Jump to content
    

Arduino помогите реализовать автозапуск автомобиля с функцией запрета стартера при снятом ручнике


////////////////////////////////////////////////////////////////////////
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(3, 2); // RX, TX

//Выходы
#define SIGNAL 2        //Сигнал (сирена)
#define LOCKED 3        //Замки на закрытие (выход на реле)
#define OPEN 4          //Замки на открытие (выход на реле)
#define TURN_SIGNALS 5  //Поворотники 
#define START_ENGINE 12 //Запуск двигателя 
#define IGNITION 13     //Включение зажигания

//Входы
#define BUTTON_LEFT_FR 6    //Концевик левой передней двери
#define BUTTON_RIGHT_FR 6   //Концевик правой передней двери
#define BUTTON_LEFT_RR 8    //Концевик левой задней двери
#define BUTTON_RIGHT_RR 8   //Концевик правой задней двери
#define BUTTON_HOOD 10      //Концевик капота
#define BUTTON_TRUNK 10     //Концевик багажника

//Состояние сигнализации
boolean signal_state = 0; // 0 - сигнализация выкл. 1 - сигнализация вкл.
boolean eng_flag = 0;
boolean signal_flag = 0;

//Данные с телефона
int data;

void setup() {
  //Выходы
  pinMode(SIGNAL, OUTPUT);
  pinMode(LOCKED, OUTPUT);
  pinMode(OPEN, OUTPUT);
  pinMode(TURN_SIGNALS, OUTPUT);
  pinMode(START_ENGINE, OUTPUT);
  pinMode(IGNITION, OUTPUT);

  //Входы
  pinMode(BUTTON_LEFT_FR, INPUT_PULLUP);
  pinMode(BUTTON_RIGHT_FR, INPUT_PULLUP);
  pinMode(BUTTON_LEFT_RR, INPUT_PULLUP);
  pinMode(BUTTON_RIGHT_RR, INPUT_PULLUP);
  pinMode(BUTTON_HOOD, INPUT_PULLUP);
  pinMode(BUTTON_TRUNK, INPUT_PULLUP);
 // Настройка BLUETOOTH
  Serial.begin(38400);
}
void loop() 

    {
    if (signal_state == 1) {
    //Концевики дверей (если хоть одна дверь открыта, срабатывает реле на сирену)
    if (!digitalRead(BUTTON_LEFT_FR) == LOW || !digitalRead(BUTTON_RIGHT_FR) == LOW || !digitalRead(BUTTON_LEFT_RR) == LOW || !digitalRead(BUTTON_RIGHT_RR) == LOW) {      Alarm();
    }
    //Концевик капота и багажника (если открыт капот или багажник, срабатывает реле на сирену)
    if (!digitalRead(BUTTON_HOOD) == LOW || !digitalRead(BUTTON_TRUNK) == LOW) {
      Alarm();
    }
  } else if(signal_state == 0){ //Выключили сигнализацию если она была снята с охраны
    digitalWrite(SIGNAL, LOW);
    Serial.println("0");
    delay(800);
  }
//Приём данных с телефона
  if(Serial.available()){ //Если в порт что-то поступило делаем...
    data = Serial.read(); //Если данные пришли сохраняем их в переменную
    if(data == '1') {     //Если пришла 1 то ставим сигнализацию в режим охраны и закрываем замки дверей
      signal_state = 1;
      digitalWrite(TURN_SIGNALS, HIGH);
      delay(800);
      digitalWrite(TURN_SIGNALS, LOW);
      delay(800);
      //   закрываем замки  
      digitalWrite(LOCKED, HIGH);
      delay(150);
      digitalWrite(LOCKED, LOW);
    }
    if(data == '2'){      //Если пришла 2 то сниаем сигнализацию с режима охраны и открываем двери
      signal_state = 0;
      digitalWrite(TURN_SIGNALS, HIGH);
      delay(400);
      digitalWrite(TURN_SIGNALS, LOW);
      delay(400);
   //  открываем замки   
      digitalWrite(OPEN, HIGH);
      delay(150);
      digitalWrite(OPEN, LOW);
      //  повторяем маргать поваротами.
      digitalWrite(TURN_SIGNALS, HIGH);
      delay(400);
      digitalWrite(TURN_SIGNALS, LOW);
      delay(400);
     digitalWrite(TURN_SIGNALS, HIGH);
      delay(400);
      digitalWrite(TURN_SIGNALS, LOW);
     
      
    }
    if(data == '3'){                  //Если пришла 3 то включаем зажигание, если оно было уже включено то выключаем его
      if(eng_flag == 0) {
        digitalWrite(IGNITION, HIGH);
      } else {
        digitalWrite(IGNITION, LOW);
      }
      eng_flag = !eng_flag;
     }
     if(data == '4') {                //Если пришла 4 то запускаем двигатель
      if(eng_flag == 1){
        digitalWrite(START_ENGINE, HIGH);
        delay(1500);
        digitalWrite(START_ENGINE, LOW);
      }
     if(eng_flag == 0){
      digitalWrite(START_ENGINE, LOW);
     }
    }
  }

  //Обратная связь
   if(!digitalRead(BUTTON_LEFT_FR) == LOW || !digitalRead(BUTTON_RIGHT_FR) == LOW){
      Serial.println("5");
      delay(800);
   }
   if(!digitalRead(BUTTON_LEFT_RR) == LOW || !digitalRead(BUTTON_RIGHT_RR) == LOW){
      Serial.println("6");
      delay(800);
   }
   if(!digitalRead(BUTTON_HOOD) == LOW){
      Serial.println("7");
      delay(800);
   }
   if(!digitalRead(BUTTON_TRUNK) == LOW){
      Serial.println("8");
      delay(800);
   }
}
   
//Функция срабатывания сигнализации
void Alarm() {
  digitalWrite(SIGNAL, HIGH);
  Serial.println("9");
  delay(800);
}

Share this post


Link to post
Share on other sites

Все работает двже  запаял в саму старлаин  сигнализацию  готова к установке но тут не реализован ручник для блокировки стартера авто мкпп.

Я могу  дописать блокировку еще одного реле для стартера но зачем эти сопли реле. Когда pin D7  arduino   я подключил на  ручник. Я не силен  это исправить в скейчь программно.

Share this post


Link to post
Share on other sites

8 hours ago, Точка Опоры said:

не обрамлённой соответствующими тэгами?

Открой редактирование первого сообщения и выдели код как "код" кнопочка <> на панели. А то заклюют.

2 minutes ago, avr said:

только учусь

Тут не любят учеников. 🤣 шутка с долей шутки.

Немного лирики. Защита от запуска без ручника в уважающих себя сигнашках делается через 2х и более шаговую постановку на охрану. Т.е. ты перед тем как заглушить машину ставишь на ручник, выключаешь зажигание, сигнашка видя это и ручник тут же подхватывает зажигание на себя, ты выходишь, закрываешь дверь и ставишь на охрану.  И уже тут сигнашка глушит машину и сохраняет флаг что ты все сделал верно.

Далее по команде запуска она (сигнашка) проверяет наличие этого флага и уже заводит или нет. 

Флаг этот снимается автоматом если ты открыл дверь машины до команды запуска.

Зачем так делается? Факт замыкания концевика ручника очень шаткая вещь. Проводок ручника идут вторым концом в приборку (или IPDM) где в примитивном варианте на лампочку, которая на питание. Когда ты выключаешь зажигание ты снимаешь это питание с лампочки (чтобы акум не сел) и тем самым создаёшь сложную схему паразитых включений через которые твой GPIO IN HiZ скорее всего снова увидит ручник, даже если ручник не "затянуть". Это все очень упрощено, но около того.

Теперь к делу. 

 

if(data == '4') {                //Если пришла 4 то запускаем двигатель
      if(eng_flag == 1){
        digitalWrite(START_ENGINE, HIGH);
        delay(1500);
        digitalWrite(START_ENGINE, LOW);
      }
     if(eng_flag == 0){
      digitalWrite(START_ENGINE, LOW);
     }
    }

Тут у тебя ерунда какая то. Но работать будем с тем что есть. 

eng_flag вроде как флаг факта включения зажигания нами же. Вместо второй проверки вставь else.

Ручник. Допустим у тебя ручник на D7. Добавь такую модификацию кода:

if(data == '4') {                //Если пришла 4 то запускаем двигатель
      if ((eng_flag == 1) && !digitalRead(7)) {
        digitalWrite(START_ENGINE, HIGH);
        delay(1500);
        digitalWrite(START_ENGINE, LOW);
      }
      else {
      digitalWrite(START_ENGINE, LOW);
     }
    }

Это примитивно перед запуском проверит ногу D7, что она НОЛЬ (а ручник это концевик на массу) и не будет запускать у противном случае.

 

Но! Это ответ на твой вопрос, а раскрытие темы выше.

Share this post


Link to post
Share on other sites

25 минут назад, avr сказал:

 

 

Благодарен с работы приду будем пробовать не проподайте спасибо до вечера.

Share this post


Link to post
Share on other sites

Sрider Спасибо огромное а я неделю перебирал код так и не получалось круто  вы решили.

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

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

1772809816515.jpg

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

Безымянный.png

Share this post


Link to post
Share on other sites

Помогите   допилить  код что бы LED под стеклом  моргал  при установки на охрану  не получается пишу код сразу рушится. 

Только что, avr сказал:

Мне так кажется  это не  конец доработки скейч. 

 

Share this post


Link to post
Share on other sites

On 3/6/2026 at 7:56 AM, Sрider said:

Ручник. Допустим у тебя ручник на D7. Добавь такую модификацию кода:

if(data == '4') {                //Если пришла 4 то запускаем двигатель
      if ((eng_flag == 1) && !digitalRead(7)) {
        digitalWrite(START_ENGINE, HIGH);
        delay(1500);
        digitalWrite(START_ENGINE, LOW);
      }
      else {
      digitalWrite(START_ENGINE, LOW);
     }
    }

 

if(data == '4') {                //Если пришла 4 то запускаем двигатель
      if ((eng_flag == 1) && !digitalRead(7)) {
        digitalWrite(START_ENGINE, HIGH);
        delay(1500);
      }
      digitalWrite(START_ENGINE, LOW);
    }

 

Share this post


Link to post
Share on other sites

За это время я уже добавил кое  что уже есть изменения. 

это я уже работает спасибо. мне надо другое  led под стекло добавить моргать 

 

 

Помогите   допилить  код что бы LED под стеклом  моргал  при установки на охрану  не получается пишу код сразу рушится. 

if(data == '4') {                //Если пришла 4 то запускаем двигатель
      if ((eng_flag == 1) && !digitalRead(7)) {
        digitalWrite(START_ENGINE, HIGH);
        delay(1500);
      }
      digitalWrite(START_ENGINE, LOW);
    }

Спасибо   за помощь  этот код  уже работает  все отлично .Надо с LED решить под лобовое стекло как оригинал было.

 

Share this post


Link to post
Share on other sites

Помогите  подправить  что бы LED  индикатор моргал при постановки на охрану у меня не получается что то.

Share this post


Link to post
Share on other sites

On 3/6/2026 at 8:35 PM, avr said:

digitalWrite(START_ENGINE, HIGH); delay(1500); } digitalWrite(START_ENGINE, LOW);

Явно, в конце не хватает еще одного delay

Но такие задержки не есть хорошо, пока отрабатывает delay ничего другого не опрашивается, программа "тупит".

Как обойтись без  delay есть в примере BlinkWithoutDelay. 

Еще "правильнее" запустить мигание как например у https://github.com/JChristensen/Timer/blob/master/examples/blink2/blink2.ino

https://www.doctormonk.com/2012/01/arduino-timer-library.html

 

Share this post


Link to post
Share on other sites

Хорошо Спасибо сейчас попробую разобраться  с этим кодом но не факт что пойму  что к чему.

Share this post


Link to post
Share on other sites

Ругается  Arduino //////////////Timer.h: No such file or directory////////////////////////// 

Я поставил библиотеку все равно  ругается

Share this post


Link to post
Share on other sites

On 3/8/2026 at 1:08 PM, avr said:

Ругается  Arduino //////////////Timer.h: No such file or directory////////////////////////// 

Я поставил библиотеку все равно  ругается

Какую библиотеку вы поставили и на основе какого примера вы используете Timer.h ?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...