Ардуино-теплица (Помогите остановить цикличность в программе)
- Войдите на сайт для отправки комментариев
Привет форумчанам!
Прошу Вашей помощи в своих начинаниях.
Уже почти сделал в железе проект автоматического управления двумя форточками теплицы, он уже вполне функционирует,но есть две проблемы.
Расскажу все по порядку:
Итак имеем:
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...
Попробуйте флаг состояния форточки. И если она закрыта, то не пытатся её закрыть.
Спасибо за совет, буду думать.
const int BUT_1 = 2; // BUT_1 - переключатель режима авто/ручной (сидит на пине 2) const int BUT_2 = 3; // BUT_2 - термо-реле //(если нажата, то обе форточки открыть, если НЕ нажата, то обе форточки закрыть)(сидит на пине 3) const int BUT_3 = A0; // BUT_3 - кнопка открывания форточки 1 (сидит на пине 4) const int BUT_4 = A1; // BUT_4 - кнопка закрывания форточки 1 (сидит на пине 5) const int BUT_5 = A2; // BUT_5 - кнопка открывания форточки 2 (сидит на пине 6) const int BUT_6 = A3; // BUT_6 - кнопка закрывания форточки 2 (сидит на пине 7) const int relayPinOpen1 = 6; //реле открывания форточки 1 const int relayPinClose1 = 7; //реле закрывания форточки 1 const int relayPinOpen2 = 8;//реле открывания форточки 2 const int relayPinClose2 = 9;//реле закрывания форточки 2 const int ledPinAuto = 4; //индикатор режима АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ ПО ТЕРМО-РЕЛЕ const int ledPinManual = 5;//индикатор режима РУЧНОГО УПРАВЛЕНИЯ КНОПКАМИ int regim=1; int openFlag = 0; 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) { //если термо-реле сработало,то if (openFlag != 1) { digitalWrite(relayPinOpen1,HIGH); //включаем на 5 секунд реле открывания форточки 1 delay(5000); digitalWrite(relayPinOpen1,LOW); //выключаем реле открывания форточки 1 digitalWrite(relayPinOpen2,HIGH);//включаем на 5 секунд реле открывания форточки 2 delay(5000); digitalWrite(relayPinOpen2,LOW);//выключаем реле открыания форточки 2 openFlag = 1; } } //если вторая кнопка нажата включаем реле открывания форточек 1 и 2 на n секунд else //иначе "если термо-реле отпустило,то" { if (openFlag != 2) { digitalWrite(relayPinClose1,HIGH); //включаем на 5 секунд реле закрывания форточки 1 delay(5000); digitalWrite(relayPinClose1,LOW);//выключаем реле закрывания форточки 1 digitalWrite(relayPinClose2,HIGH);//включаем на 5 секунд реле закрывания форточки 2 delay(5000); digitalWrite(relayPinClose2,LOW);//выключаем реле закрывания форточки 2 openFlag = 2; } } } } }Попробуйте всётаки создать класс для форточки, так код проще будет.
Примерно как это будет выглядеть. КОД НЕ РАБОЧИЙ просто прикинул.
class Frame { public: // Конструктор Frame (const uint8_t relayPinOpen, const uint8_t relayPinClose) { pinMode(_relayPinOpen = relayPinOpen, OUTPUT); pinMode(_relayPinClose = relayPinClose, OUTPUT); } void clos(){ digitalWrite(relayPinClose,HIGH); } void open(){ digitalWrite(relayPinOpen,HIGH); } private: uint8_t _relayPinOpen; uint8_t _relayPinClose; boolean openFlag=0; }; //Примерная работа с классом Frame Frame Frame1(6,7), Frame2(8,9);//создаем экземпляры Frame1.open();//открываем первую форточку Frame2.clos();//закрываем вторую