Micropython: Publicando datos en Thingspeak (3)

En los artículos anteriores de esta serie dedicada al uso de Thingspeak vimos primero los distintos tipos de protocolos, analizando con mas detenimiento HTTP y los métodos GET y POST para enviar datos. Luego vimos en detalle los pasos para crear una cuenta en Thingspeak y como configurar un canal para recibir esos datos. En este tercer artículo les voy a mostrar mas específicamente como enviar los datos a Thingspeak desde una placa con un programa escrito en Micropython.

Si te perdiste los artículos anteriores de esta serie, te recomiendo que los leas antes de continuar:

Micropython: Publicando datos en Thingspeak (1): El protocolo HTTP

Micropython: Publicando datos en Thingspeak (2): Canales en Thingspeak


Habíamos visto que enviar información usando el método GET del protocolo HTTP es bastante simple, sólo requiere agregar los parámetros o variables luego del símbolo ? en la URL, separados con el símbolo &, como en el siguiente ejemplo:

www.ejemplo.com/prog.php?dato1=100&dato2=200

También vimos que una vez creado y configurado un canal en Thingspeak podíamos ver en la solapa API Keys las distintas direcciones (URLs) que debemos emplear con el método GET para realizar distintas acciones, como escribir datos en un canal.

Método GET para escribir un dato en el canal

Y que podíamos probar el funcionamiento desde el mismo navegador, sin necesidad de tener una placa real con sensores enviando datos, simplemente haciendo una solicitud HTTP a la dirección especificada, incluyendo la API Key que les asignó Thingspeak en el momento de crear el canal y unos datos de prueba, que simulaban valores de temperatura y humedad provenientes de un sensor:

Enviando datos con el navegador

Ahora vamos a hacer lo mismo, pero desde nuestra placa y a través de un programa escrito en MIcropython. Verán que es muy sencillo, sólo consiste en leer los datos del sensor y “armar” la solicitud HTTP con toda la información necesaria.

El circuito

Para esta prueba voy a emplear un circuito sencillo con un sensor de temperatura y humedad DHT11 conectado a un ESP32, como el que utilicé en un artículo anterior en el que expliqué cómo conectar el DHT11:

Circuito para medir temperatura y humedad

Como se puede ver es un circuito mínimo, con el sensor alimentado con 3,3 voltios provenientes del ESP32 y el pin de datos conectado a D5. La alimentación depende de la conexión USB a la computadora que usaremos para escribir el programa.

El programa

El programa completo para enviar los datos de temperatura y humedad medidos por el DHT11 se puede ver a continuación:

#Envia temperatura y humedad a Thingspeak

import network, time, urequests
from dht import DHT11
from machine import Pin

def conectaWifi (red, password):
      global miRed
      miRed = network.WLAN(network.STA_IF)     
      if not miRed.isconnected():              #Si no está conectado…
          miRed.active(True)                   #activa la interface
          miRed.connect(red, password)         #Intenta conectar con la red
          print('Conectando a la red', red +"…")
          timeout = time.time ()
          while not miRed.isconnected():           #Mientras no se conecte..
              if (time.ticks_diff (time.time (), timeout) > 10):
                  return False
      return True

sensorDHT = DHT11 (Pin(5))

if conectaWifi ("nombre", "clave"):

    print ("Conexión exitosa!")
    print('Datos de la red (IP/netmask/gw/DNS):', miRed.ifconfig())
      
    url = "https://api.thingspeak.com/update?api_key=*************"  
    
    while (True):
        time.sleep (60)
        sensorDHT.measure ()

        temp=sensorDHT.temperature ()
        hum=sensorDHT.humidity()

        print ("T={:02d} ºC, H={:02d} %".format (temp,hum))

        respuesta = urequests.get(url+"&field1="+str(temp)+"&field2="+str(hum))
        print(respuesta.text)
        print (respuesta.status_code)
        respuesta.close ()
 
else:
       print ("Imposible conectar")
       miRed.active (False)

Analicemos el funcionamiento de este código:

En las primeras líneas se importan los módulos o métodos que serán necesarios. Network es para la conexión Wifi, time para los retardos de tiempo, dht para el sensor y machine para los pines de GPIO. Todos estos los hemos usado antes. El módulo nuevo que utilizamos en este programa es urequest, que incluye todos los métodos necesarios para utilizar el protocolo HTTP, así como GET y POST.

Luego, desde la línea 7 tenemos la función conectaWifi, que nos sirve para acceder a la red y que también ya hemos visto en ejemplos anteriores.

En la línea 20 se instancia el objeto que nos sirve para acceder al sensor DHT11.

En la línea 22 intentamos conectarnos a la red Wifi y si tenemos éxito mostramos los datos de la red en las líneas 24 y 25.

En la línea 27 tenemos algo muy importante. En una variable tipo string empezamos a “armar” la URL que debemos usar para acceder a Thingspeak. Por ahora, le cargamos lo que copiemos del sitio de Thingspeak, en la pestaña API Keys y que ya usamos en los ejemplos, la URL con nuestra API Key (en el código yo puse asteriscos, ustedes incluyan su API Key)

Luego en la línea 29 comenzamos un bucle dentro del cual hacemos un retardo de 1 minuto (60 segundos) antes de leer el sensor (línea 31).

Obtenemos los datos del sensor en las líneas 33 y 34 y los guardamos en las variables temp y hum. En la línea 36 se imprimen en la consola para que podamos ver los valores leídos y tener algún control.

En la línea 38 es donde se hace la magia. La copio nuevamente para analizarla con atención:

respuesta = urequests.get(url + "&field1=" + str(temp) + "&field2=" + str(hum))

Con esta línea de código enviamos los datos a Thingspeak. Llamamos al método urequest.get para establecer una conexión con el servidor usando el método GET en la dirección especificada por la variable url (que ya habíamos preparado) pero le agregamos a continuación (concatenando texto con el símbolo +) los strings “&field1=” y “&field2=” seguidos del contenido de las variables temp y hum convertidos a string con la función str. Lo que hace no es otra cosa que “armar” la URL de Thingspeak con los datos reales leídos desde el sensor de una forma similar a como lo hicimos al principio del artículo con datos simulados. El método devuelve una información que guardamos en la variable respuesta.

En las líneas 39 y 40 se imprimen los valores de respuesta, saber si los datos fueron recibidos correctamente o no (aunque si hubo algún error no lo tenemos en cuenta)

En la línea 41 cerramos la conexión con Thingspeak.

Finalmente de la línea 43 nos ocupamos del caso de que no hayamos podido establecer la conexión con la red Wifi.

Después de unos minutos funcionando, la consola nos muestra los distintos valores enviados y los resultados devueltos por Thingspeak:

El código 200 significa que la solicitud realizada tuvo éxito y es propio del protocolo HTTP. El otro valor lo devuelve Thingspeak y es un contador de datos recibidos. Si algo funciona mal en la conexión con el servidor podemos recibir alguno de los distintos códigos HTTP de respuesta y deberemos actuar según cada caso.

Si ahora accedemos a Thingspeak, podemos ver los datos recibidos desde el sensor:

Paneles de información en Thingspeak

Conclusión

Vimos un método simple y básico para conectarnos con Thingspeak y enviar información, usando a modo de ejemplo un sensor de temperatura y humedad.

El circuito empleado sirve sólo fines demostrativos. Una cadencia de un dato cada minuto seguramente es innecesaria para una aplicación real, sobre todo para la temperatura y humedad ambiente, que varía mas lentamente. Además, el circuito se alimenta desde la interfaz USB, razón por la cual no nos preocupamos por el consumo de energía, algo a tener en cuenta si utilizamos algún tipo de batería.

El programa propuesto puede usarse como una plantilla o esqueleto, sobre el cual agregar mejoras teniendo en cuenta las distintas excepciones que pueden ocurrir, por ejemplo al realizar la conexión con el servidor.

En otros artículos de esta misma serie veremos que funciones adicionales nos ofrece Thingspeak con los datos ya recibidos.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: