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

