Страница 1 из 1

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

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

Код: Выделить всё

String numberSMS_1 = "+7911777777";
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[]={"+79111777048", "+7911177777"};
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
}

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

Добавлено: 17 сен 2017, 15:22
MIXAILOVSKY
Не разобрался как правильно вставить код

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

Добавлено: 17 сен 2017, 23:19
Эдуард
Здравствуйте!

С помощью функции millis() реализуется отсчет времени параллельным процессом, т.е. программа не зависает, как при использовании delay().

millis() возвращает время (в мс), с момента запуска контроллера. Для отработки временного интервала необходимо в начале отсчета считать функцией millis() текущее время. Затем периодически считывать время этой функцией, проверяя, не достигло ли оно требуемого значения (значение считанного в начале отсчета + требуемое время интервала). В промежутках между проверками текущего времени программа может заниматься другими задачами.

В вашем случае надо менять структуру программы. Например, в функции start надо взводить флаг – выключить зажигание через 10 минут. Также в этой функции надо считать текущее время функцией millis() и сохранить его в переменной. А в основном цикле loop() должен периодически вызываться программный блок, который проверяет, не достигло ли значение millis() 10 минут (относительно значению сохраненного в функции start) и выключать зажигание.

Могут быть другие способы реализации временных интервалов. Посмотрите урок 17 на сайте.

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

Добавлено: 08 мар 2018, 11:07
Pavlo
Здравствуйте
скажите пожалуйста как заменить millis на delay
то есть
digitalWrite(..........);
delay(...);
DigitalWrite(..........);
delay(...);
digitalWrite(..........);
delay(...);
DigitalWrite(..........);
В сей программе вместо делей написать миллис