Seguimos avanzando en nuestro proyecto usando en NodeMcu como servidor, pero ahora vamos a añadir un dispositivo BME280 que por medio de un puerto serie, vamos a obtener los datos de Temperatura, presión y Humedad
Como siempre, tenemos que instalar nuestras librerías para poder comunicarnos con éste componente.
La idea sobre la que se desarrolla este proyecto es el control de instalaciones en el campo ( granjas, invernaderos, depósitos de agua, etc ) con comunicaciones basadas en GPRS, 3G o 4G.
Nos encontraremos con el problema que en telefonía móvil, aunque tengamos acceso a los puertos del router para abrir el puerto 80, el proveedor de Internet no lo va a permitir, dado que nuestra IP es compartida.
Lo primero es conocer un poco sobre el módulo sensor BME280, usado con el ESP8266 para leer la presión, la temperatura, la humedad y la altitud (dado que la presión cambia con la altitud, también puede estimar la altitud.). El sensor BME280 utiliza el protocolo de comunicación I2C o SPI para intercambiar datos con la placa NodeMcu.
Se explicará cómo conectar el sensor al ESP8266, instalar las bibliotecas necesarias y escribir un sencillo esquema que muestre las lecturas del sensor. En una segunda parte, grabaremos los datos en una base de datos MySql.
Vamos a usar la comunicación I2C con el módulo de sensores BME280. Para ello, conecte el sensor a los pines SDA y SCL del ESP8266, como se muestra en el siguiente diagrama.
Para obtener lecturas del módulo de sensores de la BME280 es necesario
utilizar la biblioteca Adafruit_BME280. Siga los siguientes pasos para
instalar la biblioteca en su IDE de Arduino:
1º Abra su IDE de Arduino y vaya a Programa > Incluir librería > Gestionar
librerías. El Administrador de Librerías debería abrirse.
Busque "adafruit bme280 " en el cuadro de búsqueda e instale la biblioteca.
Dejamos una imagen del proceso, aunque en nuestro caso, ya la tenemos
instalada en el IDE
Para usar la biblioteca BME280, también necesita instalar la biblioteca
Adafruit_Sensor. Siga los siguientes pasos para instalar la biblioteca en su
IDE de Arduino:
Vaya a Programa > Incluir librería > Gestionar librerías y escriba "Adafruit
Unified Sensor" en el cuadro de búsqueda. Desplácese hacia abajo para
encontrar la biblioteca e instalarla. También la tenemos instalada.
Una vez que hemos instalado las librerías, y con los archivos html y Css de la práctica anterior (Servidor web con NodeMCU ) , vamos a cargar nuestro programa con el nuevo código de la estación meteorológica.
Cuidado. Podemos encontrarnos con el error:
Could not find
a valid BME280 sensor, check wiring!
En este caso, es conveniente que miremos la posible Solución que dejamos al final de la página
El siguiente paso es mandar un email desde nuestro nodeMCU. La idea es
avisar si un determinado valor excede de uno fijado, por ejemplo, nos avise
si la temperatura excede de 25 grados
Si tenemos en cuenta el trabajo desarrollado por -->https://randomnerdtutorials.com/esp32-esp8266-send-email-notification/<--
tenemos que la respuesta del servidor no es adecuada.
Vamos a explicarlo por pasos. Dejamos el archivo de prueba ( donde hemos quitado el BME 280 para simplificar ). Bajar archivo AQUI
El archivo que va a recibir los datos del nodeMCU debe estar alojado donde dice
const char* serverName = "tudominio.es/email-notification.php";
Tenemos que sustituir tudominio.es por el dominio nuestro y crear un archivo email-notification.php donde vamos a poner nuestro código php
Bajamos de internet el edito Lopeedit para modificar este archivo
Dejamos el archivo php AQUI email-notification.php
<?phpEl primer problema que vamos a encontrar es el siguiente:
Conectamos con la url
http.begin(serverName);
// Ahora especificamos el contenido de cabecera
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Se prepara los datos para el envio de HTTP POST
String httpRequestData = "api_key=" +
apiKeyValue + "";
// solo vamos a mandar una variable , la api key , para probar el código.
//Vemos en consola los datos que mandamos
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
Enviamos los datos a la url con la información que nos interesa ( por POST
)
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
//Vemos la respuesta que nos dá nuestro servidor por medio de
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
// en estas dos líneas es donde vamos a obtener la respuesta del servidor
String payload = http.getString();
Serial.println(payload); //Print request response payload
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
http.end();
}
Terminado todo esto nos encontramos con un mensaje largo donde podemos ver
el siguiente texto
This site requires Javascript to work, please enable Javascript in your
browser or use a browser with Javascript support
La razón es la siguiente
Los hosting, y sobre todos los compartidos, y más aún los gratuitos, tienen un sistema de seguridad que ayuda a proteger los sitios web contra los robots. Este mensaje es el propio del sistema de seguridad, porque no se ha detectado que la consulta se haga desde un navegador, sino un dispositivo IOT como nuestro NodeMCU
Si hacemos lo mismo en otro servidor sin estas limitaciones, tenemos la respuesta ok 200 con el envío de email.
Por tanto, es muy importante que antes de seguir con esta práctica,
comprobemos que nuestro hosting va a aceptar una petición POST desde un IOT
La solución (pendiente de confirmar ) está en el tipo gestor de
archivos del servidor, Nginx o Apache.
Donde he realizado las pruebas es un servidor del la empresa OVH, tipo VPS
donde se utiliza plesk para configurar el servidor.
Para uno de los dominios, tengo
Apache & nginx Settings for midominio.ovh
Proxy mode: Nginx proxies requests to Apache. Turn off to stop using Apache.
Lo primero es crear nuestra base de datos y obtener las credenciales para poder entrar por MysqlAdmin.
Luego hacemos una consulta Sql con el siguiente texto
Problema de reconocimiento del BME 280
A veces nos encontramos con el siguiente mensaje de error
Could not find
a valid BME280 sensor, check wiring!
A pesar de tener todas las librerías instaladas y las conexiones correctas,
el BME 280 no funciona
Solución
1º Debemos de encontrar por qué dirección se comunica el BME con nuestro
microcontrolador. para ello, vamos a hacer un test de direcciones para
comprobar si es la 0x76 o la 0x77
Cargar y ejecutar el siguiente programa para
Comprobar la dirección del BME 280 Aquí
2º Si tu dirección es 0x77 no tienes que cambiar nada
Si su dirección es diferente y no tenemos una librería actualizada, donde se
consideren las dos direcciones, proceder de la siguiente manera
a) Localizar el archivo de la biblioteca Adafruit_BME280.h - normalmente se
guarda en
C:\Users\Usuario\Documents\Arduino\libraries\Adafruit_BME280_Library
b) Encontrar #definir BME280_ADDRESS (0x76) y cambiar a su dirección
escaneada.
Ahora comprobamos si funciona
Si todavía tienes el mismo problema, abre el archivo Adafruit_BME280.cpp -
que está junto al archivo anterior
Encontrar
_sensorID = read8(BME280_REGISTER_CHIPID);
if (_sensorID != 0x60)
return false;
Y sustituir por
_sensorID = read8(BME280_REGISTER_CHIPID);
if (_sensorID != 0x60)
// return false;
En esta última prueba, la biblioteca de adafruit comprueba el CHIPID y su
chipid es diferente de lo que vende adafruit.
Diseño PCB Principios básicos de antenas