Zeit verstellen Poti

Grüße ins Forum,
ich benötige eure Hilfe bei folgendem DS3231 Alarm Sketch:

#include <RTClib.h>
RTC_DS3231 rtc;
#define CLOCK_INTERRUPT_PIN 2
volatile bool alarm = false;
const int ledPin = 12;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
if(!rtc.begin()) {
Serial.println("Couldn't find RTC!");
Serial.flush();
abort();
}
if(rtc.lostPower()) {
rtc.adjust(DateTime(2022, 1, 1, 00,00,00));
}
rtc.disable32K();
pinMode(CLOCK_INTERRUPT_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(CLOCK_INTERRUPT_PIN), onAlarm, FALLING);
rtc.clearAlarm(1);
rtc.clearAlarm(2);
rtc.writeSqwPinMode(DS3231_OFF);
DateTime alarmTime (2022, 1, 2, 0, 0, 20);
rtc.setAlarm1(alarmTime, DS3231_A1_Hour);
Serial.print("Current time: ");
printTime();
Serial.println();
DateTime alarmTime2 (2022, 1, 2, 4, 0, 0);
rtc.setAlarm2(alarmTime2, DS3231_A2_Hour);
Serial.print("Current time: ");
printTime();
Serial.println();
}
void loop() {
if(alarm){
if(rtc.alarmFired(1)) {
Serial.println("Alarm occured, current time: ");
printTime();
rtc.clearAlarm(1);
Serial.println("Alarm 1 cleared");
digitalWrite (ledPin, HIGH);
delay (2000);
digitalWrite (ledPin, LOW);
}
if(rtc.alarmFired(2)) {
Serial.println("Alarm occured, current time: ");
printTime();
rtc.clearAlarm(2);
Serial.println("Alarm 2 cleared");
digitalWrite (ledPin, HIGH);
delay (2000);
digitalWrite (ledPin, LOW);
}
}
}
void printTime(){
// print current time
DateTime now = rtc.now();
char date[] = "DD.MM.YYYY, ";
Serial.print(now.toString(date));
char time[] = "hh:mm:ss";
rtc.now().toString(time);
Serial.println(time);
}
void onAlarm() {
alarm = true;
}

Den Sketch habe ich gut hinbekommen, jetzt möchte ich die Startzeit/Zeile 15(00.00.00) mittels eines Poti`s verstellen können. Poti deshalb, weil ich da eine Skala aufkleben kann, wo man die eingestellte Zeit ablesen kann. Weil ich kein Display verbauen möchte. Linker Anschlag 0Uhr rechter Anschlag 12Uhr/oder umgekehrt. Es sollte in 15 Min Schritten gehen, sprich 48 Schritte(00.00-00.15-00.30 etc.). Datum spielt keine Rolle/auch die Genauigkeit der Zeit steht nicht im Vordergrund. Wenn der Arduino/DS3231(ohne Pufferakku) mit Strom versorgt wird, soll ab der eingestellten Uhrzeit loslaufen.
Drehreglerwert=analogRead(Drehregler);
Drehreglerwert=map(Drehreglerwert, 0,1023,0,48);
Wie bekomme ich den „Drehreglerwert“(0-48) in eine Zeit umgewandelt und wie bekomme ich dann den Wert an die richtige Stelle?
Hat da jemand eine Idee? Ich bin eher der "Hardwarebasteler" als Programmierer.

Setze Deinen Sketch bitte in Codetags. Wie das geht, steht hier.
Außerdem formatiere den Code bitte ordentlich. Strg+T in der IDE hilft Dir dabei.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Die Warnungen der IDE solltest Du in den Voreinstellungen anzeigen lassen und die Programmfehler beseitigen.

Kurzfassung:

Test_Forum.ino:59:15: warning: invalid conversion from 'const char*' to 'char' [-fpermissive]
   char date = "DD.MM.YYYY, ";
               ^~~~~~~~~~~~~~
Test_Forum.ino:61:15: warning: invalid conversion from 'const char*' to 'char' [-fpermissive]
   char time = "hh:mm:ss";
               ^~~~~~~~~~

15 Minuten sind 900 sekunden.
Die lib dürfte wohl unixtime / .now() unterstützen und das stellen der Uhr/derAlarmzeit in etwa dieser Art:
rtc.setAlarm1(900*Drehreglerwert);
[edit] Was für ne lib nimmst Du? Es könnte wohl so aussehen:

rtc.setAlarm1(TimeSpan(900UL*Drehreglerwert), DS3231_A1_Second);

[/edit]
Da Die Uhr immer mit 00:00:00 startet, kein Problem.

So jetzt mal mit den Code Tags.
Ich möchte wenn das RTC Modul die Spannung verliert(rtc.lostPower), das der an der vorher mit dem Poti eingestellten Zeit anfängt zu laufen. Jetzt ist ja 00.00.00 Uhr voreingestellt. Also stelle ich nur die Zeit bis zum Alarm(der erste 20 sec nach dem jetzt eingestellten Alarm), danach kommt der Alarm alle 24h. So eine Art Timer, bei der ich Startzeit verzögere, der zwei mal am Tag Alarm schlägt.
Ich hoffe das das jetzt verständlicher ist.

#include <RTClib.h>
RTC_DS3231 rtc;
#define CLOCK_INTERRUPT_PIN 2
volatile bool alarm = false;
const int ledPin = 12;
void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC!");
    Serial.flush();
    abort();
  }

  if (rtc.lostPower()) {

    rtc.adjust(DateTime(2022, 1, 1, 00, 00, 00));
  }


  rtc.disable32K();

  // Making it so, that the alarm will trigger an interrupt
  pinMode(CLOCK_INTERRUPT_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(CLOCK_INTERRUPT_PIN), onAlarm, FALLING);

  // set alarm 1, 2 flag to false (so alarm 1, 2 didn't happen so far)
  // if not done, this easily leads to problems, as both register aren't reset on reboot/recompile
  rtc.clearAlarm(1);
  rtc.clearAlarm(2);

  // stop oscillating signals at SQW Pin
  // otherwise setAlarm1 will fail
  rtc.writeSqwPinMode(DS3231_OFF);


  DateTime alarmTime (2022, 1, 2, 0, 0, 20);
  rtc.setAlarm1(alarmTime, DS3231_A1_Hour);
  Serial.print("Current time: ");
  printTime();
  Serial.println();

  DateTime alarmTime2 (2022, 1, 2, 4, 0, 0);
  rtc.setAlarm2(alarmTime2, DS3231_A2_Hour);
  Serial.print("Current time: ");
  printTime();
  Serial.println();

}
void loop() {
  if (alarm) {
    if (rtc.alarmFired(1)) {
      Serial.println("Alarm occured, current time: ");
      printTime();
      rtc.clearAlarm(1);
      Serial.println("Alarm 1 cleared");
      digitalWrite (ledPin, HIGH);
      delay (2000);
      digitalWrite (ledPin, LOW);


    }
    if (rtc.alarmFired(2)) {
      Serial.println("Alarm occured, current time: ");
      printTime();
      rtc.clearAlarm(2);
      Serial.println("Alarm 2 cleared");
      digitalWrite (ledPin, HIGH);
      delay (2000);
      digitalWrite (ledPin, LOW);


    }
  }
}
void printTime() {
  // print current time
  DateTime now = rtc.now();
  char date[] = "DD.MM.YYYY, ";
  Serial.print(now.toString(date));
  char time[] = "hh:mm:ss";
  rtc.now().toString(time);
  Serial.println(time);
}
void onAlarm() {
  alarm = true;
}

nein:

Wie gerechnet wird, habe ich Dir oben gezeigt.

Die Zeit ```
rtc.adjust(DateTime(2022, 1, 1, 00, 00, 00))

Dann nicht die Alarmzeit sondern die Uhrzeit stellen.

Ich habe den Code von"wolles-elektronikkiste.de" und mit ein wenig basteln so umfunktioniert.
Welche lib ich verwende, kann ich nicht sagen.

Dann musst Du raten. Zu jeder lib gibt es Examples.
Vielleicht steht da was drin.
Ansonsten ins lib-Verzeichnis gehen und nachschauen.
Das wäre meine Idee - damit ist dann aber auch Schluß.

rtc.adjust(TimeSpan(900UL*Drehreglerwert));

Hast du das schon mal mit einem "normalen Poti" versucht ?
Das mit 48 Schritten zu machen, halte ich für ein Wunschdenken.
Diese Dinger sind für dein Vorhaben sicher viel zu ungenau.

Nimm dafür einen Drehimpulsgeber (Encoder), z.B. den KY-040. Da hast du auch eine bessere Genauigkeit und Reproduzierbarkeit.

Im Verzeichnis der Lib in der Datei library.properties sollte eine URL stehen.

Gruß Tommy

Hallo den Encoder möchte ich nicht nehmen, weil er kein Anschlag hat.Müsste mir den Wert auf einem Display anzeigen lassen. Den ungefähren Wert möchte ich auf der Skala ablesen, kommt auf +/- 15 Minuten nicht an

Hallo,
Du willst die Uhrzeit auf einen beliebigen Wert einstellen , so das Deine Alarmen zum richtigen Zeitpunkt kommen, weil Du die Alarmzeit fest eingestellt hast. ich denke deine Vorgehensweise ist,sagen wir mal, etwas unüblich. :wink:
Du musst die Uhr richtig stellen und die Alarmzeit verändern. Die RTC hat doch eine Batterie, wenn Du die einmal richtig stellst, läuft die auch weiter wenn der Arduino keinen Strom hat, und das über Jahre.
Eigentlich willst Du doch nur eine Eieruhr. Wenn das nicht super genau sein soll bekommst Du das mit millis() auch hin. Wenn dir das nicht genau genug ist kannst Du doch auch die richtige Uhrzeit aus der RTC ständig auslesen, z.B mit millis() jede Sekunde, und wenn die Uhrzeit die mittels Deines Potis eingestellten Zeitpunkt erreicht, deinen Alarm ausgeben. Du kannst Doch auch mit dem Poti die Alarmzeit einstellen. Und wenn Du zwei Alarmzeiten hast dann nimm zwei Potis , oder einen zus. Auswahlschalter.
Heinz

Du könntest dir einen eigenen, optischen Anschlag per Led bauen.
Nur mit dem Poti sehe ich das nicht. Nicht mit den 48 Schritten.

Na dann, viel Erfolg dabei.

Unter "Installation der RTCLib für den DS3231" steht da "Ihr könnt die RTCLib (Adafruit) über die Bibliotheksverwaltung der Arduino IDE installieren:" mit Bild. Inzwischen sind wir bei Version 2.0.2, die Du installiert haben solltest. Hast Du?

Hallo ist ein wenig schwer zu erklären.
Es soll jeder mit der Wartung des Projekt ohne viel Erklärung auskommen.
Die Länge des Alarms und die Zeit dazwischen sind vorgegeben, also von außen nicht veränderbar.
Es soll einfach die ungefähre Zeit bis zum ersten Alarm eingestellt werden, danach einen Taster drücken(RTC kurz reseten/Stromlos machen) und es geht wieder an der eingestellten Zeit los.
Das kann ich jedem erklären: Du bist Anfang der Woche um 14 Uhr da, der Alarm sollte diese Woche um ca. 20 Uhr(abhängig vom Sonnenuntergang) kommen, Poti auf 6(oder 18 Uhr) stellen, und der Alarm kommt jeden Tag um die gleiche Zeit, bis er wieder verstellt wird.
Es gibt wohl fertige Module mit Display, aber das kann ich den "alten Herren" nicht einfach erklären.
Hier noch mal die lib:
url=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

Ich habe noch 1.8.13 . Werde das nachher mal updaten.

Hast Du die Codezeile aus #10 ausprobiert?
Ja? Mit welchem Ergebnis?
Nein?

Ich werde es nachher ausprobieren, bin da nicht nicht zu gekommen.