Advertisement
tdrobotica

Envió de datos IOT

Jun 13th, 2025 (edited)
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.14 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. from machine import ADC # Clase ADC de la librería machine necesaria para definir pines analógicos y configuraciones de los mismos
  11. import socket # Librería necesaria para crear un objeto "socket" y comunicarse con el servidor que tiene la API de ubidots
  12. import time # Librería necesaria para utilizar esperas de tiempo
  13.  
  14. # --------------------------------------------------
  15. # Sección para definir e inicializar variables, constantes y configuraciones globales
  16. AP_name = "RED_WIFI" # Variable para almacenar el nombre del punto de acceso de red o router || Cambiar por su nombre de RED
  17. AP_pass = "1234566789" # Variable para almacena la contraseña del punto de acceso de red o router || Cambiar por su contraseña de RED
  18. ubi_token = "BBUS-ONSOpUKputY7iCZeG4RI9Gquuzb7bz" # Token asociado a la cuenta ubidots || Cambiar por su token en UBIDOTS
  19. ubi_label = "sensor" # Nombre de la etiqueta de variable que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS
  20. ubi_device = "playiot" # Nombre del dispositivo en Ubidots || Cambiar por su nombre de dispositivo en UBIDOTS
  21. updating_time = 4; # Variable para indicar la cantidad de segundos de espera de actualización del valor del potenciómetro en Ubidots.
  22. sensor = ADC(Pin(32)) # Nombre que se le da al pin ADC 33, donde está conectado el sensor humedad del suelo
  23. sensor.atten(ADC.ATTN_11DB)
  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. api_route = ("industrial.api.ubidots.com", 80) # Ruta de conexión a la API de ubidots por el puerto 80 para subir datos
  29. station_interface = network.WLAN(network.STA_IF) # Creación de una interfaz de estación para conectarse al AP (o router) wifi
  30. station_interface.active(True) # Activar la interfaz de estación
  31. successful_sendings = 0 # contador de envíos exitosos
  32. failed_sendings = 0 # contador de envíos erróneos
  33.  
  34.  
  35. # --------------------------------------------------
  36. # Sección para definir funcion principal
  37.  
  38. def main_function():
  39.     while True:
  40.         check_connection_to_wifi() # Función personalizada: Conectarse a red wifi si es necesario
  41.         sensor_value= sensor.read()
  42.         ubi_update(ubi_label, sensor_value, ubi_device, ubi_token, updating_time) # Función personalizada: actualizar el valor almacenado en la variable creada en ubidots
  43. # --------------------------------------------------
  44. # Sección para definir las funciones personalizadas auxiliares
  45.  
  46. def check_connection_to_wifi(): # Función para conectarse a Wifi, verificando conexión
  47.     try: # bloque de intento de conexión a WiFi
  48.         station_interface.connect(AP_name, AP_pass) # Conectar la interfaz de estación al WiFi con las credenciales de nombre y contraseña indicados
  49.         print("network config:", station_interface.ifconfig()) # Mostrar mensaje de datos de conexión
  50.     except: # Bloque en caso de que se genere un error al intentar conexión a WiFi
  51.         pass # No realizar acciones
  52.     while not station_interface.isconnected(): # Ciclo condicional hasta que haya conexión
  53.         print("connecting to network...") # Mostrar en consola que se está conectando a la red WiFi
  54.         led_wifi.on() # Encender LED indicador WiFi, para después apagarse
  55.         time.sleep_ms(500) # Tiempo de espera para apagar
  56.         led_wifi.off() # Apagar LED indicador WiFi, para después encenderse de nuevo si aún no hay conexión
  57.         time.sleep_ms(500) # Tiempo de espera para encender de nuevo
  58.     led_wifi.on() #Encender LED indicador WiFi permanente. Si se llega hasta aquí, ya se logró conexión WiFi.
  59.  
  60. def ubi_update(ubi_label, 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
  61.     body='{"'+ubi_label+'": "' + str(value) +'"}' # Creación del cuerpo del mensaje
  62.     try: # Bloque de intento de envío de petición HTTP con mensaje estructurado a través de la API
  63.         http_rq = ('POST /api/v1.6/devices/%s ' # Construcción de mensaje con método de envío POST de protocolo HTTP
  64.                    'HTTP/1.1\r\nHost: industrial.api.ubidots.com\r\nX-Auth-Token: '
  65.                    '%s\r\nContent-Type: application/json\r\nContent-Length: '
  66.                    '%s\r\n\r\n%s\r\n' % (ubi_device, ubi_token, len(body), body))
  67.         s = socket.socket() # Crear y abrir un socket virtual para crear una conexión con la API de ubidots
  68.         s.connect(api_route) # Conexión del socket con la API de ubidots
  69.         request = bytes(http_rq, 'utf8') # Variable para empatquetar el mensaje, que se codifica en formato utf-8
  70.         s.send(request) # Hacer el envío de mensaje de datos utf-8 por el socket ya conectado
  71.         led_sending.on() # Activar el LED de envío para que el usuario sepa que se siguen enviando paquetes
  72.         global successful_sendings # Indicar que la variable global se va a modificar de valor en esta función personalizada
  73.         successful_sendings = successful_sendings + 1 # Incrementar el valor de la variable successful_sendings indicando el número de envíos exitosos a Ubidots
  74.         print(successful_sendings, "Envío de datos exitoso...", http_rq) # Mostrar por consola el número de mensaje y la petición construida
  75.         s.close() # Cerrar el socket de envío de datos
  76.         time.sleep(updating_time) # Esperar el tiempo de espera de actualización del valor de la variables antes de enviar otra petición
  77.     except: # Bloque de instrucciones a ejecutar en caso de que se presente un fallo en el intento de petición HTTP
  78.         global failed_sendings # Indicar que la variable global se va a modificar de valor en esta función personalizada
  79.         failed_sendings += 1 # Incrementar el valor de la variable successful_sendings indicando el número de envíos exitosos a Ubidots
  80.         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
  81.         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
  82.         time.sleep(1) # Espera de 1 segundo antes de intentar el envío de otro paquete de datos.
  83.  
  84.  
  85. # Iniciar el bucle principal
  86. main_function()
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement