Одиночный вызов функции
- Войдите на сайт для отправки комментариев
Втр, 31/10/2017 - 11:57
Название темы может быть не совсем точно отражает суть вопроса.
Есть датчик газа MQ-5, при превышении определенной концентрации у него меняется состояние вывода D0. Соответственно будет вызываться функция отправляющая смску на заранее запрограммированый номер. Но у датчика высокий уровень будет до тех пор пока концентрация газа не снизится. Если просто читать состояние входа, то смска будет отправляться при каждом цикле). Аппаратно это можно решить путем включения конденсатора последовательно с датчиком, как раз будет одиночный импульс при срабатывании датчика. А как это решить программно?
P.S. Схемы и скетча нет никаких, пока только думаю над алгоритмом будущего устройства.
Нужна какая-то защелка ( флаг, признак, whatever )
Если Вас дачик выдает 1 или 0, то можно так:
bool stage = 0, read = 0; void setup(){ } void loop{ read = (читаем состояние датчика); if (read != stage) function(); } void function(){ stage = read; {остылаем смску} }Смска будет отправляться один раз, когда порог превышен, и когда измерения с датчика вошли в норму.
А как это решить программно?
Завести переменную, первоначальное значение которой - 0. Перед отправкой СМС проверять значение переменной: если 0 - отправляем СМС и меняем значение переменной на 1. Всё, больше СМС отправляться не будет. Осталось только вернуть в нужный момент значение 0, чтобы СМС снова отправлялось. Например по снижению концетрации газа.
bool sms_send = false; //флаг отправки смс bool gaz_sens = false; //Флаг срабатывания датчика gaz_sens = digitalRead (pin_sens); //Читаем состояние входа к которому подключен датчик if (gaz_sens == true && sms_send == false){ //Если выполнены два условия - датчик сработал, а смс ещё не отправлялась //тут отправляем смску //Отправляем смс sms_send = true; //Поднимаем флаг, смс отправлено } if (gaz_sens == false){ //Если концентрация газа снизилась - на выходе датчика лог. 0 sms_send = false; //Снова разрешаем отправку смс }Получается примерно такое.
У меня красивее :). Если не хотите отправлять смску, когда показания датчика пришли в норму, то будет так:
bool stage = 0, read = 0; void setup(){} void loop{ read = (читаем состояние датчика); if (read != stage) function(); } void function(){ stage = read; if(stage){остылаем смску} }У меня красивее :)
Тут не в красоте дело) Я так пишу потому что для меня так более понятно, т.к. программист я так себе)))
Тут не в красоте дело) Я так пишу потому что для меня так более понятно, т.к. программист я так себе)))