Помогите устранить ложное срабатывание в коде сигнализации.
- Войдите на сайт для отправки комментариев
Здравствуйте. Подскажите пожалуцйста что с кодом не так - каждые 4 часа и 4 минуты происходит ложное срабатывание сигнализации.
Алгорит работы кода простой -
int presPin = 4; // цифровой пин, на который подаётся сигнал с датчика присутствия int movPin = 10; // цифровой пин, на который подаётся сигнал с датчика движения int micPin = A0; // аналоговый пин, на который подаётся сигнал с датчика звука int vibrPin = 12; // цифровой пин, на который подаётся сигнал с датчика вибрации int LED = 3; // диод на 3 пин (цифровом) void setup() { Serial.begin(9600); // Объявляем работу com порта со скоростью 9600 pinMode (LED, OUTPUT); pinMode(presPin, INPUT); pinMode(movPin, INPUT); pinMode(micPin, INPUT); pinMode(vibrPin, INPUT); } void loop() { int presence = digitalRead(presPin); // блок датчика присутствия (микроволновый) int movement = digitalRead(movPin); // блок датчика движения (инфракрасный) int vibration = digitalRead(vibrPin); // блок датчика вибрации int mv = analogRead(micPin) * 5.0 / 1024.0 * 1000.0; // блок датчика шума if((presence == HIGH) && (mv < 4000)) { Serial.print( mv ); Serial.print( presence ); digitalWrite(LED, HIGH); digitalWrite(LED, HIGH); delay(5000); digitalWrite(LED, LOW); delay(40000); } else { digitalWrite(LED,LOW); } }
Есть 3 датчика (присутствия, звука и вибрации), но датчик вибрации подключать не стал (бесполезно).
Подпаял к мобильному телефону контакты на кнопку быстрого вызова и через транзистор замыкаю контакты. Всё вроди работает как и хотелось, но вот беда - каждые 4 часа и 4 минуты происходит ложное срабатывание.
По-началу думал какие-то наводки (до того, как определил цикличность ложных срабатываний), установил резистор на 330 Ом между пином и базой транзистора - ничего не поменялось.
Помогите пожалуйста разобраться в чём проблема - надоело уже среди ночи подрываться по ложным звонкам.
Я бы посоветовал прицепить SD карту и писать лог состояния входов, что бы потом понять по какому входу срабатывает ваша сигналка.
Я бы посоветовал прицепить SD карту и писать лог состояния входов, что бы потом понять по какому входу срабатывает ваша сигналка.
По обоим - фунукционально срабатывание сигнализации происходит только при срабатывании обоих датчиков (защита от ложного срабатывания).
Время мне тоже известно - 4 часа и 4 минуты между срабатываниями.
Ну вот и отлично - дело осталось за малым разобраться почему же они срабатывают.
Ну вот и отлично - дело осталось за малым разобраться почему же они срабатывают.
Врядли это вообще срабатывают датчики - очень уж одинаковы промежутки времени между ложными срабатываниями.
А может быть проблема с неподходящими форматами для переменных?
Нет у вас никаких переменных, которые могли бы переполнится. Я бы провел сперва два эксперимента: работа чисто на батарейном питании, а если проблема останется, то дать поработать на другом удаленном объекте. Потом уже делать какие то выводы.
Нет у вас никаких переменных, которые могли бы переполнится. Я бы провел сперва два эксперимента: работа чисто на батарейном питании, а если проблема останется, то дать поработать на другом удаленном объекте. Потом уже делать какие то выводы.
Спасибо, буду пробовать.
В setup не задано начальное состояние на портах, нет подтяжки (в коде), что там реально можно только гадать.
а еще в 21 строке вы объявляете переменну int, действия производите как с float, указывая десятичные, как мк это общитывает, учитывая ограничения float, я не готов ответить
Спасибо, сам только что заметил (после Вашей подскажки).
Более правильно использовать переменную float для датчика звка или лучше убрать дробные значения в коде?
Датчик посылает значения напряжения с точностью до тысячных, но вроди достаточно просто указать границу срабатывания (В).
Более правильно использовать переменную float для датчика звка или лучше убрать дробные значения в коде?
Функция analogRead() возвращает только целочисленное значение от 0 до 1023.