Arduino Nano analoge klok met DS3231 RTC en 1mA ammeter – Precisie houten timer
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino Nano R3 | 1 |
| Maxim Integrated DS3231M – ±5ppm, I2C Real-Time Clock | 1 |
| 1mA ammeter | 3 |
| 5kΩ weerstand | 3 |
| Weerstand 10kΩ | 2 |
| SparkFun Drukknopschakelaar 12mm | 2 |
Apps en online diensten
- Arduino IDE
Over dit project
Ik heb deze mooie houten analoge klok gebouwd met een Arduino Nano en 1mA ammeters. Het idee kwam van een ander project. Voor de weergave van seconden is een deel van de code toegevoegd. Ook is een kalibratie-functie toegevoegd die bij opstarten de volledige schaal afloopt (van nul naar max) om de meters te calibreren. Afhankelijk van de gebruikte ammeters kunnen de waarden van de 5kΩ weerstanden verschillen. Omdat alle meters iets anders zijn, moeten de PWM-waarden worden aangepast op basis van je ontwerp. Je zult waarschijnlijk enkele waarden moeten wijzigen omdat de code specifiek is afgestemd op mijn meters.
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/
_____________________
Wiring:
- USB rood (5V) naar VCC
- USB zwart naar GND
- Knoppen: Links/Omlaag naar Digital 2, Rechts/Omhoog naar Digital 3
- DS1307 RTC: SDA naar Analog 4, SCL naar Analog 5
- Linker meter (uren) naar Digital 5 (PWM)
- Rechter meter (minuten) naar Digital 6 (PWM)
- Seconden meter naar Digital 9 (PWM)
_____________________
Let op: Omdat alle meters verschillen, moeten PWM-waarden worden aangepast.
Voel je vrij de code te gebruiken, maar pas waarden aan voor jouw meters.
*/
#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00;
int downButton = 2;
int upButton = 3;
int hours = 0, minutes = 0, seconds = 0;
int lastMinute = 0, lastSecond = 0;
int leftMeter = 5, rightMeter = 6, secMeter = 9;
void setup(){
Wire.begin();
Serial.begin(9600);
pinMode(leftMeter, OUTPUT);
pinMode(rightMeter, OUTPUT);
pinMode(secMeter, OUTPUT);
// Test meters op start
digitalWrite(leftMeter, HIGH);
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);
// Tijd aanpassen met knoppen
if (digitalRead(downButton) == HIGH){
byte second = seconds, minute = minutes, hour = hours;
if (minute > 0) minute--; else { minute = 59; if (hour > 0) hour--; else hour = 23; }
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(zero);
Wire.endTransmission();
}
if (digitalRead(upButton) == HIGH){
byte second = 0, minute = minutes, hour = hours;
if (minute < 59) minute++; else { minute = 0; if (hour < 23) hour++; else hour = 0; }
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(zero);
Wire.endTransmission();
}
}
byte decToBcd(byte val){ return ( (val/10*16) + (val%10) ); }
byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); }
void printDate(){
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-uurs formaat
// Specifieke meterstanden voor elk uur (moet je aanpassen!)
if (lastMinute != minutes){
if (hours == 1 || hours == 13) analogWrite(leftMeter, 0);
else if (hours == 2 || hours == 14) analogWrite(leftMeter, 29);
else if (hours == 3 || hours == 15) analogWrite(leftMeter, 52);
else if (hours == 4 || hours == 16) analogWrite(leftMeter, 75);
else if (hours == 5 || hours == 17) analogWrite(leftMeter, 98);
else if (hours == 6 || hours == 18) analogWrite(leftMeter, 130);
else if (hours == 7 || hours == 19) analogWrite(leftMeter, 152);
else if (hours == 8 || hours == 20) analogWrite(leftMeter, 172);
else if (hours == 9 || hours == 21) analogWrite(leftMeter, 192);
else if (hours == 10 || hours == 22) analogWrite(leftMeter, 213);
else if (hours == 11 || hours == 23) analogWrite(leftMeter, 234);
else if (hours == 0 || hours == 12) analogWrite(leftMeter, 255);
// Minuten meter (4.75 per minuut voor mijn meter)
if (minutes * 4.75 < 255) analogWrite(rightMeter, minutes * 4.75);
else analogWrite(rightMeter, 255);
lastMinute = minutes;
// Seconden meter (4.25 per seconde)
if (seconds * 4.25 < 255) analogWrite(secMeter, seconds * 4.25);
else analogWrite(secMeter, 255);
lastSecond = seconds;
}
}
Schema's

Productieproces
- Arduino POV-klok: Bouw een Persistence-of-Vision LED-display
- DIY Arduino Woordklok – Bouw een Elegant Real-Time Display
- Bouw een Arduino Real-Time Clock voor Islamitische Gebedstijden
- Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
- Arduino Nano Bundle: CrazyCircuits, DFRobot Sensoren & Tools – Bouw Projecten met Vertrouwen
- Analoge-stijl LED Persistence-of-Vision Klok – DIY Arduino Nano Project
- Compacte Analog Trim Tab Wiel voor FlightGear met Arduino Nano
- Twee Stappenmotors Sturen met Arduino Nano & Joystick – Simpele Tutorial
- Paneelmeters: Een Kosten-effectieve Oplossing voor Machine-interface en Besturing
- De Juiste Paneel Keuzemaken: Digitale vs. Analog Oplossingen
- Paneelmeters Uitgelegd: Hoe Ze Industriële Apparatuur Monitoren en Besturen