Weckeruhr ohne RTC-Modul

Ich bin dabei einen Wecker zu Programmiern.
Dabei habe ich bereits viel ausprobiert, aber mein Code funktioniert irgendwie nicht ganz, und ich weiß nicht warum. Was Ich bis jetzt gemacht habe ist, das die Uhrzeit angezeigt wird. Gerne könnt ihr mir auch weiterhelfen beim Wecker.
Anbei mein Code.
Dazu: Ich möchte keinen RTC verwenden.
Auserdem fehlt dort noch die Zeit für den Wecker, und das ein Ausgang geschaltet werden soll, wenn die zeit erreicht ist. Diese soll über einen Taster eingestellt werden.

#include <TM1637Display.h>
#include <Wire.h>

const int CLK_PIN = 2;
const int DIO_PIN = 3;
const int hourButtonPin = 8;
const int minButtonPin = 9;

TM1637Display display(CLK_PIN, DIO_PIN);

int currentHour = 12;
int currentMinute = 0;

bool hourMode = true;
unsigned long lastUpdateTime = 0;
const unsigned long updateInterval = 1000;

void setup() {
  display.setBrightness(7);
  pinMode(hourButtonPin, INPUT_PULLUP);
  pinMode(minButtonPin, INPUT_PULLUP);

  Wire.begin();
}

void loop() {
  unsigned long currentTime = millis();

  if (digitalRead(hourButtonPin) == LOW)
    hour();
  if (digitalRead(minButtonPin) == LOW)
    miner();

  if (currentTime - lastUpdateTime >= updateInterval) {
    lastUpdateTime = currentTime;

    if (hourMode) {
      display.showNumberDecEx(currentHour * 100 + currentMinute, 0b11100000, true);
    } else {
      display.showNumberDecEx(currentMinute, 0b11100000, true);
    }
  }
}

void hour() {
  if (hourMode) {
    currentHour = (currentHour + 1) % 24;
  }
  while (digitalRead(hourButtonPin) == LOW)
    ;
}

void miner() {
  if (!hourMode) {
    currentMinute = (currentMinute + 1) % 60;
  }
  while (digitalRead(minButtonPin) == LOW)
    ;
}

Wieso?

Wozu?

weil ich nicht alles kaufen muss.

für Wire.begin();

brauchst du den Wecker anscheinend für einmal?

ok, jetzt die schwerste Frage: Wozu glaubst du Wire.begin(); ist gut? Hast du probiert es aus zu kommentieren?

für die Kommunikation

zwischen was?

nein für die Schule

Für die Schule, also für eine einzige Vorstellung. Jetzt ist es verständlich.

zwischen dem <TM1637Display.h> und dem was ich geschrieben habe.
Stand so im Internet

um noch dutzend aufeinander greifende Fragen zu ersparen, fasse ich kurz zusammen:
TM1637 Module braucht keine I2C Verbindung. Genau deshalb werden Pins 2 und 3 deklariert, aber I2C Pins sind (bei Uno und Nano) auf den A4/A5.

ansonsten, was ist dein Problem eigentlich?

mein Code funktioniert irgendwie nicht ganz

sagt nichts über deine Erwartungen und was du erhalten hast

Wie funktioniert das? define wir doch vor dem Kompilieren aufgelöst, oder? Das kompilieren passiert vor dem hochladen, richtig? Wie kann man den Zustand eines Pins auslesen, vor dem hochladen?
Bzw. man kann ja auch ohne hochladen kompilieren und auch ohne dem vorhanden sein des Ziels kompilieren. Wie können dann die define aufgelöst werden?

Gar nicht.

Das #define ist eine Textersetzung, die vom Präprozessor vor dem eigentlichen Kompilieren durchgeführt wird.

Wo HourBtnPressed stand, wird stattdessen !digitalRead(hourButtonPin) eingefügt.

2 Likes

Stimmt, klarer Gedankenfehler von mir. Danke!

Das kannst du dann z.B. in einer Anweisung wie
if (HourBtnPressed) { ... }
verwenden, wo es wie eine undefinierte und nie initialisierte oder aktualisierte Variable aussieht.
Toll !

Hallo,
ich kann mich mit der Variante noch nicht so richtig anfreunden. eine bool Variable "HourBtnPressed" und dann im loop einmal

HourBtnPressed= !digitalRead(hourButtonPin)

bietet zudem den Vorteil das man die Variable dann im code mehrfach abfragen kann ohne das sich inzwischen der Pegel geändert haben kann, was bei einem mehrfachen Einlesen des Einganges ja nicht ausgeschlossen ist.
Heinz

1 Like

Sehe ich auch so.
Verstehen was passiert, das gut finden und selber auch so machen sind nicht dasselbe.

Mit anderen Worten: Andere dürfen für dich die Hausaufgaben machen ?

Nein damit ich morgens rechtzeitig aufstehe!