Датчик PIR выдает ложный максимум за 55 минут (не могу найти способ решения)
Я создал систему для обнаружения движения и оповещения о пожаре. Система может отправить SMS в случае выявления таких предупреждений.
Система состоит из двух частей,
Часть 1. Постановка на охрану и снятие с охраны с помощью PIN-кода (с использованием Arduino Uno)
Этот модуль состоит из 4*4 контактных панелей, модуля I2C, 2 светодиодов и платы Arduino UNO. Эта часть работает нормально
Часть 2. Сенсорные системы и система SMS
Этот модуль состоит из Arduino NANO, датчика газа MQ135, датчика PIR, модуля SIM 800L, тамперных переключателей. Эта часть тоже работает, но каждые 55 минут генерируется ложное оповещение о движении, и мне не удалось устранить проблему.
Схемы прилагаются.
Коды, как показано ниже,
Часть 1: Test6-LCD_Intigrated_Working_Temper.ino
#include <Keypad.h>
#include<EEPROM.h>
#include <Wire.h> // Библиотека для связи I2C
#include <LiquidCrystal_I2C.h> // Библиотека для LCD
char password[4];
char pass[4],pass1[4];
int i=0;
int k=0;
char customKey=0;
byte col = 0;
const byte ROWS = 4; //четыре строки
const byte COLS = 4; //четыре столбца
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //подключаемся к распиновке ряда клавиатуры
byte colPins[COLS] = {13, 12, 11, 10}; //подключаем к колонке распиновку клавиатуры
// инициализируем экземпляр класса NewKeypad
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
void setup()
{
lcd.begin();
Serial.begin(9600);
pinMode(4, INPUT); // Сигнал тампера
pinMode(3, OUTPUT); //Вооружен
pinMode(2, OUTPUT); // Разоружен
lcd.setCursor(0, 0);
lcd.print ("--SECURE ROOM!--");
Serial.print("Server Room");
lcd.setCursor(0, 1);
lcd.print ("PLEASE ENTER PIN");
Serial.print("\n*********Keypad Lock********* ");
delay(2000);
Serial.println("\n*********Enter Ur Passkey:*********");
for(int j=0;j<4;j++)
EEPROM.write(j, j+49);
for(int j=0;j<4;j++)
pass[j]=EEPROM.read(j);
}
void Armed(){
digitalWrite(3, HIGH);
digitalWrite(2, LOW);
Serial.println("\n***System is Armed***");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("--SYSTEM ARMED--");
lcd.setCursor(0, 1);
lcd.print("-SENSORS ACTIVE-");
delay (2000);
lcd.noBacklight();
i=0;
customKey=0;
}
void change()
{
int j=0;
lcd.backlight();
Serial.println("\n*********UR Current Passk*********");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" CURRENT PIN ");
while(j<4)
{
char key=customKeypad.getKey();
if(key)
{
pass1[j++]=key;
Serial.print(key);
lcd.setCursor(j+6, 1);
lcd.print(key);
}
key=0;
}
delay(500);
if((strncmp(pass1, pass, 4)))
{
Serial.println("\n*********Wrong Passkey*********");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" UNAUTHORIZED ");
Serial.println("\n*********UNAuthorized Access*********");
lcd.setCursor(0, 1);
lcd.print(" ACCESS DENIED ");
delay(10000);
}
else
{
j=0;
Serial.println("\n*********Enter New Passk: *********");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" ENTER NEW PIN! ");
while(j<4)
{
char key=customKeypad.getKey();
if(key)
{
pass[j]=key;
Serial.print("*");
EEPROM.write(j,key);
lcd.setCursor(j+6, 1);
lcd.print(key);
j++;
}
}
Serial.println("*********Done*********");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("----UPDATED!----");
delay(1000);
}
Serial.println("\n*********Enter Ur Passk: *********");
lcd.clear();
lcd.setCursor(2, 0);
lcd.print ("SECURE ROOM!");
lcd.setCursor(0, 1);
lcd.print ("PLEASE ENTER PIN");
lcd.noBacklight();
customKey=0;
}
void tamper(){
Serial.println("\n***System is Tampered***");
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("--TAMPERED--");
lcd.setCursor(0, 1);
lcd.print("WARN COMPROMISED");
delay (2000);
lcd.backlight();
i=0;
customKey=0;
}
void loop()
{
Serial.println(digitalRead(4));
customKey = customKeypad.getKey();
if(customKey=='A')
Armed();
if(customKey=='C')
change();
/*
if(digitalRead(4)==LOW)
tamper();
*/
if (customKey)
{
lcd.backlight();
password[i++]=customKey;
Serial.print("*");
lcd.setCursor(0, 0);
lcd.print(" PIN INPUT ");
lcd.setCursor(0,1);
lcd.print(" ---- ") ;
lcd.setCursor(i+6, 1);
lcd.print("*");
}
if(i==4)
{
delay(200);
for(int j=0;j<4;j++)
pass[j]=EEPROM.read(j);
if(!(strncmp(password, pass,4)))
{
Serial.println("\n*********Passkey Accepted*********");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("---AUTHORIZED---");
lcd.setCursor(0, 1);
lcd.print("SYSTEM DISARMED");
delay(1000);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
i=0;
}
else
{
Serial.println("\n*********Access Denied*********");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" UNAUTHORIZED ");
lcd.setCursor(0, 1);
lcd.print(" ACCESS DENIED ");
delay (5000);
Serial.println("\n*********Enter Passkey: *********");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print ("--SECURE ROOM!--");
lcd.setCursor(0, 1);
lcd.print ("PLEASE ENTER PIN");
lcd.noBacklight();
i=0;
}
}
}
Часть 2: Test7_Tested_Tamper_Smoke_PIR_GSM.ino.ino
/*
Arduino with PIR motion sensor and MQ 135 Smoke Detector with SMS Alert
Developed By Vinod Amarathunga 18.09.2019
DMS Electronics (Pvt) Ltd
*/
#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 5); //SIM800L Rx Tx
char msg;
String textMessage;
int smokeA0 = A0; // Аналоговый вход MQ135
int led = 13; // контакт, к которому подключен светодиод
int priState = LOW; // по умолчанию движение не обнаружено
int TampSignal = 11; // Тампер Сигнал 5В
int sensorThres = 150; //Порог качества дымового воздуха
int pretamper = LOW;
bool premotion = false;
bool prefire = false;
void setup() {
pinMode(led, OUTPUT); // инициализируем светодиод как выход
pinMode(3, INPUT); // инициализируем датчик как вход
pinMode(TampSignal, OUTPUT); // Выходной сигнал тампер-драйва
pinMode(10, INPUT); // Предупреждение о несанкционированном доступе
Serial.begin(9600); // инициализируем сериал
mySerial.begin(9600);
}
void SmokeSMS()
{
Serial.println("Warning!! Secure Room Fire Detected");
mySerial.println("AT+CMGF=1"); // Устанавливает модуль GSM в текстовый режим
delay(1000); // Задержка 1000 миллисекунд или 1 секунда
mySerial.println("AT+CMGS=\"+xx\"\r");
delay(1000);
mySerial.println("Warning!! Secure Room Fire Detected");
mySerial.println((char)26);// ASCII-код CTRL+Z
delay(1000);
mySerial.println("AT+CMGD=2");
delay(5000);
Serial.println("Warning!! Secure Room Fire Detected");
mySerial.println("AT+CMGF=1"); // Устанавливает модуль GSM в текстовый режим
delay(1000); // Задержка 1000 миллисекунд или 1 секунда
mySerial.println("AT+CMGS=\"+xx2\"\r");
delay(1000);
mySerial.println("Warning!! Secure Room Fire Detected");
mySerial.println((char)26);// ASCII-код CTRL+Z
delay(1000);
mySerial.println("AT+CMGD=2");
}
void MotionSMS()
{
Serial.println("Warning!! Secure Room Motion Detected");
mySerial.println("AT+CMGF=1"); // Устанавливает модуль GSM в текстовый режим
delay(1000); // Задержка 1000 миллисекунд или 1 секунда
mySerial.println("AT+CMGS=\"xx\"\r");
delay(1000);
mySerial.println("PIN 3 HIGH");
mySerial.println((char)26);// ASCII-код CTRL+Z
delay(1000);
mySerial.println("AT+CMGD=2");
delay(5000);
/*
Serial.println("Warning!! Secure Room Motion Detected");
mySerial.println("AT+CMGF=1"); // Устанавливает модуль GSM в текстовый режим
delay(1000); // Задержка 1000 миллисекунд или 1 секунда
mySerial.println("AT+CMGS=\"xx2\"\r");
delay(1000);
mySerial.println("Warning!! Secure Room Motion Detected");
mySerial.println((char)26);// ASCII-код CTRL+Z
delay(1000);
mySerial.println("AT+CMGD=2");
*/
}
void TamperSMS()
{
Serial.println("Warning!! System Tamper Detected");
mySerial.println("AT+CMGF=1"); // Устанавливает модуль GSM в текстовый режим
delay(1000); // Задержка 1000 миллисекунд или 1 секунда
mySerial.println("AT+CMGS=\"xx2\"\r");
delay(1000);
mySerial.println("Warning!! System Tamper Detected");
mySerial.println((char)26);// ASCII-код CTRL+Z
delay(1000);
mySerial.println("AT+CMGD=2");
delay(5000);
Serial.println("Warning!! System Tamper Detected");
mySerial.println("AT+CMGF=1"); // Устанавливает модуль GSM в текстовый режим
delay(1000); // Задержка 1000 миллисекунд или 1 секунда
mySerial.println("AT+CMGS=\"xx\"\r");
delay(1000);
mySerial.println("Warning!! System Tamper Detected");
mySerial.println((char)26);// ASCII-код CTRL+Z
delay(1000);
mySerial.println("AT+CMGD=2");
}
void loop() {
int analogSensor = analogRead(smokeA0);
digitalWrite(TampSignal, HIGH); // Сигнал привода всегда высокий
//val = цифровое чтение(3); // считываем значение датчика
// ПолучитьСообщение(); //Системные сообщения
//Serial.print("Уровень дыма:");
//Serial.println(аналоговый датчик);
Serial.println(digitalRead(3));
if (analogSensor > sensorThres ) { // проверяем, находится ли датчик в ВЫСОКОМ состоянии и в состоянии охраны
digitalWrite(led, HIGH); // включить светодиод
Serial.print("\nSmoke Alert....!!!");
SmokeSMS(); // Оповещение о задымлении по СМС
delay(100); // задержка 100 миллисекунд
}
else if ( priState == LOW && digitalRead(3) == HIGH && digitalRead(7) == HIGH ) {
digitalWrite(led, HIGH); // включить светодиод
Serial.println("Motion detected!");
MotionSMS(); //Motion SMS
priState = HIGH; // Статус предыдущего движения установлен на Высокий
delay(15000);
}
else if ( digitalRead(7) == HIGH && digitalRead(10) == LOW )
{
digitalWrite(led, HIGH); // включить светодиод и включить аварийный сигнал тревоги
Serial.println("One of the TIP Switches being Trigered");
if ( pretamper == LOW ) {
TamperSMS(); // Тампер СМС
pretamper = HIGH;
delay(15000);
}
}
else {
digitalWrite(led, LOW); // выключаем светодиод
digitalWrite(11, HIGH); // Сигнал тампера
delay(200); // задержка 200 миллисекунд
pretamper = LOW;
//Serial.print("\n.....Нормально.....");
if (priState == HIGH) {
Serial.println("Motion stopped!");
priState = LOW; // обновить состояние переменной до LOW
}
}
}
Я схожу с ума, потому что не могу найти проблему с ложным оповещением каждые 55 минут.
Я очень благодарен любому, кто может помочь.
1 ответ
Лучший ответ:
После множества исследований был найден способ решить эту проблему.
Это характерно для обычных ИК-датчиков, когда мы используем 5 В на выходе Arduino. Поэтому мы должны разделить питание для PIR и Arduino с помощью оптопары и нескольких транзисторов для сглаживания сигнала. Теперь решение работает нормально.
Я пишу здесь, чтобы помочь кому-то, кто столкнулся с той же проблемой.
- MAX30100 не работает
- Arduino Nano BME280 странные значения
- Использование библиотеки емкостных датчиков с мультиплексором 74HC4067
- Проблема с сигналом датчика пульса
- Считывание значений с емкостного сенсорного датчика TTP229 на arduino
- Подключение двух Arduino через I2C, когда контакты I2C A4/A5 уже используются.
- Два датчика расхода, один ESP32, ЖК-дисплей и/или Arduino
- Arduino nano 33 ble vs ble sense. Потребляемая мощность и т.д.
Я не вижу в коде ничего, что могло бы вызывать сигнал ровно каждые 55 минут. -- Можно ли отсоединить датчик движения от NANO, чтобы попробовать, появляется ли сигнал отдельно. В конце концов вы подключаете выход данных датчика к бистабильному триггеру, который управляет светодиодом. Чтобы узнать, срабатывает ли датчик движения, например, тестовый сигнал каждые 55 минут. Вы также можете попытаться скрыть датчик от окружающего света. Возможно, есть источник света, который мигает ИК-светом каждые 55 минут и каким-либо образом мешает датчику., @Peter Paul Kiefer
Привет @PeterPaulKiefer, спасибо. На самом деле каждые 55 минут свет не излучается. Тестирую в закрытой коробке. Я собираюсь попробовать это в автономном режиме, как было предложено. Но я сомневаюсь, чтобы получить предупреждение о проверке, @Vinod Amarathunga
Если вы по-прежнему не получите никаких результатов, было бы полезно увидеть последовательные распечатки по крайней мере двух разных тестовых прогонов. т.е. включите сигнализацию, подождите 3 раза по 55 минут (таким образом, ложное срабатывание произойдет 3 раза). Выключите питание, подождите 30 минут и повторите то же самое. Вывод должен содержать метки времени. Этот 55-минутный интервал действительно странный. Мне было бы интересно, если это относительные интервалы или абсолютные временные точки, отсюда и второй тестовый прогон., @Peter Paul Kiefer