Advertisement
tdrobotica

Control de temperatura y humedad en cultivos con IoT

Dec 4th, 2023
1,320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.65 KB | None | 0 0
  1. # --------------------------------------------------
  2. # Descripcion del programa:
  3. # El siguiente programa permite subir el valor del pin análogo 32 de la tarjeta a Ubidots, una plataforma de IoT
  4. # Esta acción se realiza cada 4 segundos.
  5.  
  6. # --------------------------------------------------
  7. # Sección para importar las librerías necesarias
  8. import network # Librería necesaria para funciones de conexión a wifi
  9. from machine import Pin # Clase Pin de la librería machine necesaria para definir pines digitales y configuraciones de los mismos
  10. import socket # Librería necesaria para crear un objeto "socket" y comunicarse con el servidor que tiene la API de ubidots
  11. import time # Librería necesaria para utilizar esperas de tiempo
  12. import dht # Librería necesaria para utilizar el sensor DHT
  13.  
  14. # --------------------------------------------------
  15. # Sección para definir e inicializar variables, constantes y configuraciones globales
  16. AP_name = "TdRobotica_mobile" # Variable para almacenar el nombre del punto de acceso de red o router || Cambiar por su nombre de RED
  17. AP_pass = "Tdrobotica2023&$." # Variable para almacena la contraseña del punto de acceso de red o router || Cambiar por su contraseña de RED
  18. ubi_token = "BBFF-wyeS36UwJGX1Rv6A4WPLOk6DWoGthE" # Token asociado a la cuenta ubidots || Cambiar por su token en UBIDOTS
  19. ubi_temperatura = "temperatura" # Nombre de la etiqueta de variable que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS
  20. ubi_humedad = "humedad" # Nombre de la etiqueta de variable que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS
  21. ubi_device = "playiot" # Nombre del dispositivo en Ubidots || Cambiar por su nombre de dispositivo en UBIDOTS
  22. updating_time = 4; # Variable para indicar la cantidad de segundos de espera de actualización del valor del potenciómetro en Ubidots.
  23. sensor = dht.DHT11(Pin(5)) # Nombre que se le da al pin ADC 32, donde está conectado el potenciómetro
  24. led_sending = Pin(12,Pin.OUT) # Nombre que se le da al pin 13 que tiene conectado un LED. Se configura como salida digital y se usa para indicar conexión wifi.
  25. led_wifi = Pin(13,Pin.OUT) # Nombre que se le da al pin 13 que tiene conectado un LED. Se configura como salida digital y se usa para indicar conexión wifi.
  26. led_sending.off() # Se inicia el pin 12 que tienen conectado el LED de envío de datos a apagado.
  27. led_wifi.off() # Se inicia el pin 13 que tiene contectado un LED a apagado.
  28. sensor_value = 0 # Variable para almacenar el valor del pin. Se inicializa en 0
  29. api_route = ("industrial.api.ubidots.com", 80) # Ruta de conexión a la API de ubidots por el puerto 80 para subir datos
  30. station_interface = network.WLAN(network.STA_IF) # Creación de una interfaz de estación para conectarse al AP (o router) wifi
  31. station_interface.active(True) # Activar la interfaz de estación
  32. successful_sendings = 0 # contador de envíos exitosos
  33. failed_sendings = 0 # contador de envíos erróneos
  34.  
  35. # --------------------------------------------------
  36. # Sección para definir funcion principal
  37. def main_function():
  38.     while(True): # Ciclo repetitivo infinito
  39.         check_connection_to_wifi() # Función personalizada: Conectarse a red wifi si es necesario
  40.         sensor.measure() # Función para leer y actualziar los datos captados por el sensor
  41.         sensor_temperatura = sensor.temperature() # Guardar valores de temperatura en la variable sensor_temperatura
  42.         sensor_humedad = sensor.humidity() # Guardar valores de humedad en la variable sensor_humedad
  43.         ubi_update_temperatura(ubi_temperatura, sensor_temperatura, ubi_device, ubi_token, updating_time) # Función personalizada: actualizar el valor almacenado en la variable creada en ubidots
  44.         ubi_update_humedad(ubi_humedad, sensor_humedad, ubi_device, ubi_token, updating_time) # Función personalizada: actualizar el valor almacenado en la variable creada en ubidots
  45. # --------------------------------------------------
  46. # Sección para definir las funciones personalizadas auxiliares
  47.  
  48. def check_connection_to_wifi(): # Función para conectarse a Wifi, verificando conexión
  49.     try: # bloque de intento de conexión a WiFi
  50.         station_interface.connect(AP_name, AP_pass) # Conectar la interfaz de estación al WiFi con las credenciales de nombre y contraseña indicados
  51.         print("network config:", station_interface.ifconfig()) # Mostrar mensaje de datos de conexión
  52.     except: # Bloque en caso de que se genere un error al intentar conexión a WiFi
  53.         pass # No realizar acciones
  54.     while not station_interface.isconnected(): # Ciclo condicional hasta que haya conexión
  55.         print("connecting to network...") # Mostrar en consola que se está conectando a la red WiFi
  56.         led_wifi.on() # Encender LED indicador WiFi, para después apagarse
  57.         time.sleep_ms(500) # Tiempo de espera para apagar
  58.         led_wifi.off() # Apagar LED indicador WiFi, para después encenderse de nuevo si aún no hay conexión
  59.         time.sleep_ms(500) # Tiempo de espera para encender de nuevo
  60.     led_wifi.on() #Encender LED indicador WiFi permanente. Si se llega hasta aquí, ya se logró conexión WiFi.
  61.  
  62. def ubi_update_temperatura(ubi_temperatura, value, ubi_device, ubi_token, updating_time): # Función para actualizar el valor en la variable del servidor de ubidots. Se realiza a través de una petición HTTP por la API
  63.     body='{"'+ubi_temperatura+'": "' + str(value) +'"}' # Creación del cuerpo del mensaje
  64.     try: # Bloque de intento de envío de petición HTTP con mensaje estructurado a través de la API
  65.         http_rq = ('POST /api/v1.6/devices/%s ' # Construcción de mensaje con método de envío POST de protocolo HTTP
  66.                    'HTTP/1.1\r\nHost: industrial.api.ubidots.com\r\nX-Auth-Token: '
  67.                    '%s\r\nContent-Type: application/json\r\nContent-Length: '
  68.                    '%s\r\n\r\n%s\r\n' % (ubi_device, ubi_token, len(body), body))
  69.         s = socket.socket() # Crear y abrir un socket virtual para crear una conexión con la API de ubidots
  70.         s.connect(api_route) # Conexión del socket con la API de ubidots
  71.         request = bytes(http_rq, 'utf8') # Variable para empatquetar el mensaje, que se codifica en formato utf-8
  72.         s.send(request) # Hacer el envío de mensaje de datos utf-8 por el socket ya conectado
  73.         led_sending.on() # Activar el LED de envío para que el usuario sepa que se siguen enviando paquetes
  74.         global successful_sendings # Indicar que la variable global se va a modificar de valor en esta función personalizada
  75.         successful_sendings = successful_sendings + 1 # Incrementar el valor de la variable successful_sendings indicando el número de envíos exitosos a Ubidots
  76.         print(successful_sendings, "Envío de datos exitoso...", http_rq) # Mostrar por consola el número de mensaje y la petición construida
  77.         s.close() # Cerrar el socket de envío de datos
  78.         time.sleep(updating_time) # Esperar el tiempo de espera de actualización del valor de la variables antes de enviar otra petición
  79.     except: # Bloque de instrucciones a ejecutar en caso de que se presente un fallo en el intento de petición HTTP
  80.         global failed_sendings # Indicar que la variable global se va a modificar de valor en esta función personalizada
  81.         failed_sendings += 1 # Incrementar el valor de la variable successful_sendings indicando el número de envíos exitosos a Ubidots
  82.         print(failed_sendings, "Error de conexión con el servidor...", http_rq) # Mostrar por consola el número de mensaje erróneo y la petición construida
  83.         led_sending.off() # Desactivar el LED de envío para que el usuario sepa que no se están enviando paquetes de informacion a Ubidots
  84.         time.sleep(1) # Espera de 1 segundo antes de intentar el envío de otro paquete de datos.
  85.  
  86. def ubi_update_humedad(ubi_humedad, value, ubi_device, ubi_token, updating_time): # Función para actualizar el valor en la variable del servidor de ubidots. Se realiza a través de una petición HTTP por la API
  87.     body='{"'+ubi_humedad+'": "' + str(value) +'"}' # Creación del cuerpo del mensaje
  88.     try: # Bloque de intento de envío de petición HTTP con mensaje estructurado a través de la API
  89.         http_rq = ('POST /api/v1.6/devices/%s ' # Construcción de mensaje con método de envío POST de protocolo HTTP
  90.                    'HTTP/1.1\r\nHost: industrial.api.ubidots.com\r\nX-Auth-Token: '
  91.                    '%s\r\nContent-Type: application/json\r\nContent-Length: '
  92.                    '%s\r\n\r\n%s\r\n' % (ubi_device, ubi_token, len(body), body))
  93.         s = socket.socket() # Crear y abrir un socket virtual para crear una conexión con la API de ubidots
  94.         s.connect(api_route) # Conexión del socket con la API de ubidots
  95.         request = bytes(http_rq, 'utf8') # Variable para empatquetar el mensaje, que se codifica en formato utf-8
  96.         s.send(request) # Hacer el envío de mensaje de datos utf-8 por el socket ya conectado
  97.         led_sending.on() # Activar el LED de envío para que el usuario sepa que se siguen enviando paquetes
  98.         global successful_sendings # Indicar que la variable global se va a modificar de valor en esta función personalizada
  99.         successful_sendings = successful_sendings + 1 # Incrementar el valor de la variable successful_sendings indicando el número de envíos exitosos a Ubidots
  100.         print(successful_sendings, "Envío de datos exitoso...", http_rq) # Mostrar por consola el número de mensaje y la petición construida
  101.         s.close() # Cerrar el socket de envío de datos
  102.         time.sleep(updating_time) # Esperar el tiempo de espera de actualización del valor de la variables antes de enviar otra petición
  103.     except: # Bloque de instrucciones a ejecutar en caso de que se presente un fallo en el intento de petición HTTP
  104.         global failed_sendings # Indicar que la variable global se va a modificar de valor en esta función personalizada
  105.         failed_sendings += 1 # Incrementar el valor de la variable successful_sendings indicando el número de envíos exitosos a Ubidots
  106.         print(failed_sendings, "Error de conexión con el servidor...", http_rq) # Mostrar por consola el número de mensaje erróneo y la petición construida
  107.         led_sending.off() # Desactivar el LED de envío para que el usuario sepa que no se están enviando paquetes de informacion a Ubidots
  108.         time.sleep(1) # Espera de 1 segundo antes de intentar el envío de otro paquete de datos.
  109.  
  110. # --------------------------------------------------  
  111. #Sección para indicar la ruta de ejecucion (Se recomienda tener una función principal que controle el flujo del programa)
  112. main_function() # Ejecutar la función principal y todas aquellas contenidas dentro de ella
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement