Ардуино-теплица (Помогите остановить цикличность в программе)
- Войдите на сайт для отправки комментариев
Привет форумчанам!
Прошу Вашей помощи в своих начинаниях.
Уже почти сделал в железе проект автоматического управления двумя форточками теплицы, он уже вполне функционирует,но есть две проблемы.
Расскажу все по порядку:
Итак имеем:
1) Тумблер переключения режимов управления АВТО/РУЧНОЙ (в скетче это BUT_1);
2) Так как я начинающий "ардуинщик" и пока что для меня сложно написать скетч с применением датчика DS18B20, то термостат использую внешний и подключаю его как кнопку BUT_2 ;
3) 4 кнопки для ручного управления моторами форточек;
4) моторы (мотор-редукторы с концевиками, для открытия форточки нужно подать питания в одной полярности,для закрытия полярность поменять) управляются посредством четырех реле, на одну форточку по 2 реле, одно реле на открытие, другое для закрытия;
Смысл такой:
в режиме ручного управления кнопками все просто, тут всё хорошо работает;
А вот в режиме автоматического управления должно быть так: если термостат сработал, он замыкает как бы кнопку BUT_2, после чего нужно на 5 секунд включить реле открывания первой форточки,далее на 5 секунд включить реле открывания второй форточки.
Если термостат отпустил кнопку BUT_2, то включаем на 5 секунд реле закрывания первой форточки, затем на 5сек. включаем реле закрывания второй форточки.
Вот собственно и всё, но дело в том, что после срабатывания термостата цикл постоянно крутится с 79 по 84 строки, и релюшки щелкают каждые 5 секунд, а мне надо чтоб данный цикл отработал один раз после срабатывания термостата и ждал до момента отпускания термостата.
И проблема номер два: из-за использования функции delay(5000) при переключении тумблера на ручное управления,нужно выждать эти 5 секунд и тогда только происходит переход в ручное управление.
Всю голову сломал уже и данный сайт облазил, но никак не получается справиться с данной задачей, помогите пожалуйста.
const int BUT_1 = 2; // BUT_1 - переключатель режима авто/ручной (сидит на пине 2) const int BUT_2 = 3; // BUT_2 - термо-реле //(если нажата, то обе форточки открыть, если НЕ нажата, то обе форточки закрыть)(сидит на пине 3) const int BUT_3 = 4; // BUT_3 - кнопка открывания форточки 1 (сидит на пине 4) const int BUT_4 = 5; // BUT_4 - кнопка закрывания форточки 1 (сидит на пине 5) const int BUT_5 = 6; // BUT_5 - кнопка открывания форточки 2 (сидит на пине 6) const int BUT_6 = 7; // BUT_6 - кнопка закрывания форточки 2 (сидит на пине 7) const int relayPinOpen1 = 8; //реле открывания форточки 1 const int relayPinClose1 = 9; //реле закрывания форточки 1 const int relayPinOpen2 = 10;//реле открывания форточки 2 const int relayPinClose2 = 11;//реле закрывания форточки 2 const int ledPinAuto = 12; //индикатор режима АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ ПО ТЕРМО-РЕЛЕ const int ledPinManual = 13;//индикатор режима РУЧНОГО УПРАВЛЕНИЯ КНОПКАМИ int regim=1; void setup() { pinMode(ledPinAuto,OUTPUT); pinMode(ledPinManual,OUTPUT); pinMode(relayPinOpen1,OUTPUT); pinMode(relayPinClose1,OUTPUT); pinMode(relayPinOpen2,OUTPUT); pinMode(relayPinClose2,OUTPUT); pinMode(BUT_1, INPUT); //для считывания состояний кнопок digitalWrite( BUT_1 , HIGH ); // подтяжка pinMode(BUT_2, INPUT); //для считывания состояний кнопок digitalWrite( BUT_2 , HIGH ); // подтяжка pinMode(BUT_3, INPUT); //для считывания состояний кнопок digitalWrite( BUT_3 , HIGH ); // подтяжка pinMode(BUT_4, INPUT); //для считывания состояний кнопок digitalWrite( BUT_4 , HIGH ); // подтяжка pinMode(BUT_5, INPUT); //для считывания состояний кнопок digitalWrite( BUT_5 , HIGH ); // подтяжка pinMode(BUT_6, INPUT); //для считывания состояний кнопок digitalWrite( BUT_6 , HIGH ); // подтяжка // кнопки соединены с ардуиной ПОДТЯГИВАЮЩИМ резистором! //(т.е. когда НЕ нажато - на пине висит 5 В, если нажато - на пине висит 0 В) !!!!!!!!!!!!!!!! } void loop() { if(digitalRead(BUT_1)==LOW) { regim=1;//если кнопка BUT_1 нажата режим 1 } else { regim=2;//если кнопка BUT_1 НЕ нажата режим 2 } if(regim==1)//первый режим { digitalWrite(ledPinAuto,LOW); //вЫключаем индикатор режима АВТО digitalWrite(ledPinManual,HIGH);//включаем индикатор режима РУЧНОГО УПРАВЛЕНИЯ if (digitalRead(BUT_3) == LOW) digitalWrite(relayPinOpen1,HIGH); //если 3-я кнопка нажата включаем реле открывания форточки 1 if (digitalRead(BUT_3) == HIGH) digitalWrite(relayPinOpen1,LOW); //если 3-я кнопка НЕ нажата вЫключаем реле открывания форточки 1 if (digitalRead(BUT_4) == LOW) digitalWrite(relayPinClose1,HIGH); //если 4-ая кнопка нажата включаем реле закрывания форточки 1 if (digitalRead(BUT_4) == HIGH) digitalWrite(relayPinClose1,LOW); //если 4-ая кнопка НЕ нажата вЫключаем реле закрывания форточки 1 if (digitalRead(BUT_3) == LOW && digitalRead(BUT_4) == LOW) digitalWrite(relayPinOpen1,LOW), digitalWrite(relayPinClose1,LOW); //если кнопки 3 и 4 нажали одновременно, то отключаем обе реле откр и закр форточки1 if (digitalRead(BUT_5) == LOW) digitalWrite(relayPinOpen2,HIGH); //если 5-я кнопка нажата включаем реле открывания форточки 2 if (digitalRead(BUT_5) == HIGH) digitalWrite(relayPinOpen2,LOW); //если 5-я кнопка НЕ нажата вЫключаем реле открывания форточки 2 if (digitalRead(BUT_6) == LOW) digitalWrite(relayPinClose2,HIGH); //если 6-ая кнопка нажата включаем реле закрывания форточки 2 if (digitalRead(BUT_6) == HIGH) digitalWrite(relayPinClose2,LOW); //если 6-ая кнопка НЕ нажата вЫключаем реле закрывания форточки 2 if (digitalRead(BUT_5) == LOW && digitalRead(BUT_6) == LOW) digitalWrite(relayPinOpen2,LOW), digitalWrite(relayPinClose2,LOW); //если кнопки 3 и 4 нажали одновременно, тоотключаем обе реле откр и закр форточки1 delay(10); // подождем перед следующим опросом } else { regim==2;//второй режим { digitalWrite(ledPinAuto,HIGH);//включаем индикатор режима АВТО digitalWrite(ledPinManual,LOW);//вЫключаем индикатор режима РУЧНОГО УПРАВЛЕНИЯ if (digitalRead(BUT_2) == LOW) { //если термо-реле сработало,то digitalWrite(relayPinOpen1,HIGH); //включаем на 5 секунд реле открывания форточки 1 delay(5000); digitalWrite(relayPinOpen1,LOW); //выключаем реле открывания форточки 1 digitalWrite(relayPinOpen2,HIGH);//включаем на 5 секунд реле открывания форточки 2 delay(5000); digitalWrite(relayPinOpen2,LOW);//выключаем реле открыания форточки 2 } //если вторая кнопка нажата включаем реле открывания форточек 1 и 2 на n секунд else //иначе "если термо-реле отпустило,то" { digitalWrite(relayPinClose1,HIGH); //включаем на 5 секунд реле закрывания форточки 1 delay(5000); digitalWrite(relayPinClose1,LOW);//выключаем реле закрывания форточки 1 digitalWrite(relayPinClose2,HIGH);//включаем на 5 секунд реле закрывания форточки 2 delay(5000); digitalWrite(relayPinClose2,LOW);//выключаем реле закрывания форточки 2 } } } }
Создайте класс форточки, в его методах функции открытия и закрытия. Тогда и код проще будет. Для индикации режима можно один светодиод использовать http://arduino.ru/forum/programmirovanie/upravlenie-elektrokotlom-i-naso...
Попробуйте флаг состояния форточки. И если она закрыта, то не пытатся её закрыть.
Спасибо за совет, буду думать.
Попробуйте всётаки создать класс для форточки, так код проще будет.
Примерно как это будет выглядеть. КОД НЕ РАБОЧИЙ просто прикинул.