Nach ein paar Stunden Display fehler

Hallo Ihr Lieben,

ich habe das Problem mit meinem Programm, das nach ein paar Stunden Laufzeit immer komische Symbolketten auf dem Display angezeigt werden. Nach einem Neustart läuft alles wieder ganz normal.

Hiermal der Code.

#include "EspMQTTClient.h"
#include <Adafruit_ADS1X15.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
Adafruit_ADS1115 ads;
int Taster   = 2;//minus Min
int Taster2  = 15;//plus Min
int Taster3  = 16;//minus Max
int Taster4 =  5;//plus MaX
int sTaster   = 0;
int sTaster2  = 0;
int sTaster3  = 0;
int sTaster4 =  0;

int Relay    = 25;
int Min = 40;
int Max = 60;
unsigned long previousMillis = 0;
const long interval = 10000; //60000 * 10;

EspMQTTClient client(
  "*",
  "*",
  "*",  // MQTT Broker server ip
  "MQTTUsername",   // Can be omitted if not needed
  "MQTTPassword",   // Can be omitted if not needed
  "TestClient",     // Client name that uniquely identify your device
  1883              // The MQTT port, default to 1883. this line can be omitted
);

void setup()
{
  Serial.begin(115200);
  pinMode(Relay, OUTPUT);

  pinMode(Taster, INPUT_PULLDOWN);
  pinMode(Taster2, INPUT_PULLUP); // Taster PIN = Eingang
  pinMode(Taster3, INPUT);
  pinMode(Taster4, INPUT_PULLUP);

  ads.setGain(GAIN_ONE);
  if (!ads.begin()) {
    Serial.println("Failed to initialize ADS.");
    //while (1);
  }
  lcd.init();
  lcd.backlight();
  delay(10);
  // Optionnal functionnalities of EspMQTTClient :
  client.enableDebuggingMessages(); // Enable debugging messages sent to serial output
  client.enableHTTPWebUpdater(); // Enable the web updater. User and password default to values of MQTTUsername and MQTTPassword. These can be overrited with enableHTTPWebUpdater("user", "password").
  client.enableLastWillMessage("TestClient/lastwill", "I am going offline");  // You can activate the retain flag by setting the third parameter to true
}

// This function is called once everything is connected (Wifi and MQTT)
// WARNING : YOU MUST IMPLEMENT IT IF YOU USE EspMQTTClient
void onConnectionEstablished()
{
  // Subscribe to "mytopic/test" and display received message to Serial
  client.subscribe("mytopic/test", [](const String & payload) {
    Serial.println(payload);
  });

  // Subscribe to "mytopic/wildcardtest/#" and display received message to Serial
  client.subscribe("mytopic/wildcardtest/#", [](const String & topic, const String & payload) {
    Serial.println("(From wildcard) topic: " + topic + ", payload: " + payload);
  });

  // Publish a message to "mytopic/test"
  client.publish("mytopic/test", "This is a message"); // You can activate the retain flag by setting the third parameter to true

  // Execute delayed instructions
  client.executeDelayed(5 * 1000, []() {
    client.publish("mytopic/wildcardtest/test123", "This is a message sent 5 seconds later");
  });






}



void loop()
{
  sTaster = digitalRead(Taster);
  if (sTaster == HIGH)
  {
    Min = Min - 5;
  }

  sTaster2 = digitalRead(Taster2);
  if (sTaster2 == LOW)
  {
    Min = Min + 5;
  }

  sTaster3 = digitalRead(Taster3);
  if (sTaster3 == HIGH)
  {
    Max = Max - 5;
  }

  sTaster4 = digitalRead(Taster4);
  if (sTaster4 == LOW)
  {
    Max = Max + 5;
  }

  int mittelwert = mittelwertBerechnen();
  int mittel = map(mittelwert, 13950, 54290,  100, 0);
  lcd.setCursor(12, 1);
  lcd.print(mittel); //hier mal Var Mittel Probieren
  lcd.setCursor(14, 1);
  lcd.print("%");
  lcd.setCursor(0, 0);
  lcd.print(Min);
  lcd.setCursor(2, 0);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print(Max);
  lcd.setCursor(2, 1);
  lcd.print("%");

  // Messen
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    String stringone = String(mittel);
    client.publish("Gieskanne/mittelwert", stringone);

    if (mittel <= Min)
    {
      Serial.println("Giesen");
      digitalWrite(Relay, HIGH);
      delay(10);
      lcd.setCursor(12, 0);
      lcd.print("*");
    }
    if (mittel >= Max)
    {
      Serial.println("Fertig");
      digitalWrite(Relay, LOW);
      delay(10);
      lcd.setCursor(12, 0);
      lcd.print(" ");

    }
  }
  int sRelay;
  sRelay = digitalRead(Relay);

  Serial.println(sRelay);


}

int mittelwertBerechnen()
{

  int Sensor1 = 0;
  int Sensor2 = 0;
  int Sensor3 = 0;
  int Sensor4 = 0;
  int ergebnis = 0;
  for (int i = 0; i < 10; i++)
  {
    Sensor1 = Sensor1 + ads.readADC_SingleEnded(0);
    Sensor2 = Sensor2 + ads.readADC_SingleEnded(1);
    Sensor3 = Sensor3 + ads.readADC_SingleEnded(2);
    Sensor4 = Sensor4 + ads.readADC_SingleEnded(3);
    delay(10);
  }
  Sensor1 = Sensor1 / 10;
  Sensor2 = Sensor2 / 10;
  Sensor3 = Sensor3 / 10;
  Sensor4 = Sensor4 / 10;
  ergebnis = Sensor1 + Sensor2 + Sensor3 + Sensor4 / 4;
  delay(100);
  Serial.println(Sensor1);
  Serial.println(Sensor2);
  Serial.println(Sensor3);
  Serial.println(Sensor4);
  Serial.println("Ergebnis");
  Serial.println(ergebnis);
  Serial.println("");
  return ergebnis;
}

Kann jemand einen Fehler entdecken?

Gruß

Florian

Hallo,
was für einen Controller verwendest du ?
Bei einem Arduino oder ESP gibt es kein PULLDOWN-Widerstand.
Wie lang sind deine Kabel zum I2C-Display ?

Kannst du die Anzeige (Foto) im Fehlerfall hier posten ?

Wenn es sich um ein Softwareproblem handeln soll, könnte eine Bereichsüberschreitung der Variablen der Grund sein.

Im Übrigen ist Dein Ergebnis vermutlich falsch:

Ohhh man ich Trottel, Punkt vor Strich :man_facepalming:
Ich mache gleich mal ein Foto vom Fehler.
Die Kabel sind ca. 15cm lang.

Gruß Florian

Das kann u.U. bei I2C schon zu lang sein.
Hast du Pullup-Widerstände am I2C-Bus ?
Was für ein Controller ?

Oder Klammer vor Punkt oder ganz drauf verzichten :wink:
[edit] - Kommentare eingefügt [/edit]

unsigned int mittelwertBerechnen()
{
  const byte sensorAnzahl=4;                        // Grundeinstellung Sensoren
  unsigned int sensorWert[sensorAnzahl] = {0};      // Array für alle Sensoren
  unsigned long ergebnis = 0;                       // 32bit-Wert um Überlauf zu vermeiden
  for (int i = 0; i < 10; i++)                      // Anzahl der Lesevorgänge
  {
    for (byte b = 0; b < sensorAnzahl; b++)         // Umlauf für alle Sensoren
      sensorWert[b] += ads.readADC_SingleEnded(b);  // aufnehmen des Wertes
    delay(10);
  }
  for (byte b = 0; b < sensorAnzahl; b++)           // Berechnen über alle Sensoren
  {
    ergebnis += sensorWert[b];                      // aufaddieren jedes Sensorwertes
    Serial.println(sensorWert[b]);                  // Ausgabe des aktuellen Sensor
  }
  ergebnis /= 10 * sensorAnzahl;                    // Das Ergebnis aus der Gesamtsumme ermitteln
  Serial.println("Ergebnis");
  Serial.println(ergebnis);
  Serial.println();
  return ergebnis;
}

wäre mein erster Gedanke...

Es ist ein ESP32.
wow cool so ist der Code natürlich viel besser. Bin halt kein Programmierer :smiley:

Dann muss ich natürlich erstmal die Sensoren neu Kalibrieren.

Danke

Florian

Das sieht nach I2C-Problemen aus.

Nochmal, hast du Pullup-Widerstände am I2C.
Und nimm mal kürzere Kabel.
Verwendest du Levelshifter am I2C ?
Dein Display ist für 3,3V geeignet ?

Also habe die Kabel nochmal gemessen sie sind 8cm lang. Nein ich habe keinen Pullup wiederstand am I2C.
Nein ich habe kein Levelshifter.
Er läuft mit 3,3V ist nur etwas dunkler.

Pullups-Widerstände müssen sein. Ohne die gibt es Probleme, die so aussehen können wie deine. Mit welcher Spannung arbeitet dein LCD ?

Ok, hat sich überschnitten.

Miss mal auf dem LCD nach, ob da Widerstände drauf sind.
Ohne Betriebsspannung.

Hallo,
wie hast Du das Display angeschlossen , könnte es auch ein Wackelkontakt sein. Wenn es sich um einen Steckbrett Aufbau handelt vermute ich sowas.
Heinz

Er hängt am 3,3v PIN habe gelesen das es Probleme gibt wenn ich den LCD an 5V habe beim ESP32.
Ich suche mir mal eine Anleitung zu der Pullup geschichte
Nein ist fest verlötet

Das ist der LCD

Auf dem I2C-Adapter sind Pullups drauf.
Ich würde erstmal den Code richtig bauen und dann nochmal sehen, ob das geht.

Also meinst du das es am Rechenfehler liegt?
Ich werde es mal mit Klammern versuchen ob es besser wird, falls nicht melde ich mich nochmal.

Eine Frage zum Code hätte ich noch, ist es jetzt so das er jeden Sensor nur einmal ausliest?

Vielen Dank euch allen

Florian

Wenn Du oben meinen Codeschnipsel meinst: Nein.

Ich rechne genauso wie Du. Nur eben punkt vor strich :slight_smile:
Ich durchlaufe die erste for() 10x und innerhalb eines Durchlaufes die Sensoren mit einer weiteren for() auf Basis der Anzahl der Sensoren.
Änderst Du die Anzahl der Sensoren oben, passiert alles andere automatisch und Du brauchst nicht in die Codezeilen eingreifen.

Das wert += neuerWert ist die Kurzschreibweise für wert = wert + neuerWert

Wichtig und von mir geändert ist der Wertebereich der Variablen ergebnis.
Ich hab mal Kommentare oben eingefügt....

Top Erklärung!
Solltest mal drüber nachdenken Kurse zu geben :wink:

Gruß Florian

So jetzt funktioniert alles wie es soll

Tausend Dank

Florian

1 Like

Na geht doch!
Danke für die Rückmeldung!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.