Los microchips ESP8266, que se puede conectar a una red WIFI, pueden programarse mediante el IDE de Arduino para controlar su conexión serie y sus dos tomas GPIO. Además estos chips aceptan comandos AT a través de su conexión serie, comandos con los que se pueden ejecutar ciertas operaciones para que este chip actúe como servidor o como cliente a través de una conexión WIFI ( https://en.wikipedia.org/wiki/ESP8266 , https://programarfacil.com/podcast/como-configurar-esp01-wifi-esp8266/ ).
El microchip más sencillo de esta familia de chips es el ESP-01 que a pesar de su sencillez y pequeño tamaño nos va permitir desarrollar equipos de gran interés para el INTERNET DE LAS COSAS.
En este post se explica cómo construir un sencillo barómetro con conexión WIFI que presenta las medidas de la presión, la temperatura y la humedad en un display LCD y que trasmite dichas medidas a un servidor donde un script PHP se encarga de guardar esos datos en un fichero al que cualquiera puede acceder remotamente, siempre que tenga los permisos requeridos.
Para la realización de este proyecto (que montaremos sobre una placa de prueba PROTOBOARD ) utilizaremos los siguientes dispositivos (figura 1):
– Una placa ARDUINO MEGA 2560
– Un micrichip BME280
– Un display LCD de 4 líneas con conexión I2C
– Un microchip ESP8266 ( ESP-O1)
Figura 1. Elementos utilizados en nuestro proyecto
Tanto el display LCD como el chip barométrico BME280 tienen conexión I2C y tras ser alimentados con 5 V deberán conectarse a los PINES 20 y 21 ( SDA y SCL ) de la placa ARDUINO. Para saber en qué dirección concreta cada uno de estos dos dispositivos se conecta, usaremos el programa “I2C_scanner” para ARDUINO, programa que podremos encontrar por ejemplo en esta dirección: https://github.com/todbot/arduino-i2c-scanner.
En nuestro caso el LCD se instala en la dirección “0x27” y el chip BME280 en la dirección “0x76” de la conexión I2C .
El microchip ESP-01 debe alimentarse a 3.5 V y a cualquiera de las pines serie (TX y RX) de los que cuenta la placa ARDUINO MEGA. En nuestro caso hemos usado la conexión Serial-3 de los pines 14 y 15 (figura 2).
Figura 2. Pines Serial-3 e I2C de la placa ARDUINO MEGA
A la hora de programar nuestro ARDUINO para ejecutar los comandos AT en el chip ESP-01 debemos recordar que usualmente estos chips utilizan una comunicación en serie con una velocidad de 115200.
Para comprobar que nuestro chip ESP-01 funciona correctamente podemos usar el siguiente programa ARDUINO:
======================================================================
void setup() {
//Begin serial comunication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(115200);
Serial3.begin(115200);
delay(1000);
Serial.println(“Setup Complete!”);
}
void loop()
{
//Read Arduino IDE Serial Monitor
If (Serial3.available()) {
Serial.write(Serial3.read());
}
//Read Arduino IDE Serial Monitor inputs
if(Serial.available()){
Serial3.write(Serial.read());
}
}
==============================================================================
Este programa nos permitirá comunicarnos con el chip ESP-01 mediante los comandos AT usando el monitor serie de la herramienta de programación de ARDUINO. En estos tutoriales https://www.prometec.net/arduino-wifi/ podemos ver cómo realizar estas comprobaciones. La única diferencia que encontraremos con nuestro caso es que en estos tutoriales se usa un ARDUINO UNO en vez de ARDUINO MEGA. Para saber más de estos comandos podemos ir al siguiente link https://hetpro-store.com/comandos-at-esp8266-esp8266ex/ .
Tras hacer el montaje y establecer todas las conexiones estaremos en condiciones de podar enviar nuestros datos del sensor BME280 tanto a nuestro LCD , para visualizarlos, así como a un servidor mediante la conexión WIFI proporciona por el chip ESP8266.
Para controlar todo el proceso usaremos las siguientes LIBRERÍAS:
– <Wire.h>
– <cactus_io_BME280_I2C.h>
– <LCD.h>
– <LiquidCrystal_I2C.h>
– <TimeLib.h>
Y para trabajar con el chip ESP8266 loa siguientes comandos AT:
– AT+CWJAP (con el que nos conectaremos a la red WIFI)
– AT+CWMODE=3 ( para establecer el tipo de conexión)
– AT+CIPSERVER=1,80 (para conectarnos al servidor)
– AT+CIPSTART=0,\”TCP\”,\”IP_o_NOMBRE_del_SERVIDOR\”,80″ (para iniciar el envío de datos)
Y a partir de aquí el proceso se basa en construir una variable llamada data que contienes las observaciones y medir la longitud del texto que se envía , dato que en nuestro caso va determinado en la variable l. El procedimiento de envío de datos se presenta en las siguientes líneas de programa donde la variable valor es la que identifica en el servidor los datos enviados.
================================================================================
Serial.println(“Sending out data…”);
String a=”GET /posted_2.php?valor=”+data+” “;
String l=String(a.length());
Serial3.println(“AT+CIPSEND=0,”+l);
Serial.println(“AT+CIPSEND=0,”+l);
delay(2000);
do{Serial.write(Serial3.read());} while (Serial3.available());
String b=”GET /posted_2.php?valor=”+data;
Serial3.println(b);
Serial.println(b);
delay(2000);
================================================================================
En el servidor deberemos tener alojado un script que en nuestro caso se llama posted_2.php que es el que se encarga de recoger los datos mediante un procedimiento GET. También usamos un script time.php que nos da el contenido del reloj del servidor y con el que sincronizamos los tiempos de ambos dispositivos.
En la figura 3 y 4 se presenta una foto del montaje de los elementos y su aspecto final.
Figura 3. Conexiones de todos los elementos de nuestro barómetro
Figura4. Aspecto final del BARÓMETRO WIFI
El programa ARDUINO completo lo podemos bajar de http://e-ao.org/Apuntes/bme_wifi_5.txt y nuestros scripts PHP son los siguientes:
posted_2.php
<?php
$fp = fopen(“posted_2.txt”,”a”);
$currentDateTime = date(‘Y-m-d H:i:s’);
$var=$_GET[‘valor’];
$currentDateTime = date(‘Y-m-d H:i:s’);
$b=$var . ” “;
$b=$b. $currentDateTime;
fwrite($fp,$b);
fwrite($fp,”\r”);
fwrite($fp,”\n”);
fclose($fp);
echo $currentDateTime;
?>
time.php
<?php
$var=$_GET[‘valor’];
$currentDateTime = date(‘Y-m-d H:i:s’);
echo $currentDateTime;
?>