Помогите новичку, контроль автозапуска авто

Тема в разделе "Arduino & Shields", создана пользователем soglaev, 9 окт 2017.

  1. soglaev

    soglaev Нерд

    Добрый день, недавно начал знакомство с arduino. Сделал себе простенький автозапуск по смс с помощью arduino nano, sim800l и реле. Подключил к реле второй брелок от сигнализации (tomahawk tw-9010). Теперь когда отправляешь смс с текстом "1" реле замыкается на 1 секунду, к которой подключена кнопка автозапуска на брелке. Как реле замыкается, arduino отправляет смс в ответ "komanda vipolnena". Но столкнулся с проблемой - сигнал от брелка не всегда с первого раза доходит до сигнализации, сказываются помехи на частоте 433 mhz. Хочу реализовать контроль автозапуска. Думается сделать по следующему принципу: нужно чтобы реле замкнулось на 1 сек, потом ардуино подождал пару секунд, и если поворотники не моргнули (что указывает о получении сигнала от брелка) то отправляет повторно команду на реле замкнуть на 1 сек. И так до тех пор пока не придет сигнал с поворотников, после получения сигнала отправляет смс с текстом "komanda vipolnena"
    Как мне это сделать?


    Код (C++):
    #include "SIM900.h"
    #include <SoftwareSerial.h>

    #include "sms.h"
    #include "call.h"
    SMSGSM sms;
    CallGSM call;

    //=================Пины 2 и 3 для Подключения GSM модуля


    int flag=0;
    boolean started=false;
    char smsbuffer[160];
    char n[20];
    String n1 = "+79088018800";
    String input_string = "";
    String smsContent = "";

    char smsDv[] ="Komanda Vipolnena!";
    char pos;
    char sendsms[160];

    void setup() {

    pinMode(7, OUTPUT);
    digitalWrite(7,HIGH);
    Serial.begin(9600);


           if (gsm.begin(4800)) {
              Serial.println("\nstatus=READY");
              started=true;
         } else Serial.println("\nstatus=IDLE");

    }
    void loop() {

    pos = sms.IsSMSPresent(SMS_UNREAD); // смотрим непрочитанные СМС
          if (pos) {                    // Если непрочитанные СМС есть, то...
           
    getsms(); // получаем непрочитанную СМС

    if (input_string=="1"){Serial.print("YES!");
    //n1.toCharArray(n,20);
    sms.SendSMS(n, smsDv);
    sms.DeleteSMS(1);
    memset(n,0,20); // Команда "1" - действие
    input_string="";
    char smsbuffer[160]="";
    digitalWrite(7,LOW);
    delay(1000);
    digitalWrite(7,HIGH);
    }
    sms.DeleteSMS(pos); // удаляем СМС  из симки
          }
    }
    void getsms()
    {
    sms.GetSMS(pos,n,20,smsbuffer,160);
    input_string =String(smsbuffer);
              }

    тут файлы библиотеки:
    https://filecloud.me/g6lh010613xw.html
     
  2. soglaev

    soglaev Нерд

    сегодня немного разбирался в arduino, очень интересно оказывается, решил проще сделать: определять дошла команда от брелка или нет по включению зажигания. Но прогресс встал колом на программировании кода, а точнее не могу понять как после команды else задать повтор включения реле, т.е. начать сначала выполнение кода до тех пор пока зажигание не включиться.
    Код (C++):
    #include "SIM900.h"
    #include <SoftwareSerial.h>

    #include "sms.h"
    #include "call.h"
    SMSGSM sms;
    CallGSM call;

    //=================Пины 2 и 3 для Подключения GSM модуля


    int flag=0;
    boolean started=false;
    char smsbuffer[160];
    char n[20];
    String n1 = "+79088018800";
    String input_string = "";
    String smsContent = "";

    char smsDv[] ="Komanda Vipolnena!";
    char pos;
    char sendsms[160];

    void setup() {

    pinMode(7, OUTPUT);
    pinMode(A0, INPUT);
    digitalWrite(7,HIGH);
    Serial.begin(9600);


           if (gsm.begin(4800)) {
              Serial.println("\nstatus=READY");
              started=true;
         } else Serial.println("\nstatus=IDLE");

    }
    void loop() {

    pos = sms.IsSMSPresent(SMS_UNREAD); // смотрим непрочитанные СМС
          if (pos) {                    // Если непрочитанные СМС есть, то...
         
    getsms(); // получаем непрочитанную СМС

    if (input_string=="1"){Serial.print("YES!");
    //n1.toCharArray(n,20);
    memset(n,0,20); // Команда "1" - действие
    input_string="";
    char smsbuffer[160]="";
    digitalWrite(7,LOW);
    delay(1000);
    digitalWrite(7,HIGH);
    delay(6000);
    int ign = analogRead(A0) / 128;
    if( ign > 0 )
    {
    sms.SendSMS(n, smsDv);
    sms.DeleteSMS(1);
    }
    else
    {   ???ЧТО ТУТ ПИСАТЬ???что бы код начал заного выполняться со строки digitalWrite(7,LOW)
    }
    }
    sms.DeleteSMS(pos); // удаляем СМС  из симки
          }
    }
    void getsms()
    {
    sms.GetSMS(pos,n,20,smsbuffer,160);
    input_string =String(smsbuffer);
              }
     
  3. ORLENOK

    ORLENOK Гик

    Есть несколько моментов в коде не совсем понятных мне.
    Сейчас покажу:
    Код (C++):

    int flag=0;  //для чего это?
    boolean started=false;  //для чего это?
    char smsbuffer[160];
    char n[20];
    String n1 = "+79088018800";
    String input_string = "";
    String smsContent = "";  //для чего это?

    char smsDv[] ="Komanda Vipolnena!";
    char pos;
    char sendsms[160]; //для чего это?

    void setup() {

    if (gsm.begin(4800))
    {
       Serial.println("\nstatus=READY");
       started=true;  //для чего это, если дальше не используется.
    }
    else
     Serial.println("\nstatus=IDLE");
    }
     
    Я не знаю, как у вас код в ArduinoIDE выглядит код, но так его читать сложно. Старайтесь всё же делать отступы, просто удобнее будет всем.
    Проверку, что машина завелась можно делать в цикле.
    типо:
    Код (C++):

    int ign = analogRead(A0)/128;
    while(ign != 1)
    {
      digitalWrite(7,LOW);
      delay(1000);
      digitalWrite(7,HIGH);
      delay(6000); //так мы будет каждые 7 секунд пытаться завести машину.
      ign = analogRead(A0)/128;
    }
     
    Опять же, не знаю, насколько это правильно. Может быть будет такой момент, что машина не может по каким то причинам завести, но она будет упорно это делать и в лучшем случае посадит аккумулятор. Поэтому я советовал бы попытки завести машину проводить в течении какого-то времени. (нужно дописать код)
     
  4. soglaev

    soglaev Нерд

    то что вы написали для чего это, я не знаю, я только начинаю изучать эту сферу) я взял готовый скетч из видео на youtube где человек написал его специально для включения реле посредством смс сообщения. Вот я и подумал. Мне нужно чтобы я отослал смс, ардуино включила реле на 1 сек, к этому реле подключен второй брелок от сигнализации,(кнопка автозапуска) , и если с брелка не поступила команда на блок сигнализации то он повторно замыкает реле, и так покругу, пока не появиться на A0 сигнал, который скажет ардуино что сигнализация включила программу автозапуска и зажигание включилось. ign это +12в зажигания. А уже после этого отправила смс с текстом "команда выполнена" и ждала следующую мою смс с текстом "1" для автозапуска.
     
  5. ORLENOK

    ORLENOK Гик

    Вы проверяли этот код? Он работает? Точнее на практике какие-нибудь действия делали?
    Подавать 12v на аналоговый вход ардуино не очень хорошая затея.
     
  6. soglaev

    soglaev Нерд

    проверял, все устраивает. Только нужен контроль A0 по зажиганию, а то бывает такое что сигнал с брелка не доходит до самой сигнализации, помехи на частоте 433mhz . 12в подавать конечно не буду, через делитель напряжения хочу попробовать.
     
  7. soglaev

    soglaev Нерд

    только единственное мне смс "команда выполнена" приходила до включения реле
     
  8. b707

    b707 Гуру

    Soglaev - в этом коде масса ошибок. операторы перепутаны местами - то ли когда вы код из видео выдирали, то ли когда в форум копировали. Во всяком случае, в этом виде работать не будет.
     
  9. b707

    b707 Гуру

    Так в коде она и стоит "ДО". Только насчет приходила - явно вранье. ибо вы номер телефона в функцию отправки СМС не передаете. так что СМС придти в принципе не может.
     
  10. soglaev

    soglaev Нерд

    все работает и приходит смс,

    вот ссылка на то видео, я скетч скачивал а не переписывал
     
  11. b707

    b707 Гуру

    ага, увидел - это косяк не ваш. а автора. Он поленился вставить телефон в скетч - у него проще - ответная СМС приходит на тот же номер, с которого пришла команда.
    Любой в мире может запустить вашу машину...достаточно послать СМС с кодом "1"
    Убивать надо авторов таких видео...
     
  12. soglaev

    soglaev Нерд

    а как мне вставить телефон в скетч? я заместо его номера свой написал +79088018800 думал это как раз таки и есть параметр который отвечает с какого телефона будет выполнятся
     
  13. ORLENOK

    ORLENOK Гик

    За правильность не ручаюсь. Код нужно править. Но это явно лучше чем было. Советую сделать проверку не про цифре 1, а по какому-то коду, например d3!. А то действительно будет так, что вам уважаемые форумчане будут машину периодически прогревать))
    Код (C++):
    #include "SIM900.h"
    #include <SoftwareSerial.h>

    #include "sms.h"
    #include "call.h"
    SMSGSM sms;
    CallGSM call;

    //=================Пины 2 и 3 для Подключения GSM модуля

    boolean started=false;
    char smsbuffer[160];
    char n[20];
    String n1 = "+79088018800";
    String input_string = "";

    char smsDv[] ="Komanda Vipolnena!";
    char[] smsError = "Error";
    char pos;

    void setup() {

      pinMode(7, OUTPUT);
      pinMode(A0, INPUT);
      digitalWrite(7,HIGH);
     
      if (gsm.begin(4800))
      {
        started=true;
      }
     
    }
    void loop()
    {
      pos = sms.IsSMSPresent(SMS_UNREAD); // смотрим непрочитанные СМС
      if (pos)
      {                    // Если непрочитанные СМС есть, то...    
        getsms(); // получаем непрочитанную СМС
       
        if (input_string=="1")
        {
          memset(n,0,20); // Команда "1" - действие
          input_string="";
          digitalWrite(7,LOW);
          delay(1000);
          digitalWrite(7,HIGH);
          delay(6000);
          int count = 0;
          bool error = false;
          int ign = analogRead(A0) / 128; //не уверен
          while(ign != 1)
          {
            count ++;
            if(count > 30) //количество попыток
            {
              sms.SendSMS(n, smsError);
              sms.DeleteSMS(1);
              error = true;
              break;
            }
            digitalWrite(7,LOW);
            delay(1000);
            digitalWrite(7,HIGH);
            delay(6000); //так мы будет каждые 7 секунд пытаться завести машину.
            ign = analogRead(A0)/128;
          }
          if(!error)
          {
            sms.SendSMS(n, smsDv);
            sms.DeleteSMS(1);
          }
        }
        sms.DeleteSMS(pos); // удаляем СМС  из симки
      }
    }

    void getsms()
    {
      sms.GetSMS(pos,n,20,smsbuffer,160);
      input_string =String(smsbuffer);
    }
     
  14. b707

    b707 Гуру

    Судя по остаткам кода, автор и сам планировал вставить проверку, но то ли не осилил, то ли решил что и так сойдет.
    Чтобы ответная СМС посылалась именно тебе, раскомментируй строчку
    n1.toCharArray(n,20);
    Но приниматься команда все равно будет с любого телефона.
    Для проверки нужно брать входящий телефон (он лежит в массиве n), переводить его в String и сравнивать с твоим телефоном n1. Если они совпадают - команду выполнять, если нет - ничего не делать.
     
  15. soglaev

    soglaev Нерд

    как они будут ее заводить если не знают на какой номер смс отправлять, String n1 = тут же указывается с какого номера отправлять а не который в sim800l
     
  16. b707

    b707 Гуру

    по-моему куча ошибок....
    строчка
    memset(n,0,20);
    делает невозможной отправку ответов по СМС в принципе.
     
  17. soglaev

    soglaev Нерд

    Завтра конечно же попробую, а эту ночь придется посветить изучением основ, а то вы говорите раскоментируйте строчку и т.д. а у меня мозг закипает)))
     
  18. ORLENOK

    ORLENOK Гик

    Я кстати эту строку убрал. Раньше с этим модулем не работал, думал она осталась от прошлого владельца осталась, а вам не нужна)
    Не работал раньше с этой библиотекой. Возможно Вы с автором говорите о разных вещах или автор загрузил на ардуино другую версию кода. Потому что Вы говорите, что работать не должно совсем, а у него код работает. Это строка: memset(n,0,20); взята из его кода. По сути я только добавил проверку в цикле и убрал вывод в Serial отладочной информации ибо зачем она нужна?
     
  19. b707

    b707 Гуру

    Ну почему у автора работает, хотя и не должно :) - я уже разобрался и написал в сообщении №11.
    А в вашем случае работать не будет, потому что строка memset(n,0,20); очищает номер для отправки СМС. Обратите внимание, что в исходном коде эта строчка стоит ПОСЛЕ посылки СМС - а у вас ДО. Если очистить номер телефона ДО СМС - СМС отсылать куда будете? :)
     
  20. soglaev

    soglaev Нерд

    Снял с авто ардуино, сейчас дома попробую скетч загрузить и проверить товарища Орленка)