автоматизация (таймер)
- Войдите на сайт для отправки комментариев
Чт, 23/08/2012 - 11:44
Доброе время суток.
Помогите разобратся с таймером. Задача заключается в том чтобы ардуино давала импульс на тригер (не знаю так или нет, сам не электронщик-сори) ну дапустим каждые 12 часов, т.е. включал и выключал свет каждые 12 часов
delay (720000); не?
я тоже думал об delay ! получается delay (43200000); // 12 часов пауза! но верное ли решение ? я не профи и поэтому спрашиваю !
можно условие создать с millis()
unsigned long val = 3600000; #переменная для перевода миллисекунд в часы unsigned long hour = millis()/val; if (hour == 12) { сделать что-то }и добавить счётчик
можно условие создать с millis()
unsigned long val = 3600000; #переменная для перевода миллисекунд в часы unsigned long hour = millis()/val; if (hour == 12) { сделать что-то }и добавить счётчик
Приведенный алгоритм имеет два недостатка:
- в связи с особенностями целочисленного деления устройство будет непрерывно "делать что-то" в течение целого часа - пока частное от деления millis()/val не примет значение 13.
- это безобразие произойдет только по прошествии первых 12 часов (многократно до истечения 13-го часа - см. выше). Дальше условие if(hour == 12) перестанет возвращать значение "истина" и обработка больше никогда не повторится - только перезапуск микроконтроллера поможет.
step962
А что вы можете посоветовать ? юзать delay ?
больше никогда не повторится - только перезапуск микроконтроллера поможет.
зациклить можно же.
ну и как вариант использовать библиотеку MsTimer
Можно использовать TimerOne - в прерывании прибавлять по секунде, когда пройдет 12*60*60, то формировать импульс и сбрасывать переменную. Тогда loop() будет свободен - можно еще че-нить делать ;)
Кстати, глянул MsTimer - тоже прикольная штука. Юзает TIMER2, похоже, что PWM, связанный с ним, будет продолжать работать, но с частотой 1 кГц и не на весь диапазон.
Ну что тут можно посоветовать? Переписать. Например, так:
// в начале скетча - объявление/инициализация констант и переменных // константа для перевода миллисекунд в часы #define MSEK_PER_HOUR = 3600000 unsigned long hour; unsigned long timemark=millis(); // в loop: hour = (millis()-timemark)/MSEK_PER_HOUR; // количество полных часов с момента последнего срабатывания if (hour == 12) { сделать что-то timemark=millis(); } else { // тут тоже можно делать всяко-разно в ожидании момента срабатывания "будильника" }step962
простите нуба но не могли бы вы полностью пример привести на примере блинка ? а то не могу все воедино собрать =(
Ну "нубство" это проходящие достоинство. Нужно только пытатся, смотреть примеры что идут в документации, эксперементировать.
// в начале скетча - объявление/инициализация констант и переменных // константа для перевода миллисекунд в часы #define MSEK_PER_HOUR 3600000 unsigned long hour; unsigned long timemark=millis(); #define LED 13 void setup(){ pinMode(LED,OUTPUT); } void loop(){ hour = (millis()-timemark)/MSEK_PER_HOUR; // количество полных часов с момента последнего срабатывания if (hour == 12) { digitalWrite(LED,!digitalRead(LED)); //сделать что-то timemark=millis(); } else { // тут тоже можно делать всяко-разно в ожидании момента срабатывания "будильника" } }К сожалению вы не указали от чего вы питаете ардуину. Если от блока питания - то предложенный подход вполне нормален.
А вот если вы "питаетесь от батарейки", то это конечно уже "расточительство" крутить холостой цикл в течении такого времени.
Тут желательно "засыпать" и просыпатся по таймеру. Примерно вот так:
http://donalmorrissey.blogspot.com/2011/11/sleeping-arduino-part-4-wake-...
Правда "заснуть" на 12-ть часов не получится таким образом. Макимум на 4.1 секунды. Но все равно "хлеб". Так будет намного экономней: просыпатся на пару микросекунд раз в 4-ре секунды. Проверять что "12-ть часов еще не прошло" и "засыпать обратно", чем "все время молотить электричество".
Правда "для нуба" эта статья конечно "тяжело". Но... читать документацию... статьи... только так перестать нубом можно. А "выжимать" из контроллера максимум не зная его архитектуры - не получится.
Вот, скажем, со "слипом" можно так (не стал, правда, заморачиваться с отключением питания перефирии)
#include <TimerOne.h> #include <avr\sleep.h> #define SECPER12HOUR 3 //(12*60*60) volatile long n_sec=0; void setup() { pinMode(13, OUTPUT); sleep_enable(); Timer1.initialize(1000000); // set a timer of length 1000000 microseconds (or 1 sec - or 1Hz => the led will blink 5 times, 5 cycles of on-and-off, per second) Timer1.attachInterrupt( timerIsr ); // attach the service routine here } void loop() { // Main code loop // TODO: Put your regular (non-ISR) logic here sleep_mode(); } /// -------------------------- /// Custom ISR Timer Routine /// -------------------------- void timerIsr() { n_sec++; if (n_sec>=(long)SECPER12HOUR) { // Toggle LED digitalWrite( 13, digitalRead( 13 ) ^ 1 ); n_sec=0; } }Константа намеренно сделана =3, чтобы не ждать 12 часов при проверке - переключается каждые 3 секунды :)
Как я понял из приведенного кода step962 и leshak скетч отсчитывает 12 часов, выполняет задачу и уходит на очередной круг отсчета ?
Объясню задачу так : стоит террариум с лампой и вентилятором , задача в том чтобы лампа включалась на 8 часов и выключалась на 14 + каждые 2 часа включался вентилятор на 10 мин.
МК питается от БП и должен давать импульс (1 сек) на симистор который в свое время откроет ток на лампу на 8 часов, через 8 часов еще один импульс который закроет ток на 14 часов.
И параллельно этому всему делу каждые 2 часа МК будет включать мини вентилятор (3v) на 10 мин. Вот такая хитрая и для меня сложная задача. :(
Ну тогда так (неоптимально, конечно, решение "в лоб", но легче разобраться новичку)
#include <TimerOne.h> #include <avr\sleep.h> #define TimeLampOn (8*60*60) // 8 утра #define TimeLampOff (16*60*60) // 4 дня (через 8 часов) #define PeriodVent (2*60*60) #define TimeVent (10*60) #define LampOn 9 #define LampOff 10 #define Vent 11 volatile long n_sec=0; void setup() { pinMode(LampOn, OUTPUT); pinMode(LampOff, OUTPUT); pinMode(Vent, OUTPUT); sleep_enable(); Timer1.initialize(1000000); // set a timer of length 1000000 microseconds (or 1 sec - or 1Hz => the led will blink 5 times, 5 cycles of on-and-off, per second) Timer1.attachInterrupt( timerIsr ); // attach the service routine here } void loop() { // Main code loop // TODO: Put your regular (non-ISR) logic here sleep_mode(); } /// -------------------------- /// Custom ISR Timer Routine /// -------------------------- void timerIsr() { n_sec++; if (n_sec>=(long)(24*60*60)) // сброс в 0:00 { n_sec=0; } // Лампа. Включение и выключение разными выходами if (n_sec==TimeLampOn) { digitalWrite(LampOn, HIGH); } else if (n_sec==(TimeLampOn+1)) //выключение импульса через секунду { digitalWrite(LampOn, LOW); } else if (n_sec==TimeLampOff) { digitalWrite(LampOff, HIGH); } else if (n_sec==(TimeLampOff+1)) //выключение импульса через секунду { digitalWrite(LampOff, LOW); } // вентиллятор if (n_sec%PeriodVent==0) { digitalWrite(Vent, HIGH); } else if (n_sec%PeriodVent==TimeVent) { digitalWrite(Vent, LOW); } }Т.е. отcчет времени пойдет при включении МК или при сбросе ?
И вот > #define TimeLampOff (16*60*60) // 4 дня (через 8 часов) не совсем понял про 4 дня !
Да. Нужно сбросить в 0:00
4 дня :) только дошло :) Имел в виду 4 часа дня (4:00pm) или 16:00
AlexFisher
вы меня запутали совсем :) при старте в МК стоит время 0:00 (24:00) и включится лампа в 8:00? я правильльно понял ?
Ну вот видите, совсем и не запутал :) Все правильно :)
я новерно уже запарил, но то ли у меня инет с другой планеты, то ли .......хм! не могу найти библиотеки
<TimerOne.h>
<avr\sleep.h>
А чего искать? я же ссылку дал в посте #7 - на статью, в статье прямая ссылка.
avr\sleep.h - стандартная (если у Вас линукс, напишите avr/sleep.h)
Ребят, а помогите со скейтчем на шаговый двигатель
Его задача - Включаться каждый день в 7 утра и в 9 вечера, (один день в в воскресение что бы не включался!), сделать 5 полных оборотов за одну минуту в 7 утра, отключиться, и сделать это же самое в 9 вечера
Вот с этим с этим кодом шаговик делает только пол оборота туда и обратно без каких либо задержек во времени #include <Stepper_28BYJ.h> // изменить количество шагов для вашего мотора #define STEPS 4078 // create an instance of the stepper class, specifying // the number of steps of the motor and the pins it's // attached to Stepper_28BYJ stepper(STEPS, 2, 3, 4, 5); #include <TimerOne.h> #include <avr/sleep.h> #define SECPER12HOUR 3 //(12*60*60) volatile long n_sec=0; void setup() { // установим скорость вращения 5 об/мин stepper.setSpeed(5); } void loop() { pinMode(STEPS, HIGH); sleep_enable(); Timer1.initialize(7000000); // 7 Секунд Timer1.attachInterrupt( timerIsr ); // attach the service routine here stepper.step(4000); // Делаем 4000 шагов в одну строну // Main code loop // TODO: Put your regular (non-ISR) logic here pinMode(STEPS, LOW ); sleep_mode(); Timer1.initialize(7000000); // 7 Секунд Timer1.attachInterrupt( timerIsr ); // attach the service routine here stepper.step(-4000);// Делаем 4000 шагов в другую строну } /// -------------------------- /// Custom ISR Timer Routine /// -------------------------- void timerIsr() { }Помогите пожалуйста дополнить код просто в этом не разбираюсь. У меня готовый код на часы (сегментные часы из светодиодной ленты)
мне нужно дополнить таймер чтоб получились Учебные часы во время урока идет время , а после урока /перемена показывался таймер по окончание перемены после чего начинается урок снова включались часы.
10;30 начинался таймер 10 мин , 12:10 начинался таймер 30 мин , 14:10 начинался таймер 10 мин , 15:50 начинался таймер 10 мин , 17:30 начинался таймер 10 мин, а выходные дни 10;30 начинался таймер 10 мин , 12:10 начинался таймер 10 мин , 13:50 начинался таймер 10 мин , 15:30 начинался таймер 10 мин , 17:10 начинался таймер 10 мин,
#include <DS3232RTC.h> #include <Time.h> #include <TimeLib.h> #include <Wire.h> #include "FastLED.h" #include "DHT.h" #define DHT_PIN 5 // пин подключения датчика DHT 11 #define DHTTYPE DHT11 // DHT 11 #define NUM_LEDS 114 // 4*7*4 +2 количество светодиодов в ленте #define COLOR_ORDER BRG // определение порядка цветов для ленты #define DATA_PIN 6 // пин подключения ленты #define DST_PIN 2 // пин кнопки перевода на летнее время и обратно #define MIN_PIN 3 // пин кнопки настройки минут #define HUR_PIN 4 // пин кнопки настройки часов #define BRI_PIN A3 // фоторезистор #define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить) #define max_bright 100 // максимальная яркость (0 - 255) #define min_bright 1 // минимальная яркость (0 - 255) #define bright_constant 1023 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость #define coef 0.9 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость int new_bright, new_bright_f; unsigned long bright_timer, off_timer; DHT dht(DHT_PIN, DHTTYPE); CRGB leds[NUM_LEDS]; // Define LEDs strip // 0,0,0,0 // 1,1,1,1 // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 byte digits[13][28] = {{0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 0 {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 1 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, // Digit 2 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 3 {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 4 {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 5 {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 6 {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 7 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 8 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 9 | 2D Array for numbers on 7 segment, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // ° char {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, // C char {1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}; // % char bool Dot = true; //Dot state bool DST = false; //DST state bool TempShow = false; bool HumidityShow = false; bool led_state = true; // флаг состояния ленты int last_digit = 0; // int led Color = 0x0000FF; / / используемый цвет (в шестнадцатеричном формате) long ledColor = CRGB::DarkOrchid; // Color used (in hex) // Случайные цвета, которые я подобрал long ColorTable[16] = { CRGB::Amethyst, CRGB::Aqua, CRGB::BlueViolet, CRGB::Crimson, CRGB::DarkMagenta, CRGB::DeepPink, CRGB::Fuchsia, CRGB::Magenta, CRGB::MidnightBlue, CRGB::MediumVioletRed, CRGB::Navy, CRGB::Indigo, CRGB::OrangeRed, CRGB::Purple, CRGB::RoyalBlue, CRGB::Tomato }; void setup() { Serial.begin(9600); LEDS.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type LEDS.setBrightness(5); // Set initial brightness pinMode(DST_PIN, INPUT_PULLUP); // Define DST adjust button pin pinMode(MIN_PIN, INPUT_PULLUP); // Define Minutes adjust button pin pinMode(HUR_PIN, INPUT_PULLUP); // Define Hours adjust button pin TempShow = false; HumidityShow = false; dht.begin(); } // Получить время в одном числе, если часы будут одной цифрой, то время будет отображаться 155 вместо 0155 int GetTime() { tmElements_t Now; RTC.read(Now); //time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object int hour = Now.Hour; int minutes = Now.Minute; int second = Now.Second; if (second % 2 == 0) { Dot = false; } else { Dot = true; }; return (hour * 100 + minutes); }; // Проверьте датчик освещенности и установите яркость соответственно void BrightnessCheck() { if (auto_bright) { if (millis() - bright_timer > 1000) { // каждые 100 мс bright_timer = millis(); int bright = analogRead(BRI_PIN); int bright_r; bright_r = bright%10 > 5 ? ((bright/10)*10)+10 : (bright/10)*10; new_bright = map(bright_r, 0, bright_constant, min_bright, max_bright); // считать показания с фоторезистора, перевести диапазон new_bright = constrain(new_bright, min_bright, max_bright); new_bright_f = new_bright_f * coef + new_bright * (1 - coef); new_bright_f += 1; LEDS.setBrightness(new_bright_f); // установить новую яркость } } }; // / / Преобразование времени в массив, необходимый для отображения void TimeToArray() { int Now = GetTime(); // Получить текущее время int cursor = 114; // номер последнего светодиода // Serial.print("Time is: ");Serial.println(Now); if (DST) { // if DST is true then add one hour Now += 100; // Serial.print("DST is ON, time set to : ");Serial.println(Now); }; if (Dot) { leds[57] = ledColor; leds[56] = ledColor; } else { leds[57] = 0x000000; leds[56] = 0x000000; }; for (int i = 1; i <= 4; i++) { int digit = Now % 10; // get last digit in time if (i == 1) { // Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" "); cursor = 86; for (int k = 0; k <= 27; k++) { // Serial.print(digits[digit][k]); if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); if (digit != last_digit) { cylon(); ledColor = ColorTable[random(16)]; } last_digit = digit; } else if (i == 2) { // Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" "); cursor = 58; for (int k = 0; k <= 27; k++) { // Serial.print(digits[digit][k]); if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); } else if (i == 3) { // Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" "); cursor = 28; for (int k = 0; k <= 27; k++) { // Serial.print(digits[digit][k]); if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); } else if (i == 4) { // Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" "); cursor = 0; for (int k = 0; k <= 27; k++) { // Serial.print(digits[digit][k]); if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); } Now /= 10; }; }; // / / Преобразование температуры в массив, необходимый для отображения void TempToArray() { tmElements_t tm; RTC.read(tm); if (tm.Second != 17) { TempShow = false; return; } TempShow = true; int t = dht.readTemperature(); int celsius = t * 100; // Serial.print("Temp is: ");Serial.println(celsius); int cursor = 114; // last led number leds[57] = 0x000000; leds[56] = 0x000000; for (int i = 1; i <= 4; i++) { int digit = celsius % 10; // get last digit in time if (i == 1) { // Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" "); cursor = 86; for (int k = 0; k <= 27; k++) { // Serial.print(digits[11][k]); if (digits[11][k] == 1) { leds[cursor] = ledColor; } else if (digits[11][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); } else if (i == 2) { // Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" "); cursor = 58; for (int k = 0; k <= 27; k++) { // Serial.print(digits[10][k]); if (digits[10][k] == 1) { leds[cursor] = ledColor; } else if (digits[10][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); } else if (i == 3) { // Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" "); cursor = 28; for (int k = 0; k <= 27; k++) { // Serial.print(digits[digit][k]); if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); } else if (i == 4) { // Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" "); cursor = 0; for (int k = 0; k <= 27; k++) { // Serial.print(digits[digit][k]); if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); } celsius /= 10; }; }; void HumidityToArray() { tmElements_t tm; RTC.read(tm); if (tm.Second != 38) { HumidityShow = false; return; } HumidityShow = true; int h = dht.readHumidity(); int humidity_percentage = h * 100; // Serial.print("Humidity is: ");Serial.println(humidity_percentage); int cursor = 114; // last led number leds[57] = 0x000000; leds[56] = 0x000000; for (int i = 1; i <= 4; i++) { int digit = humidity_percentage % 10; // get last digit in time if (i == 1) { // Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" "); cursor = 86; for (int k = 0; k <= 27; k++) { // Serial.print(digits[11][k]); if (digits[12][k] == 1) { leds[cursor] = ledColor; } else if (digits[12][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); } else if (i == 2) { // Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" "); cursor = 58; for (int k = 0; k <= 27; k++) { // Serial.print(digits[10][k]); if (digits[10][k] == 1) { leds[cursor] = ledColor; } else if (digits[10][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); } else if (i == 3) { // Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" "); cursor = 28; for (int k = 0; k <= 27; k++) { // Serial.print(digits[digit][k]); if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); } else if (i == 4) { // Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" "); cursor = 0; for (int k = 0; k <= 27; k++) { // Serial.print(digits[digit][k]); if (digits[digit][k] == 1) { leds[cursor] = ledColor; } else if (digits[digit][k] == 0) { leds[cursor] = 0x000000; }; cursor ++; }; // Serial.println(); } humidity_percentage /= 10; }; }; void DSTcheck() { int buttonDST = digitalRead(2); // Serial.print("DST is: ");Serial.println(DST); if (buttonDST == LOW) { if (DST) { DST = false; // Serial.print("Switching DST to: ");Serial.println(DST); } else if (!DST) { DST = true; // Serial.print("Switching DST to: ");Serial.println(DST); }; delay(500); }; } void TimeAdjust() { int buttonH = digitalRead(HUR_PIN); int buttonM = digitalRead(MIN_PIN); if (buttonH == LOW || buttonM == LOW) { delay(500); tmElements_t Now; RTC.read(Now); int hour = Now.Hour; int minutes = Now.Minute; int second = Now.Second; if (buttonH == LOW) { if (Now.Hour == 23) { Now.Hour = 0; } else { Now.Hour += 1; }; } else { if (Now.Minute == 59) { Now.Minute = 0; } else { Now.Minute += 1; }; }; RTC.write(Now); } } /* coool effect function*/ void fadeall() { for (int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } } void cylon () { static uint8_t hue = 0; // Serial.print("x"); // First slide the led in one direction for (int i = 0; i < NUM_LEDS; i++) { // Set the i'th led to red leds[i] = CHSV(hue++, 255, 255); // Show the leds FastLED.show(); // now that we've shown the leds, reset the i'th led to black // leds[i] = CRGB::Black; fadeall(); // Wait a little bit before we loop around and do it again delay(10); } // Serial.print("x"); // Now go in the other direction. for (int i = (NUM_LEDS) - 1; i >= 0; i--) { // Set the i'th led to red leds[i] = CHSV(hue++, 255, 255); // Show the leds FastLED.show(); // now that we've shown the leds, reset the i'th led to black // leds[i] = CRGB::Black; fadeall(); // Wait a little bit before we loop around and do it again delay(10); } } void loop() // Main loop { BrightnessCheck(); // Проверка яркости DSTcheck(); // Check DST TimeAdjust(); // Check to se if time is geting modified TimeToArray(); // Get leds array with required configuration TempToArray(); HumidityToArray(); FastLED.show(); // Display leds array if (TempShow == true) delay (5000); if (HumidityShow == true) delay (5000); }дополнить - это к автору скечча.