Считать импульсы с выхода сигнализации

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Добрый день. Подскажите как организовать считывание импульсов с выхода автосигнализации на "колокол".
Как я понимаю, 1 импульс - поставить,2 им.-снять,три-забыл закрыть дверь,длинный импульс-тревога.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Использовать функцию attachInterrupt и считывать число прерываний? Но тогда при закрытии/открытии машины будет пауза перед оповещением

Penumbra
Offline
Зарегистрирован: 06.08.2017

да есть аж миль0н способов, все зависит от фантазии! например вот один из извращенных способов

1 цепляешь свой выход автосигнализации на внешнее прерывание INT0
2  настраиваем  прерывание  INT0 на срабатывание при любом изменении уровня
3 при первом изменении уровня (пришла 1 ) ствим флаг что пришла 1 flag=1 и запускаем таймер измерения длинны импульса
4 при втором изменении уровня (пришла 0 ) смотрим что  flag=1  тогда  останавливаем  таймер и проверяем длину импульса. если длина импульса  больше ну там 1 секунды то  считаем что пришел длинный импульс тревоги и выходим.
если длинна импульса меньше 500 мс (какая там дина импульса я не знаю) то  переменную impulsCount++ и  flag=0
 
5 ждем второй импульс  ( если импульс 2й не пришел выходим по таймауту)
 
6 при первом изменении уровня (пришла 1 ) ставим флаг что пришла 1 flag=1
7 при втором изменении уровня (пришла 0 ) смотрим что  flag=1  переменную impulsCount++ и  flag=0 
 
8 повторяем 5-7

 

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Соберу, померю длину, спасибо.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Мучался с измерением длины импульсов, не понял как ы итоге вывести их количество..

Вот так вроде всё правильно работает:

https://youtu.be/Lx2f9U1gjYI

int flag,zn=0;


void setup() {
Serial.begin(9600);
Serial.println("Start");
attachInterrupt(0, read, CHANGE);
pinMode(2, INPUT);  
}
  
void loop(){
if (zn==1){
delay(1500);//Пауза перед проверкой числа импульсов(подбирается путём теста)
switch (flag) {
case 2:Serial.println("Zakruto");break;//Один импульс - поставил на сигнализацию
case 4:Serial.println("Otrruto");break;//Два импульса - снял с сигнализации
case 6:Serial.println("Vnimanie");break;//Три импульса - внимание (не закрыта одна из дверей)
default:
 if (digitalRead(2)==1){
  Serial.println("Trevoga");//Тревога (т.е. значение поменялось только с 0 на 1)
 }else{
 Serial.println("Stop trevoga");//Выключил тревогу (т.е. значение поменялось только с 1 на 0)
  }
}
zn=0;
flag=0;
}
}

void read(){
sei();
if (flag==0){
zn=1;
}
flag++;
}
renoshnik
Offline
Зарегистрирован: 11.04.2013
Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

renoshnik спасибо.

Я забыл про "предупреждения", когда есть небольшие удары по машине и т п