diff --git a/gateway/4f44f5eed4-certificate.cert.der b/gateway/4f44f5eed4-certificate.cert.der deleted file mode 100644 index 7eb07ce..0000000 --- a/gateway/4f44f5eed4-certificate.cert.der +++ /dev/null @@ -1 +0,0 @@ -este debe ser su clave generada por AWS - ESTE DOCUMENTO ES DE EJEMPLO ESTA ES LA CLAVEBINARIZADA diff --git a/gateway/4f44f5eed4-certificate.pem.crt b/gateway/4f44f5eed4-certificate.pem.crt deleted file mode 100644 index 458d769..0000000 --- a/gateway/4f44f5eed4-certificate.pem.crt +++ /dev/null @@ -1 +0,0 @@ -CLAVE GENERADA POR AWS IOT CORE diff --git a/gateway/4f44f5eed4-private.key.der b/gateway/4f44f5eed4-private.key.der deleted file mode 100644 index 07c4802..0000000 --- a/gateway/4f44f5eed4-private.key.der +++ /dev/null @@ -1 +0,0 @@ -ESTE DEBE SER SU CLAVE PRIVADA CONVERTIDA EN NUMEROS - DEBE SER CONVERTIDA POR MEDIO DE OTRA COSA diff --git a/gateway/4f44f5eed4-private.pem.key b/gateway/4f44f5eed4-private.pem.key deleted file mode 100644 index 4871e2d..0000000 --- a/gateway/4f44f5eed4-private.pem.key +++ /dev/null @@ -1 +0,0 @@ -CLAVE GENERADA POR AWS CORE CERTIFICADO diff --git a/gateway/README.md b/gateway/README.md deleted file mode 100644 index 4529887..0000000 --- a/gateway/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# WSN-MICROPYTHON -This is a basic repository to form a network of nodes using the NRF24L01 transceiver with esp8266 and send Payloads to the RPI Gateway and then be sent to the cloud through MQTT diff --git a/gateway/comandos.txt b/gateway/comandos.txt deleted file mode 100755 index c75a614..0000000 --- a/gateway/comandos.txt +++ /dev/null @@ -1,163 +0,0 @@ -MicroPython - -Herramienta de CLI para flash esp8266 esp32 -> sudo pip3 install esptool - -Herramienta shell para ejecutar con micropython -> sudo pip3 install rshell - -Obtener puerto usb del dispositivo con su CONTROLADOR UART -> dmesg | grep ttyUSB - -Obtener caracteristicas de la placa ESP -> esptool.py --port /dev/ttyUSB0 flash_id - -Borrar memoria flash de Microcontrolador -> esptool.py --port /dev/ttyUSB0 erase_flash - -Deploy the new firmware - Primera Forma -> esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_size=detect 0 esp8266-20191220-v1.12.bin - - Segunda Forma FlashRom -fm dio -> esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_size=detect -fm dio 0 esp8266-20191220-v1.12.bin - - -Conectarse por medio de comandos shell a la esp8266 -> rshell --buffer-size=30 -p /dev/ttyUSB0 - -Ver las boards disponibles -> Tiene que estar dentro del RSHELL -> boards - -Ejecutar REPL - SALIR CTRL + X -> REPL - -Prender y Apagar LED Con REPL -- Con RSHELL ACTIVADO ->>> import machine ->>> import time ->>> pin = machine.Pin(2, machine.Pin.OUT) ->>> pin.off() ->>> pin.on() ->>> while(1): -... pin.on() -... time.sleep(1) -... pin.off() -... time.sleep(1) -... -... -... ->>> ---- SALIR CON CTROL + X - - -Importar SCRIPT al board para ser ejecutado -Dentro de RSHELL Se ejecuta lo siguiente, teniendo un script ya realizado -> rshell --buffer-size=30 -p /dev/ttyUSB0 -> ls /pyboard -> cp test.py /pyboard -> REPL ->>> import test -El script se ejecuta ciando se llama al import - - - -Comunicacion serial con minicom a la esp8266 -> sudo apt-get install minicom - -Iniciar minicom -> minicom -s - -Los comandos de minicom deben estar configurados de la siguiente manera -> Serial device /dev/ttyUSB0 -> lockfile Location /var/lock -> Bps/Par/Bits 115200 SN1 -> Hardware Flow COntrol No -> Software Flow Control No -Para Iniciar Minicom se guarda el documento y luego se dirige a EXIT -Allí comienza la comunicacion con la BOARD -Para salir de minicom y finalizar la conexion -> CTRL + A + Q - - - -Para mirar todos los archivos que estan dentro del board -> import os -> os.listdir() - - - -Para guardar en memoria de la esp8266 un Script este se debe llamar main.py -SE EJECUTARA DESPUES DE BOOT.PY -> rshell --buffer-size=30 -p /dev/ttyUSB0 -> ls /pyboards -> cp main.py /pyboards/main.py - - - -PARA CARGAR NUEVAS APLICACIONES AL BOARD UTILIZANDO RSHELL sin tener que ingrasar a la terminal de rshell y luego salir de la herramienta -> rshell --port /dev/ttyUSB0 cp main.py /pyboard/main.py - -PARA BORRAR LA APLICACION DE LA BOARD Y/O BORRAR OTRO DOCUMENTO DENTRO DE LA BOARD -> rshell --port /dev/ttyUSB0 rm /pyboard/main.py - - - - -HERRAMIENTA PYBOARD PARA GESTION DE LA TARGETA -Herramienta de Mycropython -PYBOARD.PY - Cargar script solo en ROM, NO LO ESCRIBE EN LOS ARCHIVOS -> ./pyboard.py --device /dev/ttyUSB0 main.py - Para detener CTRL+C pero el board seguirá ejecutando hasta que re reinicie - - -Filesystem access - PYBOARD --f ...para acceder al directorio - --cat path - --ls [path] - --rm path - --mkdir path - --rmdir path - - -El cpcomando utiliza una sshconvención similar para referirse a archivos locales y remotos. Cualquier ruta que comience con a :se interpretará como en el dispositivo; de lo contrario, será local. Entonces: -> pyboard.py --device /dev/ttyUSB0 -f cp main.py :main.py - -------------------------------------------------------------------------- -------------------------------------------------------------------------- - -copiará main.py del directorio actual en la PC a un archivo llamado main.py en el dispositivo. El nombre del archivo se puede omitir, por ejemplo: -> pyboard.py --device/dev/ttyUSB0 -f cp main.py: - -------------------------------------------------------------------------- -------------------------------------------------------------------------- - -Copie tres archivos al dispositivo, manteniendo sus nombres -y rutas (nota: `lib` debe existir en el dispositivo) -> pyboard.py --device /dev/ttyUSB0 -f cp main.py app.py lib/foo. py: - -------------------------------------------------------------------------- -------------------------------------------------------------------------- - -Eliminar un archivo del dispositivo. -> pyboard.py --device /dev/ttyUSB0 -f rm util.py - -------------------------------------------------------------------------- -------------------------------------------------------------------------- - -Imprime el contenido de un archivo en el dispositivo -> pyboard.py --device /dev/ttyUSB0 -f cat boot.py - - -////////////MICIOM///////////////////////////////////////////// - -Para acceder al minicon sin mas unidades USB en serial -minicon -s - - -Si hay varios dispositivos conectados se debe especificar el puerto -minicom -D /dev/ttyUSB0 diff --git a/gateway/main.py b/gateway/main.py deleted file mode 100755 index 236ae72..0000000 --- a/gateway/main.py +++ /dev/null @@ -1,201 +0,0 @@ -from umqtt.robust import MQTTClient -import machine -import time -import network -import urequests -import utime -import rf24 -import ujson - - - -#import os -#os.listdir() -#print(os.listdir()) - -clientId="piId", -thingName="GREENHOUSE-GATEWAY" -awsHost = 'a2ejpqeqsr9chb-ats.iot.us-east-1.amazonaws.com' #EndPoint -awsPort = 8883 #Port No -#caPem = "/AmazonRootCA1.pem" # Root_CA_Certificate_Name -#keyPath = "/4f44f5eed4-private.pem.key" # .pem.key -keyPath = "/4f44f5eed4-private.key.der" # .pem.key -#certPath = "/4f44f5eed4-certificate.pem.crt" # .pem.crt -certPath = "/4f44f5eed4-certificate.cert.der" # .pem.crt - - -with open(certPath, 'rb') as f: - certData = f.read() -#print(certData) - -with open(keyPath, 'rb') as f: - keyData = f.read() -#print(keyData) - -#mqtt_server = '192.168.1.50' -topic_sub = 'telemetry/data' -#messagge = 'holamundo' -#userId = 'greenhouse' -#passId = 'Telemetry20.' - - -url = "http://worldtimeapi.org/api/timezone/America/Bogota" -#http://worldtimeapi.org/timezones -rtc = machine.RTC() - - -sendNode01 = False -sendNode02 = False -sendNode03 = False -sendNode04 = False -sendNode05 = False - - -def netWorkConnect(SSID, PASSWORD): - nic = network.WLAN(network.STA_IF) - ap = network.WLAN(network.AP_IF) - if not nic.isconnected(): - print('connecting to network...') - nic.active(True) - - nic.connect(SSID, PASSWORD) - while not nic.isconnected(): - #print(".", end="") - pass - ap.active(False) - print('network config:', nic.ifconfig()) - return True - -print("Iniciando......") - -if netWorkConnect('YOUR_SSID','YOUR_PASSWORD'): - #print('Connected') - response = urequests.get(url) - if response.status_code == 200: - #print("JSON response:\n", response.text) - parsed = response.json() - - datetime_str = str(parsed["datetime"]) - year = int(datetime_str[0:4]) - month = int(datetime_str[5:7]) - day = int(datetime_str[8:10]) - hour = int(datetime_str[11:13]) - minute = int(datetime_str[14:16]) - second = int(datetime_str[17:19]) - subsecond = int(round(int(datetime_str[20:26]) / 10000)) - #update internal RTC - rtc.datetime((year, month, day, 0, hour, minute, second, subsecond)) - update_time = utime.ticks_ms() - print("RTC updated\n") - - date_str = "Date: {1:02d}/{2:02d}/{0:4d}".format(*rtc.datetime()) - time_str = "Time: {4:02d}:{5:02d}:{6:02d}".format(*rtc.datetime()) - print('Date: ' + date_str) - print('Hour: ' + time_str) - ##Connect to mqtt - try: - client = MQTTClient(thingName, server=awsHost, port=awsPort, ssl=True, keepalive=10000, ssl_params={'key':keyData,'cert':certData,"server_side":False}) - client.connect() - except: - pass - print('Conctado a AWS') - #client.publish(topic_sub, "{ 'testFuncional': 'true' }") - -#NodoDir 1 d2 D2 NODO05 invernadero -- 01 -- 21 -#NodoDir 2 d4 D4 NODO05 airelibre -- 02 -- 12 -#NodoDir 3 d6 D6 NODO05 invernadero -- 03 -- 23 -#NodoDir 4 d8 D8 NODO05 airelibre -- 04 -- 14 -#NodoDir 5 db DB NODO05 Invernadero -- 05 -- 25 -pipesa = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") # -- NODO05 D2 -pipesb = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd4\xf0\xf0\xf0\xf0") # -- NODO05 D4 -pipesc = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd6\xf0\xf0\xf0\xf0") # -- NODO05 D6 -pipesd = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd8\xf0\xf0\xf0\xf0") # -- NODO05 D8 -pipese = (b"\xe1\xf0\xf0\xf0\xf0", b"\xdb\xf0\xf0\xf0\xf0") # -- NODO05 DB -#pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") -#------------ slave --------------- master ------------ - -body={} -errs = 0 -send = False -algomas = True -while True: - #try: - #time.sleep(1) - - currentMinute = int("{5:02d}".format(*rtc.datetime())) - if currentMinute%5==0: - send = True - - if algomas: - sendMqtt = True - - if sendMqtt: - algomas = False - - if not sendNode01: - try: - packG = rf24.slave(pipesa,1) - except: - pass - isidA = packG.find("'S':'21'") - if isidA > 0: - sendNode01 = True - body['node01'] = str(packG) - print(body) - - elif not sendNode02: - - packB = rf24.slave(pipesb,2) - isidb = packB.find("'S':'12'") - if isidb > 0: - sendNode02 = True - body['node02'] = packB - print(body) - - elif not sendNode03: - - packC = rf24.slave(pipesc,3) - isidc = packC.find("'S':'23'") - if isidc > 0: - sendNode03 = True - body['node03'] = packC - print(body) - - elif not sendNode04: - - packD = rf24.slave(pipesd,4) - isidd = packD.find("'S':'14'") - if isidd > 0: - sendNode04 = True - body['node04'] = packD - print(body) - - elif not sendNode05: - - packE = rf24.slave(pipese,0) - iside = packE.find("'S':'25'") - if iside > 0: - sendNode05 = True - body['node05'] = packE - print(body) - #sendNode01 = False - - else: - print("All get package") - try: - jsonBody = ujson.dumps(body) - #print(jsonBody) - client.publish(topic_sub, jsonBody) - except: - pass - del body - body = {} - sendMqtt = False - else: - algomas = True - sendNode01 = False - sendNode02 = False - sendNode03 = False - sendNode04 = False - sendNode05 = False - time.sleep(3) diff --git a/connections/README.md b/masterNode/README.md similarity index 91% rename from connections/README.md rename to masterNode/README.md index 4529887..e11a155 100644 --- a/connections/README.md +++ b/masterNode/README.md @@ -1,2 +1,3 @@ # WSN-MICROPYTHON This is a basic repository to form a network of nodes using the NRF24L01 transceiver with esp8266 and send Payloads to the RPI Gateway and then be sent to the cloud through MQTT +## sdcscscsdcsdcs diff --git a/masterNode/main.py b/masterNode/main.py new file mode 100644 index 0000000..0dec3f1 --- /dev/null +++ b/masterNode/main.py @@ -0,0 +1,95 @@ +import machine +import time +import network +import dht +import rf24 + +# Configurar alarma por interrupción para levantar el dispositivo de deepSleep +rtc = machine.RTC() +rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP) + +#Desactivar el modo AP de las conecciones wifi +#Siempre esta activado, incluso si no se usa el modulo Network +nic = network.WLAN(network.AP_IF) +nic.active(False) + +print("Iniciando......") +print("Nodo 01") + +# Validar de donde se esta levantando - reset o deepSleep +if machine.reset_cause() == machine.DEEPSLEEP_RESET: + print('Iniciando por deepSleep') +else: + print('Iniciando por hardReset') + +#10 segundos => 10000 -- 1 segundo => 1000 -- 5 min => 1000 * 60 * 5 +milliseconds = 1000 +seconds = 30 +sleepTime = milliseconds * seconds + +#Declarar el sensor DHT11 en el pin GPIO-4 +sensor = dht.DHT11(machine.Pin(4)) + +#Direcciones de los modulos NRF24L01 +#La tupla corresponde de dos direcciones +#pipes[0] = la direccion del nodo Esclavo - escucha los datos y los envia a AWS +#pipes[1] = la direccion del nodos Maestro - envia los datos al nodo esclavo +#La direccion pipes[1] debe cambiar cada vez que carga el script a un nodo diferente +#La direccion de tipo bytes corresponde a un dato tipo LL que corresponde a 0xF0F0F0F0D2LL +#Note que la forma de escribirlo es de LSB a MSB para el tipo bytes -> b"\xd2\xf0\xf0\xf0\xf0" +#Por lo tanto la ultima direccion es la que deberia cambiar para cada nodo, en este caso corresponde al d2 +pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") + +#------------------DIRECCIONES NODOS-------------------- +#pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") +#-------------- DIR SLAVE ----------- DIR MASTER -------- + +#NodoDir 1 d2 D2 NODO05 invernadero -- 01 -- 21 +#NodoDir 2 d4 D4 NODO05 airelibre -- 02 -- 12 +#NodoDir 3 d6 D6 NODO05 invernadero -- 03 -- 23 +#NodoDir 4 d8 D8 NODO05 airelibre -- 04 -- 14 +#NodoDir 5 db DB NODO05 Invernadero -- 05 -- 25 + +#Validar errores presentados +errs = 0 +while True: + try: + #Los datos debe ser tomado por lo menos cada 2 segundos + time.sleep(2) + #Preparar los datos para ser leidos + sensor.measure() + #Leer los datos del sensor de temperatura y humedad + temp = sensor.temperature() + hum = sensor.humidity() + #Convertir el formato de los datos + formatTemp = '{:4.2f}'.format(temp) + formatHum = '{:4.2f}'.format(hum) + + #Visualizar los datos de los nodos + #print('Temperature: {} C'.format(formatTemp)) + #print('Humidity: {} %'.format(formatHum)) + + #Validador de recibido de datos + state = False + while not state: + #Inicializar la comunicación con el slave, enviando: + #Direccion del nodo + #Temperatura + #Humedad + #Direccion del canal + #Tuberia para hacer la comunicación + state = rf24.master(21,formatTemp,formatHum, pipes, 1) + if state: + #Mensaje cuando los datos son recibidos + print("Se envio la informacion") + #Activar la alarma para despertar en ms + rtc.alarm(rtc.ALARM0, sleepTime) + #Poner a dormir la ESP por ms + machine.deepsleep() + except: + #Errores principalmente generado por la conexion del DHT11 + errs +=1 + print('Failed to read sensor.') + #Reiniciar si sobrepasa los 4 errores + if errs > 4: + machine.reset() diff --git a/nodes/nrf24l01.py b/masterNode/nrf24l01.py old mode 100755 new mode 100644 similarity index 97% rename from nodes/nrf24l01.py rename to masterNode/nrf24l01.py index 6273344..c210c27 --- a/nodes/nrf24l01.py +++ b/masterNode/nrf24l01.py @@ -1,4 +1,7 @@ """NRF24L01 driver for MicroPython + Este documento contiene los registros para la manipulacion del NRF24L01 + Para mas información revisar los Driver en su Repositorio de Git + https://github.com/micropython/micropython """ from micropython import const diff --git a/gateway/pyboard.py b/masterNode/pyboard.py old mode 100755 new mode 100644 similarity index 100% rename from gateway/pyboard.py rename to masterNode/pyboard.py diff --git a/gateway/rf24.py b/masterNode/rf24.py old mode 100755 new mode 100644 similarity index 61% rename from gateway/rf24.py rename to masterNode/rf24.py index 3d270cc..7de52d5 --- a/gateway/rf24.py +++ b/masterNode/rf24.py @@ -4,8 +4,9 @@ from machine import Pin, SPI from nrf24l01 import NRF24L01 from micropython import const -#import ujson as json +#Driver principal del Micropython +#https://github.com/micropython/micropython # Slave pause between receiving data and checking for further packets. @@ -15,15 +16,23 @@ # master may be a slow device. Value tested with Pyboard, ESP32 and ESP8266. _SLAVE_SEND_DELAY = const(10) + +#Configuracion de los pines GPIO - cambiar de acuedo al modulo ESP que utulice o board cfg = {"spi": 1, "miso": 12, "mosi": 13, "sck": 14, "csn": 15, "ce": 2} -# Addresses are in little-endian format. They correspond to big-endian -# 0xf0f0f0f0e1, 0xf0f0f0f0d2 -#pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") -#------------ slave --------------- master ------------ + +#Metodo de configuración para el nodo Maestro que envia los datos y luego escucha +#id - identificadr del nodo +#temperatura = valor :4.2f +#humedad = valor :4.2f +#pipe - Tupla - Direcciones de la comunicacion (idSlave. idMaster) +#npipe - Tuberia para hacer la comunicación - Más 5 por canal + def master(id = 00, temperature=20.20, humidity=30.30, pipe=(b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0"), npipe=1): + + #Diccionario a enviar al nodo Slave - Gategay body={} body['S'] = str(id) body['T'] = str(temperature) @@ -31,44 +40,41 @@ def master(id = 00, temperature=20.20, humidity=30.30, pipe=(b"\xe1\xf0\xf0\xf0\ bodyString = str(body) bodyString = bodyString.replace(" ", "") - + #Configuración de los pines para hacer la comunicación csn = Pin(cfg["csn"], mode=Pin.OUT, value=1) ce = Pin(cfg["ce"], mode=Pin.OUT, value=0) + #Configuracion del modulo nrf24l01 y su carga util nrf = NRF24L01(SPI(cfg["spi"]), csn, ce, payload_size=32) + + #Configuracion del canal de configuración nrf.open_tx_pipe(pipe[0]) nrf.open_rx_pipe(npipe, pipe[1]) - #nrf.open_tx_pipe(pipes[0]) - #nrf.open_rx_pipe(1, pipes[1]) - nrf.start_listening() - #pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") - #nrf.open_tx_pipe(pipe[1]) - #nrf.open_rx_pipe(1, pipe[0]) + #Comenzar a escuchar + nrf.start_listening() statusSuccess = 0 confirmSuccess = 5 - #print("NRF24L01 master mode, enviando hasta que responda") - + while statusSuccess < confirmSuccess: + + #Parar de escuchar y comenzar a enviar nrf.stop_listening() - #millis = utime.ticks_ms() - #print("sending:", bodyString ) + #Enviar los datos a l try: - #print("se esta enviando") - #nrf.send("hola mundo") nrf.send(struct.pack('32s', bodyString)) except OSError: pass - # start listening again + #Comenzar a escuchar nrf.start_listening() - # wait for response, with 250ms timeout + # Timeout de 250ms - comienza a contar start_time = utime.ticks_ms() timeout = False - + # Timeout si se cumplen los 250ms while not nrf.any() and not timeout: if utime.ticks_diff(utime.ticks_ms(), start_time) > 250: timeout = True @@ -77,67 +83,79 @@ def master(id = 00, temperature=20.20, humidity=30.30, pipe=(b"\xe1\xf0\xf0\xf0\ print("No confirm") else: - # recv packet + # Paquetes Recibidos buff = nrf.recv() + #Res es el resultado devuelto (res,) = struct.unpack("i", buff) + #Termina de escuchar si la comunicación es 5 if res > 5: statusSuccess = res - + # delay then loop utime.sleep_ms(250) - return True + + +#Metodo del nodo esclavo o Gateway +#Sus parametros corresponden unicamente a: +#pipe - Tupla - Direcciones de la comunicacion (idSlave. idMaster) +#npipe - Tuberia para hacer la comunicación - Más 5 por canal def slave(pipe, npipe): + + #Configuración de los pines para hacer la comunicación csn = Pin(cfg["csn"], mode=Pin.OUT, value=1) ce = Pin(cfg["ce"], mode=Pin.OUT, value=0) + #Configuracion del modulo nrf24l01 y su carga util nrf = NRF24L01(SPI(cfg["spi"]), csn, ce, payload_size=32) + + #Configuracion del canal de configuración nrf.open_tx_pipe(pipe[1]) nrf.open_rx_pipe(npipe, pipe[0]) - nrf.start_listening() - #pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") - #nrf.open_tx_pipe(pipes[1]) - #nrf.open_rx_pipe(1, pipes[0]) + #Comenzar a escuchar + nrf.start_listening() - #print("NRF24L01 slave mode, waiting for packets...") + #Validadores del paquete statusPackage = False pack = False + while not statusPackage: + #Escuchar de cualquier parte if nrf.any(): while nrf.any(): buf = nrf.recv() (led_state,) = struct.unpack('32s', buf) - #print("received:", led_state) utime.sleep_ms(_RX_POLL_DELAY) - + #Convertir los datos de bites a String package = led_state package = package.decode() - iside = package.find("'S':'21'") - + #Arreglar el string si el payload no alcanzó package = package + "'}" + #Validar si es un string el contenido if isinstance(package, str): pack = True - #print("str pack") #Give response master utime.sleep_ms(_SLAVE_SEND_DELAY) + + #Parar de escuchar y comenzar a enviar nrf.stop_listening() try: + #Enviar un int igual a 20 nrf.send(struct.pack("i", 20)) - #nrf.send(struct.pack("i", 20)) - #print("sent response") + except OSError: - #print("Error enviando") pass - #print("sent response") + + #Validar si el paquete contiene algo if pack and len(package) > 0: - #pass - #print('se recivio paquete') statusPackage = True + #Comenzar a escuchar nrf.start_listening() + #Retornar el paquete recibido return package diff --git a/nodes/README.md b/nodes/README.md deleted file mode 100644 index 4529887..0000000 --- a/nodes/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# WSN-MICROPYTHON -This is a basic repository to form a network of nodes using the NRF24L01 transceiver with esp8266 and send Payloads to the RPI Gateway and then be sent to the cloud through MQTT diff --git a/nodes/comandos.txt b/nodes/comandos.txt deleted file mode 100755 index c75a614..0000000 --- a/nodes/comandos.txt +++ /dev/null @@ -1,163 +0,0 @@ -MicroPython - -Herramienta de CLI para flash esp8266 esp32 -> sudo pip3 install esptool - -Herramienta shell para ejecutar con micropython -> sudo pip3 install rshell - -Obtener puerto usb del dispositivo con su CONTROLADOR UART -> dmesg | grep ttyUSB - -Obtener caracteristicas de la placa ESP -> esptool.py --port /dev/ttyUSB0 flash_id - -Borrar memoria flash de Microcontrolador -> esptool.py --port /dev/ttyUSB0 erase_flash - -Deploy the new firmware - Primera Forma -> esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_size=detect 0 esp8266-20191220-v1.12.bin - - Segunda Forma FlashRom -fm dio -> esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_size=detect -fm dio 0 esp8266-20191220-v1.12.bin - - -Conectarse por medio de comandos shell a la esp8266 -> rshell --buffer-size=30 -p /dev/ttyUSB0 - -Ver las boards disponibles -> Tiene que estar dentro del RSHELL -> boards - -Ejecutar REPL - SALIR CTRL + X -> REPL - -Prender y Apagar LED Con REPL -- Con RSHELL ACTIVADO ->>> import machine ->>> import time ->>> pin = machine.Pin(2, machine.Pin.OUT) ->>> pin.off() ->>> pin.on() ->>> while(1): -... pin.on() -... time.sleep(1) -... pin.off() -... time.sleep(1) -... -... -... ->>> ---- SALIR CON CTROL + X - - -Importar SCRIPT al board para ser ejecutado -Dentro de RSHELL Se ejecuta lo siguiente, teniendo un script ya realizado -> rshell --buffer-size=30 -p /dev/ttyUSB0 -> ls /pyboard -> cp test.py /pyboard -> REPL ->>> import test -El script se ejecuta ciando se llama al import - - - -Comunicacion serial con minicom a la esp8266 -> sudo apt-get install minicom - -Iniciar minicom -> minicom -s - -Los comandos de minicom deben estar configurados de la siguiente manera -> Serial device /dev/ttyUSB0 -> lockfile Location /var/lock -> Bps/Par/Bits 115200 SN1 -> Hardware Flow COntrol No -> Software Flow Control No -Para Iniciar Minicom se guarda el documento y luego se dirige a EXIT -Allí comienza la comunicacion con la BOARD -Para salir de minicom y finalizar la conexion -> CTRL + A + Q - - - -Para mirar todos los archivos que estan dentro del board -> import os -> os.listdir() - - - -Para guardar en memoria de la esp8266 un Script este se debe llamar main.py -SE EJECUTARA DESPUES DE BOOT.PY -> rshell --buffer-size=30 -p /dev/ttyUSB0 -> ls /pyboards -> cp main.py /pyboards/main.py - - - -PARA CARGAR NUEVAS APLICACIONES AL BOARD UTILIZANDO RSHELL sin tener que ingrasar a la terminal de rshell y luego salir de la herramienta -> rshell --port /dev/ttyUSB0 cp main.py /pyboard/main.py - -PARA BORRAR LA APLICACION DE LA BOARD Y/O BORRAR OTRO DOCUMENTO DENTRO DE LA BOARD -> rshell --port /dev/ttyUSB0 rm /pyboard/main.py - - - - -HERRAMIENTA PYBOARD PARA GESTION DE LA TARGETA -Herramienta de Mycropython -PYBOARD.PY - Cargar script solo en ROM, NO LO ESCRIBE EN LOS ARCHIVOS -> ./pyboard.py --device /dev/ttyUSB0 main.py - Para detener CTRL+C pero el board seguirá ejecutando hasta que re reinicie - - -Filesystem access - PYBOARD --f ...para acceder al directorio - --cat path - --ls [path] - --rm path - --mkdir path - --rmdir path - - -El cpcomando utiliza una sshconvención similar para referirse a archivos locales y remotos. Cualquier ruta que comience con a :se interpretará como en el dispositivo; de lo contrario, será local. Entonces: -> pyboard.py --device /dev/ttyUSB0 -f cp main.py :main.py - -------------------------------------------------------------------------- -------------------------------------------------------------------------- - -copiará main.py del directorio actual en la PC a un archivo llamado main.py en el dispositivo. El nombre del archivo se puede omitir, por ejemplo: -> pyboard.py --device/dev/ttyUSB0 -f cp main.py: - -------------------------------------------------------------------------- -------------------------------------------------------------------------- - -Copie tres archivos al dispositivo, manteniendo sus nombres -y rutas (nota: `lib` debe existir en el dispositivo) -> pyboard.py --device /dev/ttyUSB0 -f cp main.py app.py lib/foo. py: - -------------------------------------------------------------------------- -------------------------------------------------------------------------- - -Eliminar un archivo del dispositivo. -> pyboard.py --device /dev/ttyUSB0 -f rm util.py - -------------------------------------------------------------------------- -------------------------------------------------------------------------- - -Imprime el contenido de un archivo en el dispositivo -> pyboard.py --device /dev/ttyUSB0 -f cat boot.py - - -////////////MICIOM///////////////////////////////////////////// - -Para acceder al minicon sin mas unidades USB en serial -minicon -s - - -Si hay varios dispositivos conectados se debe especificar el puerto -minicom -D /dev/ttyUSB0 diff --git a/nodes/main.py b/nodes/main.py deleted file mode 100755 index a817ecc..0000000 --- a/nodes/main.py +++ /dev/null @@ -1,65 +0,0 @@ -import machine -import time -import network -import dht -import rf24 - -# configure RTC.ALARM0 to be able to wake the device -rtc = machine.RTC() -rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP) - -nic = network.WLAN(network.AP_IF) -nic.active(False) - -print("Iniciando......") -print("Nod 01") -#print("Estado del firmware: " + str(esp.check_fw())) - -# check if the device woke from a deep sleep -if machine.reset_cause() == machine.DEEPSLEEP_RESET: - print('woke from a deep sleep') -else: - print('power on or hard reset') - -sleepTime = 10000 -#Starting DHT11 on gpio 4 -sensor = dht.DHT11(machine.Pin(4)) - -pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") -#NodoDir 1 d2 D2 NODO05 invernadero -- 01 -- 21 -#NodoDir 2 d4 D4 NODO05 airelibre -- 02 -- 12 -#NodoDir 3 d6 D6 NODO05 invernadero -- 03 -- 23 -#NodoDir 4 d8 D8 NODO05 airelibre -- 04 -- 14 -#NodoDir 5 db DB NODO05 Invernadero -- 05 -- 25 -#------------ slave --------------- master ----- - -#nrf.open_tx_pipe(pipes[1]) -#nrf.open_rx_pipe(1, pipes[0]) - - -errs = 0 -while True: - try: - time.sleep(2) - sensor.measure() - temp = sensor.temperature() - hum = sensor.humidity() - formatTemp = '{:4.2f}'.format(temp) - formatHum = '{:4.2f}'.format(hum) - #print('Temperature: {} C'.format(formatTemp)) - #print('Humidity: {} %'.format(formatHum)) - - state = False - while not state: - state = rf24.master(21,formatTemp,formatHum, pipes, 1) - if state: - print("Se envio la informacion") - rtc.alarm(rtc.ALARM0, sleepTime) - # put the device to sleep - machine.deepsleep() - except: - errs +=1 - print('Failed to read sensor.') - if errs > 4: - #pass - machine.reset() diff --git a/slaveNode/4f44f5eed4-certificate.cert.der b/slaveNode/4f44f5eed4-certificate.cert.der new file mode 100644 index 0000000..892ceed --- /dev/null +++ b/slaveNode/4f44f5eed4-certificate.cert.der @@ -0,0 +1 @@ +Este es un documento de prueba .der - para generar el certificado, vaya hasta AWS IOT y registre un nuevo "Thing", descargue el certificado y conviertalo a .der como se ve en el tutorial diff --git a/slaveNode/4f44f5eed4-certificate.pem.crt b/slaveNode/4f44f5eed4-certificate.pem.crt new file mode 100644 index 0000000..fd6fa50 --- /dev/null +++ b/slaveNode/4f44f5eed4-certificate.pem.crt @@ -0,0 +1 @@ +Este es un documento de prueba .crt - para generar el certificado, vaya hasta AWS IOT y registre un nuevo "Thing" y descargue el certificado diff --git a/slaveNode/4f44f5eed4-private.key.der b/slaveNode/4f44f5eed4-private.key.der new file mode 100644 index 0000000..e425f20 --- /dev/null +++ b/slaveNode/4f44f5eed4-private.key.der @@ -0,0 +1 @@ +Este es un documento de prueba .der - para generar la clave privada, vaya hasta AWS IOT y registre un nuevo "Thing", descargue la llave privada y conviertalo a .der como se ve en el tutorial diff --git a/slaveNode/4f44f5eed4-private.pem.key b/slaveNode/4f44f5eed4-private.pem.key new file mode 100644 index 0000000..f476407 --- /dev/null +++ b/slaveNode/4f44f5eed4-private.pem.key @@ -0,0 +1 @@ +Este es un documento de prueba .key - para generar la clave privada, vaya hasta AWS IOT y registre un nuevo "Thing" y descargue la llave privada diff --git a/slaveNode/main.py b/slaveNode/main.py new file mode 100644 index 0000000..5644b1e --- /dev/null +++ b/slaveNode/main.py @@ -0,0 +1,189 @@ +from umqtt.robust import MQTTClient +import machine +import time +import timeSynchronizer +import network +import wificonnect +import utime +import rf24 +import ujson + + +#CON ESTE CODIGO SE PUEDE ENVIAR POR MQTT A AWS +#AWS IOT con MQTT valida el Tema del que escliente +#Si el topic corresponde a se ejecuta un lambda de AWS que envia los datos a DynamoDB - NodeJS +#Si el topic corresponde a se ejecuta un lambda de AWS que envia los datos a Firebase - Firebase + +#10 segundos => 10000 -- 1 segundo => 1000 -- 5 min => 1000 * 60 * 5 +seconds = 1000 +minutes = 5 * 60 +sleepTime = seconds * minutes + +thingName="GREENHOUSE-GATEWAY" +awsHost = '' #EndPoint +awsPort = 8883 #Port No +keyPath = "/4f44f5eed4-private.key.der" # .pem.key +certPath = "/4f44f5eed4-certificate.cert.der" # .pem.crt +topic_sub = '' +topic_subdb = '' + + +#Abrir el certificado .cert.der +with open(certPath, 'rb') as f: + certData = f.read() + +#Abrir la clave privada .key.der +with open(keyPath, 'rb') as f: + keyData = f.read() + +#Validarores de recibo de paquetes +sendNode01 = False +sendNode02 = False +sendNode03 = False +sendNode04 = False +sendNode05 = False +sendFirebase = False + + +print("Iniciando......") + +# Validar de donde se esta levantando - reset o deepSleep +if machine.reset_cause() == machine.DEEPSLEEP_RESET: + print('Iniciando por deepSleep') +else: + print('Iniciando por hardReset') + + +#Conectar a tu red wifi +if wificonnect.netWorkConnect('',''): + print('Conectado') + + +# Configuración de real time clock RTC +rtc = machine.RTC() +#Configura interrupción para despertar del deep sleep +#Pin 16 +rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP) +#Imprime la Hora - Con una tupla de 6 items, configura el RTC +#print(rtc.datetime()) + + +#Conexion a MQTT en AWS de IOT CORE +#Solo es necesario para los parametros SSL el certificado y la llave privada +try: + client = MQTTClient(thingName, server=awsHost, port=awsPort, ssl=True, keepalive=10000, ssl_params={'key':keyData,'cert':certData,"server_side":False}) + client.connect() +except: + print("imposible conectar") + + + +#Tuplas de las direcciones de cada NRF24L01 +#los bytes de la tupla [0] siempre sera la direccion del Nodo Esclavo - Recibe del Maestro y envia por MQTT +#los bites de la tupla [1] siempre sera la direccion del Nodo Maestro - Envia al esclavo +pipesa = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") # -- NODO05 D2 -- d2 +pipesb = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd4\xf0\xf0\xf0\xf0") # -- NODO05 D4 -- d4 +pipesc = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd6\xf0\xf0\xf0\xf0") # -- NODO05 D6 -- d6 +pipesd = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd8\xf0\xf0\xf0\xf0") # -- NODO05 D8 -- d8 +pipese = (b"\xe1\xf0\xf0\xf0\xf0", b"\xdb\xf0\xf0\xf0\xf0") # -- NODO05 DB -- db +#------------ slave ----------- master --------- + +#Diccionario para recibir el contenido de los sensores y nodo +body={} +send = False + +while True: + + #Para ejecutar el reloj sin necesidad de apagarlo + #currentMinute = int("{5:02d}".format(*rtc.datetime())) + #if currentMinute%5==0: + # send = True + + if send: + #Validar si el dato del NodoX ha sido recibida - mientras sea falsa - realiza la comunicación + if not sendNode01: + #Habilitar comunicación con el nodo de direccion pipesA[1] en la pipe 1 + packG = rf24.slave(pipesa,1) + #Validar si el contenido del package corresponde al Nodo05 + isidA = packG.find("'S':'21'") + if isidA > 0: + sendNode01 = True + #Agregar los datos de Nodo01 al Diccionario + body['node01'] = str(packG) + print(body) + + elif not sendNode02: + #Habilitar comunicación con el nodo de direccion pipesB[1] en la pipe 2 + packB = rf24.slave(pipesb,2) + #Validar si el contenido del package corresponde al Nodo02 + isidb = packB.find("'S':'12'") + if isidb > 0: + sendNode02 = True + #Agregar los datos de Nodo02 al Diccionario + body['node02'] = packB + print(body) + + elif not sendNode03: + #Habilitar comunicación con el nodo de direccion pipesC[1] en la pipe 3 + packC = rf24.slave(pipesc,3) + #Validar si el contenido del package corresponde al Nodo03 + isidc = packC.find("'S':'23'") + if isidc > 0: + sendNode03 = True + #Agregar los datos de Nodo03 al Diccionario + body['node03'] = packC + print(body) + + elif not sendNode04: + #Habilitar comunicación con el nodo de direccion pipesD[1] en la pipe 4 + packD = rf24.slave(pipesd,4) + #Validar si el contenido del package corresponde al Nodo04 + isidd = packD.find("'S':'14'") + if isidd > 0: + sendNode04 = True + #Agregar los datos de Nodo04 al Diccionario + body['node04'] = packD + print(body) + + elif not sendNode05: + #Habilitar comunicación con el nodo de direccion pipesE[1] en la pipe 0 + packE = rf24.slave(pipese,0) + #Validar si el contenido del package corresponde al Nodo05 + iside = packE.find("'S':'25'") + if iside > 0: + sendNode05 = True + #Agregar los datos de Nodo05 al Diccionario + body['node05'] = packE + print(body) + + elif not sendFirebase: + + print("Send to Firebase") + jsonBody = ujson.dumps(body) + #Envia los datos a AWS Lambda e insertarlos en Firebase - RealTime + client.publish(topic_subdb, jsonBody) + sendFirebase = True + time.sleep(1) + else: + print("All get package") + #Envia los datos a AWS Lambda e insertarlos en DynamoDB - No RealTime + #jsonBody = ujson.dumps(body) + #client.publish(topic_sub, jsonBody) + del body + body = {} + send = False + #Activar la alarma para despertar en ms + rtc.alarm(rtc.ALARM0, sleepTime) + print("Go to sleep....") + # Poner a dormir la ESP por ms + machine.deepsleep() + else: + sendNode01 = False + sendNode02 = False + sendNode03 = False + sendNode04 = False + sendNode05 = False + sendFirebase = False + #Comentar si se esta ejecutando sin apagar y con el RTC para validar + send = True + time.sleep(1) diff --git a/gateway/nrf24l01.py b/slaveNode/nrf24l01.py old mode 100755 new mode 100644 similarity index 97% rename from gateway/nrf24l01.py rename to slaveNode/nrf24l01.py index 6273344..c210c27 --- a/gateway/nrf24l01.py +++ b/slaveNode/nrf24l01.py @@ -1,4 +1,7 @@ """NRF24L01 driver for MicroPython + Este documento contiene los registros para la manipulacion del NRF24L01 + Para mas información revisar los Driver en su Repositorio de Git + https://github.com/micropython/micropython """ from micropython import const diff --git a/nodes/pyboard.py b/slaveNode/pyboard.py old mode 100755 new mode 100644 similarity index 100% rename from nodes/pyboard.py rename to slaveNode/pyboard.py diff --git a/nodes/rf24.py b/slaveNode/rf24.py old mode 100755 new mode 100644 similarity index 58% rename from nodes/rf24.py rename to slaveNode/rf24.py index 85212d6..7de52d5 --- a/nodes/rf24.py +++ b/slaveNode/rf24.py @@ -4,8 +4,9 @@ from machine import Pin, SPI from nrf24l01 import NRF24L01 from micropython import const -#import ujson as json +#Driver principal del Micropython +#https://github.com/micropython/micropython # Slave pause between receiving data and checking for further packets. @@ -16,15 +17,22 @@ _SLAVE_SEND_DELAY = const(10) +#Configuracion de los pines GPIO - cambiar de acuedo al modulo ESP que utulice o board cfg = {"spi": 1, "miso": 12, "mosi": 13, "sck": 14, "csn": 15, "ce": 2} -# Addresses are in little-endian format. They correspond to big-endian -# 0xf0f0f0f0e1, 0xf0f0f0f0d2 -#pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") + +#Metodo de configuración para el nodo Maestro que envia los datos y luego escucha +#id - identificadr del nodo +#temperatura = valor :4.2f +#humedad = valor :4.2f +#pipe - Tupla - Direcciones de la comunicacion (idSlave. idMaster) +#npipe - Tuberia para hacer la comunicación - Más 5 por canal def master(id = 00, temperature=20.20, humidity=30.30, pipe=(b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0"), npipe=1): + + #Diccionario a enviar al nodo Slave - Gategay body={} body['S'] = str(id) body['T'] = str(temperature) @@ -32,49 +40,41 @@ def master(id = 00, temperature=20.20, humidity=30.30, pipe=(b"\xe1\xf0\xf0\xf0\ bodyString = str(body) bodyString = bodyString.replace(" ", "") - + #Configuración de los pines para hacer la comunicación csn = Pin(cfg["csn"], mode=Pin.OUT, value=1) ce = Pin(cfg["ce"], mode=Pin.OUT, value=0) + #Configuracion del modulo nrf24l01 y su carga util nrf = NRF24L01(SPI(cfg["spi"]), csn, ce, payload_size=32) - + #Configuracion del canal de configuración nrf.open_tx_pipe(pipe[0]) nrf.open_rx_pipe(npipe, pipe[1]) - #nrf.open_tx_pipe(pipes[0]) - #nrf.open_rx_pipe(1, pipes[1]) - nrf.start_listening() - - - #pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") - #nrf.open_tx_pipe(pipe[1]) - #nrf.open_rx_pipe(1, pipe[0]) - + #Comenzar a escuchar + nrf.start_listening() statusSuccess = 0 confirmSuccess = 5 - #print("NRF24L01 master mode, enviando hasta que responda") - + while statusSuccess < confirmSuccess: + + #Parar de escuchar y comenzar a enviar nrf.stop_listening() - #millis = utime.ticks_ms() - #print("sending:", bodyString ) + #Enviar los datos a l try: - #print("se esta enviando") - #nrf.send("hola mundo") nrf.send(struct.pack('32s', bodyString)) except OSError: pass - # start listening again + #Comenzar a escuchar nrf.start_listening() - # wait for response, with 250ms timeout + # Timeout de 250ms - comienza a contar start_time = utime.ticks_ms() timeout = False - + # Timeout si se cumplen los 250ms while not nrf.any() and not timeout: if utime.ticks_diff(utime.ticks_ms(), start_time) > 250: timeout = True @@ -83,63 +83,79 @@ def master(id = 00, temperature=20.20, humidity=30.30, pipe=(b"\xe1\xf0\xf0\xf0\ print("No confirm") else: - # recv packet + # Paquetes Recibidos buff = nrf.recv() + #Res es el resultado devuelto (res,) = struct.unpack("i", buff) + #Termina de escuchar si la comunicación es 5 if res > 5: statusSuccess = res - + # delay then loop utime.sleep_ms(250) - return True + + +#Metodo del nodo esclavo o Gateway +#Sus parametros corresponden unicamente a: +#pipe - Tupla - Direcciones de la comunicacion (idSlave. idMaster) +#npipe - Tuberia para hacer la comunicación - Más 5 por canal def slave(pipe, npipe): + + #Configuración de los pines para hacer la comunicación csn = Pin(cfg["csn"], mode=Pin.OUT, value=1) ce = Pin(cfg["ce"], mode=Pin.OUT, value=0) + #Configuracion del modulo nrf24l01 y su carga util nrf = NRF24L01(SPI(cfg["spi"]), csn, ce, payload_size=32) + + #Configuracion del canal de configuración nrf.open_tx_pipe(pipe[1]) nrf.open_rx_pipe(npipe, pipe[0]) + + #Comenzar a escuchar nrf.start_listening() - #pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") - #nrf.open_tx_pipe(pipes[1]) - #nrf.open_rx_pipe(1, pipes[0]) - #print("NRF24L01 slave mode, waiting for packets...") + + #Validadores del paquete statusPackage = False pack = False + while not statusPackage: + #Escuchar de cualquier parte if nrf.any(): while nrf.any(): buf = nrf.recv() (led_state,) = struct.unpack('32s', buf) - #print("received:", led_state) utime.sleep_ms(_RX_POLL_DELAY) - + #Convertir los datos de bites a String package = led_state - package = package.decode('UTF-8') - package = package + "}" - package = str(package) - #print(package) + package = package.decode() + iside = package.find("'S':'21'") + #Arreglar el string si el payload no alcanzó + package = package + "'}" + + #Validar si es un string el contenido if isinstance(package, str): pack = True - #print("str pack") #Give response master utime.sleep_ms(_SLAVE_SEND_DELAY) + + #Parar de escuchar y comenzar a enviar nrf.stop_listening() try: + #Enviar un int igual a 20 nrf.send(struct.pack("i", 20)) - nrf.send(struct.pack("i", 20)) - #print("sent response") + except OSError: - #print("Error enviando") pass - #print("sent response") + + #Validar si el paquete contiene algo if pack and len(package) > 0: - #pass - #print('se recivio paquete') statusPackage = True + #Comenzar a escuchar nrf.start_listening() + #Retornar el paquete recibido return package diff --git a/slaveNode/timeSynchronizer.py b/slaveNode/timeSynchronizer.py new file mode 100644 index 0000000..e7d0d9c --- /dev/null +++ b/slaveNode/timeSynchronizer.py @@ -0,0 +1,28 @@ +import machine +import urequests +import ujson + +#Consume una api para calibrar el RTC la esp - mediante elu uso de una peticion request +#Para más informacipon del API: http://worldtimeapi.org + +def calibrateRTC(getTimeApi='http://worldtimeapi.org/api/timezone/America/Bogota'): + + try: + #Hacer request a + response = urequests.get(getTimeApi) + except: + print('No se puede hacer la peticion') + if response.status_code == 200: + #Convierte los datos y los organiza en una tupla + parsed = response.json() + datetime_str = str(parsed["datetime"]) + year = int(datetime_str[0:4]) + month = int(datetime_str[5:7]) + day = int(datetime_str[8:10]) + hour = int(datetime_str[11:13]) + minute = int(datetime_str[14:16]) + second = int(datetime_str[17:19]) + subsecond = int(round(int(datetime_str[20:26]) / 10000)) + #Retorna la tupla de 8 datos, estos datos luego se pasan a RTC().datetime() + #rtc.datetime((year, month, day, 0, hour, minute, second, subsecond)) + return (year, month, day, 0, hour, minute, second, subsecond) \ No newline at end of file diff --git a/slaveNode/wificonnect.py b/slaveNode/wificonnect.py new file mode 100644 index 0000000..dbdab1a --- /dev/null +++ b/slaveNode/wificonnect.py @@ -0,0 +1,29 @@ +import network + +#Conexion a red Wifi en modo de STATION + +#El modo AP siempre esta habilitado en micropython, aún si no se usa el modulo NETWORK +#Se deshabilita este modo que no se va a implementar +def netWorkConnect(SSID='ssid', PASSWORD='pass'): + nic = network.WLAN(network.STA_IF) + ap = network.WLAN(network.AP_IF) + + #Validar si ya esta conectado + if not nic.isconnected(): + print('Conectando a la red...') + #Activar el modo STATION + nic.active(True) + try: + #Realiza la conexion con las credenciales puestas como argumento + nic.connect(SSID, PASSWORD) + while not nic.isconnected(): + #print(".", end="") + a = 'conectando....' + except: + print('Imposible conectar')' + #Desactivar el modo APLICATION + ap.active(False) + #Imprime las configuraciones de la red -IP - MASK - MODEN - DNS + print('network config:', nic.ifconfig()) + #Devuelve True si logra realizar la comunicción + return True \ No newline at end of file diff --git a/tutorial/README.md b/tutorial/README.md deleted file mode 100644 index 4529887..0000000 --- a/tutorial/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# WSN-MICROPYTHON -This is a basic repository to form a network of nodes using the NRF24L01 transceiver with esp8266 and send Payloads to the RPI Gateway and then be sent to the cloud through MQTT