Hilfe bei kleinem Projekt mit RTC

Hallo zusammen,

ich habe gerade angefangen ein wenig mit Arduino zu programmieren und wollte zum Start ein kleines Projekt umsetzen.

Ich habe ein LCD Display, ein DS3231 RTC Modul und zwei Knöpfe.
Wenn man den einen Knopf drückt, soll das Display für 5 Sekunden angehen und die aktuelle Uhrzeit speichern/anzeigen.
Der zweite Knopf soll nur das Display aktivieren und die Zeit nur anzeigen, aber nicht aktualisieren.
Der eine Knopf zeigt mir also an, wann ich die Katzen zuletzt gefüttert habe, den anderen Drücke ich, wenn ich die Katzen gefüttert habe, damit sich die Zeit aktualisiert.

Ich hoffe ich habe es einigermaßen verständlich erklärt.

Dies ist mein Code:

#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>


DS3231 myRTC;
LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C-Adresse, 20 Zeichen pro Zeile, 4 Zeilen
const int buttonPin1 = 6;
const int buttonPin2 = 7;


bool century = false;
bool h12Flag;
bool pmFlag;


void setup() {
  Wire.begin();
  lcd.init();
  lcd.noBacklight();
  lcd.setCursor(0, 0);
  lcd.print("Katzen gefuettert:");
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  lcd.setCursor(0, 1);
  lcd.print("Datum: ");
  lcd.setCursor(0, 2);
  lcd.print("Uhrzeit: ");

  myRTC.setHour(17);
  myRTC.setMinute(31);
  myRTC.setDate(26);
  myRTC.setMonth(10);
  myRTC.setYear(23);
  displayDateTime();
  }



void loop() {
  int reading = digitalRead(buttonPin1);

    if (reading == HIGH) {
     lcd.backlight();
     displayDateTime();
     delay(5000);
     lcd.noBacklight();
    }
  
int reading2 = digitalRead(buttonPin2);

    if (reading2 == HIGH) {
     lcd.backlight();
     delay(5000);
     lcd.noBacklight();
    }

 
}

void displayDateTime() {
 
  lcd.setCursor(7, 1);
  lcd.print(myRTC.getDate(), DEC);
  lcd.print('/');
  lcd.print(myRTC.getMonth(century), DEC);
  lcd.print('/');
  lcd.print(myRTC.getYear(), DEC);
  lcd.setCursor(9, 2);
  lcd.print(myRTC.getHour(h12Flag, pmFlag), DEC);
  lcd.print(':');
  if (myRTC.getMinute() < 10){
    lcd.print("0");
    lcd.print(myRTC.getMinute(), DEC);
}else {
  lcd.print(myRTC.getMinute(), DEC);
}
}

Nun bräuchte ich bei zwei Dingen Hilfe.

  1. Aktuell gebe ich ja manuell Datum und Uhrzeit für das RTC mit. Kann man da irgendwie bei der Initialisierung die Systemzeit des Computers nehmen?
  2. Wenn man den Strom trennt und das Programm neu startet, wird ja auch die Zeit neu gesetzt. Sinn des RTC ist es ja, dass diese gespeichert wird. Wie kriege ich es hin, dass nach Stromverlust die Zeit nicht neu gesetzt wird?

Vielen Dank schon einmal im Voraus :slight_smile:

So richtig verstehe ich deine Beschreibung nicht.

Eine korrekt funktionierende RTC enthällt immer die korrekte Zeit. Die muss dann nicht aktualisiert oder gespeichert werden.

Hallo @njoy1522

willkommen im Arduino-Forum.
Schon mal supergut, dass du das Programm als Code-Section gepostest hast.

Ob und wie man die Systemzeit des Computers nehmen kann hängt davon ab welchen Microcontroller du verwendest.

Mit einem ESP32 der mit dem WLAN verbunden ist braucht man nicht einmal eine RTC.

Wenn du einen Arduino Uno verwendest, dann könnte man über eine serielle Schnittstelle die aktuelle Uhrzeit senden.

Und je nach µC geht vielleicht noch was anderes.
Deshalb poste welchen µC du verwendest.

vgs

Es geht darum mit dem einen Knopf die letzte Fütterungszeit anzuzeigen
und
mit dem anderen Knopf eine neue "letzte Fütterung um hh:mm" zu speichern.

1 Like

Ich verwende ein Elegoo Uno R3

Wenn die RTC eine Batterie/einen Akku hat, läuft die Zeit weiter, sonst nicht.
zum einmaligen Stellen kannst Du die Macros DATE und TIME benutzen. Sie enthalten Datum und Uhrzeit des Kompilens Deines Sketches.

Wie Du sie nutzen kannst, hängt von der Lib ab. Es gibt viele für die DS3231, da müsstest Du uns einen Link zur Lib schicken.

Gruß Tommy

Die Zeit läuft ja auch korrekt weiter, nur bei neustarten der Stromversorgung ist alles wieder auf meiner initial eingestellten Zeit. Das RTC hat eine Batterie. Deshalb gehe ich einfach mal davon aus, dass mein Code sehr schlecht ist :smiley:

Die Library ist GitHub - NorthernWidget/DS3231: Communicates between Arduino-programmed AVR and Maxim DS3231 RTC: splice of Ayars' (http://hacks.ayars.org/2011/04/ds3231-real-time-clock.html) and Jeelabs/Ladyada's (https://github.com/adafruit/RTClib) libraries

Den Part zum Stellen der Uhr im Setup musst du nach dem ersten Stellen ausblenden.

1 Like

Oh mein Gott, da stand ich echt auf dem Schlauch. So sollte es tatsächlich funktionieren

Zumindest wird dann nicht immer wieder die Zeit "neu" gestellt.

Bei meiner LED-Uhr mit DS3231 habe ich ein Programm zum Stellen der Uhrzeit und eins für den normalen Betrieb. Da die Abweichung bei Zimmertemperatur erfreulich gering ist, stelle ich sie höchstens einmal im Jahr. Sommer/Winterzeit wird berechnet für eine automatische Umstellung.

Meine eine RTC läuft fast draußen = Geräteschuppen und in 2J hat erst 2Min Vorlauf. Nächste Woche bekommt die automatische Sommer / Winterzeitumstellung dann ist die wider gut eingestellt :wink:

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