/*Проект ЧАСЫ-ОБРУЧ
*использовано:
*60 диодов ленты (2 метра ленты 30 диодов на метр)
*модуль РТС
*ардуинка
*/
#include <iarduino_RTC.h> //подключаем библиотеку для работы с модулем реального времени
#include <FastLED.h> //подключаем библиотеку для работы с лентой
#define NUM_LEDS 60 //количество светодиодов в ленте
#define DATA_PIN 12 //пин подключения ленты
CRGB leds[NUM_LEDS]; //нуууу, вот.
iarduino_RTC watch(RTC_DS1302, 2, 4, 3); //пины подключения модуля РТС
int i = 0; //переменная для указания цифр (0, 5, 10, 15 и т.д.)
int H = 0; //переменная для хранения ПОЛОЖЕНИЯ часовой стрелки
float M = 0; //переменная для промежуточного хранения положения часовой стрелки
int s = 0; //переменная для хранения положения часовой стрелки
int m = 0; //переменная для хранения положения часовой стрелки
int h = 0; //переменная для хранения ЗНАЧЕНИЯ часовой стрелки поступающего с модуля РТС
void setup() {
delay(500); //задержка для очухивания модуля РТС
Serial.begin(9600); //это понятно
FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS); //установки для ленты
LEDS.setBrightness(250); //яркость ленты
watch.begin(); //для модуля часов
}
void loop() {
watch.gettime(); // Считываем текущее время из модуля в буфер библиотеки.
h = watch.hours; // Получаем из буфера библиотеки текущие часы 0-12.
m = watch.minutes; // Получаем из буфера библиотеки текущие минуты 0-59.
s = watch.seconds; // Получаем из буфера библиотеки текущие секунды 0-59.
M = m / 12; // каждые 12 минут часовая стрелка смещается на один сектор
ceil(M); // округляем после деления
H = h * 5 + M; // ну всё понятно
Serial.println((String) H + ":" + h + ":" + m + ":" + s); //для проверки
for (i = 0; i < 60; i = i + 5) leds[i] = CRGB::White; //каждый пятый заливаем белым (можно любым)
leds[H] = CRGB::Blue; //часовая стрелка синяя
if (millis() % 1 == 0) { // плавное затухание//
leds[H - 1].nscale8(200); // предыдущего диода после//
leds[59].nscale8(200); //того как стрелка убежала дальше//
}
leds[m] = CRGB::Green; //минутная стрелка зеленая
if (millis() % 1 == 0) {
leds[m - 1].nscale8(200);
leds[59].nscale8(200);
}
if (m == H)leds[H] = CRGB::Yellow; //если минутная стрелка и часовая совпадают то диод желтый
leds[s] = CRGB::Red;
if (millis() % 1 == 0) {
leds[s - 1].nscale8(200);
leds[59].nscale8(200);
}
LEDS.setBrightness(250); //яркость ленты (зачем второй раз? я забыл и не помню, а проверять и исправлять лень)
FastLED.show(); //отправляем на ленту
}