задержка с рестартом
- Войдите на сайт для отправки комментариев
Чт, 19/10/2017 - 22:32
Надо чтоб по факту срабатывания датчика активировалось реле, если датчик повторно срабатывает в течении времени когда реле активовано, отсчет задежки должен начинатся сначала.
По найденым примерам пытался написать что то. Работает, после срабатывания датчика реле включаестя и отрабатэавет весь период, повторные срабатывания датчика в этот период не регистрируются, рестарта нет. Что я сделал неправильно?
/* ARDUINI NANO * PIR Sensor[PIN GND] -> Arduino Nano[PIN GND] * PIR Sensor[PIN 5V] -> Arduino Nano[PIN 5V] * PIR Sensor[PIN OUT] -> Arduino Nano[PIN A0] * Relay Module[PIN IN] -> Arduino Nano[PIN 13] */ const int relout = 13;//relout - пин(выходной сигнал) для модуля реле //prevMillis - переменная для хранения времени предидущего цикла сканирования программы unsigned long prevMillis = 0;//interval - временной интервал для отсчета секунд до выключения реле int interval = 1000; int DelayValue = 10;//DelayValue - период в течение которого реле удерживается во включенном состоянии int initSecond = 10; //initSecond - Переменная итерации цикла инициализации static int countDelayOff = 0; //countDelayOff - счетчик временных интервалов static bool trigger = false;//trigger - флаг срабатывания датчика движения #define baud 9600 void setup() { Serial.begin(9600); //инициализация вывода в терминал pinMode(relout, OUTPUT); //процедура инициализации порта на который подключено реле digitalWrite(relout, LOW); //первоначальное состояние порта на который подключено реле for(int i = 0; i < initSecond; i ++) // ждем когда закончатся X циклов(переменная initSecond) продолжительностью в 1 секунду, за это время датчик "самоинициализируется" { delay(100); } } void loop() { if(analogRead(A0) > 500) //Считать значение с аналогового порта А0, Если значение выше 500 { trigger = true; //устаналиваем флаг trigger=1 } else { trigger = false; //В противном случае устаналиваем флаг trigger=0 } Serial.println(trigger); //вывод состояния флага в терминал while(trigger) //Пока флаг срабатывания датчика движения =1 { unsigned long currMillis = millis(); //Сохранить в переменной currMillis значение миллисекунд прошедших с момента начала выполнения программы if(currMillis - prevMillis > interval) //Сравниваем с предидущим значением миллисекунд, если разница больше заданного интервала, то: { prevMillis = currMillis; //Сохранить текущее значение миллисекунд в переменную prevMillis if(countDelayOff >= DelayValue) //Проверяем счетчик задержки сравнивая его со значением периода в течение которого реле должно удерживаться во включенном состоянии { trigger = false; //Если значение сравнялось, то сбросить флаг срабатывания датчика движения countDelayOff = 0; //Обнулить счетчик задержки digitalWrite(relout, LOW); //Выключить реле break; //Прервать цикл } else //Если значение всё еще меньше, то инкрементировать счетчик задержки на единицу { countDelayOff ++; digitalWrite(relout, HIGH);//Удерживать реле во включенном состоянии } } } }
Надо чтоб по факту срабатывания датчика активировалось реле, если датчик повторно срабатывает в течении времени когда реле активовано, отсчет задежки должен начинатся сначала.
Вот так, навскидку:
Логика проста: при любом срабатывании датчика сбрасываем таймер начала работы реле. Если датчик не срабатывал долгое время - реле выключится после истечения нужного интервала.
Если А0 остается с высоким уровнем, рестарта нет, отрабатывается только один интервал.
Надо чтоб по факту срабатывания датчика активировалось реле, если датчик повторно срабатывает в течении времени когда реле активовано, отсчет задежки должен начинатся сначала.
Вот так, навскидку:
Логика проста: при любом срабатывании датчика сбрасываем таймер начала работы реле. Если датчик не срабатывал долгое время - реле выключится после истечения нужного интервала.
Спасибо! Попробую это завтра.
Если А0 остается с высоким уровнем, рестарта нет, отрабатывается только один интервал.
Если А0 остается с высоким уровнем, рестарта нет, отрабатывается только один интервал.
Спасибо, почти то что надо если дергать А0 вверх вниз, есть рестарт но если сохраняется высокий уровень рестарта нет. Видимо я плохо описал задачу. Ситуация, человек зашел в комнату, датчик сработал, период включения допустим 20 минут, человек ходит по комнате, датчик может подавать все время высокий уровень на А0 но может и дергатся если человек выходит из зоны действия и заходит обратно. Свет в это время включен. Когда человек из комнаты выйдет свет должен оставатся включеным 20 минут после ухода.
Т.е. реле должно включится по фронту сигнала от датчика и выключится через X минут после спада сигнала от датчика.
В любом случае спасибо, идей подкинули, буду разбиратся.
Надо чтоб по факту срабатывания датчика активировалось реле, если датчик повторно срабатывает в течении времени когда реле активовано, отсчет задежки должен начинатся сначала.
Вот так, навскидку:
Логика проста: при любом срабатывании датчика сбрасываем таймер начала работы реле. Если датчик не срабатывал долгое время - реле выключится после истечения нужного интервала.
Спасибо огромное! Это то что надо, проверю завтра еще раз на свежую голову, но сейчас все выглядит хорошо, посмотрел таймер в мониторе, работает как надо, при нажатой кнопке добавляется. В общем спасибо!
Код такой сейчас:
Легким движением руки ...
пс:тоже самое что написали вы.:)
Строго говоря, подобные вещи лучше делать без ардуины вообще - на NE555, например. Тот же датчик движения китайский уже умеет в задержку: при срабатывании на выходе появляется сигнал, который может пропадать через определённое настраиваемое потенциометром время, при повторных срабатываниях, ессно, это время отодвигается в будущее. Никакой ардуины - чистая магия :)
Строго говоря, подобные вещи лучше делать без ардуины вообще - на NE555, например. Тот же датчик движения китайский уже умеет в задержку: при срабатывании на выходе появляется сигнал, который может пропадать через определённое настраиваемое потенциометром время, при повторных срабатываниях, ессно, это время отодвигается в будущее. Никакой ардуины - чистая магия :)
Да, конечно, но в учебных целях и если нужны задежки по пол часа, ардуино мне больше нравица :) Длинные задежки плохо реализуются без цифры. Ну и одна ардуина вполне может работать с датчиками в 3-4 помещениях отрабатывая выдежки хоть по часу, что мне собственно и надо.
Ну для нескольких пар сенсор-реле лучше всего так написать.
Спасибо, как добавлю сенсоров попробую.