Помогите устранить ложное срабатывание в коде сигнализации.

iven83
Offline
Зарегистрирован: 02.02.2017

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

Помогите пожалуйста разобраться в чём проблема - надоело уже среди ночи подрываться по ложным звонкам. 

JasKo
Offline
Зарегистрирован: 21.11.2015

Я бы посоветовал прицепить SD карту и писать лог состояния входов, что бы потом понять по какому входу срабатывает ваша сигналка.

iven83
Offline
Зарегистрирован: 02.02.2017

JasKo пишет:

Я бы посоветовал прицепить SD карту и писать лог состояния входов, что бы потом понять по какому входу срабатывает ваша сигналка.

По обоим - фунукционально срабатывание сигнализации происходит только при срабатывании обоих датчиков (защита от ложного срабатывания). 

Время мне тоже известно - 4 часа и 4 минуты между срабатываниями. 

JasKo
Offline
Зарегистрирован: 21.11.2015

Ну вот и отлично - дело осталось за малым разобраться почему же они срабатывают.

iven83
Offline
Зарегистрирован: 02.02.2017

JasKo пишет:

Ну вот и отлично - дело осталось за малым разобраться почему же они срабатывают.

Врядли это вообще срабатывают датчики - очень уж одинаковы промежутки времени между ложными срабатываниями. 

А может быть проблема с неподходящими форматами для переменных? 

bwn
Offline
Зарегистрирован: 25.08.2014

Нет у вас никаких переменных, которые могли бы переполнится. Я бы провел сперва два эксперимента: работа чисто на батарейном питании, а если проблема останется, то дать поработать на другом удаленном объекте. Потом уже делать какие то выводы.

iven83
Offline
Зарегистрирован: 02.02.2017

bwn пишет:

Нет у вас никаких переменных, которые могли бы переполнится. Я бы провел сперва два эксперимента: работа чисто на батарейном питании, а если проблема останется, то дать поработать на другом удаленном объекте. Потом уже делать какие то выводы.

Спасибо, буду пробовать. 

BoBo4kA
Offline
Зарегистрирован: 15.01.2016

В setup не задано начальное состояние на портах, нет подтяжки (в коде), что там реально можно только гадать.

а еще в 21 строке вы объявляете переменну int, действия производите как с float, указывая десятичные, как мк это общитывает, учитывая ограничения float, я не готов ответить

iven83
Offline
Зарегистрирован: 02.02.2017

Спасибо, сам только что заметил (после Вашей подскажки). 

Более правильно использовать переменную float для датчика звка или лучше убрать дробные значения в коде?

Датчик посылает значения напряжения с точностью до тысячных, но вроди достаточно просто указать границу срабатывания (В). 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

iven83 пишет:

Более правильно использовать переменную float для датчика звка или лучше убрать дробные значения в коде?

Функция analogRead() возвращает только целочисленное значение от 0 до 1023.