"Одноразовая" пауза с помощью для if

ergeykl
Offline
Зарегистрирован: 20.04.2017

Всем привет!

Стоит задача сделать условие с разовой задержкой на Arduino. Подробнее:

  if ( digitalRead(Pin1) == LOW )   //если включен Pin1
  {
digitalWrite(Pin2, LOW);            //включаем Pin2
Разовая пауза в 20 секунд с помощью millis

  if ( X!= 1 )            //опрос датчика Х на изменения, после работы Pin2 в течение 20 сек
  {
digitalWrite(Pin2, HIGH); //выключение Pin2 если после 20 сек работы 
                          //не произошло изменений в системе
  }
  }

В общем нужна постоянная проверка работоспособности Pin2 по данным с датчика Х.

Уже всю голову поломал! Может пример какой есть простой? Помогите пожалуйста!

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Ну если только как пример

#define Pin1 2
#define Pin2 5
unsigned long pausa;
bool f_pausa;
bool X;

void setup() {
  pinMode(Pin1, INPUT_PULLUP);
  pinMode(Pin2, OUTPUT);
}

void loop() {
  if ( digitalRead(Pin1) == LOW && !f_pausa )   //если включен Pin1
  {
    f_pausa = 1;
    pausa = millis();
    digitalWrite(Pin2, LOW);            //включаем Pin2
  }
  if (millis() - pausa > 20000) {
    if (digitalRead(!Pin2) && X != 1)          //опрос датчика Х на изменения, после работы Pin2 в течение 20 сек
    {
       f_pausa = 0;
      digitalWrite(Pin2, HIGH); //выключение Pin2 если после 20 сек работы
      //не произошло изменений в системе
    }
  }
}

 

ergeykl
Offline
Зарегистрирован: 20.04.2017

vosara, выражаю громадную благодарность за помощь! Благодаря этому примеру всё склепал за 20 минут.

Желаю чтобы у тебя всё было замечательно!)

ergeykl
Offline
Зарегистрирован: 20.04.2017

В общем, получилось как то так:

 unsigned long pausa;       //
bool f_pausa;              //Таймер для (Насоса ЦО)
byte avariya;

void setup(void){
  mcp.begin();

 mcp.pinMode(7, OUTPUT);        // GPB7 Реле 12 (котел цо)
 mcp.pinMode(9, OUTPUT);        // GPB1 Реле 2 (Насос ЦО)
 mcp.pinMode(4, OUTPUT);        // GPA4 Реле 9 (Авария)

mcp.digitalWrite(9, HIGH);        // GPB1 Реле 12 (котел цо) ВЫКЛ
mcp.digitalWrite(9, HIGH);        // GPB1 Реле 2 (Насос ЦО) ВЫКЛ
mcp.digitalWrite(4, HIGH);        // GPA4 Реле 9 (Авария) ВЫКЛ
  }



void loop(void){

 if (mcp.digitalRead(7) == LOW && !f_pausa)   //Условие для включения (Насос ЦО)
  {
    avariya = 2;
    f_pausa = 1;                                 //Переключаем таймер в положение ВКЛ
    pausa = millis();
    mcp.digitalWrite(9, LOW);                             //Включаем (Насос ЦО)
  }
  
  if (millis() - pausa > 5000)                   //Включаем таймер
    {

    if (mcp.digitalRead(9) == LOW && ds.getTempC(Temp2) >= 40 && ds.getTempC(Temp2) >= 40 && avariya == 2)
      {
     avariya = 0;     
      }
    if (mcp.digitalRead(9) == LOW && ds.getTempC(Temp2) <= 40 && avariya == 2)
        {
     mcp.digitalWrite(9, HIGH);                           //Выключаем (Насос ЦО)
     mcp.digitalWrite(4, LOW);                            //Включаем сигнал Авария!
     avariya = 1;
        } 

     }

     }

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

В 21 строчке Вы проверяете f_pausa=0 -чтобы включить насос и провести засечку времени-если истина то включается насос и f_pausa = 1; для того чтобы сюда больше не заходить и не менять засечку времени. Больше нигде в программе Вы не возвращаете  f_pausa=0, следовательно во второй раз не сможете включить насос.

И еще если mcp.digitalRead(7) то может mcp.pinMode(7, INPUT); 

mcp.digitalWrite(9, HIGH); - Может mcp.digitalWrite(7, HIGH);        // GPB1 Реле 12 (котел цо) ВЫКЛ 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

vosara пишет:

во второй раз не сможете включить насос.

А надо? :)

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Ну я думаю что каждыйраз перезапускать ардуино не лутший вариант. А вообще в програме на 40 строк очень много ошибок по не внимательности!

ergeykl
Offline
Зарегистрирован: 20.04.2017

Вы верно подметили на счет f_pausa=0 и на счет ошибок. Это значение возвращается во время перевода "mcp.digitalWrite(9, LOW);" в другом отрезке кода. Исходный код очень объёмный и не хотелось выкладывать его полностью. Если смысл работы системы понятен и (он всё таки работает так как я задумал) грамотность кода не вызывает рвотного рефлекса, то моя цель достигнута :)

Ещё раз благодарю за помощь!

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Да нет все нормально. Я считаю если код работает так как Вы задумали ЗНАЧИТ ОН НАПИСАН ПРАВЕЛЬНО!