# -------------------------------------------------- # Descripcion del programa: # El siguiente programa permite subir el valor del pin análogo 32 de la tarjeta a Ubidots, una plataforma de IoT # Esta acción se realiza cada 4 segundos. # -------------------------------------------------- # Sección para importar las librerías necesarias import network # Librería necesaria para funciones de conexión a wifi from machine import Pin # Clase Pin de la librería machine necesaria para definir pines digitales y configuraciones de los mismos from machine import ADC # Clase ADC de la librería machine necesaria para definir pines analógicos y configuraciones de los mismos 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 # -------------------------------------------------- # 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_label = "pot" # Nombre de la etiqueta de variable que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS ubi_device = "play_iot" # Nombre del dispositivo en Ubidots || Cambiar por su nombre de dispositivo en UBIDOTS updating_time = 4; # Variable para indicar la cantidad de segundos de espera de actualización del valor del potenciómetro en Ubidots. pot = ADC(Pin(32)) # Nombre que se le da al pin ADC 32, donde está conectado el potenciómetro 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. 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. led_sending.off() # Se inicia el pin 12 que tienen conectado el LED de envío de datos a apagado. led_wifi.off() # Se inicia el pin 13 que tiene contectado un LED a apagado. pot_value = 0 # Variable para almacenar el valor del pin. Se inicializa en 0 pot.atten(ADC.ATTN_11DB) # Leer el pin ADC 32 de 0 a 3.6V 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 successful_sendings = 0 # contador de envíos exitosos failed_sendings = 0 # contador de envíos erróneos # -------------------------------------------------- # 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 pot_value = pot.read() # leer valor del potenciometro (pin ADC 32) y almacenarlo 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 # -------------------------------------------------- # 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_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 body='{"'+ubi_label+'": "' + str(value) +'"}' # Creación del cuerpo del mensaje try: # Bloque de intento de envío de petición HTTP con mensaje estructurado a través de la API http_rq = ('POST /api/v1.6/devices/%s ' # Construcción de mensaje con método de envío POST de protocolo HTTP 'HTTP/1.1\r\nHost: industrial.api.ubidots.com\r\nX-Auth-Token: ' '%s\r\nContent-Type: application/json\r\nContent-Length: ' '%s\r\n\r\n%s\r\n' % (ubi_device, ubi_token, len(body), body)) s = socket.socket() # Crear y abrir un socket virtual para crear una conexión con la API de ubidots 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 por el socket ya conectado led_sending.on() # Activar el LED de envío para que el usuario sepa que se siguen enviando paquetes global successful_sendings # Indicar que la variable global se va a modificar de valor en esta función personalizada successful_sendings = successful_sendings + 1 # Incrementar el valor de la variable successful_sendings indicando el número de envíos exitosos a Ubidots print(successful_sendings, "Envío de datos exitoso...", http_rq) # Mostrar por consola el número de mensaje y la petición construida s.close() # Cerrar el socket de envío de datos time.sleep(updating_time) # Esperar el tiempo de espera de actualización del valor de la variables antes de enviar otra petición except: # Bloque de instrucciones a ejecutar en caso de que se presente un fallo en el intento de petición HTTP global failed_sendings # Indicar que la variable global se va a modificar de valor en esta función personalizada failed_sendings += 1 # Incrementar el valor de la variable successful_sendings indicando el número de envíos exitosos a Ubidots 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 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 time.sleep(1) # Espera de 1 segundo antes de intentar el envío de otro paquete de datos. # -------------------------------------------------- #Sección para indicar la ruta de ejecucion (Se recomienda tener una función principal que controle el flujo del programa) main_function() # Ejecutar la función principal y todas aquellas contenidas dentro de ella