128x64 LCD Smart Clock: Analog/Digital Zeit & Temperatur – Arduino Nano + DS3231 RTC
Komponenten und Zubehör
| Arduino Nano R3 | × | 1 |
| Maxim DS3231M RTC Modul (±5 ppm, I²C) | × | 1 |
| 10 kΩ Potentiometer (Kontrasteinstellung) | × | 1 |
| Taster (Bildschirmumschaltung) | × | 1 |
| 128x64 LCD Grafikdisplay (ST7920-Controller) | × | 1 |
Benötigte Werkzeuge
- Lötkolben
Über dieses Projekt
Diese Uhr basiert auf einem Arduino Nano mit 128x64 LCD-Grafikdisplay, DS3231 Echtzeituhr (RTC), Potentiometer für Kontrast und einem Taster. Die RTC wird über A4 (SDA) und A5 (SCL) angebunden, der Taster an D3 mit internem Pull-Up.
Benötigte Bibliotheken (in Arduino IDE unter libraries entpacken):
- U8glib
- DS3232RTC
- Streaming
- Time
- Wire
Zwei Anzeigemodi (per Taster umschaltbar)
- Bildschirm 1: Analoguhr, Digitaluhr, Datum, aktuelle Temperatur.
- Bildschirm 2: Digitaluhr, Wochentag, Datum, aktuelle/Min-/Max-Temperatur.
(Foto der Anzeige im Originalprojekt)
Zeit & Datum einstellen
Über den Seriellen Monitor (9600 Baud) im Format: Jahr, Monat, Tag, Stunde, Minute, Sekunde eingeben. Bei Erfolg erscheint Bestätigung.
Code
// 128x64 LCD & RTC DS3231 Uhr
// Autor: Arduino e Cia
#include <U8glib.h>
#include <DS3232RTC.h>
#include <Streaming.h>
#include <Time.h>
#include <Wire.h>
// Display-Verbindungen anpassen (Enable, RW, RS, RESET)
U8GLIB_ST7920_128X64_1X u8g(6, 5, 4, 7);
int X2=0, Y2=0, X3=0, Y3=0;
float angulo=0;
int posicao=0, posicaoh=0;
int temperatura=0, min_temp=500, max_temp=-500;
int ScreenWith=128, ScreenWithC=96, ScreenHeight=64, ScreenHeightC=32;
#define botao 3
int estado_botao=0;
char* dia_da_semana[]={"So","Mo","Di","Mi","Do","Fr","Sa"};
void tela_1() { // Analog + Digital + Temp
u8g.drawRFrame(0,0,128,64,3);
u8g.setPrintPos(20,30); u8g.print(temperatura); u8g.drawStr(42,30,"C"); u8g.drawCircle(37,34,2);
mostra_relogio_digital();
fundo_relogio();
desenha_ponteiro(hour()-1, 12.0, 10); // Stunden
desenha_ponteiro(minute()-5, 60.0, 19); // Minuten
desenha_ponteiro(second()-5, 60, 21); // Sekunden
}
void tela_2() { // Digital + Min/Max Temp
u8g.drawRFrame(0,0,128,64,3);
u8g.drawRFrame(68,4,55,56,2);
mostra_relogio_digital();
u8g.setFont(u8g_font_5x8);
u8g.drawStr(78,35,"MIN"); u8g.drawStr(78,53,"MAX");
u8g.setFont(u8g_font_6x13);
u8g.setPrintPos(25,41); u8g.print(dia_da_semana[weekday()-1]);
u8g.setPrintPos(83,19); u8g.print(temperatura); u8g.drawStr(105,19,"C"); u8g.drawCircle(100,12,2);
u8g.setPrintPos(98,36); u8g.print(min_temp); u8g.drawCircle(113,29,2);
u8g.setPrintPos(98,54); u8g.print(max_temp); u8g.drawCircle(113,47,2);
}
void desenha_ponteiro(float valor, float rotacao, int Radius) {
angulo = valor * 2.0 * 3.1415 / rotacao - 1.5707;
X2 = ScreenWithC + Radius * cos(angulo);
Y2 = ScreenHeightC + Radius * sin(angulo);
u8g.drawLine(ScreenWithC, ScreenHeightC, X2, Y2);
}
void fundo_relogio() {
u8g.drawCircle(ScreenWithC, ScreenHeightC, 27);
u8g.drawCircle(ScreenWithC, ScreenHeightC, 1);
u8g.setFont(u8g_font_6x13); u8g.setFontPosTop();
u8g.drawStr(90,9,"12"); u8g.drawStr(114,25,"3");
u8g.drawStr(94,44,"6"); u8g.drawStr(74,25,"9");
for(int i=0;i<12;i++) {
angulo = i/12.0 * 2 * 3.1415;
X2 = ScreenWithC + 25 * cos(angulo);
Y2 = ScreenHeightC + 25 * sin(angulo);
X3 = X2; Y3 = Y2;
u8g.drawLine(X2,Y2,X3,Y3);
}
}
void mostra_relogio_digital() {
u8g.setFont(u8g_font_5x8);
u8g.setPrintPos(8,55); u8g.print(day()); u8g.drawStr(19,55,"/");
u8g.setPrintPos(24,55); u8g.print(month()); u8g.drawStr(35,55,"/");
u8g.setPrintPos(41,55); u8g.print(year());
u8g.drawRBox(3,4,62,21,2);
u8g.setColorIndex(0); u8g.setFont(u8g_font_fub17); u8g.drawStr(29,21,":");
if(hour()<10){ u8g.drawStr(3,23,"0"); posicaoh=16; } else posicaoh=3;
u8g.setPrintPos(posicaoh,23); u8g.print(hour());
if(minute()<10){ u8g.drawStr(38,23,"0"); posicao=51; } else posicao=38;
u8g.setPrintPos(posicao,23); u8g.print(minute());
u8g.setColorIndex(1);
}
void setup() {
pinMode(3, INPUT_PULLUP);
Serial.begin(9600);
if(u8g.getMode()==U8G_MODE_R3G3B2) u8g.setColorIndex(255);
else if(u8g.getMode()==U8G_MODE_GRAY2BIT) u8g.setColorIndex(3);
else if(u8g.getMode()==U8G_MODE_BW) u8g.setColorIndex(1);
setSyncProvider(RTC.get);
Serial << F("RTC Sync");
if(timeStatus()!=timeSet) Serial << F(" FEHLGESCHLAGEN!");
Serial << endl;
}
void loop() {
temperatura = RTC.temperature() / 4.0;
if(temperatura >= max_temp) max_temp = temperatura;
if(temperatura <= min_temp) min_temp = temperatura;
static time_t tLast;
time_t t = now();
if(t != tLast){ tLast = t; printDateTime(t); Serial << endl; }
// Serielle Zeiteinstellung: Jahr(2/4-stellig),Monat,Tag,Stunde,Minute,Sekunde
if(Serial.available() >= 12) {
int y = Serial.parseInt();
if(y>=100 && y<1000) Serial<=1000) tm.Year = CalendarYrToTm(y);
else tm.Year = y2kYearToTm(y);
tm.Month = Serial.parseInt(); tm.Day = Serial.parseInt();
tm.Hour = Serial.parseInt(); tm.Minute = Serial.parseInt(); tm.Second = Serial.parseInt();
t = makeTime(tm); RTC.set(t); setTime(t);
Serial << F("Zeit gesetzt: "); printDateTime(t); Serial << endl;
while(Serial.available()>0) Serial.read();
}
}
// Taster entprellen & Bildschirm toggeln
boolean btn = digitalRead(3);
if(btn != 1){
while(digitalRead(3)!=1) delay(100);
estado_botao = !estado_botao;
}
u8g.firstPage();
do {
if(estado_botao==0) tela_1();
if(estado_botao==1) tela_2();
} while(u8g.nextPage());
delay(10);
}
void printDateTime(time_t t){
printI00(day(t),0); Serial << monthShortStr(month(t)) << _DEC(year(t)) << ' ';
printI00(hour(t),':'); printI00(minute(t),':'); printI00(second(t),' ');
}
void printI00(int val, char delim){
if(val<10) Serial << '0'; Serial << _DEC(val); if(delim>0) Serial << delim;
}
Bibliotheken
(Download-Links im Originalprojekt: U8glib, DS3232RTC, Streaming, Time)
Schaltplan
(Verdrahtungsbild im Originalprojekt: RTC an A4/A5, Display an D4-D7, Taster an D3, Potentiometer an Kontrast-Pin)
Herstellungsprozess
- Analoge und digitale Signale: Grundlagen der industriellen Messtechnik
- Analoge vs. digitale Sensoren: Typen, Anwendungen und Praxisbeispiele
- Arduino POV-Uhr: Persistence-of-Vision LED-Display selbst bauen
- Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
- LCD-Animationen & Spiele mit Arduino UNO erstellen
- Arduino Temperaturoverwachung & Echtzeituhr mit 3,2″ TFT-Display
- TM1637 Digitaluhr mit Zeiteinstellung & Alarm – Arduino Nano Prototyp
- DIY-Voltmeter mit Arduino und Nokia 5110 Display – Schritt-für-Schritt-Anleitung
- BME280 Temperatur, Luftfeuchte & Druck auf Nextion Touchscreen anzeigen
- Zuverlässigen Wecker mit DS1302 RTC und Arduino UNO bauen