“Интерфейс” для дистанционного автозапуска автомобиля по GSM.

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

 Голосовой модуль (интерфейс) является дополнением для авто сигнализаций с функцией авто запуска прогрева двигателя. Для тех сигнализаций в которых есть дополнительный вход для запуска двигателя (который необходимо замкнуть на массу на 1 сек). В тех условиях, когда не достаточно мощности брелка для связи запустить двигатель. Интерфейс работает в сетях GSM, надежность связи блока зависит от покрытия связью провайдером связи. Для того что бы интерфейс мог Вам перезванивать, необходимо на чистой SIM карте записать номер телефона дозвона под именем 1. Пин код должен быть отключен. Принцип работы заключается в следующем.

  Когда пользователь звонит, на номер СИМ карты установленной в интерфейсе. Происходит авто ответ и в динамике звучат ( смотреть скетч);

    "короткие гудки"- Voice 13, создавая имитацию сброса линии, на тот случай если на номер позвонит другой.

  или

   "привет жду команды"- Voice 1

 или

   "записи сообщения нажмите один"- Voice 19, шутка если на номер позвонит другой, нажимает 1 происходит сброс

   или

  просто двух тональный гудок- Voice 22

кому что нравится выбирается перед программированием Arduino.

  После прекращения звуков или сообщений, в динамике наступает тишина.

После этого можно подавать команды;

  1. 45   прозвучит “контроль связи”, интерфейс отключит Вас и перезвонит на номер записанный на SIM карте.
  2.  03   прозвучит “все поняла завожу”, интерфейс подаст команду на вход авто сигнализации на авто запуск двигателя
  3.  30  прозвучит “стоп”, интерфейс подаст команду на вход авто сигнализации стоп двигателя, если авто было в режиме прогрева, через интерфейс.
  4.  56  прозвучит “ отключен контроль дверей ”, отключит авто дозвон при открытии двери авто
  5.  65  прозвучит “ включен контроль дверей ”, включит авто дозвон при открытии двери авто
  6.  89  прозвучит “ двигатель блокирован ”, заблокирует двигатель (блокировка реле бензонасоса), будет включен периодический сигнал клаксона и моргание  дальним светом фар.
  7.  98  прозвучит “ продолжайте движение ”, разблокирует двигатель (разблокирует реле бензонасоса), отключит периодический сигнал клаксона и моргание  дальним светом фар.
  8. 22  прозвучит “ привет жду каманды ” ( ничего не делает)
  9. 1    интерфейс прервет Ваше соединение.                                    Можно в скетче задать любую комбинацию набора и любое количество цифр.

 В скетче интерфейса присутствуют функции контроля;

  1. При срабатывании колокола авто сигнализации, интерфейс перезвонит вам и сообщит “сработала сигнализация авто”. Можно не отвечать на звонок, сбросить.
  2. Если авто ставилось на охрану сигнализацией и колокол хоть один раз “пикнул”, то при открытии двери интерфейс перезвонит вам и сообщит “открыта дверь авто”. Полезна тем что, если сняли авто с охраны сканером она Вам перезвонит. Можно не отвечать на звонок, сбросить. Что бы интерфейс не звонил, при открытии двери, необходимо подать команду 56 или ставить на охрану беззвучно. Не забудьте потом включить контроль открытия дверей командой 65.
  3. Если авто уже работает (включено зажигание), то интерфейс при входящем звонке сообщит “двигатель уже запущен”.
  4. Если при подаче команды 03, не было голосового сообщения “двигатель запущен” а было сообщение “повторный запуск”, следовательно авто сигнализация не запустила двигатель.
  5. Если после команды 03 перезвонить на интерфейс и авто сигнализация запустила двигатель, то будет сообщение “уже прогреваюсь”.

Назначение контактов в схеме и на печатной плате;

  1. Light  на под рулевой переключатель дальнего света (моргание дальним светом)
  2. Light Com  в зависимости от какого сигнала срабатывает дальний свет на под рулевом переключателе. На плюс + или на массу (зависит от конструкции авто)
  3. Klaxon   на рулевую кнопку клаксона
  4. Klaxon Com   в зависимости от какого сигнала срабатывает клаксон, на плюс + или на массу.
  5. 12 V   питание 12 вольт
  6. GND  масса
  7. Door –   на концевик кнопки двери если срабатывание на массу
  8. Alarm   на колокол авто сигнализации
  9. Door +   на концевик кнопки двери если срабатывание по плюсу +
  10. GND
  11. Fuel    на разрыв обмотки реле бензонасоса
  12. Fuel    на разрыв обмотки реле бензонасоса
  13. Park   на концевик ручного тормоза или парктроник
  14. Stop    на концевик кнопки ножного тормоза
  15. Ignit   на провод замка зажигания (IGN1 авто)
  16. Start  на провод внешнего запуска авто сигнализации

 

В Sim модуль перед установкой в плату, необходимо записать звуковые сообщения в формате AMR, программой Sim800 Series ArmFile Download v1.00.

А так же подать команды через терминал AT+IPR=9600;ATE1;AT+DDET=1;AT+CMGF=1;AT+CSCS="gsm";AT+CNMI=2,1,0,0,0;AT+VTD=1;AT+CMEE=1;AT+COLP=1;AT&W

 Я отказался от фиксированного номера в скетче, несмотря на то что можно прописать любое количество разрешенных входящих номеров. За много лет эксплуатации аналогичного блока но на логических элементах, не было проблем если кто-то чужой дозвонится на номер (http://www.rlocman.ru/shem/schematics.html?di=66614  ).

  Отказался от SMS, бывает зависают на сервере не определенное время. Не рассматривал протокол MQTT, зависают сервисы. У каждого свой взгляд.

  У владельцев авто сигнализации в которых нет дополнительного провода на внешний запуск авто. Придется в авто положить запасной пульт, запараллелить кнопки реле, а так же немного дописать скетч. Так как есть сигнализации, у которых на пульте необходимо нажимать две кнопки по очереди или кнопку нажать два раза. Вариантов много.

  Ссылка на файлы; https://yadi.sk/d/jUXfl-v610LJIQ

  Может куда еще перенести файлы, на сервер arduino.ru, не вижу где это сделать.

Идея была взята https://github.com/martinhol221/SIM800L_DTMF_control

Большое СПАСИБО MaksVV, b707  и другим кто помог советами в других темах

 

//  1 КОМАНДА НА ЗАПУСК, 1 КОМАНДА НА СТОП, ПО ОДНОМУ ПРОВОДУ

// "45" обратный звонок
// "03"  старт
// "30"  стоп
// "56"  отключение контроля дверей
// "65"  включение контроля дверей
// "89"  блокировка двигателя
// "98"  снятие блокировки двигателя
// "22"  Voice(1)
// "1"   Voice(20),память переполнена, сброс звонка

#include <SoftwareSerial.h>
SoftwareSerial SIM800(7, 6);       // для новых плат начиная с версии RX,TX

#define ON             9             // вывод для отработки иммитации команды на запуска arduino
#define STARTER        12            // на пуск/стоп автозапуска сигналки
#define Block          10            // на реле блокировки двигателя
#define Klaxon         8             // на реле дальнего света и клаксона 
#define BAT_Pin        A0            // на батарею, через делитель напряжения 39кОм / 20 кОм
#define Parking        A1            // на датчик паркинга или нейтрали, (Parking) == HIGH на паркинге
#define StopPin        A2            // на концевик педали тормоза для отключения (на нейтрали запрещение) режима прогрева
#define Ignition       A3            // на провод от замка зажигания, анализ заведенного мотора
#define StopHead       4             // через диод с D4 на A2, для сброса прогрева ардуино, при долгом отсутствии Ignition (зажигание)
#define ObrabotkaCall  11            // вывод для отработки обратного звонка
#define Alarm          2             // вход для звонка при срабатывания сигналки
#define Door           3             // вход для звонка при срабатывании дверей
#define ObrabotkaDveri A4            // выход для обработки открытой двери
#define ZapretDoor     A5            // выход для обработки, отключения контроля открытия двери
//#define              5             // зарезервирован для сброса SIM модуля или вкл/откл
//#define              A6
//#define              A7
//#define TX           6
//#define RX           7
/*  ----------------------------------------- ИНДИВИДУАЛЬНЫЕ НАСТРОЙКИ !!!---------------------------------------------------------   */
String pin = "";                   // строковая переменная набираемого пинкода
float Vbat, VbatStart, V_min ;     // переменная хранящая напряжение бортовой сети
float m = 69.50;                   // делитель для перевода АЦП в вольты для резистров 39/20kOm, подбор напряжения индикации АЦП.
unsigned long Time1, StarterTimeON = 0;
unsigned long StopHeadBut = 0;               // Задаем переменную, для внутреннего сброса счетчика arduino
unsigned long previousMillis = 0;           // Зададим начальное значение для счетчика millis
unsigned long Time2 = 4000;                // Время для сброса на StopPin через диод с D2 на A2, 40 сек
unsigned long interval = 500;      // интервал мигания (срабатывания клаксона/света) в миллисекундах
int value = LOW;                   // предыдущее состояние светодиода (срабатывания клаксона/света)
int StopHeadPin = LOW;             // устанавливаем начальное состояние StopHead (сброс прогрева)
int Timer1 = 0;                     // таймер времени прогрева двигателя по умолчанию = 0
bool heating = false;              // переменная состояния режим прогрева двигателя
bool ring = false;                 // флаг момента снятия трубки

unsigned long PsoTime3 = 0;                // для таймера в цикле отработки обратного звонка
bool timer3 = 0;                           // флаг включен ли таймер, 0 - выключен, 1 - включен
uint16_t TimePush3 = 1000;                 // Время срабатывания вывод для отработки обратного звонка
bool call_is_made3 = false;                // флаг "звонок выполнен" (в цикле отработки обратного звонка)

unsigned long PsoTime4 = 0;                // для таймера в цикле срабатывания сигналки
bool timer4 = 0;                           // флаг включен ли таймер, 0 - выключен, 1 - включен
uint16_t TimePush4 = 2000;                 // Время срабатывания сигналки
bool call_is_made4 = false;                // флаг "звонок выполнен" (в цикле срабатывания сигналки)

unsigned long PsoTime5 = 0;                // для таймера в цикле срабатывания двери
bool timer5 = 0;                           // флаг включен ли таймер, 0 - выключен, 1 - включен
uint16_t TimePush5 = 500;                  // Время срабатывания двери
bool call_is_made5 = false;                // флаг "выполнения" (в цикле срабатывания двери)

unsigned long PsoTime6 = 0;                // для таймера в цикле включения опции обработки для срабатывания двери
bool timer6 = 0;                           // флаг включен ли таймер, 0 - выключен, 1 - включен
uint16_t TimePush6 = 100;                  // Время включения опции обработки для срабатывания двери
bool call_is_made6 = false;                // флаг "выполнения" (в цикле включения опции обработки для срабатывания двери)




void(* resetFunc) (void) = 0;

void setup() {
  pinMode(ON,      OUTPUT);
  pinMode(STARTER, OUTPUT);
  pinMode(Block,   OUTPUT);
  pinMode(Klaxon,   OUTPUT);
  pinMode(Parking, INPUT);
  pinMode(StopPin, INPUT);
  pinMode(Ignition, INPUT);
  pinMode(StopHead, OUTPUT);
  pinMode(ObrabotkaCall, OUTPUT);
  pinMode(Alarm, INPUT_PULLUP);   // указываем пин на вход для с внутричипной подтяжкой к +V, для звонка при срабатывания сигналки
  pinMode(Door, INPUT_PULLUP);   // указываем пин на вход для с внутричипной подтяжкой к +V, для звонка при срабатывании двери
  pinMode(ObrabotkaDveri, OUTPUT);
  pinMode(ZapretDoor, OUTPUT);

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

  SIM800_reset();
  detachInterrupt(0);                                    // отключаем обработку внешнего прерывания
  detachInterrupt(1);                                    // отключаем обработку внешнего прерывания
}

/*  --------------------------------------------------- Перезагрузка МОДЕМА SIM800L ------------------------------------------------ */
void SIM800_reset() {
  delay(10000); SIM800.println("AT+CMGDA=\"DEL ALL\"");  // Удаляем все СМС чекрез 10 сек, после старта SIM модуля
}


void loop() {

  if (SIM800.available())  resp_modem();                            // если что-то пришло от SIM800 в Ардуино отправляем для разбора
  if (Serial.available())  resp_serial();                           // если что-то пришло от Ардуино отправляем в SIM800
  if (millis() > Time1 + 10000) Time1 = millis(), detection();      // выполняем функцию detection () каждые 10 сек
  if (heating == true && digitalRead(StopPin) == 1)  heatingstop(1); // если нажали на педаль тормоза в режиме прогрева

  //---------моргаем реле дальнего света и клаксона-------------
  if (digitalRead(Block) == HIGH)  {
    if (millis() - previousMillis > interval) {
      previousMillis = millis();   // запоминаем текущее время // если светодиод был выключен – включаем и наоборот
      if (value == LOW)
        value = HIGH;
      else
        value = LOW;
      digitalWrite(Klaxon, value);
    }
  }
  if (digitalRead(Block) == LOW) digitalWrite(Klaxon, LOW);

  //если (Ignition, зажигание) переключился с 1 на 0 (по какой то причине отключилось зажигание авто)
  // и (ON) == HIGH (или heating == true, есть прогрев в arduino). на время больше 40 сек. то нужен сброс прогрева в arduino
  //нужно сбросить ( "уже прогреваюсь" Voice(5)
  //блок добавлен для сброса прогрева ардуино через диод с D2 (StopHead) на A2 (StopPin)--------
  if (digitalRead(Ignition) == LOW && digitalRead(ON) == HIGH)  // если отключилось зажигание авто
  {
    if (millis() - previousMillis  >=  10)       // начинаем считать время, =10 используется как множитель для Time2
    {
      previousMillis = millis();
      StopHeadBut++;                             // с каждой миллисекундой увеличиваем значение StopHeadBut
    }
  }
  else                                   // если Ignition (зажигание) включилось, то StopHeadBut становится равным 0
  {
    StopHeadBut = 0;                    // это необходимо для защиты от срабатывания при частых многократных переключениях
  }
  if (StopHeadBut >= Time2)                              // как только значение StopHeadPin становится равным Time2
  { digitalWrite(StopHead, StopHeadPin = ! StopHeadPin);  // то инвертируем состояние StopHead (сброс на A2 через диод от D2)
    StopHeadBut = 0;                                     //  и устанавливаем StopHeadBut = 0
  }

  //----------------обработка обратного звонка ------------------
  if (!timer3 && digitalRead(ObrabotkaCall) == HIGH) {
    timer3 = 1;  // если таймер выключен и ObrabotkaCall == HIGH запускаем таймер
    PsoTime3 = millis();
  }
  if (digitalRead(ObrabotkaCall) == LOW) {
    timer3 = 0;  // если ObrabotkaCall == LOW выключаем таймер, сбрасываем флаг "звонок выполнен"
    call_is_made3 = 0;
  }
  if (timer3 && millis() - PsoTime3 > TimePush3)                  // если таймер был включен и кончился,
  {
    timer3 = 0;                                                  // выключаем таймер и
    if (call_is_made3 == 0) call1();                             // если флаг "звонок выполнен" в фальсе то звоним хозяину
  }

  //----------------обработка на срабатывание открытых дверей-----------------
  //----------------что бы звонок проходил только, после постановки/снятия с охраны-----------------

  if (!timer6 && digitalRead(Alarm) == LOW && digitalRead(ZapretDoor) == LOW) {
    timer6 = 1;  // если таймер выключен и пикнул колокол запускаем таймер
    PsoTime6 = millis();
  }
  if (digitalRead(Alarm) == HIGH) {
    timer6 = 0;                // если колокол молчит выключаем таймер, сбрасываем флаг
    call_is_made6 = 0;
  }
  if (timer6 && millis() - PsoTime6 > TimePush6)                  // если таймер был включен и кончился,
  {
    timer6 = 0;                                                  // выключаем таймер и
    if (call_is_made6 == 0)  digitalWrite(ObrabotkaDveri, HIGH); // если флаг выполнен в фальсе то включаем ObrabotkaDveri
  }

  //----------------срабатывание сигналки-----------------
  if (!timer4 && digitalRead(Alarm) == LOW) {
    timer4 = 1;  // если таймер выключен и работает колокол запускаем таймер
    PsoTime4 = millis();
  }
  if (digitalRead(Alarm) == HIGH) {
    timer4 = 0;  // если колокол молчит выключаем таймер, сбрасываем флаг "звонок выполнен"
    call_is_made4 = 0;
  }
  if (timer4 && millis() - PsoTime4 > TimePush4)                  // если таймер был включен и кончился,
  {
    timer4 = 0;                                                  // выключаем таймер и
    if (call_is_made4 == 0) call2();                             // если флаг "звонок выполнен" в фальсе то звоним хозяину
  }

  //----------------срабатывание дверей-----------------
  if (!timer5 && digitalRead(Door) == LOW && digitalRead(ObrabotkaDveri) == HIGH) {
    timer5 = 1;  // если таймер выключен и открыты двери запускаем таймер
    PsoTime5 = millis();
  }
  if (digitalRead(Door) == HIGH && digitalRead(ObrabotkaDveri) == HIGH) {
    timer5 = 0;  // если дверь закрыли выключаем таймер, сбрасываем флаг
    call_is_made5 = 0;
  }
  if (timer5 && millis() - PsoTime5 > TimePush5)                  // если таймер был включен и кончился,
  {
    timer5 = 0;                                                  // выключаем таймер и
    if (call_is_made5 == 0) call3();                             // если флаг "звонок выполнен" в фальсе то звоним хозяину
  }
}

//----------------обратный звонок------------------
void call1() {
  delay(100);
  SIM800.println("AT+CPBR=1"); // считывает запись с индексом 1 телефонной книги 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(":")) break;      // если :, то выходим из цикла while
    delay(100);
  }
  delay(1000);
  SIM800.print("AT+CREC=4,\"C:\\User\\"), SIM800.println("11.amr\",0,95");    //голосовое сообщение "контроль связи"
  delay(4000);
  SIM800.println("ATH0");
  call_is_made3 = 1;                // флаг "звонок выполнен" в труе
  digitalWrite(ObrabotkaCall, LOW);
}



//----------------звонок при срабатывании сигналки------------------
void call2() {
  delay(100);
  SIM800.println("AT+CPBR=1"); // считывает запись с индексом 1 телефонной книги 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(":")) break;      // если :, то выходим из цикла 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_made4 = 1;                // флаг "звонок выполнен" в труе
}

//----------------звонок при срабатывании двери------------------
void call3() {
  delay(100);
  SIM800.println("AT+CPBR=1"); // считывает запись с индексом 1 телефонной книги 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(":")) break;      // если :, то выходим из цикла while
    delay(100);
  }
  delay(1000);
  SIM800.print("AT+CREC=4,\"C:\\User\\"), SIM800.println("15.amr\",0,95");    //голосовое сообщение "открыта дверь авто"
  delay(4000);
  SIM800.println("ATH0");
  call_is_made5 = 1;                // флаг "звонок выполнен" в труе
  if (digitalRead(Alarm) == HIGH) digitalWrite(ObrabotkaDveri, LOW); //сброс ObrabotkaDveri, до следующего импульса с сигналки
}

void detection() {                                                // условия проверяемые каждые 10 сек
  if (digitalRead(StopHead == HIGH)) {           // перевод выхода StopHead в LOW
    delay(50), digitalWrite(StopHead, LOW);
  }

  Vbat = VoltRead();                                            // замеряем напряжение на батарее
  Serial.println("");   // ОТКЛЮЧИТЬ ПОСЛЕ НАСТРОЙКИ АЦП
  //  if (heating == true && Vbat < 11.0 )   heatingstop(1);  // остановка прогрева если напряжение просело ниже 11 вольт
}

// ---------------- ТРАНСЛИРУЕМ КОМАНДЫ из ПОРТА В МОДЕМ ----------------------------------
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 = "";           // набиваем в переменную at
  int k = 0;
  while (SIM800.available()) k = SIM800.read(), at += char(k), delay(1);
  Serial.println(at);

  if (at.indexOf("RING")  > -1) {      // входящий звонок
    delay(200), SIM800.println("ATA"), ring = true;
  } else if (at.indexOf("+DTMF: ")  > -1)        {
    String key = at.substring(at.indexOf("") + 9, at.indexOf("") + 10);
    pin = pin + key;
    if (pin.indexOf("*") > -1 ) pin = "";

  } else if (at.indexOf("NO CARRIER") > -1 ) {
    SIM800.println("AT+CLIP=1;+DDET=1"); // Активируем АОН и декодер DTMF
  }
  at = "";            // Возвращаем ответ можема в монитор порта , очищаем переменную

  if (pin.indexOf("45") > -1 ) {
    pin = "", Voice(11), delay (3000), SIM800.println("ATH0"), delay (100), digitalWrite(ObrabotkaCall, HIGH);   //обратный звонок
  } else if (pin.indexOf("1") > -1 ) {
    pin = "", Voice(20), delay (3000), SIM800.println("ATH0"); // сброс при нажатии на 1
  } else if (pin.indexOf("89") > -1 ) {
    pin = "", Voice(8), digitalWrite(Block, HIGH), delay (3000), heatingstop(1), SIM800.println("ATH0"); // блокировка двигателя
  } else if (pin.indexOf("98") > -1 ) {
    pin = "", Voice(9), digitalWrite(Block, LOW), delay (3000), SIM800.println("ATH0"); //снятие сблокировки двигателя
  }
  else if (pin.indexOf("03") > -1 ) {           // пуск запуска на сигналку
    pin = "";
    if (digitalRead(ON) == HIGH)           //необходима что бы командой "старт" не остановить двигатель, при прогреве от arduino
    {
      false;
    }
    else if (digitalRead(Ignition) == HIGH)     //необходима что бы командой "старт"  не подать команду
    { // сигналке на запуск, при включенном зажигании
      false;
    }
    else if (digitalRead(StopPin) == HIGH)     //если нажат тормоз
    {
      Voice(16);
    }
    else {
      (digitalRead(ON) == LOW && digitalRead(Ignition) == LOW && digitalRead(StopPin) == LOW);
      {
        Voice(7), enginestart(3); // запуск на сигналку  // "все поняла завожу"
      }
    }
  }
  else if (pin.indexOf("30") > -1 ) {
    pin = "";  // стоп запуска на сигналку
    if (digitalRead(ON) == LOW)  //необходима что бы командой "стоп" не запустить дистанционно двигатель
    {
      false;
    }
    else if (digitalRead(Ignition) == HIGH && digitalRead(Parking) == LOW)     //необходима что бы командой "стоп" при включенном зажигании
    { // и включенной скорости не подавать команду на старт запуска
      false;
    }
    else {
      (digitalRead(ON) == HIGH);
      {
        Voice(6), digitalWrite(STARTER, HIGH), delay(2000), digitalWrite(STARTER, LOW), heatingstop(1); // (стоп прогрева)
      }
    }
    SIM800.println("ATH0");
  }
  else if (pin.indexOf("56") > -1 ) {
    pin = "", Voice(17), digitalWrite(ZapretDoor, HIGH), delay (3000), SIM800.println("ATH0"); // "отключено! срабатывание! двери!"
  }
  else if (pin.indexOf("65") > -1 ) {
    pin = "", Voice(18), digitalWrite(ZapretDoor, LOW), delay (3000), SIM800.println("ATH0"); // "включено! срабатывание! двери!"
  }
  else if (pin.indexOf("22") > -1 ) {
    pin = "", Voice(1); // "привет жду команды"
  }

  //------голосовые сообщения при входящем звонке-----------
  if (ring == true) {
    ring = false, delay (2000), pin = ""; // обнуляем пин

    if (digitalRead(Alarm) == LOW && digitalRead(Block) == LOW) {    //сработала сигнализация на авто
      Voice(14);    // "нарушение охраны"
    }
    else if (digitalRead(Block) == HIGH) {    //авто находится в режиме блокирови Voice(8)
      Voice(8);    // "двигатель блокирован"
    }
    else if (digitalRead(ON) == LOW && digitalRead(Ignition) == HIGH && digitalRead(Block) == LOW) {  //включено зажигание авто и нет прогрева от arduino
      Voice(10);                          //   Voice(10) "двигатель уже запущен"
    }
    else if (Vbat < 10.5) {                   // "низкое напряжение"
      Voice(12);
    }
    /*   else if (digitalRead(StopPin) == HIGH) {
         Voice(16);                 // "нажат тормоз!"
       }  */
    else if (digitalRead(ON) == LOW && digitalRead(Ignition) == LOW && digitalRead(Parking) == LOW && digitalRead(Block) == LOW) {
      Voice(22);       //при входящем звонке, "короткие гудки" 13, "привет жду команды" 1, для записи сообщения нажамите один 19, тональный гудок 22
    }  else {
      Voice(5);          // "уже прогреваюсь"
    }
  }
}

void enginestart(int Attempts ) {                                      // программа запуска двигателя
  //  ----------------------------------------- ПРЕДНАСТРОЙКА ПЕРЕД ЗАПУСКОМ ---------------------------------------------------------
  //Serial.println("Предпусковая настройка");
  //  detachInterrupt(1);                                    // отключаем аппаратное прерывание, что бы не мешало запуску
  VbatStart = VoltRead();

  // ограничиваем время сигнала запуска на сигналку от 1 до 1 сек
  int  StTime  = constrain(StTime, 1000, 1000);
  //  V_min = 14;                                            // переменная хранящая минимальные напряжения в момент старта

  // если напряжение АКБ больше 10 вольт, зажигание выключено
  while (Vbat > 10.00 && digitalRead(ON) == LOW) {

    digitalWrite(ON,  HIGH);           // включаем виртуальное зажигание на D9
    delay (100);

    if (digitalRead(StopPin) == LOW) {         //  тормоз не нажат (или в нейтрали на минус)
      StarterTimeON = millis();
      digitalWrite(STARTER, HIGH);  // на пуск автозапуска сигналки
    }
    else {
      //      Voice(16);                 // "нажат тормоз! -- здесь не работает
      heatingstop(1);
      break;
    }
    delay (100);
    while (millis() < (StarterTimeON + StTime) && digitalRead(Ignition) == LOW)   VoltRead(), delay (50);
    digitalWrite(STARTER, LOW);
    delay (4000);        // пуск автозапуска сигналки включил, ожидаем 4 сек.

    if (digitalRead(Ignition)  == HIGH && digitalRead(Parking) == HIGH) {    // включилось зажигание от сигналки и на паркинге
      Voice(2);      // "двигатель запущен"
      heating = true;
      break;
    }                   // считаем старт успешным, выходим из цикла запуска двигателя

    if (digitalRead(Ignition)  == HIGH && digitalRead(Parking) == LOW) {               // включилось зажигание от сигналки не паркинге
      Voice(4);      // "я на передаче"
      heating = false;
      break;
    }                   // отказ если на передаче

    Voice(3), heatingstop(1), SIM800.println("ATH0");  // "повторный запуск" если авто не запустилось

    // переход но 0 адрес если нет запуска, нет + от замка зажигания(Ignition) 4 сек, перезваниваем пробуем еще раз
    void(* resetFunc) (void) = 0;
    resetFunc();
  }

  if (heating == false) {
    Timer1 = 0, Voice(6);     // стоп прогрева
  }
  delay(3000), SIM800.println("ATH0");                            // вешаем трубку (для SIM800L)
}

float VoltRead()    {                           // замеряем напряжение на батарее и переводим значения в вольты
  float ADCC = analogRead(BAT_Pin);
  ADCC = ADCC / m ;
  Serial.print(ADCC);                // ОТКЛЮЧИТЬ ПОСЛЕ НАСТРОЙКИ АЦП
  if (ADCC < V_min) V_min = ADCC;               // переводим данные ацп в вольты
  return (ADCC);
}

void heatingstop(bool reset_timer1) {                                 // программа остановки прогрева двигателя
  digitalWrite(ON, LOW), delay (100);
  heating = false, delay(2000);
  if (reset_timer1 == true) Timer1 = 0;
}

void Voice(int Track) {
  SIM800.print("AT+CREC=4,\"C:\\User\\"), SIM800.print(Track), SIM800.println(".amr\",0,95");
}

[/code]

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

замечания принимаются? 7805 там не к чему (ест много).  Ардуино можно спокойно от 4В запитывать, которые для СИМ800 приготовлены. 

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

Спасибо! Замечания приветствуются. Надо попробовать запитать Ардуино не от 7805 а параллельно с СИМ800.

MaksVV
Offline
Зарегистрирован: 06.08.2015

также гораздо лучше использовать dc dc MP1584 такой: 

 

вместо mini 360  (фото ниже): 

Последний намного более прожорливый. На хол.ходу ест уже 15мА. Первый же DC DC (MP1584) на ХХ вообще ничего не потребляет. Стоят одинаково. 

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

В авто 15мА это не есть вообще ничего, в сравнении с потреблением СИМ800. Только mini 360 (MP23070) некоторые экземпляры греются или это их особенность. Раньше не работал с ними. Но на будущее учту, заказывал их 10 шт, пока закончатся...

MaksVV
Offline
Зарегистрирован: 06.08.2015

ну там 15 там 30. Глядишь и 50 наберётся, а это уже грань. Все что более 50 - плохо. Я просто к тому что MP1584 стоит столько же, поэтому брать лучше его. И сим800 кстати в режиме ожидания (а в нём он и находится большинство своего времени) вообще почти ничего не ест (4..5мА).  А если его в сон загнать дак и того меньше: 1мА. 

а mini 360 (MP23070)  можно в каких либо домашних не батарейных проектах использовать, или когда от зажигания только работают.