Arduino Nano Analog-Uhr mit DS3231 RTC & 1-mA-Amperemeter – Präziser Holz-Timer
Komponenten und Zubehör
| Arduino Nano R3 | ×1 |
| Maxim Integrated DS3231M – ±5ppm, I2C Echtzeituhr | ×1 |
| 1-mA-Amperemeter | ×3 |
| 5-kΩ-Widerstand | ×3 |
| 10-kΩ-Widerstand | ×2 |
| SparkFun Taster 12 mm | ×2 |
Apps und Online-Dienste
- Arduino IDE
Über dieses Projekt
Ich habe diese schöne, im Holz-Look gestaltete analoge Uhr mit einem Arduino Nano und 1-mA-Amperemetern gebaut. Die Idee stammt von hier. Für die Anzeige der Sekunden wurde ein Code-Teil hinzugefügt. Ebenfalls hinzugefügt ist ein Teil, der beim Start die gesamte Skala von Null bis Maximalwert durchläuft, um Kalibrierungszwecke zu erfüllen. Je nach verwendetem Amperemeter können die Werte der 5-kΩ-Widerstände variieren. Da alle Messgeräte leicht unterschiedlich sind, müssen die PWM-Werte an dein Design angepasst werden. Du musst einige Werte ändern, da der Code speziell für meine Messgeräte eingestellt ist.
Code
/* Analog Panel Meter - Clock ONLY Mode
Instructables Link: https://www.instructables.com/id/Analog-VU-meter-and-Clock-Arduino-Powered/
Credits: bildr - DS1307 RTC code https://bildr.org/2011/03/ds1307-arduino/
_____________________
Verkabelung:
- USB rotes Kabel (5V) zu VCC
- USB schwarzes Kabel zu GND
- Taster: Links/Runter an Digital 2 (folge Arduino Tutorial: https://arduino.cc/en/uploads/Tutorial/button.png)
- Rechts/Hoch an Digital 3
- DS1307 RTC: SDA an Analog 4, SCL an Analog 5
- Linkes Analog-Meter an Digital 5 (PWM)
- Rechtes Analog-Meter an Digital 6 (PWM)
- Sekunden Analog-Meter an Digital 9 (PWM)
_____________________
Hinweis: Da alle Messgeräte leicht unterschiedlich sind, müssen die PWM-Werte an dein Design angepasst werden.
Fühle dich frei, meinen Code zu nutzen, aber du musst einige Werte ändern, da er speziell für meine Messgeräte funktioniert.
*/
#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; // Workaround für Issue #527
int downButton = 2; // Runter-Taster für Zeit-Einstellung (Pin 2)
int upButton = 3; // Hoch-Taster für Zeit-Einstellung (Pin 3)
int hours = 0;
int minutes = 0;
int seconds = 0;
int lastMinute = 0;
int lastSecond = 0;
int leftMeter = 5; // linkes Meter (Stunden) an Pin 5
int rightMeter = 6; // rechtes Meter (Minuten) an Pin 6
int secMeter = 9; // Sekunden-Meter an Pin 9
void setup() {
Wire.begin();
Serial.begin(9600); // Zeit im Serial Monitor anzeigen
pinMode(leftMeter, OUTPUT);
pinMode(rightMeter, OUTPUT);
pinMode(secMeter, OUTPUT);
digitalWrite(leftMeter, HIGH); // Messgeräte beim Start testen
digitalWrite(rightMeter, HIGH);
digitalWrite(secMeter, HIGH);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(leftMeter, LOW);
digitalWrite(rightMeter, LOW);
digitalWrite(secMeter, LOW);
digitalWrite(13, LOW);
delay(1000);
}
void loop() {
printDate();
delay(75);
// Zeit mit Tastern ändern
if (digitalRead(downButton) == HIGH) {
byte second = seconds;
byte minute = minutes;
byte hour = hours;
if (minutes > 0) { --minute; }
else { minute = 59; if (hours > 0) { --hour; } else { hour = 23; } }
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); // Oszillator stoppen
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(zero); // starten
Wire.endTransmission();
}
if (digitalRead(upButton) == HIGH) {
byte second = 0;
byte minute = minutes;
byte hour = hours;
if (minutes < 59) { ++minute; }
else { minute = 0; if (hours < 23) { ++hour; } else { hour = 0; } }
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); // Oszillator stoppen
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(zero); // starten
Wire.endTransmission();
}
}
byte decToBcd(byte val) {
// Normale Dezimalzahlen in BCD umwandeln
return ((val/10*16) + (val%10));
}
byte bcdToDec(byte val) {
// BCD in normale Dezimalzahlen umwandeln
return ((val/16*10) + (val%16));
}
void printDate() {
// Register-Zeiger zurücksetzen
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
seconds = bcdToDec(Wire.read());
minutes = bcdToDec(Wire.read());
hours = bcdToDec(Wire.read() & 0b111111); // 24-Stunden-Format
// Zeit im Serial Monitor ausgeben
Serial.print(hours);
Serial.print(":");
// Serial.println(minutes); // Auskommentieren für Serial Monitor
// Spezifische Messgeräte-Pegel für jede Stunde
// Du wirst diese Werte wahrscheinlich anpassen müssen.
// Spiele mit den Werten, bis du das gewünschte Ergebnis erhältst.
if (lastMinute != minutes) {
if (hours == 1 || hours == 13) { analogWrite(leftMeter, 0); }
if (hours == 2 || hours == 14) { analogWrite(leftMeter, 29); }
if (hours == 3 || hours == 15) { analogWrite(leftMeter, 52); }
if (hours == 4 || hours == 16) { analogWrite(leftMeter, 75); }
if (hours == 5 || hours == 17) { analogWrite(leftMeter, 98); }
if (hours == 6 || hours == 18) { analogWrite(leftMeter, 130); }
if (hours == 7 || hours == 19) { analogWrite(leftMeter, 152); }
if (hours == 8 || hours == 20) { analogWrite(leftMeter, 172); }
if (hours == 9 || hours == 21) { analogWrite(leftMeter, 192); }
if (hours == 10 || hours == 22) { analogWrite(leftMeter, 213); }
if (hours == 11 || hours == 23) { analogWrite(leftMeter, 234); }
if (hours == 0 || hours == 12) { analogWrite(leftMeter, 255); }
if (minutes * 4.75 < 255) {
analogWrite(rightMeter, minutes * 4.75); // 4.75 für exakte 30-Minuten-Mitte
} else {
analogWrite(rightMeter, 255);
}
lastMinute = minutes;
if (seconds * 4.25 < 255) {
analogWrite(secMeter, seconds * 4.25);
} else {
analogWrite(secMeter, 255);
}
lastSecond = seconds;
}
}
Schaltplan

Herstellungsprozess
- Arduino POV-Uhr: Persistence-of-Vision LED-Display selbst bauen
- DIY Arduino Word Clock – Elegante Wortuhr mit RTC & Schieberegistern
- Arduino Echtzeituhr für islamische Gebetszeiten bauen
- Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
- Arduino Nano Bundle: CrazyCircuits, DFRobot Sensoren & Werkzeuge – Projekte mit Vertrauen umsetzen
- Analog-Style LED Persistence-of-Vision Uhr – DIY Arduino Nano Projekt
- Kompaktes Trim-Rad für FlightGear mit Arduino Nano
- Panel-Meter: Kosteneffiziente Lösung für Maschinen-Interface und Steuerung
- Digital vs. Analog: Das richtige Panel-Meter wählen
- Panel-Meter verstehen: Überwachung & Steuerung industrieller Anlagen