Arduino cuckoo clock

Today we proudly present our 🎉first🥳 guest post (written in german) about an Arduino cuckoo clock project...

Heute habe ich eine Wette um 2 Packungen Gummibärchen gewonnen. Es ging darum, wer die bessere Uhr mit einem Arduino baut.

Der Aufbau

Tinker (Snapshot von Tinkercad)

  • Die aktuelle Uhrzeit kann man mit 2 Knopfen einstellen.
  • Die Uhrzeit und die Temperatur wird nachdem der Startbildschirm erschienen ist (Smileys) auf dem LCD-Display angezeigt.
  • Die Helligkeit des LCD-Displays ist mit einem Potentiometer einstellbar.
  • Immer zur vollen Stunde singt der Kukkuck.

Der Programmcode

Hier wird die Bibliothek LiquidCrystal Library aufgerufen, die das Ansteuern des LCD-Displays deutlich vereinfacht:

#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6, 13,12,11,10);

So kann man eigene Zeichen auf das LCD-Display schreiben. 0 steht für aus und 1 steht für an.

byte smiley[8] = {
  B00000,
  B10001,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000,

Die Temperatur wird vom Sensor abgelesen...und ständig aktualisiert.

currentVoltage = (analogRead(tempPin) / 1024.0) * 5.0;
Serial.print("current voltage: ");
Serial.println(currentVoltage);
float currentTemp = (currentVoltage - 0.5) * 100;
Serial.print("current temp: ");
Serial.println(currentTemp);

Immer zur vollen Stunde wird...auf dem lcd Display "Kukkuck" angezeigt und dabei das Kukkuckslied gespielt:

if (currentSecond == 0 && currentMinute == 0) {
    currentHour = updateCounter(currentHour, 23);
    lcd.clear();
    lcd.print("kuckuck...");
    playCuckoo();
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("      kuckuck...");
    currentSecond = 17;
}

Hier wird geschaut ob ein Knopf gedrückt wurde, was mit einem kurzen beep tone(tonePin, 440, 100) untermalt wird.

boolean okPressed = false;
  while (!okPressed) {
    okPressed = checkOkPressed();
    incSwitchState = digitalRead(incPin);
    if (incSwitchState != prevIncSwitchState) {
      if (incSwitchState == LOW) {
        Serial.println("inc pressed");
        tone(tonePin, 440, 100);
        currentHour = updateCounter(currentHour, 23);
        printTime("Stunde...");
      }
    }
    prevIncSwitchState = incSwitchState;
  }

In einer zentralen Funktion wird das LCD-Display aktualisiert und bei einer Stunde/Minute unter 10 wird eine 0 davor gesetzt...

void printTime(String lineTwo) {
  lcd.clear();
  lcd.print(zeroPad(currentHour));
  lcd.print(":");
  lcd.print(zeroPad(currentMinute));
  lcd.print(":");
  lcd.print(zeroPad(currentSecond));
  lcd.setCursor(0, 1);
  lcd.print(lineTwo);
}

Und hier ein Auszug aus dem Kukkuckslied...

void playCuckoo() {
  c();
  a();
  pause(vi);

  c();
  a();
  pause(vi);
...
}

samt den Noten/Pausen:

void c() {
  tone(tonePin, 523);
  delay(vi);
}

...

void pause(int p) {
  noTone(tonePin);
  delay(p);
}

Das Ergebnis in Farbe 🥳

Photo