Ciao a tutti,
oggi voglio condividere con Voi un diritto semplice Progetto, che con il Standardlibarys facilmente umzusetzten è. Si leggono i Valori di un BME280 e mettere su un server Web. Il Codice funziona a noi su un NodeMCU LoLin V3 Board, tuttavia, anche un' Amica V2 o D1mini Board correre. Il tutto in una semplice Tabella. Il Sito sarà aggiornato o ricaricato appare un Avviso in seriale. Il Codice è stato quasi Baukastenformat scritto, per i Valori, se necessario, di valuta e di Adattamento ad altri Sensori in breve Tempo è possibile.
Quindi abbiamo bisogno solo:
Il Cablaggio è semplice:
LoLin | BME280 |
3.3 V | VIN |
G | GND |
D1 | SCL |
D2 | SDA |
Per il nostro Codice è necessario I2C Indirizzo del Sensore in modo esplicito con
bme.begin(0x76);
specificare. In genere si consiglia di Utilizzare I2C-Sensore l'Indirizzo di leggere. A questo Scopo abbiamo un Indirizzi e port scanner su GitHub trovato, il quale per l'Utilizzo con il NodeMCUs diritto è consigliabile, e per la rapida Fehlerfindung contribuisce.
Qui il Codice per il Progetto:
#include <ESP8266WiFi.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #define SEALEVELPRESSURE_HPA (1013.25) const char* ssid = "AZ-DELIVERYrep"; const char* password = "18351387937912637681"; unsigned long delayTime; float h, t, p; char temperatureCString[6]; char humidityString[6]; char pressureString[7]; Adafruit_BME280 bme; WiFiServer server(80); void setup() { Serial.begin(115200); delay(10); Serial.system.out.println(F("BME280 test")); bool stato; stato = bme.begin(0x76); // Connect to WiFi network Serial.system.out.println(); Serial.system.out.println(); Serial.print("Connecting to "); Serial.system.out.println(ssid); WiFi.moda(WIFI_STA); WiFi.begin(ssid,, password); while (WiFi.di stato() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.system.out.println(""); Serial.system.out.println("wi-fi connected"); // Start the server server.begin(); Serial.system.out.println("Server started"); // Print the IP address Serial.system.out.println(WiFi.localIP()); } void 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); delay(100); } void loop() { // Check if a client has connected WiFiClient client = server.available(); if (client) { Serial.system.out.println("New client"); // bolean to locate when the http request end boolean blank_line = true; while (client.connected()) { if (client.available()) { char c = client.read(); if (c == '\n' && blank_line) { getWeather(); client.system.out.println("HTTP/1.1 200 OK"); client.system.out.println("Content-Type: text/html"); client.system.out.println("Connection: close"); client.system.out.println(); // your actual web page that display temperature client.system.out.println("<!DOCTYPE HTML>"); client.system.out.println("<html>"); client.system.out.println("<head><META HTTP-EQUIV=\"refresh\" CONTENT=\"15\"></head>"); client.system.out.println("<body><h1>BME280 Server Web</h1>"); client.system.out.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>"); client.system.out.println("<h3>Temperatura = "); client.system.out.println(temperatureCString); client.system.out.println("°C</h3><h3>Umidità = "); client.system.out.println(humidityString); client.system.out.println("%</h3>"); client.system.out.println("<h3>Pressione atmosferica = "); client.system.out.println(pressureString); client.system.out.println("hPa"); client.system.out.println("</h3></td></tr></tbody></table></body></html>"); break; } if (c == '\n') { // when avvio reading a new line blank_line = true; } else if (c != '\r') { // when finds a character on the current line blank_line = false; } } } // closing the client connection delay(1); client.stop(); Serial.system.out.println("Client disconnesso."); } }
Il Risultato:
ringrazio i nostri affezionati Lettori per l'Attenzione e addio, fino al prossimo Articolo :)
11 commenti
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
Wie bekommt man das hin, dass auch nach dem Komma Werte ausgegeben werden ?
Also statt 19 Grad 19,6 Grad
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
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
Sketch funktioniert wunderbar, Anpassungen sind leicht zu machen. DANKE für die tollen Ideen und Anleitungen.
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
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
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
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
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
Klasse Artikel,
bei mir musste ich noch folgendes hinzufügen:
Wire.begin(D3, D4);
Wire.setClock(10000);