Одиночный вызов функции

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017

Название темы может быть не совсем точно отражает суть вопроса.

Есть датчик газа MQ-5, при превышении определенной концентрации у него меняется состояние вывода D0. Соответственно будет вызываться функция отправляющая смску на заранее запрограммированый номер. Но у датчика высокий уровень будет до тех пор пока концентрация газа не снизится. Если просто читать состояние входа, то смска будет отправляться при каждом цикле). Аппаратно это можно решить путем включения конденсатора последовательно с датчиком, как раз будет одиночный импульс при срабатывании датчика. А как это решить программно?

P.S. Схемы и скетча нет никаких, пока только думаю над алгоритмом будущего устройства.

5N62V
Offline
Зарегистрирован: 25.02.2016

Нужна какая-то защелка ( флаг, признак, whatever )

Если  Вас дачик выдает 1 или 0, то можно так:

bool stage = 0, read = 0;

void setup(){
  
}

void loop{
read = (читаем состояние датчика);
  if (read != stage) function();
}

void function(){
  stage = read;
  {остылаем смску}
}

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

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

CheS_66 пишет:

А как это решить программно?

Завести переменную, первоначальное значение которой - 0. Перед отправкой СМС проверять значение переменной: если 0 - отправляем СМС и меняем значение переменной на 1. Всё, больше СМС отправляться не будет. Осталось только вернуть в нужный момент значение 0, чтобы СМС снова отправлялось. Например по снижению концетрации газа. 

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017
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;                          //Снова разрешаем отправку смс   
}

Получается примерно такое.

5N62V
Offline
Зарегистрирован: 25.02.2016

CheS_66 пишет:

Получается примерно такое.

У меня красивее  :).   Если не хотите отправлять смску, когда показания датчика пришли в норму, то будет так:

bool stage = 0, read = 0;

void setup(){}

void loop{
read = (читаем состояние датчика);
  if (read != stage) function();
}

void function(){
  stage = read;
  if(stage){остылаем смску}
}

 

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017

5N62V пишет:

У меня красивее  :)

Тут не в красоте дело) Я так пишу потому что для меня так более понятно, т.к. программист я так себе)))

5N62V
Offline
Зарегистрирован: 25.02.2016

CheS_66 пишет:

Тут не в красоте дело) Я так пишу потому что для меня так более понятно, т.к. программист я так себе)))

Та же, вобщем, фигня. :) Но учусь.