LCD Display flackert in Kombination mit RTC

Guten Abend.
Ich komme bei folgendem Problem nicht weiter:
Ich habe ein LCD-Display, welches mir ein paar veränderliche Parameter ausgibt. Das funktioniert soweit auch ganz gut.
Wenn ich jetzt ein RTC-Modul dazuhänge und im Sketch überprüfe, ob zwischenzeitlich die Stromverbindung unterbrochen wurde, funktioniert das Display nicht mehr und flackert im 0,5 Sekundentakt, womöglich bleibt der Sketch in der Setup-Funktion hängen.
Kommentiere ich die besagten 2 Zeilen aus, funktioniert das Display wieder so wie es soll.

Dieser Teil bereitet die Probleme:

if(rtc.lostPower()){
     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));}

Und hier der gesamte Sketch:

#include <LiquidCrystal.h>
#define ANALOG_IN_PIN A0
#include <RTClib.h>

byte  i, sekunde, minut, stunde, tag, datum, monat, jahr,
      menge1, zeit1, menge2, zeit2,
      status_Reg, akku;
LiquidCrystal lcd(12, 11, 5, 4, 3, 6);
RTC_DS3231 rtc;

const byte button1   =  13;                   
const byte button2   = 10; 
const byte button3   = 9;  
bool modus1, modus2;

float adc_voltage = 0.0;
float in_voltage = 0.0;
float R1 = 30000.0;
float R2 = 7500.0;
float ref_voltage = 5.0;
int adc_value = 0; 



void setup() {
   Serial.begin(9600);

  if(rtc.lostPower()){
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));}
  
 pinMode(9,  INPUT_PULLUP);
 pinMode(10, INPUT_PULLUP);   
 lcd.begin(20, 4);
 lcd.setCursor(0,2);
 lcd.print("#1: 00:00  00L   AUS");
 lcd.setCursor(0,3);
 lcd.print("#2: 00:00  00L   AUS");
}

void Blink(){
  byte j = 0;
  while(j < 10 && (digitalRead(button1) || i >= 5) && digitalRead(button2)){
    j++;
    delay(25);
  }
}


byte edit(byte x, byte y, byte parameter){
  char text[3];
  while(!digitalRead(button1) || !digitalRead(button3));    // Wait until button B1 is released
  while(true){
    while(!digitalRead(button2)){                           // If button B2 is pressed
      parameter++;
      if(((i == 0) || (i == 5)) && parameter > 23)          // If stundes > 23 ==> stundes = 0
        parameter = 0;
      if(((i == 1) || (i == 6)) && parameter > 10)          // If minuts > 59 ==> minuts = 0
        parameter = 1;
      if(i == 7 && parameter > 1)                           // For alarms ON or OFF (1: alarm ON, 0: alarm OFF)
        parameter = 0;
      lcd.setCursor(x, y);
      if(i == 7){                                           // For alarms ON & OFF
        if(parameter == 1)  lcd.print("EIN");
        else                lcd.print("AUS");
      }
      else{
        sprintf(text,"%02u", parameter);
        lcd.print(text);
      }
      delay(200);                               // Wait 200ms
    }
    lcd.setCursor(x, y);
    lcd.print("  ");                            // Print two spaces
    if(i == 7) lcd.print(" ");                  // Print space (for alarms ON & OFF)
    Blink();                                    // Call Blink function
    lcd.setCursor(x, y);
    if(i == 7){                                 // For alarms ON & OFF
      if(parameter == 1)  lcd.print("EIN");
      else                lcd.print("AUS");
    }
    else{
      sprintf(text,"%02u", parameter);
      lcd.print(text);
    }
    Blink();

    if((!digitalRead(button1) && i < 5) || (!digitalRead(button3) && i >= 5)){
      i++;                                      // Increment 'i' for the next parameter
      return parameter;                         // Return parameter value and exit
    }
  }
}





void loop() {
DateTime now = rtc.now();
 Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
   
 if(!digitalRead(button3)){                  // If B3 button is pressed
      while(!digitalRead(button3));             // Wait until button B3 released
      i = 5;
      zeit1 = edit(4, 2, zeit1);
      menge1 = edit(11, 2, menge1);
      modus1 = edit(17, 2, modus1);
      i = 5;
      zeit2 = edit(4, 3, zeit2);
      menge2 = edit(11, 3, menge2);
      modus2 = edit(17, 3, modus2);

      delay(250); }

adc_value = analogRead(ANALOG_IN_PIN);
adc_voltage  = (adc_value * ref_voltage) / 1024.0; 
in_voltage = adc_voltage / (R2/(R1+R2)); 

if(in_voltage >12.85)
  {akku=100;}
  else if(in_voltage <= 12.85 && in_voltage >12.80)
  {akku=90;}
  else if(in_voltage <= 12.80 && in_voltage >12.65)
  {akku=80;}
  else if(in_voltage <= 12.65 && in_voltage >12.55)
  {akku=70;}
  else if(in_voltage <= 12.55 && in_voltage >12.50)
  {akku=60;}
  else if(in_voltage <= 12.50 && in_voltage >12.40)
  {akku=50;}
  else if(in_voltage <= 12.40 && in_voltage >12.30)
  {akku=40;}
  else if(in_voltage <= 12.30 && in_voltage >12.20)
  {akku=30;}
  else if(in_voltage <= 12.20 && in_voltage >12.00)
  {akku=20;}
  else if(in_voltage <= 12.00 && in_voltage >11.95)
  {akku=10;}
  else {akku=00;}
  
  lcd.setCursor(0,0);
  lcd.print("Akku:      V       %");
  lcd.setCursor(6,0);
  lcd.print(in_voltage);
  lcd.setCursor(16,0);
  lcd.print(akku);
  delay(500);
}

Ich wäre euch voll dankbar, wenn jemand des Rätsels Lösung kennt

Ich vermute, du hast die RTC nicht richtig angeschlossen.
Das wird normal im Setup geprüft, fehlt allerdings bei dir im Sketch.

Hallo lukiluk

Der Sketch bleibt hier hängen:

grafik

Und die Verwendung der while() Anweisung zur Kontrollfluß-Steuerung ist eine extrem ungünstige Lösung.

Hierfür bietet C++ die Anweisungen IF/ELSE und/ SWITCH/CASE an.

Ich wünsche einen geschmeidigen Abend und viel Spass beim Programmieren in C++.

Du weißt schon daß DATE und TIME die Systemzeit des PC im Kompilierungszeitpunkt ist.
Wenn das im fertigen Sketch noch steht dann "Täglich grüßt das Murmeltier".

Grüße Uwe

Aber doch nur, wenn die RTC die Spannung verloren hat.
Danach sollte es normal funktionieren, wenn alles ok ist. :wink:

Ich hab jetzt im Setup noch

if (! rtc.begin()) {
    Serial.println("RTC nicht angeschlossen");
    Serial.flush();
    while(true); }

hinzugefügt und jetzt funktioniert es! An den Anschlüssen ist es nicht gescheitert.
Ich verstehe aber trotzdem nicht warum das einen Einfluss auf die Funktionalität hat, wenn doch nur im Falle eines Nicht-Vorhandenseins der RTC das Programm angehalten wird.

1 Like

Das habe ich auch gerade bemerkt, dass wenn ich in der edit-function bin, die Clock aufhört, Ausgaben zu machen, das werd ich noch ändern :+1:

Ja das ist mir bewusst. Aber mit Lösung des obigen Problems läuft die RTC eh mit der Backup-Batterie weiter

Durch "rtc.begin()" wird erst die Funktion gestartet.
Ohne die stellt sich dein Problem ein.

Du kannst den Thread bzw. dein Problem dann als gelöst kennzeichnen.

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