Advertisement
tdrobotica

Proyecto Nube entorno

Jan 6th, 2022
1,168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.54 KB | None | 0 0
  1. # --------------------------------------------------
  2. # Descripcion del programa:
  3. # El siguiente programa permite cambiar el color e intensidad de los LED neopixel de la tarjeta a Ubidots, una plataforma de IoT
  4.  
  5. # --------------------------------------------------
  6. # Sección para importar las librerías necesarias
  7. import network # Librería necesaria para funciones de conexión a wifi
  8. from machine import Pin # Librería necesaria para definir pines y configuraciones del dispositivo
  9. import socket # Librería necesaria para crear un objeto "socket" y comunicarse con el servidor que tiene la API de ubidots
  10. import time # Librería necesaria para utilizar esperas de tiempo
  11. import neopixel # Librería necesaria para utilizar LEDs neopixel
  12.  
  13. # --------------------------------------------------
  14. # Sección para definir e inicializar variables, constantes y configuraciones globales
  15. AP_name = "tdrobotica-mobile" # Variable para almacenar el nombre del punto de acceso de red o router || Cambiar por su nombre de RED
  16. AP_pass = "tdrobotica" # Variable para almacena la contraseña del punto de acceso de red o router || Cambiar por su contraseña de RED
  17. ubi_token = "BBFF-FV8H3MXhCpMqWBMJOVHVoS3V2jUUlh" # Token asociado a la cuenta ubidots || Cambiar por su token en UBIDOTS
  18. ubi_red = "led-red" # Nombre de la etiqueta de variable RED que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS
  19. ubi_green = "led-green" # Nombre de la etiqueta de variable GREEN que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS
  20. ubi_blue = "led-blue" # Nombre de la etiqueta de variable BLUE que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS
  21. ubi_led_number = "led-number" # Nombre de la etiqueta de variable LED_NUMBER que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS
  22. ubi_device = "nube-entorno" # Nombre del dispositivo en Ubidots || Cambiar por su nombre de dispositivo en UBIDOTS
  23. 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.
  24. pixels_leds = neopixel.NeoPixel(Pin(4, Pin.OUT), 3) # Crear un neopixel conectado al pin 4 y de 3 LEDs, como es el de la tarjeta PlayIoT
  25. updating_time = 1; # Variable para indicar la cantidad de segundos de espera de actualización del valor del Ubidots en los LEDs de la tarjeta.
  26. successful_receipts = 0;
  27. red_value = 0 # Variable para almacenar el último valor RED-rojo del LED
  28. green_value = 0 # Variable para almacenar el último valor GREEN-verde del LED
  29. blue_value = 0 # Variable para almacenar el último valor BLUE-azul del LED
  30. led_number = 1 # Variable para almacenar el último número del LED a modificar
  31. api_route = ("industrial.api.ubidots.com", 80) # Ruta de conexión a la API de ubidots por el puerto 80 para subir datos
  32. station_interface = network.WLAN(network.STA_IF) # Creación de una interfaz de estación para conectarse al AP (o router) wifi
  33. station_interface.active(True) # Activar la interfaz de estación
  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.         red_value = ubi_get_last_value(ubi_token, ubi_device, ubi_red) # Función personalizada: Obtener el valor de la variable ubidots para el LED rojo
  41.         green_value = ubi_get_last_value(ubi_token, ubi_device, ubi_green) # Función personalizada: Obtener el valor de la variable ubidots para el LED verde
  42.         blue_value = ubi_get_last_value(ubi_token, ubi_device, ubi_blue) # Función personalizada: Obtener el valor de la variable ubidots para el LED verde
  43.         led_number = ubi_get_last_value(ubi_token, ubi_device, ubi_led_number) # Función personalizada: Obtener el valor de la variable ubidots para el número de LED a modificar
  44.         red_value = int(float(red_value)) # Como el valor se almacena como texto, aqui se convierte primero a número decimal y después entero.
  45.         green_value = int(float(green_value)) # Como el valor se almacena como texto, aqui se convierte primero a número decimal y después entero.
  46.         blue_value = int(float(blue_value)) # Como el valor se almacena como texto, aqui se convierte primero a número decimal y después entero.
  47.         led_number = int(float(led_number)) # Como el valor se almacena como texto, aqui se convierte primero a número decimal y después entero.
  48.         time.sleep(updating_time) # esperar el tiempo de actualización configurado antes de modificar el LED indicado
  49.         pixels_leds[led_number-1] = (red_value, green_value, blue_value) # almacenar la información al LED indicado los valores obtenidos
  50.         pixels_leds.write() # activar el LED indicado con los colores indicados RGB
  51.  
  52. # --------------------------------------------------
  53. # Sección para definir las funciones personalizadas auxiliares
  54.  
  55. def check_connection_to_wifi(): # Función para conectarse a Wifi, verificando conexión
  56.     try: # bloque de intento de conexión a WiFi
  57.         station_interface.connect(AP_name , AP_pass) # Conectar la interfaz de estación al WiFi con las credenciales de nombre y contraseña indicados
  58.         print("network config:", station_interface.ifconfig()) # Mostrar mensaje de datos de conexión
  59.     except: # Bloque en caso de que se genere un error al intentar conexión a WiFi
  60.         pass # No realizar acciones
  61.     while not station_interface.isconnected(): # Ciclo condicional hasta que haya conexión
  62.         print("connecting to network...") # Mostrar en consola que se está conectando a la red WiFi
  63.         led_wifi.on() # Encender LED indicador WiFi, para después apagarse
  64.         time.sleep_ms(500) # Tiempo de espera para apagar
  65.         led_wifi.off() # Apagar LED indicador WiFi, para después encenderse de nuevo si aún no hay conexión
  66.         time.sleep_ms(500) # Tiempo de espera para encender de nuevo
  67.     led_wifi.on() #Encender LED indicador WiFi permanente. Si se llega hasta aquí, ya se logró conexión WiFi.
  68.  
  69. def ubi_get_last_value(ubi_token, ubi_device, var):
  70.     try: # Bloque de intento de conexión con servidor de Ubidots para obtener información de variables que controlan LEDs
  71.         http_rq = ('GET /api/v1.6/devices/%s/%s/lv HTTP/1.1\r\nX-Auth-Token: %s\r\n' # Construcción de mensaje con método de recepción de GET de protocolo HTTP
  72.                    'Host: industrial.api.ubidots.com\r\n'
  73.                    'Content-Type: application/json \n\n' % (ubi_device, var, ubi_token))
  74.         s = socket.socket() # Crear y abrir un socket virtual para crear una conexión con la API de ubidots
  75.         s.settimeout(5) # Definir un tiempo de espera máximo de conexión de 5 segundos
  76.         s.connect(api_route) # Conexión del socket con la API de ubidots
  77.         request = bytes(http_rq, 'utf8') # Variable para empatquetar el mensaje, que se codifica en formato utf-8
  78.         s.send(request) # Hacer el envío de mensaje de datos utf-8 con la petición por el socket ya conectado
  79.         res = s.recv(4096).decode() # Leer respuesta y obtener la informacion decodificada.
  80. #        print(res) # mostrar en consola el mensaje completo que se recibe desde el servidor de Ubidots
  81.         last_value = res.replace('\r', '').split('\n')[10] # Ajustar el dato recibido para obtener únicamente el texto de interés que corresponde a la fila 10 del mensaje. Se eliminan caracteres ocultos, se convierte en vector y después se toma el elemento 10.
  82.         global successful_receipts # Indicar que la variable global se va a modificar de valor en esta función personalizada
  83.         successful_receipts = successful_receipts + 1 # Incrementar el valor de la variable successful_sendings indicando el número de envíos exitosos a Ubidots
  84.         print(successful_receipts, "Dato obtenido desde ubidots:", last_value) # Mostrar en consola el número de mensaje recibido desde el encendido de la placa y el dato, como tal. Es texto.
  85.         s.close() # Cerrar el socket de comunicación de datos
  86.         return last_value
  87.     except Exception as e: # Bloque de instrucciones a ejecutar en caso de que se presente un fallo en el intento de petición HTTP. Se almacena el error como "e"  
  88.         print(e) # Mostrar el error de conexión, en caso de haber alguno
  89.         return None # En caso de error, retornar un valor nulo
  90.  
  91. # --------------------------------------------------  
  92. #Sección para indicar la ruta de ejecucion (Se recomienda tener una función principal que controle el flujo del programa)
  93. main_function()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement