Помогите придумать алгоритм суточного таймера. Задается время начала и конца включения. Например 12.00 - 14.00, т.е. включить в 12.00, выключить в 14.00 Или 23.30 - 05.30. Сам к сожалению смог придумать только варианты с кучей if .. else, которые неправильно работали если время выключения ниже времени включения. Код (Text): void check_time(byte vkl_hour, byte vkl_min, byte vikl_hour, byte vikl_min) { if (hour >= x && minute >= y && hour <=o && minute <p) { digitalWrite(nagruzka, HIGH); } else digitalWrite(nagruzka, LOW); .. .. }
А почему нельзя так: if (hour = vkl_hour && minute = vkl_min) digitalWrite(nagruzka, HIGH); if (hour = vikl_hour && minute = vikl_min) digitalWrite(nagruzka, LOW);
Примерно так Код (Text): void check_time(byte vkl_hour, byte vkl_min, byte vikl_hour, byte vikl_min) { // переводим время в количество минут с начала суток (меньше толкотни с часами-минутами) int vkl_time=vkl_hour*60+vkl_min; int vikl_time=vikl_hour*60+vikl_min; int now=hour*60+minute; if ( // включение раньше выключения ( (vkl_time<vikl_time)&& ((vkl_time<=now)&&(now<vikl_time)) ) || // включение позже выключения (работа через полночь) ( (vkl_time>vikl_time)&& ((now<vikl_time)||(vkl_time<=now)) ) ) { digitalWrite(nagruzka, HIGH); } else { digitalWrite(nagruzka, LOW); } }
Это можно использовать, если не предполагаются возможные выключения "тонкой управляющей электроники" "в самый ответственный момент", в то время как включить или выключить лучше поздно, чем никогда.
Возможно так - работоспособность кода не проверял... P.S. Код из внешнего источника (не правильный) Код (Text): Код наказан за неработоспособность ;)
Спасибо всем за помощь! Код geher полностью рабочий. Пожалуй вот такой постараюсь взять https://www.ozon.ru/context/detail/id/4958146/
а не подскажете новичку, как решить проблему циклического таймера, когда что выполняется Х времени, а потом не исполняется Y времени и так по кругу? учусь и уже 2 дня не могу толком осилить логику такого таймера.
Могу в псевдокоде, он компилироваться не будет, но логику - покажет: Код (C++): TimerTime timeToOn = 10000; // 10 секунд работает TimerTime timeToOff = 20000; // 20 секунд не работает TimerState timerState = stateOff; unsigned long past; void TimerOnAction() { // тут выполняем действие, когда таймер включается } void TimerOffAction() { // тут выполняем действие, когда таймер выключается } void setup() { past = millis(); TimerOffAction(); } void loop() { unsigned long now = millis(); switch(timerState) { case stateOff: { if(now - past > timeToOn) { past = now; timerState = stateOn; TimerOnAction(); } } break; case stateOn: { if(now - past > timeToOff) { past = now; timerState = stateOff; TimerOffAction(); } } break; } }
Большое спасибо! Сейчас буду изучать! Изначально думал переделать http://forum.amperka.ru/threads/Как-реализовать-суточный-таймер.2418/#post-18943 этот код, использовав несколько дополнительных переменных (int start = секундное представление времени начала выполнения, int till start + время выполнения и пр.) но пока ничего желаемого не получилось ) Еще раз спасибо!