Frage zur Struktur

Hallo zusammen,

ich bin neu bei Arduino, aber generell schon Erfahrung mit Programmierung.

Ich habe einen MakerHawk Wifi Kit 32 (ESP32)

und folgenden Code gebaut.
Der soll mit dem SR04 einen Füllstand einer Zysterne messen.

Dazu soll er mir das aktuell noch auf der Seriellen Schnittstelle ausgeben sowie am OLED und als Webserver.

Der Webserver ist aber bei meinem Code ab und zu nicht zuerreichen, bzw hängt sich auf.

Ich schätze da ist ein Problem mit dem delay in der loop Schleife, der Webserver muss da wohl ständig drauf sein aber die Werte möchte ich nur alle paar Sekunden vom Sensor holen und dann auch auf dem OLED aktualisieren.

#include "heltec.h"
#include "images.h"
#include "HTML.h"
#include <NewPing.h>
#include <WiFi.h>
#include <WebServer.h>

#define TRIGGER_PIN  17  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     5  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 400 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
#define LEVELFULL 100 //Maximale Höhe der zumessenden Flüssigkeit
#define LEVELEMPTY 108 // Maximaler Abstand zwischen Sensor und Tankboden
#define VOLUME 1000


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

WebServer server(80);


float duration;
int lefty, distance, levelact, levelpercent, volumeact;
String levelpercentStr;

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

void logo() {
  Heltec.display->clear();
  Heltec.display->drawXbm(0, 5, logo_width, logo_height, logo_bits);
  Heltec.display->display();
}

void berechnen() {

  distance = sonar.ping_cm();

  //Fuellstand berechnen
  levelact = (LEVELEMPTY - distance);

  //Fuellstand in Prozent berechnen
  levelpercent = (levelact * 100 / LEVELFULL);

  //Berechnung Volumen
  volumeact = ((VOLUME / 100) * levelpercent);

  //Balkenanzeige
  levelpercent = constrain(levelpercent, 0, 100); //um nur Werte zwischen 0 und 100 zu erhalten

  levelpercentStr = String(levelpercent);

  }

void setup() {
  Heltec.begin(true /*DisplayEnable Enable*/, false /*LoRa Disable*/, true /*Serial Enable*/, false /*PABOOST Enable*/, 470E6 /**/);
  //

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

  Heltec.display->init();
  Heltec.display->flipScreenVertically();
  Heltec.display->setFont(ArialMT_Plain_10);
  logo();
  delay(1500);
  Heltec.display->clear();


}



void loop() {

  server.handleClient();

  showonDisplay();
  showonSeriel();


}


void showonDisplay() {

  delay(1000);
  berechnen();
  Heltec.display->clear();
  Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
  Heltec.display->setFont(ArialMT_Plain_10);
  Heltec.display->drawString(40 , 15 , "Füllstand");
  Heltec.display->drawString(52 , 52 , levelpercentStr + " %");
  Heltec.display->drawProgressBar(10, 35, 100, 10, levelpercent);
  Heltec.display->display();
}

void showonSeriel() {

  delay(1000);
  Serial.print("Abstand: ");
  Serial.print(distance); // Send ping, get distance in cm and print result (0 = outside set distance range)
  Serial.print(" cm ");

  Serial.print("Level Aktuell: ");
  Serial.print(levelact); // Send ping, get distance in cm and print result (0 = outside set distance range)
  Serial.print(" cm ");
  Serial.print(" Level Prozent: ");
  Serial.print(levelpercent);
  Serial.print(" % ");
  Serial.print(" Volumen: ");
  Serial.print(volumeact);
  Serial.println(" l ");

}



void handle_OnConnect() {
  berechnen();
  server.send(200, "text/html", SendHTML(levelpercent, volumeact));
}

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

Vielen Dank für Euren Tipp

Das delay() sollte verschwinden. Schau Dir BlinkWithoutDelay in den Beispielen der IDE an und verstehe es. Auf der Basis kannst Du mit millis() Zeitsteuerungen bauen.

Dass der ESP32 ab und an nicht zu erreichen ist, ist bei dem annähernd normal. Der ist nicht besonders stabil.

Gruß Tommy

Da du alles in der loop aufrufst, hast du mit delay() schnell ein Problem.

Dein Webserver sollte ständig aufgerufen werden und alle anderen Funktionen mittels eines Timers nur in den von dir gewünschten Zeitintervallen. Den Timer baust du mit der Funktion millis auf siehe dazu das Beispiel BlinkWithoutDelay in der IDE.

Danke!!
Gleich was ganz anderes! :slight_smile:

Noch eine Frage, wenn ich hier noch nen MQTT Client mit drauf machen will.

Geht das überhaupt wenn ein Webserver noch da ist?

Habe mal bissl probiert, scheint sich zu beißen??!

Liebe Grüße

Dann sieh dir mal die Beispiel von fips an, da geht so einiges.