Advertisement
tdrobotica

Proyecto de Entorno a la Nube

Jan 6th, 2022
585
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.53 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 = "tdrobotica-mobile" # Variable para almacenar el nombre del punto de acceso de red o router || Cambiar por su nombre de RED
  17. AP_pass = "tdrobotica" # 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-FV8H3MXhCpMqWBMJOVHVoS3V2jUUlh" # Token asociado a la cuenta ubidots || Cambiar por su token en UBIDOTS
  19. ubi_label = "pot" # Nombre de la etiqueta de variable que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS
  20. ubi_device = "play_iot" # 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. pot = ADC(Pin(32)) # Nombre que se le da al pin ADC 32, donde está conectado el potenciómetro
  23. 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.
  24. 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.
  25. led_sending.off() # Se inicia el pin 12 que tienen conectado el LED de envío de datos a apagado.
  26. led_wifi.off() # Se inicia el pin 13 que tiene contectado un LED a apagado.
  27. pot_value = 0 # Variable para almacenar el valor del pin. Se inicializa en 0
  28. pot.atten(ADC.ATTN_11DB) # Leer el pin ADC 32 de 0 a 3.6V
  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.         pot_value = pot.read() # leer valor del potenciometro (pin ADC 32) y almacenarlo
  41.         ubi_update(ubi_label, pot_value, ubi_device, ubi_token, updating_time) # Función personalizada: actualizar el valor almacenado en la variable creada en ubidots
  42.  
  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. #Sección para indicar la ruta de ejecucion (Se recomienda tener una función principal que controle el flujo del programa)
  86. main_function() # Ejecutar la función principal y todas aquellas contenidas dentro de ella
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement