# -------------------------------------------------- # Descripcion del programa: # El siguiente programa permite cambiar el color e intensidad de los LED neopixel de la tarjeta a Ubidots, una plataforma de IoT # -------------------------------------------------- # Sección para importar las librerías necesarias import network # Librería necesaria para funciones de conexión a wifi from machine import Pin # Librería necesaria para definir pines y configuraciones del dispositivo import socket # Librería necesaria para crear un objeto "socket" y comunicarse con el servidor que tiene la API de ubidots import time # Librería necesaria para utilizar esperas de tiempo import neopixel # Librería necesaria para utilizar LEDs neopixel # -------------------------------------------------- # Sección para definir e inicializar variables, constantes y configuraciones globales AP_name = "tdrobotica-mobile" # Variable para almacenar el nombre del punto de acceso de red o router || Cambiar por su nombre de RED AP_pass = "tdrobotica" # Variable para almacena la contraseña del punto de acceso de red o router || Cambiar por su contraseña de RED ubi_token = "BBFF-FV8H3MXhCpMqWBMJOVHVoS3V2jUUlh" # Token asociado a la cuenta ubidots || Cambiar por su token en UBIDOTS ubi_red = "led-red" # Nombre de la etiqueta de variable RED que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS ubi_green = "led-green" # Nombre de la etiqueta de variable GREEN que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS ubi_blue = "led-blue" # Nombre de la etiqueta de variable BLUE que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS 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 ubi_device = "nube-entorno" # Nombre del dispositivo en Ubidots || Cambiar por su nombre de dispositivo en UBIDOTS 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. 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 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. successful_receipts = 0; red_value = 0 # Variable para almacenar el último valor RED-rojo del LED green_value = 0 # Variable para almacenar el último valor GREEN-verde del LED blue_value = 0 # Variable para almacenar el último valor BLUE-azul del LED led_number = 1 # Variable para almacenar el último número del LED a modificar api_route = ("industrial.api.ubidots.com", 80) # Ruta de conexión a la API de ubidots por el puerto 80 para subir datos station_interface = network.WLAN(network.STA_IF) # Creación de una interfaz de estación para conectarse al AP (o router) wifi station_interface.active(True) # Activar la interfaz de estación # -------------------------------------------------- # Sección para definir funcion principal def main_function(): while(True): # Ciclo repetitivo infinito check_connection_to_wifi() # Función personalizada: Conectarse a red wifi si es necesario 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 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 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 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 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. 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. 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. 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. time.sleep(updating_time) # esperar el tiempo de actualización configurado antes de modificar el LED indicado pixels_leds[led_number-1] = (red_value, green_value, blue_value) # almacenar la información al LED indicado los valores obtenidos pixels_leds.write() # activar el LED indicado con los colores indicados RGB # -------------------------------------------------- # Sección para definir las funciones personalizadas auxiliares def check_connection_to_wifi(): # Función para conectarse a Wifi, verificando conexión try: # bloque de intento de conexión a WiFi station_interface.connect(AP_name , AP_pass) # Conectar la interfaz de estación al WiFi con las credenciales de nombre y contraseña indicados print("network config:", station_interface.ifconfig()) # Mostrar mensaje de datos de conexión except: # Bloque en caso de que se genere un error al intentar conexión a WiFi pass # No realizar acciones while not station_interface.isconnected(): # Ciclo condicional hasta que haya conexión print("connecting to network...") # Mostrar en consola que se está conectando a la red WiFi led_wifi.on() # Encender LED indicador WiFi, para después apagarse time.sleep_ms(500) # Tiempo de espera para apagar led_wifi.off() # Apagar LED indicador WiFi, para después encenderse de nuevo si aún no hay conexión time.sleep_ms(500) # Tiempo de espera para encender de nuevo led_wifi.on() #Encender LED indicador WiFi permanente. Si se llega hasta aquí, ya se logró conexión WiFi. def ubi_get_last_value(ubi_token, ubi_device, var): try: # Bloque de intento de conexión con servidor de Ubidots para obtener información de variables que controlan LEDs 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 'Host: industrial.api.ubidots.com\r\n' 'Content-Type: application/json \n\n' % (ubi_device, var, ubi_token)) s = socket.socket() # Crear y abrir un socket virtual para crear una conexión con la API de ubidots s.settimeout(5) # Definir un tiempo de espera máximo de conexión de 5 segundos s.connect(api_route) # Conexión del socket con la API de ubidots request = bytes(http_rq, 'utf8') # Variable para empatquetar el mensaje, que se codifica en formato utf-8 s.send(request) # Hacer el envío de mensaje de datos utf-8 con la petición por el socket ya conectado res = s.recv(4096).decode() # Leer respuesta y obtener la informacion decodificada. # print(res) # mostrar en consola el mensaje completo que se recibe desde el servidor de Ubidots 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. global successful_receipts # Indicar que la variable global se va a modificar de valor en esta función personalizada successful_receipts = successful_receipts + 1 # Incrementar el valor de la variable successful_sendings indicando el número de envíos exitosos a Ubidots 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. s.close() # Cerrar el socket de comunicación de datos return last_value 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" print(e) # Mostrar el error de conexión, en caso de haber alguno return None # En caso de error, retornar un valor nulo # -------------------------------------------------- #Sección para indicar la ruta de ejecucion (Se recomienda tener una función principal que controle el flujo del programa) main_function()