Wemos D1 mini wetterstation mit hd44780 LCD Display und Webserver

Hallo

Baue gerade eine Wetterstation die im gossen und ganzen auch funktioniert bis auf das Display es zeigt nicht mehr als weisse kaestchen an soll aber Temperatur usw anzeigen. Verbaut ist ein Wemos D1 mini ( ESP8266), ein hd44780 20x4 Lcd Display und als Sensor ist ein BME280 verbaut.

Es soll so sein Das der BME280 alle werte misste und dann an den ESP8266 Webserver sendet was auch funktioniert nur das Display zeigt ausser weisse Quadrate nix an hab.

Hier der Code den ich dafuer nutze.

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

LiquidCrystal_I2C lcd(0x27,20,4);

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;

float temperature, humidity, pressure, altitude;

/*Put your SSID & Password*/
const char* ssid = "Funkwelle_Kloosterburen";  // Enter SSID here
const char* password = "T30h19A76l";  //Enter Password here

ESP8266WebServer server(80);              
 
void setup() {
  Serial.begin(115200);
  delay(100);

  IPAddress ip(192, 168, 1, 52);
  IPAddress gateway(192, 168, 1, 1);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(213, 75, 63, 75);
  WiFi.config(ip, dns, gateway, subnet);
  
  bme.begin(0x76);   

  Serial.println("Connecting to ");
  Serial.println(ssid);

  //connect to your local wi-fi network
  WiFi.begin(ssid, password);

  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());

  server.on("/", handle_OnConnect);
  server.onNotFound(handle_NotFound);

  server.begin();
  Serial.println("HTTP server started");
}
void loop() {
  server.handleClient();
}

void handle_OnConnect() {
  temperature = bme.readTemperature();
  humidity = bme.readHumidity();
  pressure = bme.readPressure() / 100.0F;
  altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print (temperature);  lcd.print(" *C");
  
  server.send(200, "text/html", SendHTML(temperature,humidity,pressure,altitude)); 
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(float temperature,float humidity,float pressure,float altitude){
  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>ESP8266 Weather Station</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: #444444;margin: 50px auto 30px;}\n";
  ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<div id=\"webpage\">\n";
  ptr +="<h1>ESP8266 Weather Station</h1>\n";
  ptr +="<p>Temperature: ";
  ptr +=temperature;
  ptr +="&deg;C</p>";
  ptr +="<p>Humidity: ";
  ptr +=humidity;
  ptr +="%</p>";
  ptr +="<p>Pressure: ";
  ptr +=pressure;
  ptr +="hPa</p>";
  ptr +="<p>Altitude: ";
  ptr +=altitude;
  ptr +="m</p>";
  ptr +="</div>\n";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

Was macher ich falsch bin mit meinem Latein am ende. :o

Da wir dein Display nicht kennen, müssen wir raten.
Dieses Display ist für 5Volt spezifiziert und somit nicht an 3,3 Volt lauffähig.
Du kannst es an 5 Volt betreiben, solltest aber Levelshifter in die I2C-Busleitung einbauen.

Der HD44780 funktioniert grundsätzlich auch mit 3,3V nur läßt sich der Kontrast eines 5V Displays nicht so einstellen daß man was sieht.
Falls Du das Display mit 3,3V versorgen mußt dann such Dir ein solches HD44780 Display das für 3,3V zertifiziert ist. Alternativ kannst Du auch ein Handydisplay nehmen.

Grüße Uwe

Guten morgen

Das hd44780 wird bei mir am I2C bus und mit 3,3V betrieben.

Wie man Sieht es funktioniert sehr gut.

Die daten vom BME280 werden auf dem ESP8266 Webserver angezeigt nur im Display nicht da sind dann weisse Quadrate oder es steht uch mal 0.0 drinne.

Irgendwas mache ich doch falsch nur weis ich nicht was

Hitman42:
Hier der Code den ich dafuer nutze.

#include <ESP8266WebServer.h>

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

LiquidCrystal_I2C lcd(0x27,20,4);

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;

float temperature, humidity, pressure, altitude;

/Put your SSID & Password/
const char* ssid = “Funkwelle_Kloosterburen”;  // Enter SSID here
const char* password = “T30h19A76l”;  //Enter Password here

ESP8266WebServer server(80);

void setup() {
 Serial.begin(115200);
 delay(100);

IPAddress ip(192, 168, 1, 52);
 IPAddress gateway(192, 168, 1, 1);
 IPAddress subnet(255, 255, 255, 0);
 IPAddress dns(213, 75, 63, 75);
 WiFi.config(ip, dns, gateway, subnet);
 
 bme.begin(0x76);

Serial.println("Connecting to ");
 Serial.println(ssid);

//connect to your local wi-fi network
 WiFi.begin(ssid, password);

//check wi-fi is connected to wi-fi network
 while (WiFi.status() != WL_CONNECTED) {
 delay(1000);
 Serial.print(".");
 }
 Serial.println("");
 Serial.println(“WiFi connected…!”);
 Serial.print("Got IP: ");  Serial.println(WiFi.localIP());

server.on("/", handle_OnConnect);
 server.onNotFound(handle_NotFound);

server.begin();
 Serial.println(“HTTP server started”);
}
void loop() {
 server.handleClient();
}

void handle_OnConnect() {
 temperature = bme.readTemperature();
 humidity = bme.readHumidity();
 pressure = bme.readPressure() / 100.0F;
 altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);

lcd.init();
 lcd.backlight();
 lcd.setCursor(0,0);
 lcd.print (temperature);  lcd.print(" *C");
 
 server.send(200, “text/html”, SendHTML(temperature,humidity,pressure,altitude));
}

void handle_NotFound(){
 server.send(404, “text/plain”, “Not found”);
}

String SendHTML(float temperature,float humidity,float pressure,float altitude){
 String ptr = " \n";
 ptr +="<meta name=“viewport” content=“width=device-width, initial-scale=1.0, user-scalable=no”>\n";
 ptr +=“ESP8266 Weather Station\n”;
 ptr +=“html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n”;
 ptr +=“body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n”;
 ptr +=“p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n”;
 ptr +="\n";
 ptr +="\n";
 ptr +="\n";
 ptr +="<div id=“webpage”>\n";
 ptr +=“

ESP8266 Weather Station

\n”;
 ptr +=“

Temperature: “;
 ptr +=temperature;
 ptr +=“°C

”;
 ptr +=“

Humidity: “;
 ptr +=humidity;
 ptr +=”%

”;
 ptr +=“

Pressure: “;
 ptr +=pressure;
 ptr +=“hPa

”;
 ptr +=“

Altitude: “;
 ptr +=altitude;
 ptr +=“m

”;
 ptr +=”\n”;
 ptr +=”\n”;
 ptr +=”\n”;
 return ptr;
}

Hitman42:
Wie man Sieht es funktioniert sehr gut.

Diese Ausgabe erzeugt dein oben gezeigter Sketch?

Das ist ganz sicher Magie!

Gruß Fips

nein das sollte blos ein bild sein das das Display funktioniert mein Code erzeugt nix auf dem Display die und wenn er mal was anzeigt sind es weisse Quadrate mehr nicht.

Hi

Weiße Quadrate ... etwas genauer darfst Du schon werden.
Wenn jede zweite Zeile mit Quadraten gefüllt ist, ist die Sache nämlich schlagartig klar.
(damit auch in Zukunft geneigte Problemlöser sich hier nicht verarscht vorkommen ... dann ist das Display nicht initialisiert - SO meldet sich ein uninitialisiertes Display - nachzulesen z.B. auf sprut.de, DER Seite, wenn's um ein LCD am µC geht)

Wenn Das nicht der Fall ist, war die Fehlerbeschreibung 'für die Tonne'.

MfG

Warum beschreibst du dein Problem nicht so, dass man es versteht.

Also funktioniert deine Anzeige nach wie vor nicht ?
Oder anders gefragt, was wird angezeigt und was nicht ?

Was genau ist ein Bild, wo es funktioniert ?
Und was genau soll angezeigt werden ?
Und an welcher Stelle soll es angezeigt werden ?

postmaster-ino:
... ein uninitialisiertes Display ....

init()

Macht oben gezeigter Sketch jedesmal wenn vom Client die Webseite angefragt wird.

Ist zwar Sinnbefreit aber vorhanden.

Gruß Fips

Hi

Wenn das Display aber das von mir beschriebene Bild zeigt, kann diese Funktion auch haenchenfluegel() geheißen haben - denn initialisiert wurde das Display damit dann nämlich nicht.

MfG

Also noch einmal.
Wenn ich den oben genannten Sketch auf den Wemos D1 mini flashe dann soll er mir Temperatur usw im Webbrowser und auf dem Display anzeigen moentan funktioniert es nur im Browser ueber den eignen wenserver. Nach dem flashen des Sketches zeit das display nur weisse Quadrate an siehe Bild

und mehr nicht yeigt keine temperatur und Luftfeutigkeit und Luftdruck an usw.

Hitman42:
Nach dem flashen des Sketches zeit das display nur weisse Quadrate an siehe Bild

Steht doch in #8 was du falsch machst.

Gruß Fips

sicher aber wo muss der Display teil denn hin hab den auch an andere stellen gesetzt und da kommt auch das gleiche

Du kannst deine Ausgabezeilen zum LCD auch direkt iin der Loop machen, um zu sehen, ob es so funktioniert.

Hitman42:
sicher aber wo muss der Display teil denn hin hab den auch an andere stellen gesetzt und da kommt auch das gleiche

Hitman42:

Wie haben wir es denn zu diesen Bild geschafft?

Oder irgendwo gefunden?

Komm gib dir ein wenig mühe.
Du willst es doch lernen.

Dankeschoen sein Tip war gut jetzt zeigt er temperatur an und die veraendert sich auch WArten wir mal mal ab obs so bleibt

Hi

Hitman42:
Also noch einmal.

Wenn es Dir schon zu viel Arbeit ist, aussagekräftige Fehlerbeschreibungen zu bringen - ja, ich kann Dein Aufstöhnen förmlich hören! - dann darfst Du mit Deinem nicht initialisiertem Display gerne weiter rumheulen.

Du darfst aber auch gerne etwas Grundlagen dazu erlernen - dazu nannte ich sprut.de - aber die heutige Generation hat ja kein Interesse am warum, sondern der Scheiß hat einfach zu funktionieren und die eigene Unfähigkeit automatisch auszubügeln.

Krass, wa?

OfG

Hitman42:
Dankeschoen sein Tip war gut jetzt zeigt er temperatur an und die veraendert sich auch WArten wir mal mal ab obs so bleibt

Schön, dass es jetzt funktioniert.

Du solltest aber für die Nachwelt hier schreiben, wie du es gelöst hast.
Und warum sollte es nicht so bleiben ?