Jednoduché analogové hodiny s Arduinem, RTC obvod DS3231 (více viz zdrojový kód). V zapojení není řešeno nastavení RTC obvodu, slouží pouze pro testování zapojení analogových panelových měřidel. Doplněn program pro nastavení RTC z příkazové řádky:
#include <Wire.h> #include "Sodaq_DS3231.h" unsigned long previousMillis = 0; const long interval = 1000; String incoming = ""; bool format_24hours = true; byte pin_hour = 6; byte pin_min = 5; byte pin_sec = 3; void setup() { Serial.begin(9600); Wire.begin(); rtc.begin(); } void loop() { unsigned long currentMillis = millis(); if (Serial.available() > 0) { incoming = Serial.readString(); if (incoming.charAt(0) == 'T') { Serial.println(incoming.substring(2)); rtc.setEpoch(incoming.substring(2).toInt()); } incoming = ""; Serial.flush(); } if (currentMillis - previousMillis >= interval) { int val; DateTime now = rtc.now(); val = map(now.second(), 0, 59, 0, 255); analogWrite(pin_sec, val); if (val == 0) { SmoothNullGauge(pin_sec); } val = map(now.minute(), 0, 59, 0, 255); analogWrite(pin_min, val); if (val == 0 && now.second() == 0) { SmoothNullGauge(pin_min); } if (format_24hours == true) { val = map(now.hour(), 0, 23, 0, 255); } else { val = map(now.hour(), 0, 11, 0, 255); } analogWrite(pin_hour, val); if (val == 0 && now.minute() == 0 && now.second() == 0) { SmoothNullGauge(pin_hour); } previousMillis = currentMillis; } } void SmoothNullGauge(byte pin) { for (byte j = 255; j > 0; j--) { analogWrite(pin, j); delay(2); } }