Выбор спрособа подключить ардуино к бортовой сети автомобиля

Тема в разделе "Arduino & Shields", создана пользователем Керил, 17 ноя 2018.

  1. Керил

    Керил Нерд

    Привет всем, делаю автозапуск в машину. SIM800L и NANO корректно работают, но релюшки срабатывают немного не так. Работать должно так - если я звоню на сим, то замыкается реле зажигания, через delay замыкается реле стартера на 2,5 секунды и сразу размыкается. Далее через 10 секунд выключается реле зажигания (через 10 секунд после замыкания) Написал вот код, только работает так - после заливки скетча реле зажигания замыкается(или размыкается) после чего через несколько секунд снова делает это и все стоит. Когда звоню - реле зажигания замыкается, замыкается и отключается через 2с реле стартера, при отключении реле стартера отключается и зажигание, думаю что то не так в скетче, конкретно в этом месте

    Код (C++):
          if (innerPhone.length() >= 7 && whiteListPhones.indexOf(innerPhone) >= 0) {
             sendATCommand("ATH", true);        // Если да, то -отвечаем на вызов
           digitalWrite(5, LOW); // Включаем реле - посылаем низкий уровень сигнала
           delay(5000);
           digitalWrite(6, LOW); // Включаем реле - посылаем низкий уровень сигнала
           delay(2500);
           digitalWrite(6, HIGH); // Включаем реле - посылаем высокий уровень сигнала
            timeMillis = millis();    //постоянно сохраняем текущее время работы системы
          }
         
          else {
            sendATCommand("ATH", true);        // Если нет, то отклоняем вызов
          }
        }
      }
       if(timeMillis >= 300)  //сверяем текущее время с последним сохраненным
      {
          //если прошло больше 5000 мс
       
            digitalWrite(5, HIGH); // Включаем реле - посылаем низкий уровень сигнала
          }
    Вот весь скетч
    Код (C++):
    #include <SoftwareSerial.h>                     // Библиотека програмной реализации обмена по UART-протоколу
    SoftwareSerial SIM800(4, 3);                    // RX, TX

    String _response = "";                          // Переменная для хранения ответа модуля
    unsigned long int timeMillis;  //переменные для подсчета интервала задержки


    void setup() {
      Serial.begin(9600);                           // Скорость обмена данными с компьютером
      SIM800.begin(9600);                           // Скорость обмена данными с модемом
      Serial.println("Start!");
      pinMode(5, OUTPUT); // Объявляем пин реле как выход
      digitalWrite(5, HIGH); // Выключаем реле - посылаем высокий сигнал
      pinMode(6, OUTPUT); // Объявляем пин реле как выход
      digitalWrite(6, HIGH); // Выключаем реле - посылаем высокий сигнал
      sendATCommand("AT+IPR=9600", true);                    // Отправили AT для настройки скорости обмена данными

      // Команды настройки модема при каждом запуске
      _response = sendATCommand("AT+CLIP=1", true);  // Включаем АОН
      //_response = sendATCommand("AT+DDET=1", true);  // Включаем DTMF
    }

    String sendATCommand(String cmd, bool waiting) {
      String _resp = "";                            // Переменная для хранения результата
      Serial.println(cmd);                          // Дублируем команду в монитор порта
      SIM800.println(cmd);                          // Отправляем команду модулю
      if (waiting) {                                // Если необходимо дождаться ответа...
        _resp = waitResponse();                     // ... ждем, когда будет передан ответ
        // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
        if (_resp.startsWith(cmd)) {                // Убираем из ответа дублирующуюся команду
          _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
        }
        Serial.println(_resp);                      // Дублируем ответ в монитор порта
      }
      return _resp;                                 // Возвращаем результат. Пусто, если проблема
    }

    String waitResponse() {                         // Функция ожидания ответа и возврата полученного результата
      String _resp = "";                            // Переменная для хранения результата
      long _timeout = millis() + 10000;             // Переменная для отслеживания таймаута (10 секунд)
      while (!SIM800.available() && millis() < _timeout)  {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
      if (SIM800.available()) {                     // Если есть, что считывать...
        _resp = SIM800.readString();                // ... считываем и запоминаем
      }
      else {                                        // Если пришел таймаут, то...
        Serial.println("Timeout...");               // ... оповещаем об этом и...
      }
      return _resp;                                 // ... возвращаем результат. Пусто, если проблема
    }

    void loop() {
      if (SIM800.available())   {                   // Если модем, что-то отправил...
        _response = waitResponse();                 // Получаем ответ от модема для анализа
        _response.trim();                           // Убираем лишние пробелы в начале и конце
        Serial.println(_response);                  // Если нужно выводим в монитор порта
        String whiteListPhones = "+79507395422"; // Белый список телефонов
        if (_response.startsWith("RING")) {         // Есть входящий вызов
          int phoneindex = _response.indexOf("+CLIP: \"");// Есть ли информация об определении номера, если да, то phoneindex>-1
          String innerPhone = "";                   // Переменная для хранения определенного номера
          if (phoneindex >= 0) {                    // Если информация была найдена
            phoneindex += 8;                        // Парсим строку и ...
            innerPhone = _response.substring(phoneindex, _response.indexOf("\"", phoneindex)); // ...получаем номер
            Serial.println("Number: " + innerPhone); // Выводим номер в монитор порта
          }
          // Проверяем, чтобы длина номера была больше 6 цифр, и номер должен быть в списке
          if (innerPhone.length() >= 7 && whiteListPhones.indexOf(innerPhone) >= 0) {
             sendATCommand("ATH", true);        // Если да, то -отвечаем на вызов
           digitalWrite(5, LOW); // Включаем реле - посылаем низкий уровень сигнала
           delay(5000);
           digitalWrite(6, LOW); // Включаем реле - посылаем низкий уровень сигнала
           delay(2500);
           digitalWrite(6, HIGH); // Включаем реле - посылаем высокий уровень сигнала
            timeMillis = millis();    //постоянно сохраняем текущее время работы системы
          }
         
          else {
            sendATCommand("ATH", true);        // Если нет, то отклоняем вызов
          }
        }
      }
       if(timeMillis >= 300)  //сверяем текущее время с последним сохраненным
      {
          //если прошло больше 5000 мс
       
            digitalWrite(5, HIGH); // Включаем реле - посылаем низкий уровень сигнала
          }
      if (Serial.available())  {                    // Ожидаем команды по Serial...
        SIM800.write(Serial.read());                // ...и отправляем полученную команду модему
      };
    }
     
  2. Airbus

    Airbus Радиохулиган Модератор

    А зажигание для чего выключаешь?
     
  3. Керил

    Керил Нерд

    Хочу реализовать отключение зажигания после 10 минут прогрева, если я еще к этому времени не вышеел из дома
     
  4. Керил

    Керил Нерд

    Тоесть это просто тестовое время короткое, чтобы было видно, что все отрабатывает верно, а вообще время должно составлять минут 10-15
     
  5. Керил

    Керил Нерд

    Да, это жеско. Проблему решил, ошибка была в том месте, где и думал. У меня мал опыт программирования, пришлось пару часов крутить скетч, но в итоге работает. Вроде простая проблема, странно, что мне сразу не подсказали, как нужно было его изменить шоб работало. Теперь у меня есть готовый работающий макет, можно ставить в тачку, НО !!! Очень хочется реализовать еще и обратную связь! Тут два пути вижу. 1) Приобрел датчик температуры, можно припаять/приклеить его к детали под капотом, которая нагревается быстрее всего при запуске двигателя и написать код, чтоб sim звонил, если температура поднялась выше какого либо значения. Зимой это сделать просто по какому либо значению, ведь зимой холодный движок явно не будет иметь температуру 10 градусов например, а вот летом потом могут проблемы возникнуть. Или можно как то написать прогу так, чтобы отзванивалась, если температура резко изменилась, не важно какие были значения(летом не должно быть проблем - если написать хорошо) 2) Те, кто делал автозапуск писали, что при заведенном авто начинает работать генератор, следовательно напряжение в сети возрастает, если видим, что напряжение выросло - звоним. Второй способ мне нравится больше, хоть я и купил уже датчик температуры, но хочется именно 2ой реализовать. Кто нибудь может подсказать конкретнее, как его сделать? я вообще правильно понял, это так работает?
     
  6. Керил

    Керил Нерд

    Нашел такую информацию. При заряженном акб напряжение на нем - 12,6В, а после того, как машина завелась - оно растет до 14,8В. И в таком случае можно легко наблюдать запустилась ли машина(вот только знать бы как) У меня возникли вот какие вопросы: 1) при запуске стартера напряжение в сети просаживается до 9В примерно. И если ардуино нано может питаться от напряжения бортовой сети через пин 30 напрямую (причем 9-14В входят в ее критический диапазон, значит при просадке и повышении напряжения бортовой сети ардуино нано будет нормально себя чувствовать и не глючить), то sim800 приходится запитывать с помощью dc-dc преобразователя, он будет настроен так, чтобы 12,6 Вольт превратить в 3,95В. Собстренно вопрос - При просадке напряжения сети до 9В может ли напряжение на выходе преобразователя упасть ниже допустимого для sim800l, вызывая этим ошибки? 2) От чего и как лучше запитать ардуино и модем? Я правильно же понимаю, что это не важно - буду я запитывать это все от проводов с прикуривателя или от проводов с замка зажигания? И не важно где я буду смотреть напряжение, оно везде будет одинаковое после запуска авто оно везде вырастает до 14В?? Какая схема будет наиболее надежной? та, по которой модем питается от dc-dc, а ардуино от сети или та, по которой ардуино питается от сети(или лучше тоже через dc-dc?), а модем подключен напрямую к 5В ардуино через диод и электролитический конденсатор на 1000мкФ? (так вроде можно)
     
  7. parovoZZ

    parovoZZ Гуру

    я зимой выходил, заводил тачку, убирал снег, садился в тачку и ехал. Зачем пережигать бенз и коптить атмосферу?
     
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1/ Ардуину и Sim питать отдельно - каждый через свой стабилизатор. Без стабилизаторов нельзя. Для Ардуины слишком высока бортовая напруга заведенного авто. А Sim - слишком много кушает, чтоб питать от Ардуины.
    2/ Любой стабилизатор нормально работает пока питающее напряжение больше стабилизируемого. А вот насколько достаточно - зависит от его марки. Если превышение есть на 4 вольта - этого вполне достаточно.
    3/ Используйте импульсные понижающие преобразователи.
    4/ Надо очень хорошо думать, и принять меры против пожара от тыщи разных возможных "электрических" причин.
     
    Последнее редактирование: 19 ноя 2018
  9. Керил

    Керил Нерд

    Я вообще хочу использовать вот эти преобразователи http://www.2150692.ru/product/view/22/25 Они ведь стабилизируют напряжение? Есть еще такие http://www.2150692.ru/product/view/22/129. Это ведь те самые импульсные понижающие преобразователи? Читал в комментариях на Ютубе что можно sim запитать напрямую от 5 вольт ардуино, если использовать диод и конденсатор, который будет обеспечивать пики до 2А. Насчет последнего совета - не знаю даже что сказать. Тысяча разных возможных электрических причин пожара??? хммм... я вот ни одной не вижу. Я хочу собрать все на плате, припаять к проводам прикуривателя параллельно еще пару, завести ее на питание всего, что собрал. Воот... мне не кажется, что устройство будет способно вызвать в машине пожар. Еще буду впаиваться в провода на замке зажигания, чтобы между нужными поставить закоротку с нормально разомкнутым реле. Провода зажигания буду замыкать обычным дешевым реле для ардуино, а провода стартера буду замыкать тоже релюшкой для ардуино, только на 30А.
     
  10. Керил

    Керил Нерд

    тупые люди ездят на своих тупых машинах, тупо коптят атмосферу и никто не задумывается о том, что можно ездить на лошадях.
    Пережигать? перед зимней поездкой движок так и так надо прогреть хотя бы 5 минут, никуда не денешься. Без автозапуска - это очень не круто заводить машину и сидеть в ней мерзнуть, пока она прогревается
     
  11. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Используйте на LM2596S. Солидней выглядит. С машиной - лучше не экономить на стабилизаторе - целей будет.
    ПС. Когда-то ремонтировал у итальянцев таймеры включения бензинового обогревателя для салона пассажирского автобуса. Забота об человеке аднако. Все по уму - с логикой по отработке множества нештатных ситуаций. Мощное реле подгорало - частая проблема была.
     
    Последнее редактирование: 19 ноя 2018
  12. DetSimen

    DetSimen Guest

    Starline B9 в Китае стоит 2300. быстро, хорошо, и автозапуск есть. стоит городить огорот с Дуней?
     
    parovoZZ и Igor68 нравится это.
  13. Vovka

    Vovka Гик

    Керил, покажите схему. Скорей всего в ней есть не точности.
    Кстати, Вы в курсе, что в бортовой сети автомобиля возможны выбросы амплитудой до 160В?
     
  14. Керил

    Керил Нерд

    Вобщем по подключению понятно, а как все таки обратную связь сделать? Я могу подключить тот же + с прикуривателя, который питает устройство на аналоговый пин ардуино через делитель напряжение с коэффициентом 4? Это надо будет использовать 2 резистора на 300 и 100кОм или 10 и 30кОМ. И смотреть напряжение на этом пине?
     
  15. Керил

    Керил Нерд

    Нет, я первый раз об этом слышу. Ну у меня ВАЗ 2109, там вообще честно говоря электрика ненадежная((9 Мне надо купить текстолитовую плату, чтоб собрать компактно, сейчас схема собрана так. на плате все соединения останутся такими же, сейчас нарисую как я вижу ее. А КАК ЗАЩИТИТЬСЯ ОТ ЭТИХ ВСПЛЕСКОВ? Диодами?
     

    Вложения:

    • Ja68tYs8S14.jpg
      Ja68tYs8S14.jpg
      Размер файла:
      417,7 КБ
      Просмотров:
      583
  16. DetSimen

    DetSimen Guest

    Мда. Пипец девятке...
     
    parovoZZ и Igor68 нравится это.
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Вы вроде хотели температуру следить. Или напругу ? Если температуру - LM35. Если напругу - делитель, но не сотни Ком, а десятки (Ком)..
     
    Последнее редактирование: 19 ноя 2018
  18. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Я бы тоже рисковать не стал. Но, сами понимаете - на форуме дело не "уму-разуму" учить, а технические решения подсказывать. Хозяин - барин.
     
  19. Керил

    Керил Нерд

    Да я знаю, это жеско. Но она вроде понятная) Пин D7 будет мерить напряжение. не нарисовал на схеме только делитель для rx sim800l.
     

    Вложения:

    • Схема.png
      Схема.png
      Размер файла:
      67,6 КБ
      Просмотров:
      384
  20. Керил

    Керил Нерд

    ну почему пипец от сразу... Понимаю, что машина может теоретически испортить ардуино и модуль, но вот никак я не могу понять, что такое может случиться, что пострадает машина.