Вопрос по millis()

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

  1. Mixailovsky

    Mixailovsky Нуб

    В програмировании новичек.Прошу обьяснить на человеческом языке как пользоваться миллись, данный код будет работать так-при получении смс с текстом ОН переходим к функции старт в ней включаем зажигание,ждем пару секунд,включаем стартер на пару секунд,считываем пришел ли положительный сигнал со стартера(если нет то выключаем зажигание) если да то через заданное время например через 10 минут выключаем зажигание.Если приходит смс со словом ОФФ все выключаем.

    Код (C++):
    String numberSMS_1 = "+7911----------"; // Номер абонента
    String text_1 = "ENGINE START";    
    String text_2 = "ENGINE STOP";    
    String text_3 = "ENGINE NO START,RESTART";
    String text_4 = "ENGINE NO START";
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(2,3);


    byte engine=11;
    byte starter=12;
    byte generator=8;
    byte parking=7;

    char* adminNumber[]={"+7911-------", "+79111---------"};
    int8_t i;




    void setup()
    {
     
      digitalWrite(engine,!LOW); // выключаем ING 1
      digitalWrite(starter,!LOW); // выключаем STARTER
    //ВХОДЫ
      pinMode(engine,OUTPUT);  //зажигание
      pinMode(starter,OUTPUT);  //стартер
      //ВЫХОДЫ
      pinMode(generator,INPUT); //вход генератора
      pinMode(parking,INPUT); //вход положения селектора акпп
    Serial.begin(19200);
    gprsSerial.begin(19200);

    // настройка приема сообщений
    gprsSerial.print("AT+CMGF=1\r"); // устанавливаем текстовый режим смс-сообщения
    delay(500); //
    gprsSerial.print("AT+IFC=1, 1\r"); // устанавливаем программный контроль потоком передачи данных
    delay(500);
    gprsSerial.print("AT+CPBS=\"SM\"\r"); // открываем доступ к данным телефонной книги SIM-карты
    delay(500);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); // включает оповещение о новых сообщениях, новые сообщения приходят в следующем формате: +CMT: "<номер телефона>", "", "<дата, время>",
    //на следующей строчке с первого символа идёт содержимое сообщения
    delay(700);
      gprsSerial.println("AT+CLIP=1");        
      delay(300);                            
      gprsSerial.println("AT+CMGF=1");        
      delay(300);                            
      gprsSerial.println("AT+CSCS=\"GSM\"");  
      delay(300);                            
      gprsSerial.println("AT+CNMI=2,2,0,0,0");
      delay(300);  
    }
    String currStr = ""; // если эта строка сообщение,

    boolean isStringMessage = false; //  то ставим флаг на разрешение оброботки SMS

    /* Функция отправки SMS */
    void sendSMS(String text, String phone) {
      gprsSerial.println("AT+CMGS=\"" + phone + "\"");
      delay(500);
      gprsSerial.print(text);                        
      delay(500);
      gprsSerial.print((char)26);      
      delay(2500);
    }



    void loop()
    {
    if (!gprsSerial.available())// если не данных от модуля SIM800l, то дальше не идем.
    return;
    char currSymb = gprsSerial.read(); // записываем в переменую символы, которые получили от модуля.
     
    if ('\r' == currSymb) // если получили символ перевода коректи в начало строки, это означает что передача сообщения от модуля завершена.
    {
    if (isStringMessage)  // если текущая строка – сообщение, то…

    {
    if (!currStr.compareTo("On")) // если текст сообщения совпадает с "on",
    {
    start();                
    }
    //----------------------------------------------------------------------------------------
      if (!currStr.compareTo("Off"))      // если текст сообщения совпадает с "off",
    {
    stop();          
    }
      isStringMessage = false;
    }
    else {
    if (currStr.startsWith("+CMT"))
    { // если текущая строка начинается с "+CMT", то следующая сообщение
     
       for (i = 0; i <= 1; i++)
       { // число 3 - это количество заданных тел.номеров.
         if (currStr.indexOf(adminNumber[i])) //сверяем номер с номером прешедним SMS
         {
          Serial.println(adminNumber[i]);
          isStringMessage = true;
          break;
         }
       }
      }
    }
    currStr = "";
    }
      else if ('\n' != currSymb) { //  игнорируем второй символ в последовательности переноса строки: \r\n , и
    currStr += String(currSymb); //дополняем текущую команду новым сиволом
    }
    }

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    void start()
    {
      digitalWrite(engine,LOW); // включаем ING 1
      delay(2000);
      digitalWrite(starter,LOW); // включаем STARTER
      delay(2000);
      if(digitalRead(generator)==1) //ЕСЛИ ДВИГАТЕЛЬ ЗАВЕЛСЯ
      {
       digitalWrite(starter,!LOW); // выключаем STARTER
    }
    else                           //ЕСЛИ НЕТ
    {
    digitalWrite(starter,!LOW); // выключаем STARTER
    digitalWrite(engine,!LOW); // включаем зажигание
    }
    delay(5000);                  //-----------------------КАК В ЭТОМ МЕСТЕ СДЕЛАТЬ ЗАДЕРЖКУ НА 10 МИНУТ С ПОМОЩЬЮ МИЛЛИС КАК НИ ЛОМАЛ ГОЛОВУ НИКАК НЕ ПОБЕДИТЬ МИЛЛИС ЧТО БЫ ЧЕРЕЗ 10 МИН
                                  //                       ВЫКЛЮЧАЛСЯ СТАРТЕР И ВЫКЛЮЧАЛОСЬ ЗАЖИГАНИЕ
                                  //-----------------------ЕСЛИ МОЖНО ПОПОДРОБНЕЕ РАСПИСАТЬ ДЕЙСТВИЯ С МИЛЛИС
    {
    digitalWrite(engine,!LOW); // выключаем ЗАЖИГАНИЕ
    }
    }
    //_____________________________________________________________________________________________________________________________________________________

    void stop()
    {
      digitalWrite(engine,!LOW); // выключаем зажигание
      digitalWrite(starter,!LOW); // выключаем STARTER
    }

     
     
  2. Airbus

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

    А миллис принципиально здесь?
     
  3. Mixailovsky

    Mixailovsky Нуб

    Да принципиально потому что если сделать к примеру delay(10000); то на протяжении 10 минут я к примеру не смогу заглушить двигатель отправкой смс Off.
     
  4. Mixailovsky

    Mixailovsky Нуб

    И еще по-задумке должно будет постоянно проверяться условие что авто стоит к примеру на PARKING или ручнике и при снятии должна заглохнуть,delay естественно не даст этого сделать...
     
  5. Mixailovsky

    Mixailovsky Нуб

    Пробывал с миллис в различных вариантах пересмотрел ВСЕ ПРИМЕРЫ ,вот один из 1000 примеров вставки мной миллиса в данный код,получается что включается зажигание,включается стартер проверяется пришло ли с генератора 1 выключается стартер по идее дальше должен работать миллис но все выключается.

    Код (C++):
    String numberSMS_1 = "+79116666666"; // Номер абонента №1 для СМС (отличается только знаком +)
    String text_1 = "ENGINE START";    // Меняем название зоны на свое,  на латинице.
    String text_2 = "ENGINE STOP";    // Меняем название зоны на свое,  на латинице.
    String text_3 = "ENGINE NO START,RESTART";
    String text_4 = "ENGINE NO START";
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(2,3); // установка контактов 2 и 3 для программного порта (для микроконтроллера ардуино убать букву D)
    // (для микроконтроллера ардуино убать букву D)


    byte engine=11;
    const int starter=12;
    byte generator=8;
    byte parking=7;

    char* adminNumber[]={"+79117777771", "+7911888888418"};
    int8_t i;


    // Variables will change :
    int engineState = LOW;            // Состояние, используемое для установки светодиода

    unsigned long previousMillis = 0;        // будет хранить последний раз, когда светодиод был обновлен


    const long interval = 5000;           // interval at which to blink (milliseconds)

    void setup()
    {

      digitalWrite(engine,!LOW); // выключаем ING 1
      digitalWrite(starter,!LOW); // выключаем STARTER
    //ВХОДЫ
      pinMode(engine,OUTPUT);  //зажигание
      pinMode(starter,OUTPUT);  //стартер
      //ВЫХОДЫ
      pinMode(generator,INPUT); //вход генератора
      pinMode(parking,INPUT); //вход положения селектора акпп
    Serial.begin(19200);
    gprsSerial.begin(19200);

    // настройка приема сообщений
    gprsSerial.print("AT+CMGF=1\r"); // устанавливаем текстовый режим смс-сообщения
    delay(500); //
    gprsSerial.print("AT+IFC=1, 1\r"); // устанавливаем программный контроль потоком передачи данных
    delay(500);
    gprsSerial.print("AT+CPBS=\"SM\"\r"); // открываем доступ к данным телефонной книги SIM-карты
    delay(500);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); // включает оповещение о новых сообщениях, новые сообщения приходят в следующем формате: +CMT: "<номер телефона>", "", "<дата, время>",
    //на следующей строчке с первого символа идёт содержимое сообщения
    delay(700);
      gprsSerial.println("AT+CLIP=1");        
      delay(300);                          
      gprsSerial.println("AT+CMGF=1");        
      delay(300);                          
      gprsSerial.println("AT+CSCS=\"GSM\"");  
      delay(300);                          
      gprsSerial.println("AT+CNMI=2,2,0,0,0");
      delay(300);
    }
    String currStr = ""; // если эта строка сообщение,

    boolean isStringMessage = false; //  то ставим флаг на разрешение оброботки SMS

    /* Функция отправки SMS */
    void sendSMS(String text, String phone) {
      gprsSerial.println("AT+CMGS=\"" + phone + "\"");
      delay(500);
      gprsSerial.print(text);                      
      delay(500);
      gprsSerial.print((char)26);    
      delay(2500);
    }



    void loop()
    {
    if (!gprsSerial.available())// если не данных от модуля SIM800l, то дальше не идем.
    return;
    char currSymb = gprsSerial.read(); // записываем в переменую символы, которые получили от модуля.

    if ('\r' == currSymb) // если получили символ перевода коректи в начало строки, это означает что передача сообщения от модуля завершена.
    {
    if (isStringMessage)  // если текущая строка – сообщение, то…

    {
    if (!currStr.compareTo("On")) // если текст сообщения совпадает с "on",
    {
    start();                
    }
    //----------------------------------------------------------------------------------------
      if (!currStr.compareTo("Off"))      // если текст сообщения совпадает с "off",
    {
    stop();          
    }
      isStringMessage = false;
    }
    else {
    if (currStr.startsWith("+CMT"))
    { // если текущая строка начинается с "+CMT", то следующая сообщение

       for (i = 0; i <= 1; i++)
       { // число 3 - это количество заданных тел.номеров.
         if (currStr.indexOf(adminNumber[i])) //сверяем номер с номером прешедним SMS
         {
          Serial.println(adminNumber[i]);
          isStringMessage = true;
          break;
         }
       }
      }
    }
    currStr = "";
    }
      else if ('\n' != currSymb) { //  игнорируем второй символ в последовательности переноса строки: \r\n , и
    currStr += String(currSymb); //дополняем текущую команду новым сиволом
    }
    }

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    void start()
    {
      digitalWrite(engine,LOW); // включаем ING 1
      delay(2000);
      digitalWrite(starter,LOW); // включаем STARTER
      delay(2000);
      if(digitalRead(generator)==1) //ЕСЛИ ДВИГАТЕЛЬ ЗАВЕЛСЯ
      {
       digitalWrite(starter,!LOW); // выключаем STARTER
    }
    else                           //ЕСЛИ НЕТ
    {
    digitalWrite(starter,!LOW); // выключаем STARTER
    digitalWrite(engine,!LOW); // включаем зажигание
    }
    unsigned long currentMillis = millis();//===============================================================================

      if (currentMillis - previousMillis >= interval) {
        // сохранить последний раз, когда вы мигали светодиод               //ВОТ    ЭТО      МЕСТО
        previousMillis = currentMillis;

       // если светодиод выключен, включите его, и наоборот:
        if (engineState == LOW) {
          engineState = HIGH;
        } else {
          engineState = LOW;
        }//=============================================================================================================

      // установить led с переменной ledState:
        digitalWrite(engine,engineState);
      }
    }

    //delay(5000);                
    //{
    //digitalWrite(engine,!LOW); // выключаем ЗАЖИГАНИЕ
    //}
    //}
    //_____________________________________________________________________________________________________________________________________________________

    void stop()
    {
      digitalWrite(engine,!LOW); // выключаем ING 1
      digitalWrite(starter,!LOW); // выключаем STARTER
    }
     
     
  6. DIYMan

    DIYMan Guest

    Ооох... Главная беда всех начинающих писать прикладные проекты второй степени сложности, по моему мнению - это пытаться сделать всё и сразу, и чтоб сразу всё работало. При том, что само общение с GSM-модемом посредством AT-команд уже само по себе подразумевает наличие в программе реализации графа состояний, проще говоря - конечного автомата. Если пытаться решить всё "в лоб" - никакие millis не помогут, ибо - оно не для этого, собственно.

    С чего стоит начать? Как минимум - с понимания всех возможных состояний системы - например, модем может быть не готов к работе (SIM800L стартуют мееедленно, да и простыми delay в полсекунды НИКАК не гарантировать, что команда успешно прошла). Далее - с понимания, как жить с этими состояниями, как на них реагировать, что можно делать, а что - нельзя.

    После того, как придёт такое понимание - делаем граф состояний, в вершинах которого есть и состояние "сейчас заводим мотор", и состояние "ничего не делаем, свободны для обработки команд", и состояние "настраиваем такой-то режим работы GSM-модема" - короче, все возможные состояния системы.

    Далее - всё просто: каждому состоянию назначается свой обработчик, который может либо перевести состояние системы на новую вершину графа (попросить обработать следующую команду настройки модема, например), так и перевести состояние системы в режим ожидания. При этом каждый обработчик может манипулировать своими сущностями, например, временем с момента начала работы этого обработчика.

    Бонус из коробки - отсутствие delay как класс. В псевдокоде это выглядит примерно так:

    Код (C++):
    typedef enum {
        ssIdle,
        ssStartConfigGSM,
        ssSetGsmTextMode,
        ssMotorSunning,
       
    } SYSTEM_STATES;

    SYSTEM_STATES currentState;
    unsigned long motorStartTime;

    void setup()
    {
        currentState = ssStartConfigGSM;
        gprsSerial.begin(19200);
    }

    void loop()
    {
        switch(currentState)
        {
            case ssStartConfigGSM:
            {
                // начинаем настраивать GSM-модем
                gprsSerial.print("AT+CMGF=1\r"); // устанавливаем текстовый режим смс-сообщения
                currentState = ssSetGsmTextMode; // меняем состояние автомата
            }
            break;
           
            case ssSetGsmTextMode:
            {
                // проверяем - как только придёт от модема ответ OK - делаем следующую команду, меняем состояние автомата
                if(gprsSerial.find("OK"))
                {
                        currentState = ...;
                }
            }
            break;
           
            case ssIdle:
            {
                // система в режиме ничегонеделания
            }
            break;
           
            case ssMotorSunning:
            {
                // мотор был запущен, проверяем, сколько времени он работает
                if(millis() - motorStartTime > 10000) // 10 секунд - и гасим
                {
                    Motor.stop();
                    // переходим в режим ожидания
                    currentState = ssIdle;
                }
            }
            break;
        } // switch
       
        //проверяем на входящие SMS
        if(gprsSerial.find("+CMT"))
        {
            // пришло СМС, проверяем его текст, если надо - запускаем мотор
            if(sms == "ON")
            {
                if(!Motor.isRunning())
                {
                    Motor.start();
               
                    // меняем состояние системы
                    currentState = ssMotorSunning;
                    motorStartTime = millis();
                }
            }
            else if(sms == "OFF")
            {
                Motor.stop();
                currentState = ssIdle;
            }
        }
       
       

    }
    Ни одного delay, всё по факту прихода данных от модема и смены состояний системы. Это набросок, лишь для демонстрации.
     
  7. Mixailovsky

    Mixailovsky Нуб

    Зачем же все так усложнять???если мне всего лишь нужно сделать что бы функция void start() в моем коде отработала к примеру 10 мин и выключилась,а с модемом пока проблем не обнаружил,отправил на него уже наверное 300 смс и на каждую он отреагировал как нужно.Спасибо за ответ,но так далеко и глубоко мне рановато еще заходить,мне бы для начала разобраться с миллис а потом уже думать об автоматах и прочее.
     
  8. DIYMan

    DIYMan Guest

    Ну как знаете, я не настаиваю. Просто проходил уже многое, если вы считаете, что незачем усложнять - ок, значит незачем. На самом деле - усложняете вы, т.к. поддержание такого потенциального трупика в рабочем состоянии - та ещё задачка ;) Это вы просто ещё не столкнулись с зависимостями различными (плохой сигнал GSM и пр.). Вы даже готовность модема к работе не проверяете - о какой надёжности подобной прошивки можно говорить? ;) Но решать, конечно - вам.
     
  9. Mixailovsky

    Mixailovsky Нуб

    Так я не спорю что нужно расширять свои знания,но постепенно,если я сейчас столкнулся с данной проблемой в моем случае с миллис и не понимаю как это устроено и работает я имею ввиду ф-цию миллис так зачем сейчас забивать голову другим тем более модемом,у меня с ним на данном этапе вообще никаких проблем,а когда они будут тогда уже стоит решать и их,вы бы лучше обьяснили человеческим языком как работает миллис и как его применить в моем случае.
     
  10. ORLENOK

    ORLENOK Гик

    Как вариант, делаете переменную типа int время включения двигателя.
    При включении задаете ей текущее значение millis(), если я правильно помню, что делает эта функция.
    Далее в loop() делаете так:
    Сначала проверка, что не пришла команда, что нужно выключить двигатель.
    Потом проверка, что время выключения

    Код (C++):
    if((millis() - время включения) < 10(мин) * 60(сек/мин) *1000(миллисекунд/сек))
    {
    выключаем двигатель();
    }
    Вообще важно в какой последовательности делать проверки эти.
    Вам НЕ нужно делать всё в рамках одного loop(), иначе код будет очень громоздкий. Нужно при каждом вхождении в loop() делать нужные проверки.
    По сути это получается упрощённая версия состояний системы)
     
  11. DIYMan

    DIYMan Guest

    А шо там объяснять? millis возвращает время в миллисекундах с момента старта системы, тип возвращаемого значения - unsigned long, следовательно, надо не забывать о беззнаковой арифметике. Правильная проверка на истечение заданного интервала делается так:

    Код (C++):
    unsigned long startMotorTime; // время, когда запустили мотор

    //где-то в коде
    startMotorTime = millis(); // запомнили время запуска мотора
    Motor.start();

    // где-то в коде
    if(millis() - startMotorTime > 10000) // прошло 10 секунд с момента запуска потора
    {
    Motor.stop();
    }
    Вот и всё, собственно. На переполнение переменной раз в 50 с чем-то там дней - внимания не обращать, от слова ВООБЩЕ, ибо приведённый код корректно работает в ЛЮБОМ случае.
     
    Airbus нравится это.
  12. rkit

    rkit Гуру

    Именно что постепенно. А вы основ не освоили, а уже машиной управлять. Она у вас просто укатится с таким кодом.
     
    DIYMan нравится это.
  13. qwone

    qwone Гик

    Британские ученые выяснили, что если delay() заменть на millis(), то скетч нормально работать не будет. А после дополнительного финансирования они так же выяснили, что и обратная замена тоже не работает нормально.
     
    Unixon, 9xA59kK и DIYMan нравится это.
  14. DIYMan

    DIYMan Guest

    Вот и я о том же попытался донести. Впрочем, решать всё равно автору, каждый достоин своих граблей, щитаю. Возможно, ТС всё и так устроит, и не будет даже тени сомнения в надёжности работы приведённого кода. Я вот - сходу вижу, что там граблей понакидано - проще пролететь над ними, чем прошагать между, но ТС, опять же, устраивает, как идёт работа с модемом. Ну и пускай, ведь на форуме тоже надо иногда новых тем - и они появятся, обязательно ;): "что-то не работает" и т.п. На примере: начинать работу с модемом, не проверив его на AT+CPAS? - дичь. Не проверять результат обработки команд к модему - дичь. Не анализировать на вольтаж (в случае SIM800L он ругается на маленький и большой вольтаж в UART) - полудичь. Не следить за перезагрузкой модема - дичь в кубе, при первой его перезагрузке (по разным причинам) - настроечки режимов того - тю-тю...

    Вся эта дичь в один прекрасный момент приведёт к тому, что "почему-то не работает". И ведь это всё из личного опыта, кучи граблей и подводных камней, короче, как обычно - хочешь поделиться, чтоб как лучше, получается - как всегда :)

    Но про millis я ответил, есличо :)
     
  15. Mixailovsky

    Mixailovsky Нуб


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

    Код (C++):
    String numberSMS_1 = "+7888888"; // Номер абонента №1 для СМС (отличается только знаком +)
    String text_1 = "ENGINE START";    
    String text_2 = "ENGINE STOP";  
    String text_3 = "ENGINE NO START,RESTART";
    String text_4 = "ENGINE NO START";
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(2,3);


    unsigned long startTime; // время запуска

    byte engine=11;
    const int starter=12;
    byte generator=8;
    byte parking=7;

    char* adminNumber[]={"+79444444", "+7911333344331"};
    int8_t i;

                                   
    void setup()
    {
     
      digitalWrite(engine,!LOW); // выключаем ING 1
      digitalWrite(starter,!LOW); // выключаем STARTER
    //ВХОДЫ
      pinMode(engine,OUTPUT);  //зажигание
      pinMode(starter,OUTPUT);  //стартер
      //ВЫХОДЫ
      pinMode(generator,INPUT); //вход генератора
      pinMode(parking,INPUT); //вход положения селектора акпп
    Serial.begin(19200);
    gprsSerial.begin(19200);

    // настройка приема сообщений
    gprsSerial.print("AT+CMGF=1\r"); // устанавливаем текстовый режим смс-сообщения
    delay(500); //
    gprsSerial.print("AT+IFC=1, 1\r"); // устанавливаем программный контроль потоком передачи данных
    delay(500);
    gprsSerial.print("AT+CPBS=\"SM\"\r"); // открываем доступ к данным телефонной книги SIM-карты
    delay(500);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); // включает оповещение о новых сообщениях, новые сообщения приходят в следующем формате: +CMT: "<номер телефона>", "", "<дата, время>",
    //на следующей строчке с первого символа идёт содержимое сообщения
    delay(700);
      gprsSerial.println("AT+CLIP=1");        
      delay(300);                            
      gprsSerial.println("AT+CMGF=1");        
      delay(300);                            
      gprsSerial.println("AT+CSCS=\"GSM\"");  
      delay(300);                            
      gprsSerial.println("AT+CNMI=2,2,0,0,0");
      delay(300);  
    }
    String currStr = ""; // если эта строка сообщение,

    boolean isStringMessage = false; //  то ставим флаг на разрешение оброботки SMS

    /* Функция отправки SMS */
    void sendSMS(String text, String phone) {
      gprsSerial.println("AT+CMGS=\"" + phone + "\"");
      delay(500);
      gprsSerial.print(text);                        
      delay(500);
      gprsSerial.print((char)26);      
      delay(2500);
    }



    void loop()
    {
    if (!gprsSerial.available())// если не данных от модуля SIM800l, то дальше не идем.
    return;
    char currSymb = gprsSerial.read(); // записываем в переменую символы, которые получили от модуля.
     
    if ('\r' == currSymb) // если получили символ перевода коректи в начало строки, это означает что передача сообщения от модуля завершена.
    {
    if (isStringMessage)  // если текущая строка – сообщение, то…

    {
    if (!currStr.compareTo("On")) // если текст сообщения совпадает с "on",
    {
    //startMotorTime = millis(); // запомнили время запуска мотора        //      ПРОБЫВАЛ И СЮДа ВСТАВЛЯТЬ
    start();                
    }
    //----------------------------------------------------------------------------------------
      if (!currStr.compareTo("Off"))      // если текст сообщения совпадает с "off",
    {
    stop();          
    }
      isStringMessage = false;
    }
    else {
    if (currStr.startsWith("+CMT"))
    { // если текущая строка начинается с "+CMT", то следующая сообщение
     
       for (i = 0; i <= 1; i++)
       { // число 3 - это количество заданных тел.номеров.
         if (currStr.indexOf(adminNumber[i])) //сверяем номер с номером прешедним SMS
         {
          Serial.println(adminNumber[i]);
          isStringMessage = true;
          break;
         }
       }
      }
    }
    currStr = "";
    }
      else if ('\n' != currSymb) { //  игнорируем второй символ в последовательности переноса строки: \r\n , и
    currStr += String(currSymb); //дополняем текущую команду новым сиволом
    }
    }

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    void start()

    {
     
      digitalWrite(engine,LOW); // включаем ING 1
      delay(2000);
      digitalWrite(starter,LOW); // включаем STARTER
      delay(2000);
      if(digitalRead(generator)==1) //ЕСЛИ ДВИГАТЕЛЬ ЗАВЕЛСЯ
      {
        startMotorTime = millis(); // запомнили время запуска мотора
       digitalWrite(starter,!LOW); // выключаем STARTER
    }
    else                           //ЕСЛИ НЕТ
    {
    digitalWrite(starter,!LOW); // выключаем STARTER
    digitalWrite(engine,!LOW); // включаем зажигание
    }

    if(millis() - startMotorTime > 10000) // прошло 10 секунд с момента запуска mотора
    {
    stop();
    }
     
    }

    //delay(5000);                
    //{
    //digitalWrite(engine,!LOW); // выключаем ЗАЖИГАНИЕ
    //}
    //}
    //_____________________________________________________________________________________________________________________________________________________

    void stop()
    {
      digitalWrite(engine,!LOW); // выключаем ING 1
      digitalWrite(starter,!LOW); // выключаем STARTER
    }
     
     
  16. Mixailovsky

    Mixailovsky Нуб

    C чего она должна укатиться???даже если миллис переполнится через 50 дней ИЛИ ардуино сойдет с ума максимум что она сможет сделать это завести или заглушить авто,даже если она включит стартер и не выключит вообще его все-равно при запуске двигателя выключают мозги авто.Уехать невозможно и вреда нанести.
     
  17. Tomasina

    Tomasina Сушитель лампочек Модератор

    :eek:
     
    DIYMan нравится это.
  18. Mixailovsky

    Mixailovsky Нуб

    digitalWrite(engine,HIGH);
    Так Вас больше устраивает
     
  19. DIYMan

    DIYMan Guest

    Именно так, и только так. Потому как делать предположения о том, что скрывается за LOW и HIGH - мы не вправе, хотя там и банальные 0 и 1. А представьте теперь, что в LOW у нас значение 1, а в HIGH - 2 (т.е. они так определены)? Что сделает ваш код? ;)
     
  20. Unixon

    Unixon Оракул Модератор