ESP8266 (Wemos D1 Mini pro) aktuallkiesiert zu schnell

Hallo
Habe ein problem mit dem esp8266. hab den BME280 sensor und ein LCD Displasy hd n44780 20x4 ueber I2C angeschlossen. Funktioniert auch alles soweit ganz gut Werde fuer Temperatur, Luftfeuchte und Luftdruck werden angezeigt nur leider werden die so schnell aktualliesiert das man die werte nach dem punt kaum lesen kann. Werte sind auch ueber den ESP8266 Webserver abrufbar.

Danke im Vorraus

hier mein Code

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

#define SEALEVELPRESSURE_HPA (1013.25)

LiquidCrystal_I2C lcd(0x27,20,4);

const char* ssid = "Funkwelle_Kloosterburen";
const char* password = "T30h19A76l";
unsigned long delayTime;
float h, t, p;
char temperatureCString[6];
char humidityString[6];
char pressureString[7];

Adafruit_BME280 bme;

WiFiServer server(80);

void setup() {
  
  lcd.init();                     
  lcd.backlight();
  
  Serial.begin(115200);
  delay(10);

 Serial.println(F("BME280 test"));

    bool status;
    status = bme.begin(0x76);
    
  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);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.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() {
  
    lcd.home();
    lcd.print("Wetterstation");
    lcd.setCursor(0, 1);
    lcd.print("Temperatur:");
    lcd.print(bme.readTemperature());
    lcd.print("c");
    lcd.setCursor(0, 2);
    lcd.print("Luftfeuchte:");
    lcd.print(bme.readHumidity());
    lcd.print("%");
    lcd.setCursor(0, 3);
    lcd.print("Luftdfruck:");
    lcd.print(bme.readPressure());
    lcd.print("hPa"); 
  
  // Check if a client has connected
  WiFiClient client = server.available();
  
  if (client) {
    Serial.println("New client");
    // bolean to locate when the http request ends
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        if (c == '\n' && blank_line) {
            getWeather();
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();
            // your actual web page that displays temperature
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<head><META HTTP-EQUIV=\"refresh\" CONTENT=\"15\"></head>");
            client.println("<body><h1>Wetterstation Kloosterburen/Niederlande</h1>");
            client.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>");
            client.println("<h3>Temperatur = ");
            client.println(temperatureCString);
            client.println("&deg;C</h3><h3>Luftfeuchte = ");
            client.println(humidityString);
            client.println("%</h3>");
            client.println("<h3>Luftdruck = ");
            client.println(pressureString);
            client.println("hPa");
            client.println("</h3></td></tr></tbody></table></body></html>");  
            break;
        }
        if (c == '\n') {
          // when starts 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.println("Client disconnected.");
  }
}

Hi

Da Du keine Frage stellst, willst Du wohl nur Dein Projekt vorstellen - danke dafür.
Da Du Dich aber bedankst, willst Du wohl doch was wissen ... eine Zwickmühle.

Nun denn - Du sagst: Die Werte werden zu oft aktualisiert.
Jo - was spricht dagegen, Das nur alle 500ms wirklich zum Display weiter zu leiten?

MfG

Nein die Frage ist wie ich das abstellen kann das die Werte zu schnell aktiualliesiert werden ao alle 5 - 10 min ware gut und ich hab festgestellt das der Luftdruch bei 97716 hPa liegt was denke ich mal unlogisch ist. was kann ich tun um das abzustellen

Hi

const uint32_t wartezeit=500;  //Zeit zwischen zwei LCD Aktualisierungen (in ms)

void loop() {
  static uint32_t lastmillis=0;
  if (millis()-lastmillis>=wartezeit){
     lastmillis+=wartezeit;
    lcd.home();
    lcd.print("Wetterstation");
    lcd.setCursor(0, 1);
    lcd.print("Temperatur:");
    lcd.print(bme.readTemperature());
    lcd.print("c");
    lcd.setCursor(0, 2);
    lcd.print("Luftfeuchte:");
    lcd.print(bme.readHumidity());
    lcd.print("%");
    lcd.setCursor(0, 3);
    lcd.print("Luftdfruck:");
    lcd.print(bme.readPressure());
    lcd.print("hPa");
}

Ungefähr so?
Eben nur alle paar Augenblicke das LCD aktualisieren - und nicht bei jedem loop()-Durchlauf.

Dadurch wird NUR die Anzeige beruhigt - der Webserver-Kram ist davon unbeeindruckt.
Denke aber, daß Da aktuelle Werte durchaus sinnig sind - kA.

MfG

Das Probiere ich gleich mal eben aus. :slight_smile:

Das mag der ESP8266 nicht bekomme eine Fehlermeldung

expected "}" at end of Input

Hi

Drück Mal STRG+T in der IDE.
Dort wirst Du dann erkennen, daß entweder mehrere } untereinander stehen - dort ist irgendwo eine Klammer zu viel! - oder, daß die letzte Klammer nicht ganz vorne steht - dann fehlt irgendwo eine Klammer.

Meine Zusatz-Zeilen fangen mit Deinem loop(){ an - DAS solltest Du ggf. nicht mit kopieren :wink:
Die IF mit dem Display-Kram ist ein geschlossener Block - sowohl das IF, wie die schließende Klammer sollten auf gleicher Ebene stehen.

Wenn dennoch Probleme bestehen - Dein aktueller Sketch wäre dann ggf. nicht die schlechteste Idee.

MfG

habe ich probiert mit STRG + T dann kommt automatische formatierung abgeschlossen und der Fehler ist der selbe

MfG

Hier hast du den Code

MfG

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

#define SEALEVELPRESSURE_HPA (1013.25)

LiquidCrystal_I2C lcd(0x27, 20, 4);

const char* ssid = "Funkwelle_Kloosterburen";
const char* password = "T30h19A76l";
const uint32_t wartezeit = 500; //Zeit zwischen zwei LCD Aktualisierungen (in ms)

unsigned long delayTime;
float h, t, p;
char temperatureCString[6];
char humidityString[6];
char pressureString[7];

Adafruit_BME280 bme;

WiFiServer server(80);

void setup() {

  lcd.init();
  lcd.backlight();
  Serial.begin(115200);
  delay(10);

  Serial.println(F("BME280 test"));

  bool status;
  status = bme.begin(0x76);

  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);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.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() {
  static uint32_t lastmillis = 0;
  if (millis() - lastmillis >= wartezeit) {
    lastmillis += wartezeit;
  }
  lcd.home();
  lcd.print("Wetterstation");
  lcd.setCursor(0, 1);
  lcd.print("Temperatur:");
  lcd.print(bme.readTemperature());
  lcd.print("c");
  lcd.setCursor(0, 2);
  lcd.print("Luftfeuchte:");
  lcd.print(bme.readHumidity());
  lcd.print("%");
  lcd.setCursor(0, 3);
  lcd.print("Luftdfruck:");
  lcd.print(bme.readPressure());
  lcd.print("hPa");

  // Check if a client has connected
  WiFiClient client = server.available();

  if (client) {
    Serial.println("New client");
    // bolean to locate when the http request ends
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (c == '\n' && blank_line) {
          getWeather();
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          // your actual web page that displays temperature
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<head><META HTTP-EQUIV=\"refresh\" CONTENT=\"15\"></head>");
          client.println("<body><h1>Wetterstation Kloosterburen/Niederlande</h1>");
          client.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>");
          client.println("<h3>Temperatur = ");
          client.println(temperatureCString);
          client.println("&deg;C</h3><h3>Luftfeuchte = ");
          client.println(humidityString);
          client.println("%</h3>");
          client.println("<h3>Luftdruck = ");
          client.println(pressureString);
          client.println("hPa");
          client.println("</h3></td></tr></tbody></table></body></html>");
          break;
        }
        if (c == '\n') {
          // when starts 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.println("Client disconnected.");
      }

Hallo,

STRG + T alleine korrigiert den Code nicht, es formatiert ihn nur das man ihn besser lesen kann.
Auch sollte man den Code nicht zusammenklatschen.
Ich sehe das am Ende mehrere geschlossene geschweifte Klammern fehlen.

Gehe zur letzten geschweiften Klammer, setze den Cursor dahinter, warte kurz und scrolle hoch, dann siehst du die zugehörige markierte öffnende Klammer. Zu allen anderen öffnenden Klammer darüber fehlt die Geschlossene.

Oh ok bin noch nicht so lange dabei werde es gleich mal ausprobieren.
Danke schonmasl fuer den Tip.

MfG

Hi

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

#define SEALEVELPRESSURE_HPA (1013.25)

LiquidCrystal_I2C lcd(0x27, 20, 4);

const char* ssid = "SSID";
const char* password = "PW_ZU_SSID";  //Dieses Passwort bitte aus dem Sketch raus löschen, wenn Du Diesen hier zeigst
const uint32_t wartezeit = 500; //Zeit zwischen zwei LCD Aktualisierungen (in ms)

unsigned long delayTime;
float h, t, p;
char temperatureCString[6];
char humidityString[6];
char pressureString[7];

Adafruit_BME280 bme;

WiFiServer server(80);

void setup() {

  lcd.init();
  lcd.backlight();
  Serial.begin(115200);
  delay(10);

  Serial.println(F("BME280 test"));

  bool status;
  status = bme.begin(0x76);

  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);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.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() {
  static uint32_t lastmillis = 0;
  if (millis() - lastmillis >= wartezeit) {
    lastmillis += wartezeit;
    //  } //<-- HIER gehört die Klammer nicht hin - wir wollen ja, daß die LCD-Ausgabe nur alle x Millisekunden ausgegeben wird
    lcd.home();
    lcd.print("Wetterstation");
    lcd.setCursor(0, 1);
    lcd.print("Temperatur:");
    lcd.print(bme.readTemperature());
    lcd.print("c");
    lcd.setCursor(0, 2);
    lcd.print("Luftfeuchte:");
    lcd.print(bme.readHumidity());
    lcd.print("%");
    lcd.setCursor(0, 3);
    lcd.print("Luftdfruck:");
    lcd.print(bme.readPressure());
    lcd.print("hPa");
  } //<-- Hier, hinter die LCD-Ausgabe ist der IF-Block erst beendet

  // Check if a client has connected
  WiFiClient client = server.available();

  if (client) {
    Serial.println("New client");
    // bolean to locate when the http request ends
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (c == '\n' && blank_line) {
          getWeather();
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          // your actual web page that displays temperature
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<head><META HTTP-EQUIV=\"refresh\" CONTENT=\"15\"></head>");
          client.println("<body><h1>Wetterstation Kloosterburen/Niederlande</h1>");
          client.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>");
          client.println("<h3>Temperatur = ");
          client.println(temperatureCString);
          client.println("&deg;C</h3><h3>Luftfeuchte = ");
          client.println(humidityString);
          client.println("%</h3>");
          client.println("<h3>Luftdruck = ");
          client.println(pressureString);
          client.println("hPa");
          client.println("</h3></td></tr></tbody></table></body></html>");
          break;
        }
        if (c == '\n') {
          // when starts 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.println("Client disconnected.");
      } //<-- Das Ende von if (client.available()) {
    } //<-- fehlende Klammer für while (client.connect){
  } //<-- fehlende Kmammer für if(client){
} //<-- fehlende Klammer für loop(){

Ungefähr Das, Was ich sagte - wenn unten die Klammern NICHT bis nach GANZ VORNE reichen - fehlen Klammern.

Dein Passwort zu Deinem WLan solltest Du jetzt allerdings wechseln - die SSID und das zugehörige Passwort dürften schon in diverse Listen gefunden haben ...

Erstelle einen neuen TAB, nenne Diesen ZUGANGSDATEN.h und include dieses .h-File in Deinem Sketch.
Dann steht in Deinem Sketch

#include "zugangsdaten.h"  //SSID / Password für WLan
...

In der zugangsdaten.h

const char* ssid = "SSID-Name";
const char* password = "SSID-PW";

So ist jedem Leser halbwegs klar, was sich darin verbirgt und man wundert sich weniger, wieso die Deklarationen der beiden Zeiger nicht im Hauptsketch vorkommt.
ungetestet!!

MfG

Das mit der SSID und passwort ist ehr unwarscheinlich da ich sich denke mal kein Niederlaender hier in das Forum verirrt (oder doch Gruebel), Hab alles hinbekommen nur das mit der Wartezeit das funktioniert nicht kann da eintragen an zeiten was ich will der esp8266 aktualliesiert das Display ohne pause.

MfG

Hi

Hast Du die Klammer noch hinter lastmillis += wartezeit; stehen?
Dann wird nämlich NUR die Warte-Variable alle 500ms geändert.
Die schließende Klammer der millis-IF muß hinter die letzte LCD-Ausgabe.

Vll. die Kommentare lesen, Die ich in Deinen Sketch eingearbeitet habe - mache Das ja nicht nur aus Spaß (ok, eigentlich schon ... erschreckend :wink: )

MfG

Hallo

[code
]void loop() {
  static uint32_t lastmillis = 0;
  if (millis() - lastmillis >= wartezeit) {
    lastmillis += wartezeit;
  }

So steht es drinne

Hi

Dann guck Mal, was ich in #12 geschrieben habe.

MfG

Hab ich gemacht aber funktioniert nicht.

MfG

Hitman43:
Hab ich gemacht aber funktioniert nicht.

MfG

Sehr gute Erklärung.
Aber ich würde gern noch mal nachfragen, wenns erlaubt ist:

Was funktioniert nicht ?

Bitte immer komplette Erklärungen schreiben, damit wir uns auch etwas darunter vorstellen können und nicht immer den kompletten Thread nochmal durchlesen müssen.

Hallo

habs hinbekommnen es laeuft :slight_smile:

MfG

Das ist doch prima.
Danke für die Rückmeldung
Sinn des Forums ist, dass dann auch die Lösung hier im Forum präsentiert wird.
Dann hat auch die Nachwelt etwas davon.