Ардуино-теплица (Помогите остановить цикличность в программе)

Slonic
Offline
Зарегистрирован: 02.04.2016

Привет форумчанам!

Прошу Вашей помощи в своих начинаниях.

Уже почти  сделал в железе проект автоматического управления двумя форточками теплицы, он уже вполне функционирует,но есть две проблемы.

Расскажу все по порядку:

Итак имеем:

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
}
}
    }
}

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Создайте класс форточки, в его методах функции открытия и закрытия. Тогда и код проще будет. Для индикации режима можно один светодиод использовать http://arduino.ru/forum/programmirovanie/upravlenie-elektrokotlom-i-naso...
Попробуйте флаг состояния форточки. И если она закрыта, то не пытатся её закрыть.

Slonic
Offline
Зарегистрирован: 02.04.2016

Спасибо за совет, буду думать.

Slonic
Offline
Зарегистрирован: 02.04.2016
yul-i-an, как вы и посоветовали, добавил флаг состояния и всё заработало как надо,
даже delay теперь не мешает работе.
Плюс в добавок перекинул несколько кнопок на аналоговые входы,
чтоб в дальнейшем была возможность например подключить датчик типа DS18B20.
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;
  }
}

}
    }
}

 

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Попробуйте всётаки создать класс для форточки, так код проще будет.

Примерно как это будет выглядеть. КОД НЕ РАБОЧИЙ просто прикинул.

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();//закрываем вторую