Звонилка к авто сигнализации

vic163-163
Offline
Зарегистрирован: 06.03.2018

Добрый день.

 Решил сделать дополнительную “приблуду”- звонилку к авто сигнализации авто.  Если сигнализация “орет” больше 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);
  }
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

создались условия для звонка - звоним и взводим флаг.

пока флаг не обнулится звонка не будет.

vic163-163
Offline
Зарегистрирован: 06.03.2018

Звонок есть я отвечаю на него. Модуль отключастся как положено, и снова и снова мне перезванивает. Как добиться того что бы только один раз позвонил и ожидал до следующего раза.

vic163-163
Offline
Зарегистрирован: 06.03.2018

Как сделать что бы  ObrabotkaIN2 переключилась в LOW в конце скетча.

И когда напряжение на IN2 стало LOW, а затем HIGH. Снова произошел звонок.

MaksVV
Offline
Зарегистрирован: 06.08.2015
#include <SoftwareSerial.h>
SoftwareSerial SIM800(7, 6);        

#define IN2           A2                 // Определяем номер вывода к которому подключёна кнопка (колокол сигналки)


unsigned long PsoTime = 0;                // для таймера 
bool timer = 0;                           // флаг включен ли таймер, 0 - выключен, 1 - включен
uint16_t TimePush = 3000;                 // Время срабатывания сигналки

bool call_is_made = false;                     // флаг "звонок выполнен"

//void(* resetFunc) (void) = 0;

void setup()
{
  pinMode(IN2, INPUT);
  

  delay(100);
  Serial.begin(9600);              //скорость порта
  SIM800.begin(9600);              //скорость связи с модемом

  SIM800_reset();

}

void SIM800_reset() {
  delay(2000); SIM800.println("AT+CMGDA=\"DEL ALL\"");  // Удаляем все СМС что бы подчистить память SIM модуля
}

void loop() {

if (!timer && digitalRead(IN2) == HIGH) {timer = 1; PsoTime = millis(); } // если таймер выключен и колокол орёт запускаем таймер
if (digitalRead(IN2) == LOW) {timer = 0; call_is_made = 0; }                   // если колокол заткнулся выключаем таймер, сбрасываем флаг "звонок выполнен"

if (timer && millis() - PsoTime > TimePush)                               // если таймер был включен и кончился, 
  {
  timer = 0;                                                              // выключаем таймер и
  if (call_is_made == 0) call();                                               // если флаг "звонок выполнен" в фальсе то звоним хозе
  }    

 
//-----------------звоним хозяину------------
  
}


void call() {     
    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");
    call_is_made = 1;                // флаг "звонок выполнен" в труе
  }

 

vic163-163
Offline
Зарегистрирован: 06.03.2018

 

ВАУ. Теперь звонит, проговаривает звуковое сообщение, отключается - до следующего цикла. Но приследующем срабатывании, звонит нет сообщения и не отключается. 

Добавил в void loop(), обмен arduino c модемом. Все отлично работает.

#include <SoftwareSerial.h>
SoftwareSerial SIM800(7, 6);

#define IN2           A2                 // Определяем номер вывода к которому подключёна кнопка (колокол сигналки)

unsigned long PsoTime = 0;                // для таймера
bool timer = 0;                           // флаг включен ли таймер, 0 - выключен, 1 - включен
uint16_t TimePush = 3000;                 // Время срабатывания сигналки

bool call_is_made = false;                     // флаг "звонок выполнен"


void setup()
{
  pinMode(IN2, INPUT);

  delay(100);
  Serial.begin(9600);              //скорость порта
  SIM800.begin(9600);              //скорость связи с модемом

  SIM800_reset();

}

void SIM800_reset() {
  delay(2000); SIM800.println("AT+CMGDA=\"DEL ALL\"");  // Удаляем все СМС что бы подчистить память SIM модуля
}

void loop() {

  if (SIM800.available())  resp_modem();          // если что-то пришло от SIM800 в Ардуино отправляем для разбора
  if (Serial.available())  resp_serial();         // если что-то пришло от Ардуино отправляем в SIM800

  if (!timer && digitalRead(IN2) == HIGH) {
    timer = 1;  // если таймер выключен и колокол орёт запускаем таймер
    PsoTime = millis();
  }
  if (digitalRead(IN2) == LOW) {
    timer = 0;  // если колокол заткнулся выключаем таймер, сбрасываем флаг "звонок выполнен"
    call_is_made = 0;
  }

  if (timer && millis() - PsoTime > TimePush)                               // если таймер был включен и кончился,
  {
    timer = 0;                                                              // выключаем таймер и
    if (call_is_made == 0) call();                                               // если флаг "звонок выполнен" в фальсе то звоним хозе
  }
}
//-----------------звоним хозяину------------
void call() {
  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");
  call_is_made = 1;                // флаг "звонок выполнен" в труе
}

void resp_serial () {
  String at = "";
  int k = 0;
  while (Serial.available()) k = Serial.read(), at += char(k), delay(1);
  SIM800.println(at), at = "";
}

void resp_modem () {
  String at = "";
  int k = 0;
  while (SIM800.available()) k = SIM800.read(), at += char(k), delay(1);
  Serial.println(at);

  at = "";
}

Всем БОЛЬШОЕ СПАСИБО. Буду дальше изучать, читать