BME280 Webserver - AZ-Delivery

Hola a todos

hoy me gustaría presentarles un proyecto bastante simple, que es fácil de implementar con las libaryas estándar. Leemos los valores de un BME280 y ponerlos a disposición en un servidor web. El código se ejecuta en un NodeMCU LoLin V3 Board, sin embargo, también debe basarse en un Amica V2 O D1mini Junta en ejecución. El conjunto se muestra en una tabla simple. Cuando se actualiza o se vuelve a cargar la página web, aparece una nota en la salida serie. El código fue escrito en formato modular para poder convertir los valores si es necesario y adaptarse a otros sensores en poco tiempo.

Así que todo lo que necesitamos es:

El cableado es simple:

Lolin BME280
3.3V Vin
G Gnd
D1 Scl
D2 Sda

 

Para nuestro código, es necesario utilizar explícitamente la dirección I2C del sensor con

 

    Bme.Comenzar(0x76);

Especificar. En general, se recomienda leer la dirección antes de usar un sensor I2C. Para ello, hemos configurado una dirección y un escáner de puertos en Github que es bastante recomendable para su uso con los NodeMCUs y contribuye a la detección rápida de errores.

 

Aquí está el código para el proyecto:

 

#include <ESP8266WiFi.H>
#include <Alambre.H>
#include <Adafruit_Sensor.H>
#include <Adafruit_BME280.H>

#define SEALEVELPRESSURE_HPA (1013.25)

Const Char* Ssid = "AZ-DELIVERYrep";
Const Char* Contraseña = "18351387937912637681";
Unsigned Largo delayTime;
Flotador H, T, P;
Char temperatureCString[6];
Char humidityString[6];
Char pressureString[7];

Adafruit_BME280 Bme;

WiFiServer Servidor(80);

Vacío Configuración() {   Serial.Comenzar(115200);   Retraso(10);

 Serial.println(Q("Prueba BME280"));     Bool Estado;     Estado = Bme.Comenzar(0x76);      Conéctese a la red WiFi   Serial.println();   Serial.println();   Serial.Impresión("Conectarse a");   Serial.println(Ssid);      Wifi.Moda(WIFI_STA);   Wifi.Comenzar(Ssid, Contraseña);      Mientras (Wifi.Estado() != WL_CONNECTED) {     Retraso(500);     Serial.Impresión(".");   }   Serial.println("");   Serial.println("WiFi conectado");      Inicie el servidor   Servidor.Comenzar();   Serial.println("Servidor iniciado");   Imprima la dirección IP   Serial.println(Wifi.localIP());
}
Vacío getWeather() {        H = Bme.readHumidity();     T = Bme.readTemperature();         P = Bme.readPressure()/ 100.0;     dtostrf(T, 5, 1, temperatureCString);     dtostrf(H, 5, 1, humidityString);     dtostrf(P, 6, 1, pressureString);     Retraso(100);
 
}
Vacío Bucle() {   Compruebe si un cliente se ha conectado   WiFiClient Cliente = Servidor.Disponible();      Si (Cliente) {     Serial.println("Nuevo cliente");     bolean para localizar cuando finaliza la solicitud http     Booleana blank_line = Verdad;     Mientras (Cliente.Conectado()) {       Si (Cliente.Disponible()) {         Char C = Cliente.Leer();                  Si (C == 'n' && blank_line) {             getWeather();             Cliente.println("HTTP/1.1 200 OK");             Cliente.println("Content-Type: text/html");             Cliente.println("Conexión: cerrar");             Cliente.println();             su página web real que muestra la temperatura             Cliente.println("<! DOCTYPE HTML>");             Cliente.println("<html>");             Cliente.println("<head><META HTTP-EQUIV-"refresh" CONTENT-"15"></head>");             Cliente.println("<body><h1>BME280 Web Server</h1>");             Cliente.println("<borde de la tabla"2" anchura "456" cellpadding "10"><tbody><tr><td>");             Cliente.println("<h3>Temperatura ");             Cliente.println(temperatureCString);             Cliente.println("&deg; C</h3><h3>Humedad á ");             Cliente.println(humidityString);             Cliente.println("%</h3>");             Cliente.println("<h3>Presión del aire ");             Cliente.println(pressureString);             Cliente.println("HPa");             Cliente.println("</h3></td></tr></tbody></table></body></html>");               Romper;         }         Si (C == 'n') {           cuando comienza a leer una nueva línea           blank_line = Verdad;         }         Más Si (C != 'A'r') {           cuando encuentra un personaje en la línea actual           blank_line = Falso;         }       }     }       cerrar la conexión del cliente     Retraso(1);     Cliente.Parada();     Serial.println("Cliente desconectado.");   }
} 

 

El resultado:

 

Me gustaría agradecer a nuestros leales lectores por su atención y decir adiós al próximo artículo :)

 

Esp-8266Projekte für anfängerSensorenSmart home

11 comentarios

Andreas Wolter

Andreas Wolter

@Reimund: die Werte werden vom Sensor mit t = bme.readTemperature(); in getWeather() ausgelesen und der float-Variablen t zugewiesen. Mit dtostrf(t, 5, 1, temperatureCString); wird aus dem float ein String gemacht mit insgesamt 5 Stellen, die eine Nachkommastelle enthält.
Somit müsste, wie auf dem Bild zu sehen, die Nachkommastelle angezeigt werden. Möglicherweise liefert der Sensor aber keine Nachkommastellen, obwohl man die Werte so auslesen muss.

Grüße,
Andreas Wolter
AZ-Delivery Blog

Reimund

Reimund

Wie bekommt man das hin, dass auch nach dem Komma Werte ausgegeben werden ?
Also statt 19 Grad 19,6 Grad

Jens

Jens

Erst mal Danke für diesen Beitrag, steige gerade in dieses Thema Webserver ein.
Was mir aber aufegafellen ist, die Werte für die Temperatur stimmen mit den Realen Temp. nicht überein.
Wenn ich die Adafruit_BME280 verwende, habe ich immer einen ca 4° höheren Temperaturwert als andere Themometer angeben. Es gibt auch einen anderen Sketch für den BME280 wo die Temperatur recht nah an die konventionellen Thermometer ran kommt. Ich habe drei BME280 und habe diese natürlich auch mal ausgetauscht und es werden bei allen BME280 bei Verwendung der Adafruit_BME280 ca 4° höhere Werte angezeigt.
Gibt es eine Möglichkeit bei Verwendung der Adafruit_BME280 die Temperatur um diesen Wert zu kompensieren?

Wolfgang

Wolfgang

Auch ich hatte nur “nan”/“0” Werte. Ich habe das Delay nach SerialBegin von 10 auf 100 gesetzt und gleich in der nächsten Zeile ein “bme.begin(0×76);” eingefügt. Anzeigen funktionieren. Jetzt gehts ans optimieren.

Wolfgang

Wolfgang

Sketch funktioniert wunderbar, Anpassungen sind leicht zu machen. DANKE für die tollen Ideen und Anleitungen.

Christian Hartung

Christian Hartung

Hallo!

Bei mit funktionierte es nach Langem probieren jetzt auch!

Adafruit_BME280.h editieren und bei:

#define BME280_ADDRESS (0×77)

0×77 mit 0×76 ersetzen.

Hoffe ich konnte manchen helfen hiermit!

Gruß
Christian

Sebastian

Sebastian

Hat hier irgendjemand mal die Lösung für das Problem? Vielleicht ja sogar, wer mag daran denken, AZ-Delivery selbst? Bei mir kommen auch nur 0 Werte raus.

Roger

Roger

Wire.begin(D3, D4);
Wire.setClock(10000);

habe ich hinzugefügt, ohne gibt es keine Verbindung. Habe aber auch diese Pins genommen.
Aber auch ich habe nur 0-Werte. Wo ist der Fehler?

Wolfgang

Wolfgang

Ich komme leider nicht weiter. Nach Aufruf der Adresse erhalte ich keine vernünftigen Werte. Es werden nur 0,00 für Temp, Druck, Feuchte angezeigt.
Wo ist der Haken an dem ich fest hänge ?
Es wäre super, wenn ich einen überarbeiteten CODE bekommen könnte.

Wolfgang Butenhoff

Wolfgang Butenhoff

Ein sehr interessanter und für mich nützlicher Artikel.
Ich kann leider nur nachbauen und bin auf gute und komplette Software angewiesen.
(Kleine Veränderungen im CODE wage ich das eine oder andere Mal schon)
Wo muss ich : Wire.begin(D3, D4); Wire.setClock(10000); einfügen ?
Warum D3 u. D4 ? …im Artikel werden D1+D2 verwendet.

Sven Schmidt

Sven Schmidt

Klasse Artikel,

bei mir musste ich noch folgendes hinzufügen:

Wire.begin(D3, D4);
Wire.setClock(10000);

Deja un comentario

Todos los comentarios son moderados antes de ser publicados