Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # --------------------------------------------------
- # 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 = "RED_WIFI" # Variable para almacenar el nombre del punto de acceso de red o router || Cambiar por su nombre de RED
- AP_pass = "1234566789" # Variable para almacena la contraseña del punto de acceso de red o router || Cambiar por su contraseña de RED
- ubi_token = "BBUS-ONSOpUKputY7iCZeG4RI9Gquuzb7bz" # Token asociado a la cuenta ubidots || Cambiar por su token en UBIDOTS
- ubi_label = "sensor" # Nombre de la etiqueta de variable que se modifica en Ubidots || Cambiar por su label de variable en UBIDOTS
- ubi_device = "playiot" # 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.
- sensor = ADC(Pin(32)) # Nombre que se le da al pin ADC 33, donde está conectado el sensor humedad del suelo
- sensor.atten(ADC.ATTN_11DB)
- 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.
- 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:
- check_connection_to_wifi() # Función personalizada: Conectarse a red wifi si es necesario
- sensor_value= sensor.read()
- ubi_update(ubi_label, sensor_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.
- # Iniciar el bucle principal
- main_function()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement