Analogové hodiny

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

Leave a Reply