RGB (на контроллере WS2812) кольца бывают разного размера с разным кол-вом светодиодов, для создания часов было выбрано кольцо с 12 светодиодами.
Считывать время с часов очень просто, красное свечение светодиода обозначают часы, синее минуты, а зеленое секунды. Так как RGB кольцо имеет только 12 светодиодов, то показания минут и секунд кратно пяти, а часов 12-и. При совпадении положения минут, секунд или часов в одном светодиоде горят одновременно 2 или три цвета.
#include <Adafruit_NeoPixel.h> // https://github.com/adafruit/Adafruit_NeoPixel.git #include <Wire.h> #include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip DS3231 clock; RTCDateTime DateTime; Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, 2, NEO_GRB + NEO_KHZ400);// 4 трека, D2 byte i,s,m,h,mm,sm,sh,mh; unsigned long t; void setup(){ strip.begin();Wire.begin(); clock.begin(); // clock.setDateTime(__DATE__, __TIME__); } void loop(){ DateTime=clock.getDateTime(); s = DateTime.second/5; m = DateTime.minute/5; h = DateTime.hour; if(h>11){h=h-12;} if(s==m){sm=10;}else{sm=0;} if(s==h){sh=10;}else{sh=0;} if(m==h){mh=10;}else{mh=0;} if(s==0){strip.setPixelColor(11, strip.Color(0, 0, 0));} else{strip.setPixelColor(s-1, strip.Color(0, 0, 0)); } if(m==0){strip.setPixelColor(11, strip.Color(0, 0, 0));} else{strip.setPixelColor(m-1, strip.Color(0, 0, 0)); } if(h==0){strip.setPixelColor(11, strip.Color(0, 0, 0));} else{strip.setPixelColor(h-1, strip.Color(0, 0, 0)); } strip.setPixelColor(s, strip.Color(0, 10, 0)); strip.setPixelColor(m, strip.Color(0, sm, 10)); strip.setPixelColor(h, strip.Color(10, sh, mh)); strip.show(); }
RGB кольцо на контроллере W2812 питается от напряжения 5 В, выход D2 Arduino подключается ко входу DI светодиодного кольца. В качестве источника точного времени используются часы реального времени DS3231.
Так же в центр светодиодного кольца можно добавить индикатор TM1637 часового типа (с двумя точками в центре) и выводить время (часы и минуты).
#include <Adafruit_NeoPixel.h> // https://github.com/adafruit/Adafruit_NeoPixel.git #include <Wire.h> #include <STM32_TM1637.h> // http://rcl-radio.ru/wp-content/uploads/2020/02/STM32_TM1637_V1_3.zip #include <DS3231.h> //https://github.com/jarzebski/Arduino-DS3231/archive/master.zip DS3231 clock; RTCDateTime DateTime; STM32_TM1637 tm(4,3);// CLK, DIO Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, 2, NEO_GRB + NEO_KHZ400);// 4 трека, D2 byte i,s,m,h,mm,sm,sh,mh; unsigned long t; void setup(){ pinMode(5,INPUT); strip.begin();Wire.begin(); clock.begin(); tm.brig(5); clock.setOutput(DS3231_1HZ); // clock.setDateTime(__DATE__, __TIME__); } void loop(){ DateTime=clock.getDateTime(); s = DateTime.second/5; m = DateTime.minute/5; h = DateTime.hour; if(h>11){h=h-12;} if(s==m){sm=10;}else{sm=0;} if(s==h){sh=10;}else{sh=0;} if(m==h){mh=10;}else{mh=0;} if(s==0){strip.setPixelColor(11, strip.Color(0, 0, 0));} else{strip.setPixelColor(s-1, strip.Color(0, 0, 0)); } if(m==0){strip.setPixelColor(11, strip.Color(0, 0, 0));} else{strip.setPixelColor(m-1, strip.Color(0, 0, 0)); } if(h==0){strip.setPixelColor(11, strip.Color(0, 0, 0));} else{strip.setPixelColor(h-1, strip.Color(0, 0, 0)); } strip.setPixelColor(s, strip.Color(0, 10, 0)); strip.setPixelColor(m, strip.Color(0, sm, 10)); strip.setPixelColor(h, strip.Color(10, sh, mh)); strip.show(); tm.print_time(DateTime.hour*100+DateTime.minute, digitalRead(5)); // delay(500); }
Для мигания двоеточия в TM1637, необходимо выход SQW DS3231 подключить ко входу Arduino D5.
Дополнительные материалы:
- Коррекция времени двумя кнопками — http://forum.rcl-radio.ru/viewtopic.php?pid=2082#p2082