Вопрос про МИЛЛИС()

mixailovsky
Offline
Зарегистрирован: 23.08.2017

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

String numberSMS_1 = "+79111310441"; // Номер абонента №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;
byte starter=12;
byte generator=8;
byte parking=7;

char* adminNumber[]={"+79111310441", "+79111310441"};
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); // выключаем ING 1
  digitalWrite(starter,!LOW); // выключаем STARTER
}

 

mixailovsky
Offline
Зарегистрирован: 23.08.2017

Строка 139 кода

nik182
Offline
Зарегистрирован: 04.05.2015

Найдите blink without delay.

mixailovsky
Offline
Зарегистрирован: 23.08.2017

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

mixailovsky
Offline
Зарегистрирован: 23.08.2017

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

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
}

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Разбирайтесь, как Ваша программа работает. Вот прямо идите по тексту от строчки к строчке и вникайте, что, зачем и в каком случае выполняется. Сейчас Вы время проверяете только один единственный раз. Получили нужную смс, что-то сделали, посмотрели не пора ли сделать следующее действие, не пора? - ну и ладно. Всё, дальше ждёте СМС. Про время забыли. На время-то надо глядеть постоянно, а что у Вас постоянно выполняется - цикл loop! Вас же посылали изучать Мигаем светодиодом без delay(). Изучили плохо. Обратите внимание где в примере расположена проверка прошедшего времени и на комментарий "здесь будет код, который будет работать постоянно". У Вас постоянно работающий код это получение и разбор СМС. 

Проникайтесь и попробуйте ещё раз переделать Ваш скетч. Сейчас Вы непонятный Вам кусок кода скопипастили не думая куда попало, в другой непонятный Вам код. Всё работает правильно, а то, что не так как Вам хотелось - неудивительно.

mixailovsky
Offline
Зарегистрирован: 23.08.2017

Так обьясните нормально если хотите помочь,то что отправили смотреть как диодики моргают так они и у меня моргают,так смотрю уже целую неделю,глаза закрываю а они все моргают),не понимаю я как этот миллис работает и тем более как его применить в моем случае и куда вставить в коде,а обьяснить толком никто не может,скетч переписать-зачем мне его переписывать???если к примеру с delay он работает.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

millis() - это просто количество миллисекунд от включения питания ардуино. Часы на башне видели? - вот это тоже самое.

Если не понятно - в дворники,там с IQ 70 можно нормально зарабатывать.

mixailovsky
Offline
Зарегистрирован: 23.08.2017

Спасибо,желаю вам всего хорошего.

mixailovsky
Offline
Зарегистрирован: 23.08.2017

Такие все умные но никто обьяснить не может.

bwn
Offline
Зарегистрирован: 25.08.2014

mixailovsky пишет:

Так обьясните нормально если хотите помочь,то что отправили смотреть как диодики моргают так они и у меня моргают,так смотрю уже целую неделю,глаза закрываю а они все моргают),не понимаю я как этот миллис работает и тем более как его применить в моем случае и куда вставить в коде,а обьяснить толком никто не может,скетч переписать-зачем мне его переписывать???если к примеру с delay он работает.

Епст, если с делаями все устраивает, зачем вопрошать о миллис? 
Если хочешь все таки понять с миллис, скопипасти сюда код мигания без делей и потом построчно расскажи, что он делает с твоей точки зрения (своими словами). Где неверные выводы, поправим.

nik182
Offline
Зарегистрирован: 04.05.2015

На моей памяти на форуме объясняли множество раз. Почитайте форум. Просто в лом писать еще раз. Всё должно быть так же, как если бы это делали сами глядя на цифровые часы, миллис это текущее время. Опишите все действия для себя, а потом в программе.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mixailovsky пишет:

В програмировании новичек.

Вот, знаете, как Вы (и остальные новички) не можете понять простую вещь по поводу этой фразы? Вы пришли в некое сообщество. Будьте интереснм этому сообществу и люди к Вам потянтуся. А попытка поставить себя в привилегированное положение на таком стрёмном основании, ничего акромя батхерта не порождает.

Вот Вы хотите понять миллис. Но программа в 150 строк слишком сложна для отработки на ней понимания миллис. Вам дали ОТЛИЧНЫЙ совет

bwn пишет:

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

Сделайте это и Вам помогут. Это работа. Если же Вы не хотите работать, а хотите качать права типа 

mixailovsky пишет:

В програмировании новичек.

Такие все умные но никто обьяснить не может.

то, помочь Вам смогут только вот на этом сайте.

mixailovsky
Offline
Зарегистрирован: 23.08.2017

УВАЖАЕМЫЙ Евгений у вас правильный аватар

mixailovsky
Offline
Зарегистрирован: 23.08.2017

bwn пишет:

mixailovsky пишет:

Так обьясните нормально если хотите помочь,то что отправили смотреть как диодики моргают так они и у меня моргают,так смотрю уже целую неделю,глаза закрываю а они все моргают),не понимаю я как этот миллис работает и тем более как его применить в моем случае и куда вставить в коде,а обьяснить толком никто не может,скетч переписать-зачем мне его переписывать???если к примеру с delay он работает.

Епст, если с делаями все устраивает, зачем вопрошать о миллис? 
Если хочешь все таки понять с миллис, скопипасти сюда код мигания без делей и потом построчно расскажи, что он делает с твоей точки зрения (своими словами). Где неверные выводы, поправим.

Смотрите,это будет автозапуск,скетч на данный момент упрощен для того чтобы не путать Вас с лишней информацией,на данный момент будет работать так-при получении смс с текстом "On" переходим к функции void start (строка 124)  в ней включаем зажигание,ждем пару секунд,включаем стартер на пару секунд,считываем пришел ли положительный сигнал со стартера(если нет то выключаем зажигание) если да то (вот здесь если вставляем delay,строка 139 в первом сообщении) через заданное время например через 10 минут выключаем зажигание (а мне нужно сюда вставить миллис для того что бы если мне нужно заглушить авто раньше я мог сделать это и для того что будет еще одно условие,что если во время прогрева(void start() ) автомобиль будет снят с Parking или нажата педаль тормоза то он будет заглушен ( void stop() )  .А delay не устраивает потому-что смогу сделать прогрев 10 минут(к примеру)но не смогу в это время контролировать Parking и нажатие педали тормоза(это для того что бы если к примеру машина работает на автозапуске,кто-то захочет на ней уехать сняв с Parking или нажав педаль тормоза она глохла).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mixailovsky пишет:

УВАЖАЕМЫЙ Евгений у вас правильный аватар

Спасибо. Я тоже так считаю.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

mixailovsky пишет:

А вам даже сказать нечего,с Вами все и так ясно...

всё, что я мог сказать о миллис - сказано здесь:

класс титановый велосипед для тактовой кнопки.

класс титановый велосипед StopWatch.

класс титановый велосипед для delay без delay().

больше мне сказать нечего. :D

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Дорогой гость! Тут сто раз разбирали этот самый, *************** тобой невесть откуда, скетч автозапуска. И сто раз помогали переделывать его в неблокирующую форму (то есть без делеев). Ты просто та соломинка, которая переломила спину верблюду.

- Вот понимаешь? - не повезло именно тебе. Ты оказался тем, кто всех ***************! ;)

Тебе предложили вариант - действительно учиться. Не скажу за других, но тут есть очень грамотные програмисты с серьезным педагогическим опытом. Это и я, уж простите мою скромность, и, конечно, ЕвгенийП, и еще люди. Тебе сказали с чего начинать: с попытки понять как именно работает "блинк без делей". Ты решил *************** на тему того, что тебе, в твоих влажных фантазиях, кто-то, что-то должен (объяснять?). Твой выбор. Не разделяю, но уважаю...Хотя вру, нет, не уважаю.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Мне тоже такие новички нравяца.

Приходит такой, школьнег, в больницу с другом, пристает к первому попавшемуся в коридоре санитару, научи меня вотпрямщажже аппендицит вырезать, я вот тут скальпель на помойке нашол, а у друга живот болит, вырезать хочу, может поможет.  А учиться не, не хочу, это же 6 лет надо, да трупы в анатомичке препарировать, не мое это.  Вы мне вот щаспрям лучше тут обьясните как скальпелем тыкать, да размахивать, и всё у меня получится, я же умненький, и друга спасу, а то пиво пить не с кем.   Примерно так же и здесь, "Памагити, чота спёр, а у ей внутре неонка не горить, ааааааа, чо делать?!!!" 

Печалит, что у 90% нынешних жертв ЕГЭ, интеллекта гораздо меньше чем оптимизма на лицах персонажей картин Иеронима Босха. Увы. 

bwn
Offline
Зарегистрирован: 25.08.2014

mixailovsky пишет:

bwn пишет:

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

Смотрите,это будет автозапуск,скетч на данный момент упрощен для того чтобы не путать Вас с лишней информацией,на данный момент будет работать так-при получении смс с текстом "On" переходим к функции void start (строка 124)  в ней включаем зажигание,ждем пару секунд,включаем стартер на пару секунд,считываем пришел ли положительный сигнал со стартера(если нет то выключаем зажигание) если да то (вот здесь если вставляем delay,строка 139 в первом сообщении) через заданное время например через 10 минут выключаем зажигание (а мне нужно сюда вставить миллис для того что бы если мне нужно заглушить авто раньше я мог сделать это и для того что будет еще одно условие,что если во время прогрева(void start() ) автомобиль будет снят с Parking или нажата педаль тормоза то он будет заглушен ( void stop() )  .А delay не устраивает потому-что смогу сделать прогрев 10 минут(к примеру)но не смогу в это время контролировать Parking и нажатие педали тормоза(это для того что бы если к примеру машина работает на автозапуске,кто-то захочет на ней уехать сняв с Parking или нажав педаль тормоза она глохла).

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

mixailovsky
Offline
Зарегистрирован: 23.08.2017

Клапауций 112 пишет:

mixailovsky пишет:

А вам даже сказать нечего,с Вами все и так ясно...

всё, что я мог сказать о миллис - сказано здесь:

класс титановый велосипед для тактовой кнопки.

класс титановый велосипед StopWatch.

класс титановый велосипед для delay без delay().

больше мне сказать нечего. :D

Спасибо попробую разобраться.

mixailovsky
Offline
Зарегистрирован: 23.08.2017

Всем спасибо за приятное общение.Тема закрыта.