Выполнить действие один раз в if пока значение = истинно

Тема в разделе "Arduino & Shields", создана пользователем Andretti, 20 мар 2020.

  1. Andretti

    Andretti Нуб

    Код (C++):
    int door_sensor7 = 7;   //пин для подключения геркона
    int door_val = 0;   // переменная для хранения состояния датчика

    void setup() {
    pinMode(8, OUTPUT);   // выход для светодиода
    pinMode(door_sensor7, INPUT);   // вход для геркона
    delay(2000);

    void loop() {

    door_val = digitalRead(door_sensor7);   //считываем значения с геркона
    {  if (door_val ==  HIGH)    //дверь откыта
      {digitalWrite(door_sensor7, LOW);
      {
        digitalWrite(8, HIGH);
        mySerial.println("AT+CMGS=\"+792********\""); //команда для отправки смс
        delay(100);
        mySerial.println("Door_7_open");   //отправляем текст
        mySerial.println((char)26);    //символ завершающий передачу
        mySerial.println("Ok");
        delay(10000);}}  // Задержка на 10 секунд и снова проверка
       else{
    digitalWrite(8, LOW);}
      }
         }
    Здравствуйте, подскажите как сделать так, чтобы сообщение об открытии двери (размыкание геркона) отправлялось ОДИН раз по каждому открытию (размыканию). Сделал через delay, но через каждые 10 секунд отправляется смс снова и снова пока геркон разомкнут.
     
  2. сделать флаг который изменится при отправке смс и запихать его в условие.

    или сделать разные режимы работы, вроде установки и снятия с охраны.
     
  3. Andretti

    Andretti Нуб

    Спасибо за ответ, подскажи как это сделать, про флаг я читал но ни чего не понял, там вроде с логической переменной boolean нужно сделать
     
  4. parovoZZ

    parovoZZ Гуру

    чтобы выполнить if гарантированно один раз, для этого придумана конструкция
    Код (C++):
    do
    while()
     
  5. Daniil

    Daniil Гуру

    Решение с флагом проще. Нужно отслеживать состояние двери. Открыли - отправили смс - взвели. Закрыли - сбросили флаг
     
    Airbus нравится это.