Параллельная работа двух реле
- Войдите на сайт для отправки комментариев
Сб, 04/02/2017 - 00:34
Здравствуйте. Помогите пожалуйста реализовать проект.
Нужно запитать два реле по следующему алгоритму работы:
1. Включается реле №1 на 1с.
2. Реле №1 выключается на 10 минут.
3. Через 2 секунду после включения реле №1 включается реле №2.
4. Реле 2 отключается через 1 с работы на 10 минут.
Цикл замкнутый (пока не отключу кнопкой). Включать-включать хочу всё с одной кнопки.
Не судите строго - читаю про Ардуино 3й день и пользуясь исключительно видеоуроками из Ютуба попытался написать следующее.
void setup() {
pinMode(13, OUTPUT); // реле №1
pinMode(11, OUTPUT); // реле №2
pinMode(12, INPUT_PULLUP); // кнопка включения-выключения
}
void loop() {
if ( digitalRead(12) == LOW ) digitalWrite(13, 11, HIGH);
else digitalWrite(13, 11 LOW);
{
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
digitalWrite(11, HIGH);
delay(1000);
digitalWrite(11, LOW);
delay(1000);
digitalWrite(13, LOW);
delay(9000);
digitalWrite(11, LOW);
delay(9000);
}
}
Поскольку параллельное выполнение задач вроди как невозможно (опять же исходя из моих скромных знаний), попытался реализовать последовательно.
Проаверить пока даже негде - только завтра обещали прислать "комплект новичка" на базе Arduino UNO. Ранее вообще к программированию отношения не имел, так что не судите строго пожалуйста.
Всем заранее спасибо.
Сразу хотел бы отметить по периоду включения-выключения - время пока ставил маленькое, потмоу как проверить будет проще (ждать меньше, если конечно вообще заработает).
Поскольку параллельное выполнение задач вроди как невозможно (опять же исходя из моих скромных знаний), попытался реализовать последовательно.
Возможно паралельное выполнение задач, точнее псевдопаралельное, так как угробить можно любую программу всунув очень много delay(). Что вы с успехом и реализовали.
ПС: Все видеоуроки на Ардуино это просто реклама и ничего больше. Вы же по рекламе автомобилей не учитесь вождению автомобилем.
...
Возможно паралельное выполнение задач, точнее псевдопаралельное, так как угробить можно любую программу всунув очень много delay(). Что вы с успехом и реализовали.
ПС: Все видеоуроки на Ардуино это просто реклама и ничего больше. Вы же по рекламе автомобилей не учитесь вождению автомобилем.
Спасибо за ответ.
Я читал про большое количество delay(), видел на Ютубе как автор говорит, что использование такой остановки контроллера не желательно. Но проект в принципе примитивен (для примитивных задач вроди продходит), да и других вариантов пока не придумал. Буду благодарен, если подскажете.
Про псевдо-праллельные процессы читал - для меня это немного сложно, но буду пробовать реализовать и так.
P.S.: Я учился вождению автомобиля по "рекламе" вождения автомобиля ).
Если ничего более программа делать не будет, то можно сдеать так например
#define RELAY1 10 #define RELAY2 11 #define ONTIME 1000 #define OFFTIME 600000 #define PAUSE 1000 #define ON 1 // если реле управляются высоким уровнем то ON= 1 OFF=0 #define OFF 0 // если реле управляется низким уровнем то поставить ON=0 OFF=1 unsigned long timeRelay1 = -99999; unsigned long timeRelay2 = -99999; boolean relay1 = false; boolean relay2 = false; void setup() { // put your setup code here, to run once: pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } void loop() { // put your main code here, to run repeatedly: if ( digitalRead(RELAY1) == ON){ if ( millis()-timeRelay1 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек digitalWrite(RELAY1, OFF); timeRelay1 = millis(); } } else { if (millis() - timeRelay1 >= OFFTIME){ // если реле 1 выключено проверяем 10 мин. и включаем если время прошло digitalWrite(RELAY1, ON); timeRelay1 = millis(); } } if (digitalRead(RELAY2) == ON){ if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем digitalWrite(RELAY2, OFF); timeRelay2 = millis(); } } else { unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек. if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))){ digitalWrite(RELAY2, ON); timeRelay2 = curentTime; } } }А по поводу отлючения включения одной кнопкой посмотри уроки джереми блума и допиши сам.
А по поводу отлючения включения одной кнопкой посмотри уроки джереми блума и допиши сам.
Спасибо за код, за совет.
Код закачал - буду разбираться, пробовать.
Про включение-выключение кнопкой видеоролик Джереми смотрел - у меня мозг вскипел ). Код-то я записал, но мало что понял.
... но мало что понял.
соболезную, но упорство и труд все перетрут.
... но мало что понял.
соболезную, но упорство и труд все перетрут.
Я тоже так думаю. В университете получилось изучить экономико-математическое моделирование самостоятельно и защитить диссертацию, с Arduino тоже должно получиться. Тем-более мне пока сложного ничего не нужно, а там видно будет.
Ваш код изучил - написано вроди красиво и что мне очень нравится - понятно. Надеюсь получится завтра опробовать ). Заодно попробую и кнопку прописать.
Если ничего более программа делать не будет, то можно сдеать так например
#define RELAY1 10 #define RELAY2 11 #define ONTIME 1000 #define OFFTIME 600000 #define PAUSE 1000 #define ON 1 // если реле управляются высоким уровнем то ON= 1 OFF=0 #define OFF 0 // если реле управляется низким уровнем то поставить ON=0 OFF=1 unsigned long timeRelay1 = -99999; unsigned long timeRelay2 = -99999; boolean relay1 = false; boolean relay2 = false; void setup() { // put your setup code here, to run once: pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } void loop() { // put your main code here, to run repeatedly: if ( digitalRead(RELAY1) == ON){ if ( millis()-timeRelay1 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек digitalWrite(RELAY1, OFF); timeRelay1 = millis(); } } else { if (millis() - timeRelay1 >= OFFTIME){ // если реле 1 выключено проверяем 10 мин. и включаем если время прошло digitalWrite(RELAY1, ON); timeRelay1 = millis(); } } if (digitalRead(RELAY2) == ON){ if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем digitalWrite(RELAY2, OFF); timeRelay2 = millis(); } } else { unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек. if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))){ digitalWrite(RELAY2, ON); timeRelay2 = curentTime; } } }Получил сегодня плату, загрузил Ваш код - отлично работает. Могу без проблем изменять все интервалы, а вот с кнопкой беда... Отдельно включение двух диодов - не проблема, а вот с учётом предыдущего алгоритма - никак. Гляньте пожалуйста что я написал не так.
Код на два диода с кнопки:
const int LED=10; const int LED2=11; const int BUTTON=2; boolean lastButton = HIGH; boolean currentButton = HIGH; boolean ledOn = false; boolean led2On = false; void setup() { pinMode (LED, OUTPUT); pinMode (LED2, OUTPUT); pinMode (BUTTON, INPUT); } boolean debounce(boolean last) { boolean current = digitalRead(BUTTON); if (last != current) { delay(5); current = digitalRead(BUTTON); return current; } } void loop() { currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { ledOn = !ledOn; led2On = !led2On; } lastButton = currentButton; digitalWrite(LED, ledOn); digitalWrite(LED2, ledOn); }const int BUTTON=2; // кнопка на втором пин const int relay1=10; const int relay2=11; #define ONTIME 500 #define OFFTIME 5000 #define PAUSE 1000 #define ON 1 // если реле управляются высоким уровнем то ON= 1 OFF=0 #define OFF 0 // если реле управляется низким уровнем то поставить ON=0 OFF=1 boolean lastButton = HIGH; boolean currentButton = HIGH; boolean relay1On = false; boolean relay2On = false; unsigned long timeRelay1 = -99999; unsigned long timeRelay2 = -99999; void setup() { { pinMode (BUTTON, INPUT); boolean debounce(boolean last) { boolean current = digitalRead(BUTTON); if (last != current) { delay(5); current = digitalRead(BUTTON); return current; } } } { // put your setup code here, to run once: pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } } void loop() { { currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { relay1On = !relay1On; relay2On = !relay1On; } lastButton = currentButton; digitalWrite(relay1, ledOn); digitalWrite(relay2, ledOn); } // put your main code here, to run repeatedly: if ( digitalRead(RELAY1) == ON){ if ( millis()-timeRelay1 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек digitalWrite(RELAY1, OFF); timeRelay1 = millis(); } } else { if (millis() - timeRelay1 >= OFFTIME){ // если реле 1 выключено проверяем 10 мин. и включаем если время прошло digitalWrite(RELAY1, ON); timeRelay1 = millis(); } } if (digitalRead(RELAY2) == ON){ if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем digitalWrite(RELAY2, OFF); timeRelay2 = millis(); } } else { unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек. if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))){ digitalWrite(RELAY2, ON); timeRelay2 = curentTime; } } }Ну для начала есть способ вставки кода на форум
const int LED=10; const int LED2=11; const int BUTTON=2; boolean lastButton = HIGH; boolean currentButton = HIGH; boolean ledOn = false; boolean led2On = false; void setup() { pinMode (LED, OUTPUT); pinMode (LED2, OUTPUT); pinMode (BUTTON, INPUT); } boolean debounce(boolean last) { boolean current = digitalRead(BUTTON); if (last != current) { delay(5); current = digitalRead(BUTTON); return current; } } void loop() { currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { ledOn = !ledOn; led2On = !led2On; } lastButton = currentButton; digitalWrite(LED, ledOn); digitalWrite(LED2, ledOn); }и то что получилось после скрещивания.
const int BUTTON=2; // кнопка на втором пин const int relay1=10; const int relay2=11; #define ONTIME 500 #define OFFTIME 5000 #define PAUSE 1000 #define ON 1 // если реле управляются высоким уровнем то ON= 1 OFF=0 #define OFF 0 // если реле управляется низким уровнем то поставить ON=0 OFF=1 boolean lastButton = HIGH; boolean currentButton = HIGH; boolean relay1On = false; boolean relay2On = false; unsigned long timeRelay1 = -99999; unsigned long timeRelay2 = -99999; void setup() { { pinMode (BUTTON, INPUT); boolean debounce(boolean last) { boolean current = digitalRead(BUTTON); if (last != current) { delay(5); current = digitalRead(BUTTON); return current; } } } { // put your setup code here, to run once: pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } } void loop() { { currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { relay1On = !relay1On; relay2On = !relay1On; } lastButton = currentButton; digitalWrite(relay1, ledOn); digitalWrite(relay2, ledOn); } // put your main code here, to run repeatedly: if ( digitalRead(RELAY1) == ON){ if ( millis()-timeRelay1 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек digitalWrite(RELAY1, OFF); timeRelay1 = millis(); } } else { if (millis() - timeRelay1 >= OFFTIME){ // если реле 1 выключено проверяем 10 мин. и включаем если время прошло digitalWrite(RELAY1, ON); timeRelay1 = millis(); } } if (digitalRead(RELAY2) == ON){ if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем digitalWrite(RELAY2, OFF); timeRelay2 = millis(); } } else { unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек. if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))){ digitalWrite(RELAY2, ON); timeRelay2 = curentTime; } } }А тепере уже можно разбираться
для объединения двух программ я бы во втором (тот что мой) переименовал
void setup() в void setup1(), а void loop() в void loop1()
теперь эти две функции можно добавить к твоему коду со светодиодами
вызов setup1() добавляем внутрь твоего setup()
а вызов loop1() в ставляем в конце твего loop()
и дописываем к нему условие
if (ledOn) { loop1(); } else { // выключаем оба реле digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); timeRelay1 = -99999; timeRelay2 = -99999; }Что можно вставлять код в таком формате я не знал - обязательно исправлюсь.
И не знал, что можно вставлять void setup1() и void loop1() - буду пробовать. )
Ещё раз большое спасибо.
Вот 1 шаг разработки кода.
/*to_iven83.ino #1реле 1 Принцип кода: реле 1 {вкл 1 сек, откл 600сек(10 мин) */ //#1реле 1 const byte relay_1_pin = 13; bool relay_1; const long relay_1_ON = 1000; // 1 сек const long relay_1_OFF = 600000; // 10 мин void setup() { //#1реле 1 pinMode(relay_1_pin, OUTPUT); digitalWrite(relay_1_pin, relay_1 = 1); } void loop() { //#1реле 1 static unsigned long past = 0; if (relay_1 && millis() - past >= relay_1_ON) { past = millis(); digitalWrite(relay_1_pin, relay_1 = 0); } if (!relay_1 && millis() - past >= relay_1_OFF) { past = millis(); digitalWrite(relay_1_pin, relay_1 = 1); } }Это 2 шаг разработки кода
/*to_iven83.ino #1реле 1 ->13 (relay_1_pin) #2реле 1 ->11 (relay_2_pin) Принцип кода: реле 1 {вкл 1 сек, откл 600сек(10 мин) реле 2 (через 2 сек от вкл 1 реле вкл 2 реле и откл через 1 сек) */ //#1реле 1 const byte relay_1_pin = 13; bool relay_1; const long relay_1_ON = 1000; // 1 сек const long relay_1_OFF = 600000; // 10 мин //#2реле 2 const byte relay_2_pin = 11; bool relay_2; bool relay_2_do ;// const unsigned long relay_2_do_ON = 2000; // 2 сек const unsigned long relay_2_ON = 1000; // 1 сек void setup() { //#1реле 1 pinMode(relay_1_pin, OUTPUT); digitalWrite(relay_1_pin, relay_1 = 1); relay_2_do = 1; //#2реле 2 pinMode(relay_2_pin, OUTPUT); digitalWrite(relay_2_pin, relay_2 = 0); } void loop() { //#1реле 1 static unsigned long past_1 = 0; static unsigned long past_2 = 0; if (relay_1 && millis() - past_1 >= relay_1_ON) { past_1 = millis(); digitalWrite(relay_1_pin, relay_1 = 0); } if (!relay_1 && millis() - past_1 >= relay_1_OFF) { past_1 = millis(); digitalWrite(relay_1_pin, relay_1 = 1); past_2 = millis(); relay_2_do = 1; } //#2реле 2 if (relay_2_do && millis() - past_2 >= relay_2_do_ON) { relay_2_do = 0; past_2 = millis(); digitalWrite(relay_2_pin, relay_2 = 1); } if (relay_2 && millis() - past_2 >= relay_2_ON) { digitalWrite(relay_1_pin, relay_1 = 0); } }Окончательный вариант полностью здесь https://yadi.sk/d/elyRWglV3DPRZm
Головной файл выкладываю
Вот 1 шаг разработки кода.
/*to_iven83.ino #1реле 1 Принцип кода: реле 1 {вкл 1 сек, откл 600сек(10 мин) */ //#1реле 1 const byte relay_1_pin = 13; bool relay_1; const long relay_1_ON = 1000; // 1 сек const long relay_1_OFF = 600000; // 10 мин void setup() { //#1реле 1 pinMode(relay_1_pin, OUTPUT); digitalWrite(relay_1_pin, relay_1 = 1); } void loop() { //#1реле 1 static unsigned long past = 0; if (relay_1 && millis() - past >= relay_1_ON) { past = millis(); digitalWrite(relay_1_pin, relay_1 = 0); } if (!relay_1 && millis() - past >= relay_1_OFF) { past = millis(); digitalWrite(relay_1_pin, relay_1 = 1); } }Это 2 шаг разработки кода
/*to_iven83.ino #1реле 1 ->13 (relay_1_pin) #2реле 1 ->11 (relay_2_pin) Принцип кода: реле 1 {вкл 1 сек, откл 600сек(10 мин) реле 2 (через 2 сек от вкл 1 реле вкл 2 реле и откл через 1 сек) */ //#1реле 1 const byte relay_1_pin = 13; bool relay_1; const long relay_1_ON = 1000; // 1 сек const long relay_1_OFF = 600000; // 10 мин //#2реле 2 const byte relay_2_pin = 11; bool relay_2; bool relay_2_do ;// const unsigned long relay_2_do_ON = 2000; // 2 сек const unsigned long relay_2_ON = 1000; // 1 сек void setup() { //#1реле 1 pinMode(relay_1_pin, OUTPUT); digitalWrite(relay_1_pin, relay_1 = 1); relay_2_do = 1; //#2реле 2 pinMode(relay_2_pin, OUTPUT); digitalWrite(relay_2_pin, relay_2 = 0); } void loop() { //#1реле 1 static unsigned long past_1 = 0; static unsigned long past_2 = 0; if (relay_1 && millis() - past_1 >= relay_1_ON) { past_1 = millis(); digitalWrite(relay_1_pin, relay_1 = 0); } if (!relay_1 && millis() - past_1 >= relay_1_OFF) { past_1 = millis(); digitalWrite(relay_1_pin, relay_1 = 1); past_2 = millis(); relay_2_do = 1; } //#2реле 2 if (relay_2_do && millis() - past_2 >= relay_2_do_ON) { relay_2_do = 0; past_2 = millis(); digitalWrite(relay_2_pin, relay_2 = 1); } if (relay_2 && millis() - past_2 >= relay_2_ON) { digitalWrite(relay_1_pin, relay_1 = 0); } }Окончательный вариант полностью здесь https://yadi.sk/d/elyRWglV3DPRZm
Головной файл выкладываю
Спасибо.
Но это без кнопки и pin11 не тухнет (после того, как загорелся диод, он уже не гаснет - только 13й пин моргает по заданной програме), а должен и 11й работать в таком режиме, как 13й)
Код JasKo работает отлично, но у меня не хватает соображалки, чтоб вписать кнопку в код (((
Немного поправил. Добавил логику при которой вкл реле. В общем верни ноги как вам надо и тайминги времени
Триждый проверил - ругается при компиляции на целую страницу
Предыдущая версия компилировалась и грузилась на плату без проблем...
Так головной замените, а библиотеки оставь прежние.Без библиотек не работает. Что опять пакет в яндекс диск кидать вам.
https://yadi.sk/d/7YIRJGb33DPsaz
iven83 если мой код тебе более понятен, то вот вариант с кнопкой
#define BUTTON 2 // кнопка на втором пин, при нажатии кнопка подключает пин к общему проводу. #define RELAY1 10 #define RELAY2 11 #define ONTIME 500 #define OFFTIME 5000 #define PAUSE 1000 #define ON 1 // если реле управляются высоким уровнем то ON= 1 OFF=0 #define OFF 0 // если реле управляется низким уровнем то поставить ON=0 OFF=1 boolean lastButton = HIGH; boolean currentButton = HIGH; boolean relayRUN = true; //Если true - щелкаем релюшками, если false отключаем релюшки и ждем следующего нажатия на кнопку unsigned long timeRelay1 = -99999; unsigned long timeRelay2 = -99999; boolean debounce(boolean last) { boolean current = digitalRead(BUTTON); if (last != current) { delay(5); current = digitalRead(BUTTON); return current; } } void setup() { pinMode (BUTTON, INPUT); digitalWrite(BUTTON, HIGH); // Включаем внутреннее подтягивающее сопротивление нажатие кнопки соответсветсвуте LOW pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } void loop() { currentButton = debounce(lastButton); if (lastButton == HIGH && currentButton == LOW) //Если кнопка нажата то на ней будет низкий уровень { relayRUN = !relayRUN; } lastButton = currentButton; if (relayRUN) { if ( digitalRead(RELAY1) == ON) { if ( millis() - timeRelay1 >= ONTIME) { // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек digitalWrite(RELAY1, OFF); timeRelay1 = millis(); } } else { if (millis() - timeRelay1 >= OFFTIME) { // если реле 1 выключено проверяем 10 мин. и включаем если время прошло digitalWrite(RELAY1, ON); timeRelay1 = millis(); } } if (digitalRead(RELAY2) == ON) { if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем digitalWrite(RELAY2, OFF); timeRelay2 = millis(); } } else { unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек. if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))) { digitalWrite(RELAY2, ON); timeRelay2 = curentTime; } } } else { digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } }Так головной замените, а библиотеки оставь прежние.Без библиотек не работает. Что опять пакет в яндекс диск кидать вам.
https://yadi.sk/d/7YIRJGb33DPsaz
Не злитесь на меня пожалуйста, я ардуино "по нужде" осваиваю - сочиняю пеллетную горелку на благо общества, а там без освоения подобного программирования либо дорого получается, либо громоздко, либо неудобно. Вот и приходится...
Я обязательно попробую разобраться и реализовать разные варианты (насколько я понял, вариантов кодов, которые могут реализовать необходимый алгоритм может быть множество).
Спасибо большое за оказанную помощь в освоении абсолютно новой для меня науки.
iven83 если мой код тебе более понятен, то вот вариант с кнопкой
#define BUTTON 2 // кнопка на втором пин, при нажатии кнопка подключает пин к общему проводу. #define RELAY1 10 #define RELAY2 11 #define ONTIME 500 #define OFFTIME 5000 #define PAUSE 1000 #define ON 1 // если реле управляются высоким уровнем то ON= 1 OFF=0 #define OFF 0 // если реле управляется низким уровнем то поставить ON=0 OFF=1 boolean lastButton = HIGH; boolean currentButton = HIGH; boolean relayRUN = true; //Если true - щелкаем релюшками, если false отключаем релюшки и ждем следующего нажатия на кнопку unsigned long timeRelay1 = -99999; unsigned long timeRelay2 = -99999; boolean debounce(boolean last) { boolean current = digitalRead(BUTTON); if (last != current) { delay(5); current = digitalRead(BUTTON); return current; } } void setup() { pinMode (BUTTON, INPUT); digitalWrite(BUTTON, HIGH); // Включаем внутреннее подтягивающее сопротивление нажатие кнопки соответсветсвуте LOW pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } void loop() { currentButton = debounce(lastButton); if (lastButton == HIGH && currentButton == LOW) //Если кнопка нажата то на ней будет низкий уровень { relayRUN = !relayRUN; } lastButton = currentButton; if (relayRUN) { if ( digitalRead(RELAY1) == ON) { if ( millis() - timeRelay1 >= ONTIME) { // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек digitalWrite(RELAY1, OFF); timeRelay1 = millis(); } } else { if (millis() - timeRelay1 >= OFFTIME) { // если реле 1 выключено проверяем 10 мин. и включаем если время прошло digitalWrite(RELAY1, ON); timeRelay1 = millis(); } } if (digitalRead(RELAY2) == ON) { if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем digitalWrite(RELAY2, OFF); timeRelay2 = millis(); } } else { unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек. if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))) { digitalWrite(RELAY2, ON); timeRelay2 = curentTime; } } } else { digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } }Спасибо! Обязательно завтра испытаю. Сегодня уже просто мозг взрывается от количества полученной информации и попытки её обработать (параллельно с программированием пытаюсь осваивать и электронику).
О результате обязательно отпишусь.
iven83 если мой код тебе более понятен, то вот вариант с кнопкой
#define BUTTON 2 // кнопка на втором пин, при нажатии кнопка подключает пин к общему проводу. #define RELAY1 10 #define RELAY2 11 #define ONTIME 500 #define OFFTIME 5000 #define PAUSE 1000 #define ON 1 // если реле управляются высоким уровнем то ON= 1 OFF=0 #define OFF 0 // если реле управляется низким уровнем то поставить ON=0 OFF=1 boolean lastButton = HIGH; boolean currentButton = HIGH; boolean relayRUN = true; //Если true - щелкаем релюшками, если false отключаем релюшки и ждем следующего нажатия на кнопку unsigned long timeRelay1 = -99999; unsigned long timeRelay2 = -99999; boolean debounce(boolean last) { boolean current = digitalRead(BUTTON); if (last != current) { delay(5); current = digitalRead(BUTTON); return current; } } void setup() { pinMode (BUTTON, INPUT); digitalWrite(BUTTON, HIGH); // Включаем внутреннее подтягивающее сопротивление нажатие кнопки соответсветсвуте LOW pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } void loop() { currentButton = debounce(lastButton); if (lastButton == HIGH && currentButton == LOW) //Если кнопка нажата то на ней будет низкий уровень { relayRUN = !relayRUN; } lastButton = currentButton; if (relayRUN) { if ( digitalRead(RELAY1) == ON) { if ( millis() - timeRelay1 >= ONTIME) { // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек digitalWrite(RELAY1, OFF); timeRelay1 = millis(); } } else { if (millis() - timeRelay1 >= OFFTIME) { // если реле 1 выключено проверяем 10 мин. и включаем если время прошло digitalWrite(RELAY1, ON); timeRelay1 = millis(); } } if (digitalRead(RELAY2) == ON) { if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем digitalWrite(RELAY2, OFF); timeRelay2 = millis(); } } else { unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек. if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))) { digitalWrite(RELAY2, ON); timeRelay2 = curentTime; } } } else { digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } }Компилируется - уже хорошо! )))
iven83 если мой код тебе более понятен, то вот вариант с кнопкой
#define BUTTON 2 // кнопка на втором пин, при нажатии кнопка подключает пин к общему проводу. #define RELAY1 10 #define RELAY2 11 #define ONTIME 500 #define OFFTIME 5000 #define PAUSE 1000 #define ON 1 // если реле управляются высоким уровнем то ON= 1 OFF=0 #define OFF 0 // если реле управляется низким уровнем то поставить ON=0 OFF=1 boolean lastButton = HIGH; boolean currentButton = HIGH; boolean relayRUN = true; //Если true - щелкаем релюшками, если false отключаем релюшки и ждем следующего нажатия на кнопку unsigned long timeRelay1 = -99999; unsigned long timeRelay2 = -99999; boolean debounce(boolean last) { boolean current = digitalRead(BUTTON); if (last != current) { delay(5); current = digitalRead(BUTTON); return current; } } void setup() { pinMode (BUTTON, INPUT); digitalWrite(BUTTON, HIGH); // Включаем внутреннее подтягивающее сопротивление нажатие кнопки соответсветсвуте LOW pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } void loop() { currentButton = debounce(lastButton); if (lastButton == HIGH && currentButton == LOW) //Если кнопка нажата то на ней будет низкий уровень { relayRUN = !relayRUN; } lastButton = currentButton; if (relayRUN) { if ( digitalRead(RELAY1) == ON) { if ( millis() - timeRelay1 >= ONTIME) { // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек digitalWrite(RELAY1, OFF); timeRelay1 = millis(); } } else { if (millis() - timeRelay1 >= OFFTIME) { // если реле 1 выключено проверяем 10 мин. и включаем если время прошло digitalWrite(RELAY1, ON); timeRelay1 = millis(); } } if (digitalRead(RELAY2) == ON) { if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем digitalWrite(RELAY2, OFF); timeRelay2 = millis(); } } else { unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек. if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))) { digitalWrite(RELAY2, ON); timeRelay2 = curentTime; } } } else { digitalWrite(RELAY1, OFF); digitalWrite(RELAY2, OFF); } }Не выдержал, проверил - всё замечательно работает!!! )))
Большущее спасибо!
Есть ещё много идей, что касается отопительных систем, которые можно будет реализовать с помощью Ардуино.
Если получится что-то интересно, обязательно буду выкладывать сдесь.
Подскажите пожалуйста из-за чего через какое-то время работа цикла может останавливаться?
Не знаю, это в "железе" или программная проблема (((.
Сегодня запускал котёл уже с ардуинкой - работало отлично, но через несколько часов заметил, что магниты не срабатывают. Проверил конструцкию - всё вроди без изменений, но сигнал не подаётся (. Все контакты пропаивал - там врди не должно быть проблем. Да и после "передёргивания" питания и нажатия кнопки всё опять работает отлично. Но такой вариант, когда она сама по себе остановилась, мне не нравится.
Запитано через два обычных реле (не твердотельных), но вроди перегрузки на пины быть не должно. Запитал от зарядного с мобильного телефона - написано на выходе 5 В - подключил через гнездо USB... Не знаю в чём может быть проблема (.
Возможно БП слабый или не качественный. Кроме этого, нужно запитать реле не от пинов ардуино, а напрямую от БП.
Возможно БП слабый или не качественный. Кроме этого, нужно запитать реле не от пинов ардуино, а напрямую от БП.
Спасибо за ответ.
Сегодня опытным путём выяснил, что какой-то "мутный" этот блок - на этом скетче иногда мигает один из диодов, а на ИК управлении данные с пульта постоянно разные приходят.