Помогите устранить ложное срабатывание в коде сигнализации.
- Войдите на сайт для отправки комментариев
Здравствуйте. Подскажите пожалуцйста что с кодом не так - каждые 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.