Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

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

Ü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):

Zwei Anzeigemodi (per Taster umschaltbar)

(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

  1. Analoge und digitale Signale: Grundlagen der industriellen Messtechnik
  2. Analoge vs. digitale Sensoren: Typen, Anwendungen und Praxisbeispiele
  3. Arduino POV-Uhr: Persistence-of-Vision LED-Display selbst bauen
  4. Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
  5. LCD-Animationen & Spiele mit Arduino UNO erstellen
  6. Arduino Temperaturoverwachung & Echtzeituhr mit 3,2″ TFT-Display
  7. TM1637 Digitaluhr mit Zeiteinstellung & Alarm – Arduino Nano Prototyp
  8. DIY-Voltmeter mit Arduino und Nokia 5110 Display – Schritt-für-Schritt-Anleitung
  9. BME280 Temperatur, Luftfeuchte & Druck auf Nextion Touchscreen anzeigen
  10. Zuverlässigen Wecker mit DS1302 RTC und Arduino UNO bauen