miércoles, 30 de diciembre de 2020

Temperatura, presion y humedad con BME280+Web server

Hace tiempo utilicé el sensor de presión BMP280, pero recientemente navegando por la red me topé con este sensor BME280.
La verdad que me pareció interesante pues es un sensor bastante completo que integra medición de presión atmosférica, temperatura y humedad relativa. Actualmente me encuentro desarrollando un prototipo de un tiesto inteligente(que pronto publicaré) y estoy valorando que este pueda ser un buen candidato para incluir en la sensórica del prototipo, sobre todo por su buena relación calidad-precio.
Al igual que sus hermanos BMP está basado en la tecnología BOSCH piezo-resistiva, gozando de una gran precisión, estabilidad y linealidad en sus mediciones.


Especificaciones técnicas

  • Voltaje de Operación: 1.8V - 3.3V DC
  • Interfaz de comunicación: I2C o SPI (3.3V)
  • Rango de Presión: 300 a 1100 hPa (0.3-1.1bar)
  • Resolución: 0.16 Pa
  • Precisión absoluta: 1 hPa
  • Rango de Temperatura: -40°C a 85°C
  • Resolución de temperatura: 0.01°C
  • Precisión Temperatura: 1°C
  • Rango de Humedad Relativa: 0-100% RH
  • Precisión de HR: +-3%
  • Rango de altura medible: 0-9100 metros
  • Bajo consumo de energía
  • Completamente calibrado
  • Frecuencia de Muestreo: 157 Hz (máx.)

datasheet: 
http://www.embeddedadventures.com/datasheets/BME280.pdf


Elementos empleados:

BME280-> Wemos D1 mini

Últimamente estoy utilizando bastante el Wemos, es pequeñín barato y muy potente.
Aunque esté realizado el tutorial con este micro, podrías utilizar perfectamente Arduino. Es muy importante seguir los pasos de las librerías y si utilizas Wemos debes de tener instalada la placa en el IDE de Arduino.


Pinout

Muy sencillo, Alimentacion 3.3V, GND y los pines de comunicación I2C configurados en los pines del Wemos D1 y D2.

Vcc-> 3.3V
Gnd-> Gnd
Scl-> D1
Sda-> D2



Pasemos a la parte del código...

Librerías a añadir

Hay opciones para prescindir de librería, pero yo no me he querido complicar. Usaremos la librería "Adafruit BME280" y la librería "Adafruit unified sensor". Las podemos encontrar en el gestor de librerías del IDLE.




Sketch

Para desarrollar el Sketch de Arduino me he basado en información de la red y después lo he adaptado a mi necesidad. Dentro de las opciones que encontré, di con una que utilizaban ESP 8266 NodeMCU, así que lo adapté para mi Wemos D1 mini.


#include <ESP8266WebServer.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;

/*Definimos variables*/
float temperatura, humedad, presion, altitud;

/*Parametros wifi y definimos server*/
const char* ssid = "***********";  // Nombre de nuestra Red wifi
const char* password = "*********";  //Contraseña de la red wifi
ESP8266WebServer server(80);              
 
void setup() {
  Serial.begin(115200);
  delay(100);
  bme.begin(0x76);   

  Serial.println("Conectando a ");
  Serial.println(ssid);

/*Llama a funcion WiFi.begin que conecta a nuestra wifi*/
  WiFi.begin(ssid, password);
  
/*Comprueba si esta conectado a la red wifi*/
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi conectado..!");
  Serial.print("IP: ");  Serial.println(WiFi.localIP());

  server.on("/", handle_OnConnect);
  server.onNotFound(handle_NotFound);
  
  server.begin();
  Serial.println("HTTP server iniciado");

}

void loop() {
  server.handleClient();
}

/*FUNCIONES*/

/*Funcion toma de datos de BME, almacena en variables y envia a nuestro servidor*/
void handle_OnConnect() {
  temperatura = bme.readTemperature();
  humedad = bme.readHumidity();
  presion = bme.readPressure() / 100.0F;
  altitud = bme.readAltitude(SEALEVELPRESSURE_HPA);
  server.send(200, "text/html", SendHTML(temperatura,humedad,presion,altitud)); 
}

/*Funcion muestra de error*/
void handle_NotFound(){
  server.send(404, "text/plain", "No encontrado");
}

/*Función String para envío de variables almacenadas a nuestro servidor HTML*/
/*Podemos configurar la visualización(tamaño letra, fuente, color, márgenes,...) así como la estructura del servidor web*/

String SendHTML(float temperatura,float humedad,float presion,float altitud){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>Wemos Sensor BME280</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #161717;margin: 50px auto 30px;}\n";
  ptr +="p {font-size: 26px;color: #205269;margin-bottom: 12px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<div id=\"webpage\">\n";
  ptr +="<h1>Wemos Sensor BME280</h1>\n";
  ptr +="<p>Temperatura: ";
  ptr +=temperatura;
  ptr +="&deg;C</p>";
  ptr +="<p>Humedad: ";
  ptr +=humedad;
  ptr +="%</p>";
  ptr +="<p>Presion: ";
  ptr +=presion;
  ptr +="hPa</p>";
  ptr +="<p>Altitud: ";
  ptr +=altitud;
  ptr +="m</p>";
  ptr +="</div>\n";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}


Prueba del funcionamiento

Cargado el código sin errores, abriremos el monitor serial y si todo ha funcionado, debería mostrarnos un mensaje una vez conectado a nuestra red Wifi con la IP asignada por nuestro router.
Tendríamos que ver algo así.

 También podemos obtener la IP haciendo un escaneo de nuestra red. 

Introducimos la IP en el navegador en mi caso fue http://192.168.1.144/.
Y queda operativo nuestro WebServer+Wemos+BME!!
Espero que te haya gustado este tuto, me despido dejándote unos links directos a los módulos que he utilizado.

-Módulo sensor BME280

https://s.click.aliexpress.com/e/_mqLdsNk






No hay comentarios:

Publicar un comentario