Звонилка к авто сигнализации
- Войдите на сайт для отправки комментариев
Добрый день.
Решил сделать дополнительную “приблуду”- звонилку к авто сигнализации авто. Если сигнализация “орет” больше 5 секунд, то позвонить на номер записанный на симке, воспроизвести аудио файл записанный в памяти SIM800 (например, “нарушение охраны”). И отключиться до следующего срабатывания сигналки появлении на входе +.
В моем скетче система отзванивается, воспроизводит сообщение, отключается… Но снова перезванивает, так как на входе присутствует приходящее напряжение ( не происходит сброса ObrabotkaIN2, и так дальше и дальше.
Если можете, подскажите, пожалуйста или где прочесть. Как сделать, что бы был только один звонок до следующего цикла, появления на входе напряжения.
Уже есть “дикое желание” добавить на входе 555 таймер, но зачем тогда возможности процессора.
В программировании очень слаб, занимаюсь совсем недавно.
Спасибо
#include <SoftwareSerial.h> SoftwareSerial SIM800(7, 6); #define IN2 A2 // Определяем номер вывода к которому подключёна кнопка (колокол сигналки) #define ObrabotkaIN2 8 // Вывод для обработки int valBut = 0; // Задаем переменную, для счетчика unsigned long PsoTime = 0; // Зададим начальное значение для счетчика millis unsigned long TimePush = 3000; // Время срабатывания сигналки int ObrabotkaIN2Pin = LOW; // устанавливаем начальное состояние вывода обработки void(* resetFunc) (void) = 0; void setup() { pinMode(IN2, INPUT); pinMode(ObrabotkaIN2, OUTPUT); delay(100); Serial.begin(9600); //скорость порта SIM800.begin(9600); //скорость связи с модемом SIM800_reset(); } void SIM800_reset() { delay(2000); SIM800.println("AT+CMGDA=\"DEL ALL\""); // Удаляем все СМС что бы подчистить память SIM модуля } void loop() { //---------срабатывание IN2 и обработка ObrabotkaIN2------------------ if (digitalRead(IN2) == LOW) digitalWrite(ObrabotkaIN2, LOW); else if (digitalRead(IN2) == HIGH) // если кнопка нажата { if (millis() - PsoTime >= 1) // начинаем считать время нажатия используется как множитель для TimePush { PsoTime = millis(); // valBut++; // с каждой миллисекундой увеличиваем значение valBut } } else // если кнопку отпустили, то valBut становится равным 0 { valBut = 0; // многократных нажатиях } if (valBut >= TimePush) // как толькозначение valBut становится равным TimtPush { digitalWrite(ObrabotkaIN2, ObrabotkaIN2Pin = ! ObrabotkaIN2Pin); // то инвертируем состояние ObrabotkaIN2 } //-----------------звоним хозяину------------ if (digitalRead(ObrabotkaIN2) == HIGH) { delay(100); SIM800.println("AT+CPBS=\"SM\"\r"); // открывает доступ к данным телефонной книги SIM-карты delay(200); SIM800.println("ATD>1"); // позвонить на 1 номер телефонной книги SIM-карты, читает номер с sim карты но не набирает, поэтому-> delay(200); SIM800.println("ATDL"); // позвонить на последний номер delay(100); if (SIM800.find("OK")); while (1) { // ожидание ответа вызова SIM800.println("AT+CPAS"); // при каждой итерации опрашиваем модуль if (SIM800.find("4")) break; // если 4, то выходим из цикла while delay(100); } delay(1000); SIM800.print("AT+CREC=4,\"C:\\User\\"), SIM800.println("14.amr\",0,95"); //голосовое сообщение нарушение охраны delay(4000); SIM800.println("ATH0"); digitalWrite(ObrabotkaIN2, LOW); } }
создались условия для звонка - звоним и взводим флаг.
пока флаг не обнулится звонка не будет.
Звонок есть я отвечаю на него. Модуль отключастся как положено, и снова и снова мне перезванивает. Как добиться того что бы только один раз позвонил и ожидал до следующего раза.
Как сделать что бы ObrabotkaIN2 переключилась в LOW в конце скетча.
И когда напряжение на IN2 стало LOW, а затем HIGH. Снова произошел звонок.
ВАУ. Теперь звонит, проговаривает звуковое сообщение, отключается - до следующего цикла. Но приследующем срабатывании, звонит нет сообщения и не отключается.
Добавил в void loop(), обмен arduino c модемом. Все отлично работает.
Всем БОЛЬШОЕ СПАСИБО. Буду дальше изучать, читать