概要

NTPで時刻同期を行い、12球のNeoPixelのカラーリングLEDを使用して時刻(時、分、秒)を表示する時計です。

スケッチ

NeoPixel用の5Vの信号出力を持つESP8266-LEAF用に作成しました。

#include <Adafruit_NeoPixel.h>
#include <ESP8266WiFi.h>

#define LED_PIN    2
#define LED_COUNT 12

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_RGB + NEO_KHZ800);

const char *ssid = "yourssid";
const char *password = "yourpasswd";

time_t t ;
struct tm *timeInfo;
int n = 0;

void setup() {
  uint32_t color = strip.Color(127, 127, 127) ;

  Serial.begin(115200);

  strip.begin();
  strip.show();
  strip.setBrightness(50);

  if (WiFi.begin(ssid, password) != WL_DISCONNECTED) {
    ESP.restart();
  }

  while (WiFi.status() != WL_CONNECTED) {
    strip.setPixelColor(n++, color);
    if (n >= 12) {
      n = 0 ;
      color = strip.Color(255, 0, 0) ;
    }
    strip.show();
    delay(1000);
  }
  n = 0 ;

  configTzTime("JST-9", "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
  t = time(NULL) ;
}

void loop() {
  uint32_t color = strip.Color(0, 0, 255) ;
  for(int i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, 0);
  }

  t = time(NULL) ;
  timeInfo = localtime(&t) ;
  if (timeInfo->tm_year != 70) {
    n = timeInfo->tm_hour % 12 ;
    strip.setPixelColor(n, strip.Color(255, 0, 0));
    n = timeInfo->tm_min / 5 ;
    color = strip.getPixelColor(n) | strip.Color(0, 255, 0) ;
    strip.setPixelColor(n, color);
    n = timeInfo->tm_sec / 5 ;
    color = strip.getPixelColor(n) | strip.Color(0, 0, 255) ;
    strip.setPixelColor(n, color);
    strip.show();
  } else {
    strip.setPixelColor(n++, color);
    if (n >= 12) {
      n = 0 ;
      color = strip.Color(255, 0, 0) ;
    }
    strip.show();
  }

  delay(500);
}

関連記事