Tabla de contenido:
- Paso 1: Dragonbord 410c - Publicação Dos Sensores - Analogicos
- Paso 2: Sensores Digitais - Publicação
- Paso 3: Codigo Para Acionamento Sirene
- Paso 4: Codigo Twitter - Publicar
- Paso 5: Centro De Comando
- Paso 6: Codigo Twitter - Monitoração
- Paso 7: Estrutura AWS
Video: Centro De Comando Emergencias - Erupção De Vulcão E Terremotos: 7 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:42
Projeto acadêmico para atender cenário de colaboración através da internet para divulgação de desastres naturales, onde será posible una detección de acontecimentos através de sensores IOT de temperatura, luminosidade, oscilación (inclinación) y botão de pânico. Ainda no cenário de colaboração prevemos integração com o Twitter e aplicativos com suporte mqtt para acionamento do alerta.
Diante a possibilidade de diversos meios de entrada na solución, caberá um centro de operações avaliar se a informação esta correta evitando assim falsos-positivos dos dispositivos automatizados e avaliar a possibilidade de fakenews. Tal tomada de decisão é crucial diante ao pânico que um alarme falso pode gerar.
Como solución de alerta de mensagem estamos considerando el uso de envio de SMS, alerta através de cliente mqtt, email, sirene e twitter.
O projeto contou com uso de recursos da AWS incluindo IOT CORE, EC2 e SNS
Sensores da DragonBord 410c
clientes android mqtt
Sendo todo desenvolvido em python
Autores:
Diego Fernandes dos Santos - [email protected]
Gabriel Piovani Moreira dos Santos - [email protected]
Gustavo Venancio Luz - [email protected]
Paulo Henrique Almeida Santos - [email protected]
Paso 1: Dragonbord 410c - Publicação Dos Sensores - Analogicos
Abaixo o codigo de publicação dos sensores analógicos, os sensores de temperatura e luminosidade estão configurados para que assim que detectarem uma variação for do padrão pré estabelecido enviarem um alerta através do protocolo mqtt sinalizando um evento.
Este alerta começa a contagem regressiva que pode ser suspensa ou acelerada pelo operador.
O contador para o alerta começa contagem regressiva em 60 seguntos, e todo novo alerta detectado decresce o contador em 20 segundos.
programa rodando dentro da dragon borad 410c
#! / usr / bin / python3importar spidev desde libsoc importar gpio desde time import sleep
# Importa lib para comunicacao com MOSQUITTO import paho.mqtt.client as mqtt
spi = spidev. SpiDev () spi.open (0, 0) spi.max_speed_hz = 10000 spi.mode = 0b00 spi.bits_per_word = 8
#Usando un porta ADC1 channel_select1 = [0x01, 0x80, 0x00]
#Para usar a porta ADC2 use o seguinte vetor de configuraÃÆ'§ÃÆ' £ o channel_select2 = [0x01, 0xA0, 0x00]
def on_connect (mqttc, obj, flags, rc): print ("rc:" + str (rc))
def on_message (mqttc, obj, msg): print (msg.topic + "" + str (msg.qos) + "" + str (msg.payload))
def on_publish (mqttc, obj, mid): print ("Id de mensaje:" + str (mid) + "\ n") pasar
# Criamos o cliente y setamos sus configuraciones mqttc = mqtt. Client ()
mqttc.on_message = on_message mqttc.on_connect = on_connect mqttc.on_publish = on_publish
pub = mqtt. Client ("grupo3")
# Conexao com localhost, uma vez que testamos para labredes. broker_address = "34.230.74.201"
pub.connect (dirección_corredor)
if _name _ == '_ main_': gpio_cs = gpio. GPIO (18, gpio. DIRECTION_OUTPUT)
con gpio.request_gpios ([gpio_cs]): contador = 0 adc_value_old = 0 adc_value2_old = 0 while contador <50: gpio_cs.set_high () sleep (0.00001) gpio_cs.set_low () rx = spi.xfer (channel_select1.set_high_cs) contador = contador + 1 adc_value = (rx [1] << 8) & 0b1100000000 adc_value = adc_value | (rx [2] & 0xff) adc_value = (((adc_value * 5) / 1024) - 0.5) * 100 print ("Temperatura:% f / n"% adc_value) pub.publish ("temperatura", str (adc_value)) # teste para acionar contador do alarme, teste ultima leitura + 5%
if adc_value_old == 0: adc_value_old = adc_value if adc_value> (adc_value_old * 1.05): pub.publish ("ALARME", "ON") print ("Alarmado temperatura") adc_value_old = adc_value sleep (1)
gpio_cs.set_high () sleep (0.00001) gpio_cs.set_low () rx = spi.xfer (channel_select2) gpio_cs.set_high () contador = contador + 1 adc_value2 = (rx [1] << 8) & 0b1100000000 adc_value2 = adc_value2 | (rx [2] & 0xff) adc_value2 = adc_value2 / 10 print ("Luminosidade:% f / n"% adc_value2) pub.publish ("luminosidade", str (adc_value2))
# teste para acionar contador do alarme, teste ultima leitura + 50%
if adc_value2_old == 0: adc_value2_old = adc_value2 if adc_value2> (adc_value2_old * 1.5): pub.publish ("ALARME", "ON") print ("Alarmado Luminosidade") adc_value2_old = adc_value2 sleep (3)
Paso 2: Sensores Digitais - Publicação
código para publicação dos sensores digitais
Os sensores digitais neste projeto foram o tilte que detecta os tremores e o botão para simular o uso de um botão de pânico.
quando detectado uma anomalia ou botão de pânico pressionado a contagem regressiva é iniciada.
programa rodando dentro da dragon borad 410c
desde libsoc_zero. GPIO import Buttonfrom libsoc_zero. GPIO import Tilt from time import sleep import paho.mqtt.client as mqtt import sys
def on_connect (mqttc, obj, flags, rc): print ("Conectado" + str (rc))
def on_message (mqttc, obj, msg): print (msg.topic + "" + str (msg.qos) + "" + str (msg.payload))
def on_publish (mqttc, obj, mid): # print ("Id de mensaje:" + str (mid) + "\ n") pasar
def detectaTilt (): count = 0 sleep_count = 0 while True: try: tilt.wait_for_tilt (1) excepto: sleep_count + = 1 else: count + = 1 sleep_count + = 1 si sleep_count> 999: break
print ("count:", count) if count> 200: pub = mqttc.publish ("TERREMOTO", "ON") pub = mqttc.publish ("SISMOGRAFO", str (count)) # Criamos o client e setamos suas configuraciones mqttc = mqtt. Client ()
mqttc.on_message = on_message mqttc.on_connect = on_connect mqttc.on_publish = on_publish
topic = "grupo3"
# Conexao com localhost, uma vez que testamos fora do labredes. mqttc.connect ("34.230.74.201", 1883)
inclinación = inclinación ('GPIO-A')
btn = Botón ('GPIO-C')
while True: sleep (0.25) detectaTilt () if btn.is_pressed (): pub = mqttc.publish ("PANICO", "ON") print ("Botao ON") sleep (1) pub = mqttc.publish ("PANICO "," OFF ") # else: # pub = mqttc.publish (" PANICO "," OFF ") # print (" Botao OFF ")
Paso 3: Codigo Para Acionamento Sirene
Codigo para subscrição para acionamento da SIRENE, programa rodando dentro da dragon board 410c
# Importa lib para comunicacao com MOSQUITTOimport paho.mqtt.client como mqtt
from libsoc_zero. GPIO import LED from time import sleep led = LED ('GPIO-E') # led.off ()
# Define o que fazer ao conectar def on_connect (client, obj, flags, rc): print ("ConexÃÆ' £ o estabelecida com broker")
# Definir o que fazer ao receber uma mensagem def on_message (cliente, obj, mensaje): print ("LED" + str (message.payload.decode ("utf-8"))) if str (message.payload.decode ("utf-8")) == "on": print ("Sirene ligada") led.on () else: print ("Sierene apagada") led.off ()
# IP do broker broker_address = "34.230.74.201"
# Cria o cliente sub = mqtt. Client ("grupo3")
sub.connect (dirección_corredor)
sub.on_message = on_message sub.on_connect = on_connect
# Increve no topico sub.subscribe ("SIRENE", qos = 0)
# Loop para escuta sub.loop_forever ()
Paso 4: Codigo Twitter - Publicar
Código para publicação do twitter assim que acionado o alarme.
código rodando na maquina virtual da AWS EC2
#! / usr / bin / env python # ---------------------------------------- ------------------------------- # twitter-post-status # - publica un mensaje de estado en su línea de tiempo # --- -------------------------------------------------- ------------------ importar paho.mqtt.subscribe como subscribe
tiempo de importación
desde la importación de twitter *
# ------------------------------------------------- ---------------------- # ¿Cuál debería ser nuestro nuevo estado? # ------------------------------------------------- ---------------------- new_status = "#Terremoto Procure uma zona segura - teste"
# ------------------------------------------------- ---------------------- # carga nuestras credenciales de API # ---------------------- ------------------------------------------------- importar sys sys.path.append (".") importar config
# ------------------------------------------------- ---------------------- # crear objeto API de Twitter # ---------------------- ------------------------------------------------- Twitter = Twitter (auth = OAuth ('senha removida))
# ------------------------------------------------- ---------------------- # publicar un nuevo estado # documentos de la API de Twitter: https://dev.twitter.com/rest/reference/post/statu… # ------------------------------------------------- ----------------------
while 1: m = subscribe.simple ("twitteralarme", nombre de host = "172.31.83.191", retenido = Falso) si m.topic == "twitteralarme" y str (m.payload.decode ("utf-8")) == "on": resultados = twitter.statuses.update (status = (new_status) + str (time.time ())) # print ("estado actualizado:% s"% new_status)
Paso 5: Centro De Comando
semper que acionado um dispositivo manual ou detectado um alerta manual do usuário é acionada uma contagem regressiva para envio de mensagem. O operador pode cancelar o envio ou acionar o envio imediato do alerta.
Para uso del tablero utilizamos um android do telefone para compor una mesa de operación del centro de comando.
código rodando na maquina virtual da AWS EC2
importar paho.mqtt.client como pahoimportar paho.mqtt.subscribe as subscribe import paho.mqtt.publish as publish import json import time import six import ssl from time import sleep
temas = ['#']
gatilho = 0 hora_disparo = 0 publish.single ("ACIONADO", "OFF", qos = 1, hostname = "172.31.83.191") publish.single ("sensor1", "OFF", qos = 1, hostname = "172.31.83.191 ") publish.single (" sensor2 "," OFF ", qos = 1, hostname =" 172.31.83.191 ")
connflag = Falso
def on_connect (cliente, datos de usuario, banderas, rc): global connflag connflag = True print (connflag) print ("Resultado de conexión devuelto:" + str (rc))
def on_message (cliente, datos de usuario, msg): # print ("teste") print (msg.topic + "" + str (msg.payload))
def on_log (cliente, datos de usuario, nivel, buf): print (msg.topic + "" + str (msg.payload))
mqttc = paho. Client ("Broker_MSG") mqttc.on_connect = on_connect mqttc.on_message = on_message
awshost = "data.iot.us-east-1.amazonaws.com" awsport = 8883 clientId = "a2rczvc6ni8105" thingName = "Ufscar2018" caPath = "aws-iot-rootCA.crt" certPath = "9e85dfd42a-certificate.pem. crt "keyPath =" 9e85dfd42a-private.pem.key "mqttc.tls_set (caPath, certfile = certPath, keyfile = keyPath, cert_reqs = ssl. CERT_REQUIRED, tls_version = ssl. PROTOCOL_TLSv1_connect2, aqwsc.connectport), keepalive = 60) mqttc.loop_start ()
while 1: hora = time.time () sleep (.1) publish.single ("LEDTERREMOTO", "on", qos = 1, hostname = "172.31.83.191")
# if connflag == True: # mqttc.publish ("mensaje", json.dumps ({'mensaje': "TERREMOTO"}), qos = 1) if gatilho == 1: publish.single ("TEMPO", str (round (hora_disparo-hora, 0)), qos = 1, hostname = "172.31.83.191") publish.single ("LEDTERREMOTO", "on", qos = 1, hostname = "172.31.83.191") else: publish.single ("TEMPO", "99", qos = 1, hostname = "172.31.83.191") # print ("") if (hora> hora_disparo) y (gatilho == 1): # print ("TERREMOTO") # print (connflag) if connflag == True: # mqttc.publish ("mensaje", json.dumps ({'mensaje': "TERREMOTO"}), qos = 1) # mqttc.publish ("mensaje", "TERREMOTO ", qos = 1) mqttc.publish (" mensaje ", json.dumps (" TERREMOTO - PROCURE UMA ZONA SEGURA "), qos = 1)
# print ("teste SNS") # publish.single ("LED", "on", hostname = "172.31.83.191") publish.single ("SIRENE", "on", qos = 1, hostname = "172.31. 83.191 ") publish.single (" TEMPO "," TERREMOTO ", qos = 1, hostname =" 172.31.83.191 ") publish.single (" ACIONADO "," OFF ", qos = 1, hostname =" 172.31.83.191 ") publish.single ("twitteralarme", "on", qos = 1, hostname = "172.31.83.191") publish.single ("twitter", "TERREMOTO - PROCURE UMA ZONA SEGURA", qos = 1, hostname = "172.31.83.191 ") gatilho = 0 sleep (5) m = subscribe.simple (temas, nombre de host =" 172.31.83.191 ", retenido = Falso) si m.topic ==" ACIONADO "y str (m.payload.decode (" utf-8 ")) ==" OFF ": gatilho = 0 print (" cancelado ") if m.topic ==" medico "y str (m.payload.decode (" utf-8 ")) ==" on ": if connflag == True: mqttc.publish (" medico ", json.dumps (" MEDICOS - EMERGENCIA TERREMOTO "), qos = 1) if m.topic ==" bombeiro "y str (m.payload.decode ("utf-8")) == "on": if connflag == True: mqttc.publish ("bombeiro", json.dumps ("BOMBEIRO - EMERGENCIA TERREMOTO"), qos = 1) if m.topic == " ambulancia "y str (m.payloa d.decode ("utf-8")) == "on": if connflag == True: mqttc.publish ("ambulancia", json.dumps ("AMBULANCIA - EMERGENCIA TERREMOTO"), qos = 1) si m. topic == "urgente" y str (m.payload.decode ("utf-8")) == "on": publish.single ("ACIONADO", 1, qos = 1, hostname = "172.31.83.191") gatilho = 1 hora_disparo = time.time () + 5 if str (m.payload.decode ("utf-8")) == "ON": if gatilho == 1: print ("acelerado 20") hora_disparo = hora_disparo -20 else: print ("Acionado") publish.single ("ACIONADO", 1, qos = 1, hostname = "172.31.83.191") gatilho = 1 hora_disparo = time.time () + 60
Paso 6: Codigo Twitter - Monitoração
código monitoração do twitter, pesquisa post na regiao de sorocaba
código rodando na maquina virtual da AWS EC2
norte
desde twitter import * import config import paho.mqtt.publish as publish
desde el momento de importar el sueño
twitter = Twitter (auth = OAuth (config.access_key, config.access_secret, config.consumer_key, config.consumer_secret))
latitud = -23.546211 longitud = -46.637840 alcance = 50 resultados = 1
publish.single ("twitter_alarme", "ON", hostname = "34.230.74.201")
result_count = 0 last_id = Ninguno flag = 0
para i en el rango (60): # ----------------------------------------- ------------------------------ # realizar una búsqueda basada en latitud y longitud # documentos de la API de twitter: https:// dev. twitter.com/rest/reference/get/search… # ------------------------------------- ---------------------------------- prueba: query = twitter.search.tweets (q = "#Terremoto", geocode = "% f,% f,% dkm"% (latitud, longitud, alcance), max_id = last_id) print ("leu")
excepto: print ("erro acesso twitter") break
para el resultado en la consulta ["estados"]:
# ------------------------------------------------- ---------------------- # solo procesa un resultado si tiene una geolocalización # ----------------- -------------------------------------------------- ---- if result ["geo"]: result_count + = 1 last_id = result ["id"] sleep (1) if result_count == resultados: flag + = 1 publish.single ("twitter_alarme", "ON", hostname = "34.230.74.201") publish.single ("twitter", "TERREMOTO - DETECTADO", hostname = "34.230.74.201") romper
Paso 7: Estrutura AWS
Utilizamos uma maquina virtual rodando ubuntu na estrutura AWS EC2
Utilizamos un AWS IOT CORE para el servicio de MQTT y configuramos como ações conforme o tipo de mensagem
Utilizmos topicos do AWS SNS que eram acionados pelo AWS IOT CORE
Recomendado:
Mesa de centro LED interactiva Arduino: 6 pasos (con imágenes)
Mesa de centro LED interactiva Arduino: Hice una mesa de centro interactiva que enciende las luces LED debajo de un objeto, cuando el objeto se coloca sobre la mesa. Solo se encenderán los leds que estén debajo de ese objeto. Lo hace mediante el uso eficaz de sensores de proximidad, y cuando la proximidad
Esterilizador UVC para emergencias COVID-19: 3 pasos
Esterilizador UVC para emergencias COVID-19: Cómo hacer una caja esterilizadora UVC. Lo primero es lo primero. ¡La electricidad es peligrosa! Si no está seguro y no es competente, no intente nada de lo que se menciona a continuación. La luz UVC (253,7 nm) es potente, puede cegarle y posiblemente provocarle cáncer de piel i
Banco de energía de emergencia - Caja de herramientas de bricolaje Solar: ¡Radio + cargador + luz para emergencias !: 4 pasos
Banco de energía de emergencia - Caja de herramientas de bricolaje Solar: ¡Radio + cargador + luz para emergencias !: Agregar 28 de marzo de 2015: Hice mi caja de herramientas para emergencias, y la uso ahora que mi ciudad estaba enterrada en el barro. Como experiencia puedo decir que serví para cargar teléfonos y escuchar radio. ¿Una vieja caja de herramientas? un viejo altavoz de pc? ¿Una batería de 12 voltios sin usar? Puede hacer
Detector de terremotos básico Arduino: 7 pasos (con imágenes)
Detector de terremotos Arduino básico: Tiny9 está de regreso y hoy vamos a hacer un detector de terremotos Arduino simple. Visite mi instrucción para interactuar con LIS2HH12 de Tiny9 en el siguiente enlace para configurar el dispositivo, de modo que todo lo que tenga que hacer sea agregar 3 resistencias y 3 Emittin de luz
Sistema de detección de terremotos: 5 pasos (con imágenes)
Sistema de detección de terremotos: este es un sistema de detección de terremotos, en este se utiliza el acelerómetro que detecta las vibraciones en la superficie de la tierra. Cuando el dispositivo se mueve, el arduino recibe una entrada y la envía al timbre. Al recibir esto, el timbre comienza a sonar