Bitte dringend um Hilfe!

Hallo liebe Community,
ich habe vor einiger Zeit ein Diorama gebaut, in dem eine Uhr eingebaut ist.
Außerdem ist die eingebaute Beleuchtung über eine Fernbedienung an/ausschaltbar.

Das Problem: Das ganze is bisher am PC mit USB angeschlossen. Aber wenn der Strom mal weg is muss ich den Code komplett neu laden damit die Zeit wieder stimmt.
Ich bin komplett raus aus der Programmierung und würde die Zeit gern per Fernbedienung stellen damit ich das alles nicht mehr über PC laufen lassen muss.
Kann mir bitte jemand helfen?
Nachfolgend der bestehende Code.

#include "RTClib.h"
#include <Wire.h>
#include <IRremote.h>               // Die IRRemote- Library
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0);

int ledPin = 2;
byte ledState = 0;

int RECV_PIN = 9;                   // An Pin 9 werden die Empfangenen Daten vom
                                    // Infrarotsensor gesammelt

IRrecv irrecv(RECV_PIN);            // Ein IRrecv- Objekt wird definiert,

decode_results results;             // Die dekodierten Daten, werden in Results
// gespeichert

RTC_DS3231  rtc;

void setup() {

  Serial.begin (9600);
  irrecv.enableIRIn();                // Der Infrarotsensor wird hier initialisiert
  pinMode(ledPin, OUTPUT);
  
  Serial.println(RECV_PIN);
  
  u8g2.begin();

 if (! rtc.begin()) {
    Serial.print("RTC nicht gefunden");
    Serial.flush();
    abort();
  }

  //if (rtc.lostPower()) {
    //Serial.print("Zeit muss neu eingestellt werden");
    // Wenn die Zeit auf einem neuen Gerät oder nach einem Stromausfall eingestellt werden muss,
    //setzt die folgende Zeile die RTC auf das Datum und die Uhrzeit, zu der dieser Sketch erstellt wurde
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  //}
}

void loop()
{  
  u8g2.firstPage();
  do { 
  DateTime now = rtc.now();
    u8g2.setFont(u8g2_font_crox4hb_tn);
    u8g2.setCursor(15, 20);
    ausgabe(now.day());
    u8g2.print('.');
    ausgabe(now.month());
    u8g2.print('.');
    u8g2.print(now.year(), DEC);

    u8g2.setFont(u8g2_font_helvR24_tn);
    u8g2.setCursor(2, 60);
    ausgabe(now.hour());
    u8g2.print(':');
    ausgabe(now.minute());
    u8g2.print(':');
    ausgabe(now.second());
  } while ( u8g2.nextPage() );

  // Code für die LEDs
  if (irrecv.decode()){
    Serial.println(irrecv.results.value);
    
    //unsigned int value = results.value;
    if (irrecv.results.value == 16726215){
    ledState = !ledState;
    digitalWrite(ledPin, !digitalRead(ledPin));
  }
    irrecv.resume();
}

 }

//wenn die Stunde einstellig ist, setzt dies eine 0 an erster Stelle
void ausgabe(uint8_t zahl){
   if (zahl < 10) {
      u8g2.print('0');
    }
    u8g2.print(zahl, DEC);
}

Lade den Sketch einmal neu auf den Arduino.
Dann kommentierst Du diese Zeile aus:

```
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
```

Den Sketch lädst Du wieder rauf.
Jetz zieh den Stecker.
Warte nen Weilchen und steck den Stecker wieder an.

Werde ich sofort mal ausprobieren.

Nur zu, das wird funktionieren.

Diese RTC-Uhren haben allerdings eine Pufferbatterie, die nach ein paar Jahren ausgetauscht werden muss. Aber immer noch einfacher dann nach dem Wechseln 1x die Zeit am PC zu setzen.

DATE bzw TIME sind die System-Datum bzw System-Zeit des PC. Diese wird im Kompilations-Zeitpunkt in den Sketch eingebaut und dieser setzt die RTC die am Arduino hängt.
Damit nicht bei jedem Start des Arduino die RTC auf die zum Kopilierzeitpunkt richtigen Zeit gesetzt wird muß wie my_xy_projekt sofort der Sketch ersetzt werden.

Ich ziehe die Lösung die Zeit mittels eines über serial verschickten Strings ( zB TssmmhhWDDMMYYYY) vor. siehe Beispiel der DS3231 Bibliothek: ds3231/examples/rtc_ds3231/rtc_ds3231.ino at master · rodan/ds3231 · GitHub

void parse_cmd(char *cmd, int cmdsize)
{
    uint8_t i;
    uint8_t reg_val;
    char buff[BUFF_MAX];
    struct ts t;

    //snprintf(buff, BUFF_MAX, "cmd was '%s' %d\n", cmd, cmdsize);
    //Serial.print(buff);

    // TssmmhhWDDMMYYYY aka set time
    if (cmd[0] == 84 && cmdsize == 16) {
        //T355720619112011
        t.sec = inp2toi(cmd, 1);
        t.min = inp2toi(cmd, 3);
        t.hour = inp2toi(cmd, 5);
        t.wday = cmd[7] - 48;
        t.mday = inp2toi(cmd, 8);
        t.mon = inp2toi(cmd, 10);
        t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
        DS3231_set(t);
        Serial.println("OK");
...
}

Grüße Uwe

Ja...
Jetzt ist die Frage, ob der Begeisterung Du noch immer davor sitzt und Dich freust, das die Uhr nach dem 312ten Mal "Strom weg" noch immer richtig läuft :slight_smile:

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