WiFi сигнализация

Всем добрый день, столкнулся с проблемой в данной системе, а именно после включения, система начинает без остановки присылать сигнал тревоги, причем датчик отвернут, и я на него никак воздействую. На фото показано как собрана система сейчас. Возможно есть какие-то проблемы в скетче, пока не очень хорошо разбираюсь, поэтому хотел получить помощь здесь. Всем заранее спасибо

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

// Название сети WIFI и пароль
#define WIFI_SSID " "
#define WIFI_PASSWORD " "

#define BOT_TOKEN " "
#define CHAT " "

#define ZUM D0  // Подключение зуммера
#define LED1 D1 // Подключение светодиода
#define LED2 D2 // Подключение светодиода
#define SEN D3  // Подключение датчика


X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);

boolean flag; // Флаг включения охраны
uint16_t cnt;

void setup() {
  Serial.begin(9600);

  pinMode(ZUM, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(SEN, INPUT);

  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  secured_client.setTrustAnchors(&cert);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }
  Serial.print("\nWiFi connected. IP address: ");
  Serial.println(WiFi.localIP());

  Serial.print("Retrieving time: ");
  configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
  time_t now = time(nullptr);
  while (now < 24 * 3600)
  {
    Serial.print(".");
    delay(1000);
    now = time(nullptr);
  }
  Serial.println(now);
  Serial.println("Запуск");
  bot.sendMessage(CHAT, "Запуск", "");
}


void loop() {
  for (byte i = 0; i < 100; i++) {
    delay(10);
    if (!digitalRead(SEN) && flag) {
      bot.sendMessage(CHAT, "Тревога", "");
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, HIGH);
      digitalWrite(ZUM, HIGH);
      delay(3000);
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, LOW);
      digitalWrite(ZUM, LOW);
      break;
    }
  }

  while (bot.getUpdates(bot.last_message_received + 1)) {
    delay(1);
    Serial.println(bot.messages[0].chat_id);
    if (bot.messages[0].chat_id != CHAT) break;

    String t = bot.messages[0].text;
    if (t == "/start") bot.sendMessage(CHAT, "Для включения и выключения введите ON или OFF. Чтобы узнать статус отправьте STATUS", "");
    else if (t == "ON") {
      flag = true;
      bot.sendMessage(CHAT, "Включено", "");
      digitalWrite(LED1, HIGH);
    }
    else if (t == "OFF") {
      flag = false;
      bot.sendMessage(CHAT, "Выключено", "");
      digitalWrite(LED1, LOW);
    }
    else if (t == "STATUS") {
      if (flag) bot.sendMessage(CHAT, "Включено", "");
      else bot.sendMessage(CHAT, "Выключено", "");
    }
    else bot.sendMessage(CHAT, "Неизвестная команда", "");
  }
}

Во-первых, Вы не написали в каком режим датчик (это перемычкой определяется), но в любом случае, срабатывание датчика - это появление HIGH на его выходе (это ведь HC-SR501, правильно?). А Вы в строке №63 проверяете наличие на нём LOW. Т.е. Вы подаёте тревогу как раз тогда, когда датчик и не думал срабатывать.

Да, датчик HC-SR501, находится в режиме L

  1. В любом режиме надо проверять на HIGH, а не на LOW
  2. В режиме L датчик выдаёт короткий импульс, потому обрабатывать его так, как Вы это делаете - очень плохая идея. Ваш loop() достаточно долгий и Вы рискуете просто прозевать этот импульс. Тут надо подумать о прерывании от пина датчика.

Как я понял, в 63 строке нужно убрать !, а что тогда сделать с loop, чтобы все работало нормально? Спасибо за ответ

Давайте слона по частям кушать. Для начала, сделайте следующее:

  1. в строке №22 добавьте инициализацию ( boolean flag = true; );
  2. в строке №63 удалите ! ;
  3. строки №№ 61, 62, 72 и 74 удалите вовсе, они не нужны в принципе;
  4. строки №№ 76-98 закомментируйте.

У Вас осталась только проверка датчика и включение светодиодов, если он сработал. Запустите и убедитесь, что он работает (если будут отдельные пропуски срабатываний – не парьтесь пока).

А вот когда Вы убедитесь, что оно работает, тогда изучите тему “прерывания на GPIO в ESP8266”, например, здесь или ещё где – это везде описано. И тогда постарайтесь сделать обнаружение срабатывания датчика по прерыванию.

Спасибо!