Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # --------------------------------------------------
- # 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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement