Добрый день! Помогите пожалуйста, очень прошу! уже больше недели не могу победить скетч. Необходимо подавать сигнал на 1 канал 2-х канального реле на 5сек, через 2 часа (чтоб проверить указал 10 сек, в главном коде время будет задаваться переменной) включать оба канала на 5 сек, потом опять пауза на 2 часа и по новой. Мне посоветовали такой код, но он не работает Может получиться через конструкцию if else, мне хоть как-то чтоб работало. Хотел из вышеописанного кода убрать чтение кнопок но тоже не вышло( Код (Text): #define channel1pin 6 #define channel2pin 5 #define work_interval 5000 // время работы канала #define idle_interval 10000 // время между включениями каналов unsigned long prevMillis = 0; byte state = 0; void setup() { pinMode(channel1pin, OUTPUT); pinMode(channel2pin, OUTPUT); digitalWrite(channel1pin, HIGH); digitalWrite(channel2pin, HIGH); } void loop() { if(!state) digitalWrite(channel1pin, LOW); unsigned long currentMillis = millis(); if((currentMillis - prevMillis > work_interval) && (state==0 || state==2)) { prevMillis = currentMillis; switch(state) { case 0: digitalWrite(channel1pin, HIGH); state = 1; break; case 2: digitalWrite(channel1pin, HIGH); digitalWrite(channel2pin, HIGH); state = 0; break; } } currentMillis = millis(); if(currentMillis - prevMillis > idle_interval && state==1) { prevMillis = currentMillis; digitalWrite(channel1pin, LOW); digitalWrite(channel2pin, LOW); state = 2; } }
от включения upd. Мне понравилась Ваша библиотека и примеры смотрел но так и не понял если честно) один канал включал примером, а второй подключить не смог
Первое, что пришло в голову. Приду домой попробую через подсчет включений первого канала, тогда генерить второй меандр не нужно. Код будет попроще. Сейчас ужу времени нет. Код (Text): #define channel1pin 6 #define channel2pin 5 #define work_interval 5000 // время работы канала #define idle_interval 10000 // время между включениями каналов long doptime1, doptime2; void setup() { pinMode(channel1pin, OUTPUT); pinMode(channel2pin, OUTPUT); } void loop() { doptime1 = millis() % idle_interval; if (doptime1 < work_interval){ digitalWrite(channel1pin, HIGH); }else{ digitalWrite(channel1pin, LOW); } doptime2 = millis() % (idle_interval * 2); if (doptime2 >= idle_interval && doptime2 < idle_interval+work_interval){ digitalWrite(channel2pin, HIGH); }else{ digitalWrite(channel2pin, LOW); } } Тоже самое, но в 4 строки в loop. Код (Text): #define channel1pin 6 #define channel2pin 5 #define work_interval 5000 // время работы канала #define idle_interval 10000 // время между включениями каналов long doptime1, doptime2; void setup() { pinMode(channel1pin, OUTPUT); pinMode(channel2pin, OUTPUT); } void loop() { doptime1 = millis() % idle_interval; digitalWrite(channel1pin, doptime1 < work_interval); doptime2 = millis() % (idle_interval * 2); digitalWrite(channel2pin, doptime2 >= idle_interval && doptime2 < idle_interval+work_interval); }
Так тоже должно работать Код (Text): #define channel1pin 6 #define channel2pin 5 #define work_interval 5000 // время работы канала #define idle_interval 10000 // время между включениями каналов boolean ReleOn = 0, ReleOn_Old = 0; byte OnCounter; long doptime; void setup() { pinMode(channel1pin, OUTPUT); pinMode(channel2pin, OUTPUT); } void loop() { doptime = millis() % idle_interval; // Эти 2 строки формируют меандр ReleOn = doptime < work_interval; if (ReleOn && !ReleOn_Old) OnCounter++; // Счетчик включений реле ReleOn_Old=ReleOn; digitalWrite(channel1pin, ReleOn); //Вывод первого реле каждый цикл меандра digitalWrite(channel2pin, ReleOn && (OnCounter%2 == 0)); //Вывод второго реле через цикл меандра } }
Спасибо еще раз! первый код работает, вставил в основной скетч, сначала было затруднение - для проверки выбрал малые значения- выставил бОльший интервал между включениями и все отлично!
Дело в том что в работе с реле идет инверсия, т.е. в первом Вашем коде я менял LOW на HIGH, а как поменять в сокращенном не представляю, может поменять idle_interval и work_interval ?
Код (Text): void loop() { doptime1 = millis() % idle_interval; digitalWrite(channel1pin, !(doptime1 < work_interval)); doptime2 = millis() % (idle_interval * 2); digitalWrite(channel2pin, !(doptime2 >= idle_interval && doptime2 < idle_interval+work_interval)); }
Специально собрал схему проверил все 3 варианта. 1й и 2й полностью рабочие, по предложенному алгоритму. В 3-м была пропущена одна строка в loop, вставил. Если получается так, что требуется инверсия выхода, то или катушка реле подключена некорректно, или у самого реле используете NC контакты вместо NO. Фотку реле с подключением нагрузки в студию.