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);
}
}