Расшифровка скетча управления устройством через MQTT

xellow
Offline
Зарегистрирован: 12.03.2016

Добрый вечер. Есть готовый скетч - автозапуск авто через MQTT. Есть большое желание допилить "под себя".

Скетч выложу целиком. Суть вопроса: У автора есть возможность задавать время прогрева авто через Приложение Андроид. Задаётся строчкой(если я правильно понял) :

else if (at.indexOf("C5/settimer",4) > -1 )  {Timer = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}

где Timer - переменная времени прогрева

Я хочу, по аналогии, задавать температуру, при которой будет выполняться автозапуск.

Ввёл переменную Tmin, топики Settmin и tmin(по аналогии). Но вводимая переменная не сохраняется, а принимает другие значения. Я просто не понимаю, что такое +15 и +18 в строке кода указанной выше. 

Пробовал найти описание в нете, понял примерно смысл функции, но не до конца. Я так понимаю, что возвращает какую то часть массива String и преобразует его в переменную int. 

Огромная просьба подскажите как должна выглядеть эта строка для моей задачи. А лучше подскажите где это можно прочитать, более менее понятным языком? Далее весь код. Спасибо!

[code]
#include <SoftwareSerial.h>
#include <DallasTemperature.h>      // https://github.com/milesburton/Arduino-Temperature-Control-Library
SoftwareSerial SIM800(2, 3);                // для новых плат начиная с 5.3.0 пины RX,TX 
#define ONE_WIRE_BUS 4                     // пин датчика DS18B20, библиотека тут https://github.com/PaulStoffregen/OneWire
#define FIRST_P_Pin  8                     // на реле K1 на плате ПОТРЕБИТЕЛИ
#define SECOND_P     7                     // на реле К3 на плате ЗАЖИГАНИЕ
#define STARTER_Pin  6                     // на реле К2 на плате СТАРТЕР
#define Lock_Pin     12                      // на реле внешнее "заблокировать дверь-door loock"
#define Unlock_Pin   13                      // на реле внешнее на кнопку "разблокировать дверь"
#define Door_Out     10                      // на реле имитации открытия/закрытия двери для погашения света особенность КИА
#define STOP_Pin     11                     // вход блокировки запуска - ручник, нейтраль
#define CHARGE_Pin   5                     // вход наличие напряжения заряда АКБ
#define BAT_Pin      A0                    // внутри платы соединен с +12, через делитель напряжения 100кОм / 10 кОм
                     

OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);
/*  ----------------------------------------- НАСТРОЙКИ MQTT брокера---------------------------------------------------------   */
const char MQTT_user[10] = "---------";      // api.cloudmqtt.com > Details > User  
const char MQTT_pass[15] = "---------";  // api.cloudmqtt.com > Details > Password
const char MQTT_type[15] = "---------";        // тип протокола НЕ ТРОГАТЬ !
const char MQTT_CID[15] = "---------";        // уникальное имя устройства в сети MQTT
String MQTT_SERVER = "soldier.cloudmqtt.com";   // api.cloudmqtt.com > Details > Server  сервер MQTT брокера
String PORT = "------";                      // api.cloudmqtt.com > Details > Port    порт MQTT брокера НЕ SSL !
/*  ----------------------------------------- ИНДИВИДУАЛЬНЫЕ НАСТРОЙКИ !!!---------------------------------------------------------   */
String call_phone=  "+79-------";        // телефон входящего вызова  для управления DTMF
String APN = "internet.tele2.ru";             // точка доступа выхода в интернет вашего сотового оператора
String SMS_phone = "+7920----------";        // телефон куда отправляем СМС 
bool flag_avto = false;                    // флаг разрешения автозапуска по температуре 
bool SMS_send_volt = true;            // флаг разовой отправки СМС
bool SMS_send_temp = true;             // флаг разовой отправки СМС
bool SMS_send_Start = true;          // флаг разовой отправки СМС
bool SMS_send_Stop = false;          // флаг разовой отправки СМС

/*  ----------------------------------------- ДАЛЕЕ НЕ ТРОГАЕМ ---------------------------------------------------------------   */

String pin = "";                            // строковая переменная набираемого пинкода 
float TempDS[11];                           // массив хранения температуры c разных датчиков 
float Vbat,V_min;                           // переменная хранящая напряжение бортовой сети
float m = 22.5497204668743;                // делитель для перевода АЦП в вольты для резистров 100/10kOm
unsigned long Time1, Time2 = 0;
int Timer, inDS, count, error_CF, error_C, Tmin; //переменные
int interval = 4;                           // интервал отправки данных на сервер после загрузки ардуино
int ENGINE_START_MAX_TIME = 5;              //В секундах масимальное время работы стартера типично 3 -10 сек
bool heating = false;                       // переменная состояния режим прогрева двигателя
bool ring = false;                          // флаг момента снятия трубки
bool broker = false;                        // статус подклюлючения к брокеру
bool Security = false;                      // состояние охраны после подачи питания
bool Block = false;                         // состояние блокировки(ручник + нейтраль)
bool Avto_start = false;                    // статус разрешения запуска по температуре
bool Start_break = false;                   // статус 
//int Tmin = -25;                           // температура автостарта 

void setup()
 
{
  //analogReference(INTERNAL);
  pinMode(FIRST_P_Pin, OUTPUT);
  digitalWrite(FIRST_P_Pin, LOW);          
  pinMode(SECOND_P,    OUTPUT);
  digitalWrite(SECOND_P, LOW);           
  pinMode(STARTER_Pin, OUTPUT);
  digitalWrite(STARTER_Pin, LOW);          
  pinMode(Lock_Pin,    OUTPUT);
  digitalWrite(Lock_Pin, LOW);           
  pinMode(Unlock_Pin,  OUTPUT);
  digitalWrite(Unlock_Pin, LOW);          
  pinMode(Door_Out,    OUTPUT);
  digitalWrite(Door_Out, LOW);            
               
  
 
  delay(100); 
  Serial.begin(9600);                       //скорость порта
//  Serial.setTimeout(50);
  
  SIM800.begin(9600);                       //скорость связи с модемом
 // SIM800.setTimeout(500);                 // тайм аут ожидания ответа
  
  Serial.println("MQTT |13/11/2018"); 
  delay (1000);
  SIM800_reset();
 
              }



void loop() {

if (SIM800.available())  resp_modem();                                    // если что-то пришло от SIM800 в Ардуино отправляем для разбора
if (Serial.available())  resp_serial();                                    // если что-то пришло от Ардуино отправляем в SIM800
if (millis()> Time2 + 60000) {Time2 = millis(); 
if (Timer > 0 ) Timer--, Serial.print("Тм:"), Serial.println (Timer);}    // если (Timer > 0 ) Timer-- крутим в обратную сторону
                                               
if (millis()> Time1 + 10000) Time1 = millis(), detection();               // выполняем функцию detection () каждые 10 сек 
if (heating == true &&  digitalRead(STOP_Pin)==HIGH) heatingstop(), Start_break = true;                              // если вкл передача или отпущен ручник - глушим двигатель
if (heating == true &&  digitalRead(CHARGE_Pin)!=HIGH) heatingstop(), Start_break = true;

if (digitalRead(STOP_Pin)==LOW) 
 {Block = true;}       
 else
 {Block = false;}
}


void enginestart() 
{                                              // программа запуска двигателя
 Serial.println("E-start");
   Timer = 5;                                                     // устанавливаем таймер на 5 минут 
 
 if ((digitalRead(STOP_Pin) == LOW)&&(digitalRead(CHARGE_Pin) != HIGH)&& Start_break != true)
   {
    //int StTime  = map(TempDS[0], 20, -15, 2000, 5000);                // Задаем время работы стартера в зависимости т температуры
   //}
 // StTime = 1000;                                                // Жестко указываем время кручения стартером в милисекундах ! (0,001сек)
    //StTime = constrain(StTime, 2000, 6000);                        // ограничиваем нижний и верхний диапазон работы стартера от 0,7 до 6 сек. 
    //Serial.println("Еgnition. ON");
    digitalWrite(FIRST_P_Pin, HIGH),   delay (1000);              // включаем реле первого положения замка зажигания, ждем 1 сек.
    digitalWrite(SECOND_P,    HIGH),   delay (4000);              // включаем зажигание, и выжидаем 4 сек.
    
    //if (TempDS[0] < -20)                                          // если температура ниже -20 градусов, дополнителльно выключаем 
       //{digitalWrite(SECOND_P, LOW),   delay(2000);               // и снова включаем зажигание для прогрева свечей на дизелях
      // digitalWrite(SECOND_P, HIGH),   delay(8000);}
    
   if ((digitalRead(STOP_Pin) == LOW)&&(digitalRead(CHARGE_Pin) != HIGH));                            // если ручник поднят и двигатель не запущен
       {//Serial.println("ST. ON"); 
       digitalWrite(STARTER_Pin, HIGH);
       for (int secs=0; secs <= ENGINE_START_MAX_TIME ; secs++) // включаем стартер...
 {
      delay(1000); // и продолжаем его держать включенным 1 секунду
     if (digitalRead(CHARGE_Pin) != LOW) //если зарядка пошла то 
     break;  // прерываем цикл
 }
       //delay(StTime); 
       digitalWrite(STARTER_Pin, LOW);    // выключаем стартер
        //Serial.println("ST. OFF");      
        delay (1000);}            // ожидаем 1 секунду.
      
if (digitalRead(CHARGE_Pin) == HIGH)
{Serial.println ("START OK"), heating = true;
        flag_avto = true;
        /*SIM800.println("AT+CMGS=\""+SMS_phone+"\""), delay(100);
        if (heating == true && SMS_send_Start == true)  {SIM800.print("Engine START"), SMS_send_Start = false;}        
        SIM800.print((char)26);
        SMS_send_Stop = true;*/
        
} 
else heatingstop(), Start_break = true; // вырубаем всё и больше не заводим.

Serial.println ("OUT"), interval = 1;
        
//delay(3000), SIM800.println("ATH0");                            // вешаем трубку (для SIM800L) 
//attachInterrupt(1, callback, FALLING);                          // включаем прерывание на обратный звонок
 }
}

float VoltRead()    {                                             // замеряем напряжение на батарее и переводим значения в вольты
              float ADCC = analogRead(BAT_Pin);
                    ADCC = ADCC / m ;
                    Serial.print("АКБ: "), Serial.print(ADCC), Serial.println("V");    
                    if (ADCC < V_min) V_min = ADCC;                   
                    return(ADCC); }                  // переводим попугаи в вольты


void heatingstop() {                                // программа остановки прогрева двигателя
    digitalWrite(SECOND_P,    LOW), delay (100);
    digitalWrite(FIRST_P_Pin, LOW), delay (1000);
    //хлопнули дверью - свет погас, закрыли машину - особенность Sportage.
    digitalWrite(Door_Out, HIGH);   
    delay(1000); 
    digitalWrite(Door_Out, LOW);
    delay(1000);
    blocking(1);
        /*digitalWrite(Lock_Pin, HIGH);   //закрыли двери
        delay(1000); 
        digitalWrite(Lock_Pin, LOW);
        delay(1000);*/ 
      
    if (digitalRead(CHARGE_Pin) == LOW) //проверяем, что двигатель заглох
     {
        heating = false, Timer = 0;
        //Serial.println ("Engine Stop");
        SMS_send_Start = true; 
        //Start_break = false;               
    }
    /*if (heating == false && SMS_send_Stop == true)
    { 
        SIM800.println("AT+CMGS=\""+SMS_phone+"\""), delay(100);
        {SIM800.print("Engine Stop"), SMS_send_Stop = false;}       
        SIM800.print((char)26);} */   
}

void detection(){                                                 // условия проверяемые каждые 10 сек  
    
    Vbat = VoltRead(); // замеряем напряжение на батарее
    //разрешение СМС
     if (Vbat > 14.0) {SMS_send_volt = true;} 
     if (Vbat < 11.5 && SMS_send_volt == true)
     {
       SIM800.println("AT+CMGS=\""+SMS_phone+"\""), delay(100);               
       SIM800.print("Low battery"), SMS_send_volt = false;       
       SIM800.print((char)26); }
      
    Serial.print("Инт:"), Serial.println(interval);
    inDS = 0;
    sensors.requestTemperatures();                                // читаем температуру с трех датчиков
    while (inDS < 2){
          TempDS[inDS] = sensors.getTempCByIndex(inDS);           // читаем температуру
      if (TempDS[inDS] == -127.00){TempDS[inDS]= 80;
                                   break; }                       // пока не доберемся до неподключенного датчика
              inDS++;}
      
      //разрешение СМС
     if (TempDS[1] < 100 && TempDS[1] > 0) {SMS_send_temp = true;}                 //температура в рабочих пределах - сброс флага СМС

     //отправка СМС
     if ( TempDS[1] < -25 && TempDS[1] > -127 && SMS_send_temp == true)            //если темп меньше уставки отправка СМС
       {
        SIM800.println("AT+CMGS=\""+SMS_phone+"\""), delay(100);        
        SIM800.print("Low Temp"), SMS_send_temp = false;        
        SIM800.print((char)26); }
        
      if ( TempDS[0] > 100 && SMS_send_temp == true)                               //если темп больше уставки и отправка СМС
      {SIM800.println("AT+CMGS=\""+SMS_phone+"\""), delay(100);        
        SIM800.print("Peregrev"), SMS_send_temp = false;        
        SIM800.print((char)26);}
        
      if ( TempDS[1] <= Tmin && Avto_start == true && flag_avto == true && heating == false) //если темп меньше уставки и разрешён авто запуск
      {flag_avto = false;
        enginestart();}  
      
          
      for (int i=0; i < inDS; i++) Serial.print("Temp"), Serial.print(i), Serial.print("= "), Serial.println(TempDS[i]); 
    Serial.println ("");
    
    
    if (heating == true && Timer <1)    heatingstop();      // остановка прогрева если закончился отсчет таймера
    if (heating == true && TempDS[1] > 86)  heatingstop();   // остановить прогрев если температура выше 86 град
    interval--;
    if (interval <1) interval = 6, SIM800.println("AT+SAPBR=2,1"), delay (200);    // подключаемся к GPRS 
                      
}  

 
void resp_serial (){     // ---------------- ТРАНСЛИРУЕМ КОМАНДЫ из ПОРТА В МОДЕМ ----------------------------------
     String at = "";   
   while (Serial.available()) at = Serial.readString();
  int k = 0;
   while (Serial.available()) k = Serial.read(),at += char(k),delay(1);
     SIM800.println(at), at = "";   }   


void  MQTT_FloatPub (const char topic[15], float val, int x) {char st[10]; dtostrf(val,0, x, st), MQTT_PUB (topic, st);}

void MQTT_CONNECT () {
  SIM800.println("AT+CIPSEND"), delay (100);
     
  SIM800.write(0x10);                                                              // маркер пакета на установку соединения
  SIM800.write(strlen(MQTT_type)+strlen(MQTT_CID)+strlen(MQTT_user)+strlen(MQTT_pass)+12);
  SIM800.write((byte)0),SIM800.write(strlen(MQTT_type)),SIM800.write(MQTT_type);   // тип протокола
  SIM800.write(0x03), SIM800.write(0xC2),SIM800.write((byte)0),SIM800.write(0x3C); // просто так нужно
  SIM800.write((byte)0), SIM800.write(strlen(MQTT_CID)),  SIM800.write(MQTT_CID);  // MQTT  идентификатор устройства
  SIM800.write((byte)0), SIM800.write(strlen(MQTT_user)), SIM800.write(MQTT_user); // MQTT логин
  SIM800.write((byte)0), SIM800.write(strlen(MQTT_pass)), SIM800.write(MQTT_pass); // MQTT пароль

  MQTT_PUB ("C5/status", "Подключено");                                            // пакет публикации
  MQTT_SUB ("C5/comand");                                                          // пакет подписки на присылаемые команды
  MQTT_SUB ("C5/settimer");                                                        // пакет подписки на присылаемые значения таймера
  MQTT_SUB ("C5/settmin");                                                         // пакет подписки на присылаемые значения температуры автозапуска
  MQTT_SUB ("C5/block");                                                           // пакет подписки на присылаемые значения блокировки запуска
  MQTT_SUB ("C5/avto_start");                                                      // пакет подписки на присылаемые значения кнопки автозапуска
  SIM800.write(0x1A),  broker = true;    }                                         // маркер завершения пакета

void  MQTT_PUB (const char MQTT_topic[15], const char MQTT_messege[15]) {          // пакет на публикацию

  SIM800.write(0x30), SIM800.write(strlen(MQTT_topic)+strlen(MQTT_messege)+2);
  SIM800.write((byte)0), SIM800.write(strlen(MQTT_topic)), SIM800.write(MQTT_topic); // топик
  SIM800.write(MQTT_messege);   }                                                  // сообщение

void  MQTT_SUB (const char MQTT_topic[15]) {                                       // пакет подписки на топик
  
  SIM800.write(0x82), SIM800.write(strlen(MQTT_topic)+5);                          // сумма пакета 
  SIM800.write((byte)0), SIM800.write(0x01), SIM800.write((byte)0);                // просто так нужно
  SIM800.write(strlen(MQTT_topic)), SIM800.write(MQTT_topic);                      // топик
  SIM800.write((byte)0);  }                          

void resp_modem (){     //------------------ АНЛИЗИРУЕМ БУФЕР ВИРТУАЛЬНОГО ПОРТА МОДЕМА------------------------------
     String at = "";
 //    while (SIM800.available()) at = SIM800.readString();  // набиваем в переменную at
  int k = 0;
   while (SIM800.available()) k = SIM800.read(),at += char(k),delay(1);           
   Serial.println(at);  
 
      if (at.indexOf("+CLIP: \""+call_phone+"\",") > -1) {delay(200), SIM800.println("ATA"), ring = true;}
     
else if (at.indexOf("+DTMF: ")  > -1)        {String key = at.substring(at.indexOf("")+9, at.indexOf("")+10);
                                                     pin = pin + key;
                                                     if (pin.indexOf("*") > -1 ) pin= ""; }
else if (at.indexOf("SMS Ready") > -1 || at.indexOf("NO CARRIER") > -1 ) {SIM800.println("AT+CLIP=1;+DDET=1");} // Активируем АОН и декодер DTMF
/*  -------------------------------------- проверяем соеденеиние с ИНТЕРНЕТ, конектимся к серверу------------------------------------------------------- */
else if (at.indexOf("+SAPBR: 1,3") > -1)                                  {SIM800.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\""), delay(200);} 
else if (at.indexOf("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\r\nOK") > -1)    {SIM800.println("AT+SAPBR=3,1, \"APN\",\""+APN+"\""), delay (500); }
else if (at.indexOf("AT+SAPBR=3,1, \"APN\",\""+APN+"\"\r\r\nOK") > -1 )   {SIM800.println("AT+SAPBR=1,1"), interval = 2 ;} // устанавливаем соеденение   
else if (at.indexOf("+SAPBR: 1,1") > -1 )        {delay (200),  SIM800.println("AT+CIPSTART=\"TCP\",\""+MQTT_SERVER+"\",\""+PORT+"\""), delay (1000);}
else if (at.indexOf("CONNECT FAIL") > -1 )       {SIM800.println("AT+CFUN=1,1"), error_CF++, delay (1000), interval = 3 ;}  // костыль 1
else if (at.indexOf("CLOSED") > -1 )             {SIM800.println("AT+CFUN=1,1"), error_C++,  delay (1000), interval = 3 ;}  // костыль 2
else if (at.indexOf("+CME ERROR:") > -1 )        {error_CF++; if (error_CF > 5) {error_CF = 0, SIM800.println("AT+CFUN=1,1");}}   // костыль 4 
else if (at.indexOf("CONNECT OK") > -1)          {MQTT_CONNECT();}


else if (at.indexOf("+CIPGSMLOC: 0,") > -1   )   {String LOC = at.substring(26,35)+", "+at.substring(16,25);
                                                  SIM800.println("AT+CIPSEND"), delay (200);
                                                  MQTT_PUB ("C5/ussl", LOC.c_str()), SIM800.write(0x1A);} 
                                                  
else if (at.indexOf("+CUSD:") > -1   )           {String BALANS = at.substring(13, 26);
                                                  SIM800.println("AT+CIPSEND"), delay (200);
                                                  MQTT_PUB ("C5/ussd", BALANS.c_str()), SIM800.write(0x1A);} 
                                                  
else if (at.indexOf("+CSQ:") > -1   )            {String RSSI = at.substring(at.lastIndexOf(":")+1,at.lastIndexOf(","));  // +CSQ: 31,0
                                                  SIM800.println("AT+CIPSEND"), delay (200);
                                                  MQTT_PUB ("C5/rssi", RSSI.c_str()), SIM800.write(0x1A);} 
 
//else if (at.indexOf("ALREADY CONNECT") > -1)     {SIM800.println("AT+CIPSEND"), delay (200); 
else if (at.indexOf("AL") > -1)              {SIM800.println("AT+CIPSEND"), delay (200); // если не "влезает" "ALREADY CONNECT"
                                                  MQTT_FloatPub ("C5/ds0",      TempDS[0],2);
                                                  MQTT_FloatPub ("C5/ds1",      TempDS[1],2);
                                          //      MQTT_FloatPub ("C5/ds2",      TempDS[2],2);
                                          //      MQTT_FloatPub ("C5/ds3",      TempDS[3],2);
                                                  MQTT_FloatPub ("C5/vbat",     Vbat,2);
                                                  MQTT_FloatPub ("C5/timer",    Timer,0);
                                                  MQTT_FloatPub ("C5/tmin",     Tmin,0);
                                                  MQTT_PUB      ("C5/block",    Block ? "unlock" : "lock");
                                                  MQTT_FloatPub ("C5/block",    Block,0);
                                                  MQTT_PUB      ("C5/avto_start",    Avto_start ? "yes" : "no");
                                                  MQTT_FloatPub ("C5/avto_start",    Avto_start,0);
                                                  //MQTT_PUB("C5/security", digitalRead(A3) ? "lock1" : "lock0");
                                                  MQTT_PUB      ("C5/security", Security ? "lock1" : "lock0");
                                                  MQTT_PUB      ("C5/engine",   heating ? "start" : "stop");
                                                  MQTT_FloatPub ("C5/engine",   heating,0);
                                                  MQTT_FloatPub ("C5/uptime",   millis()/3600000,0); 
                                                  SIM800.write(0x1A);}
                     


else if (at.indexOf("C5/comandlock1",4) > -1 )      {blocking(1);}     // команда постановки на охрану     
else if (at.indexOf("C5/comandlock0",4) > -1 )      {blocking(0);}     // команда снятия с охраны 
else if (at.indexOf("C5/settimer",4) > -1 )         {Timer = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}
else if (at.indexOf("C5/settmin",4) > -1 )          {Tmin = at.substring(at.indexOf("")+18, at.indexOf("")+30).toInt();}
else if (at.indexOf("C5/comandbalans",4) > -1 )     {SIM800.println("AT+CUSD=1,\"*105#\""); }     // запрос баланса
else if (at.indexOf("C5/comandno",4) > -1 )         {Avto_start = false;}
else if (at.indexOf("C5/comandyes",4) > -1 )        {Avto_start = true, Tmin = -25;}
else if (at.indexOf("C5/comandrssi",4) > -1 )       {SIM800.println("AT+CSQ"); }                  // запрос уровня сигнала
else if (at.indexOf("C5/comandlocation",4) > -1 )   {SIM800.println("AT+CIPGSMLOC=1,1"); }        // запрос локации
else if (at.indexOf("C5/comandrelay6on",4) > -1 )   {Timer = 30, digitalWrite(13, HIGH), heating = true; }      //  включение реле K6
else if (at.indexOf("C5/comandstop",4) > -1 )       {heatingstop(); }     // команда остановки прогрева
else if (at.indexOf("C5/comandstart",4) > -1 )      {enginestart(), Start_break = false; }     // команда запуска прогрева
else if (at.indexOf("C5/comandRefresh",4) > -1 )    {// Serial.println ("Команда обновления");
                                                          SIM800.println("AT+CIPSEND"), delay (200);  
                                                          MQTT_FloatPub ("C5/ds0",      TempDS[0],2);
                                                          MQTT_FloatPub ("C5/ds1",      TempDS[1],2);
                                                  //      MQTT_FloatPub ("C5/ds2",      TempDS[2],2);
                                                  //      MQTT_FloatPub ("C5/ds3",      TempDS[3],2);
                                                          MQTT_FloatPub ("C5/vbat",     Vbat,2);
                                                          MQTT_FloatPub ("C5/timer",    Timer,0);
                                                          MQTT_FloatPub ("C5/tmin",     Tmin,0);
                                                          MQTT_PUB      ("C5/block",    Block ? "unlock" : "lock");
                                                          MQTT_PUB      ("C5/avto_start",    Avto_start ? "yes" : "no");
                                                          MQTT_PUB      ("C5/security", Security ? "lock1" : "lock0");
                                                          MQTT_PUB      ("C5/engine",   heating ? "start" : "stop");
                                                          MQTT_FloatPub ("C5/C", error_C,0);
                                                          MQTT_FloatPub ("C5/CF", error_CF,0); 
                                                          MQTT_FloatPub ("C5/uptime",   millis()/3600000,0); 
                                                          SIM800.write(0x1A); 
                                                          interval = 6; // швырнуть данные на сервер и ждать 60 сек
            
   at = "";      }                                                  // Возвращаем ответ модема в монитор порта , очищаем переменную

       if (pin.indexOf("123") > -1 ){ pin= "", enginestart(), Start_break == false;} 
  else if (pin.indexOf("777") > -1 ){ pin= "", SIM800.println("AT+CFUN=1,1");}           // костыль 3
  else if (pin.indexOf("789") > -1 ){ pin= "", delay(1500), SIM800.println("ATH0"),heatingstop();} 
  else if (pin.indexOf("#")   > -1 ){ pin= "", SIM800.println("ATH0");}
                              
 } 

//void blocking (bool st) {digitalWrite(Lock_Pin, st ? HIGH : LOW), Security = st, Serial.println(st ? "На охране":"Открыто");} // функция удержания реле блокировки/разблокировки на выходе out4
 
// функция дергания реле блокировки/разблокировки дверей с паузой "удержания кнопки" в 0,5 сек.
void blocking (bool st) {digitalWrite(st ? Lock_Pin : Unlock_Pin, HIGH), delay(500), digitalWrite(st ? Lock_Pin : Unlock_Pin, LOW), Security = st, Serial.println(st ? "На охране":"Открыто");}
void SIM800_reset() {SIM800.println("AT+CFUN=1,1");}                        // перезагрузка модема 
void callback()     {SIM800.println("ATD"+call_phone+";"),    delay(3000);} // обратный звонок при появлении напряжения на входе IN1
[/code]

 

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

Я что то не так сделал? 

Код автор выложил для открытого пользования на массе ресурсов...

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

xellow пишет:

Я что то не так сделал? 

Ничего. Вы вообще ничего не сделали ни "так", ни "не так". Это просто рассуждения о стилистике форума.

xellow
Offline
Зарегистрирован: 12.03.2016

Ничего не понял.. Вы о чём? 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

xellow пишет:

Скетч выложу целиком. Суть вопроса: У автора есть возможность задавать время прогрева авто через Приложение Андроид. Задаётся строчкой(если я правильно понял) :

else if (at.indexOf("C5/settimer",4) > -1 )  {Timer = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}

где Timer - переменная времени прогрева

Уважаемый!

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

Обратитесь к создателю программы и, если на то будет его воля, он Вам поможет.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Ну крутой скетч...че...одних delay куча, в loop проверяется ну прям все....машина взлетит, не остановить.

xellow
Offline
Зарегистрирован: 12.03.2016

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

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

Как мне представлялось форум, как раз то место где задаются вопросы и иногда получают на них ответы.

Между прочим название ветки имеет форума имеет недвусмысленный намёк, что профи вопросы здесь задавать и не должны.

 

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

А зачем 400 строк и даже не свёрнутых под спойлер? Вопрос ведь к одной? Их даже просто промотать проблема. 

А на счёт substring. Вы должны точно знать с какого по какой символ содержится число с температурой в запросе и только его  переводить в переменную. 

 

b707
Offline
Зарегистрирован: 26.05.2017

xellow пишет:

Как мне представлялось форум, как раз то место где задаются вопросы и иногда получают на них ответы.

 

в том то и дело, что "иногда". Для этого вопрос должен быть понятно и грамотно сформулирован. что явно не про ваш случай

xellow
Offline
Зарегистрирован: 12.03.2016

Код я не свернул по незнанию.. строчку указал сразу, что бы не листать код. Не частый я здесь гость...

"А на счёт substring. Вы должны точно знать с какого по какой символ содержится число с температурой в запросе и только его  переводить в переменную. "

Это я примерно и предполагал..но вот только как это определить не могу понять.. Это как то можно увидеть?

Может есть ссылка где почитать? 

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

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

b707
Offline
Зарегистрирован: 26.05.2017

xellow пишет:

Может есть ссылка где почитать? 

ни в какой ссылке вы этого не найдете - для этого надо видеть конкретно ваш запрос MQTt

xellow
Offline
Зарегистрирован: 12.03.2016

Этот запрос я могу увидеть на MQTT брокере?

MaksVV
Offline
Зарегистрирован: 06.08.2015

 Полагаю название топика нужно сделать с таким же количеством символов. и сделайте скриншот настроек кнопки установки температуры в программе MQTT Dash в смартфоне.

else if (at.indexOf("C5/settimer",4) > -1 )         {Timer = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}

типа так:

else if (at.indexOf("C5/settmin_",4) > -1 )          {Tmin = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}

MaksVV
Offline
Зарегистрирован: 06.08.2015

да в брокере запрос можно увидеть тут 

b707
Offline
Зарегистрирован: 26.05.2017

MaksVV пишет:

 Полагаю название топика нужно сделать с таким же количеством символов

почему с таким же??? а что, параметры функции substring нам недоступны? мы их подстроить под другую строку не сможем? :)))

MaksVV
Offline
Зарегистрирован: 06.08.2015

а зачем? ТСу так будет проще

xellow
Offline
Зарегистрирован: 12.03.2016

Я так и сделал.



else if (at.indexOf("C5/comandlock1",4) > -1 )      {blocking(1);}     // команда постановки на охрану     
else if (at.indexOf("C5/comandlock0",4) > -1 )      {blocking(0);}     // команда снятия с охраны 
else if (at.indexOf("C5/settimer",4) > -1 )         {Timer = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}
else if (at.indexOf("C5/settmin",4) > -1 )          {Tmin = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}
else if (at.indexOf("C5/comandbalans",4) > -1 )     {SIM800.println("AT+CUSD=1,\"*105#\""); }     // запрос баланса
else if (at.indexOf("C5/comandno",4) > -1 )         {Avto_start = false;}
else if (at.indexOf("C5/comandyes",4) > -1 )        {Avto_start = true;}
else if (at.indexOf("C5/comandrssi",4) > -1 )       {SIM800.println("AT+CSQ"); }                  // запрос уровня сигнала
else if (at.indexOf("C5/comandlocation",4) > -1 )   {SIM800.println("AT+CIPGSMLOC=1,1"); }        // запрос локации
else if (at.indexOf("C5/comandrelay6on",4) > -1 )   {Timer = 30, digitalWrite(13, HIGH), heating = true; }      //  включение реле K6
else if (at.indexOf("C5/comandstop",4) > -1 )       {heatingstop(); }     // команда остановки прогрева
else if (at.indexOf("C5/comandstart",4) > -1 )      {enginestart(), Start_break = false; }     // команда запуска прогрева
else if (at.indexOf("C5/comandRefresh",4) > -1 )    {// Serial.println ("Команда обновления");

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

и где настройки кнопки?

xellow
Offline
Зарегистрирован: 12.03.2016

  

MaksVV
Offline
Зарегистрирован: 06.08.2015

крупнее топики не видно ж нифига, и показать какой именно топик появляется при нажатии кнопки настройки вашей температуры, остальные то нафига тут

xellow
Offline
Зарегистрирован: 12.03.2016

MaksVV
Offline
Зарегистрирован: 06.08.2015

xellow пишет:

Я так и сделал.



else if (at.indexOf("C5/settmin",4) > -1 )          {Tmin = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}

смотрим разницу: 

 

MaksVV пишет:

 Полагаю название топика нужно сделать с таким же количеством символов. и сделайте скриншот настроек кнопки установки температуры в программе MQTT Dash в смартфоне.

else if (at.indexOf("C5/settmin_",4) > -1 )          {Tmin = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}

xellow
Offline
Зарегистрирован: 12.03.2016

 ок счас сделаю..

xellow
Offline
Зарегистрирован: 12.03.2016

xellow
Offline
Зарегистрирован: 12.03.2016

Вот настройки кнопки времени прогрева - от автора

MaksVV
Offline
Зарегистрирован: 06.08.2015

да это понятно. У вас топик в принципе от смартфона правильно доходит. Как вы определяете что переменная не поменяла значение? 

и ещё 

xellow пишет:

Я так и сделал.



else if (at.indexOf("C5/settmin",4) > -1 )          {Tmin = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}

у вас в скетче в 0 сообщении другая строка:  

else if (at.indexOf("C5/settmin",4) > -1 )          {Tmin = at.substring(at.indexOf("")+18, at.indexOf("")+30).toInt();}

 
xellow
Offline
Зарегистрирован: 12.03.2016

У автора установка значения идёт через топик SETTIMER, а после этого приходит значение TIMER от ардуины.

У меня SETTMIN приходит с заданным значением, а Tmin отрицательные значения возвращает с плюсом, а положительные без десятков(т.е. вводил 25 пришло 5)

xellow
Offline
Зарегистрирован: 12.03.2016

первый пост - это эксперименты..

MaksVV
Offline
Зарегистрирован: 06.08.2015

а результат из поста #23? 

MaksVV
Offline
Зарегистрирован: 06.08.2015

вставить так и выложить сюда что в сериал выводится 

else if (at.indexOf("C5/settmin_",4) > -1 )  {Serial.println (at); Tmin = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}

 

 

xellow
Offline
Зарегистрирован: 12.03.2016

Ок. Сделаю отпишусь. Спасибо за помощь! Если не против продолжим завтра)

MaksVV
Offline
Зарегистрирован: 06.08.2015

только впредь указывать какая строка парсинга используется в программе, когда вот это проявляется.

xellow пишет:
У меня SETTMIN приходит с заданным значением, а Tmin отрицательные значения возвращает с плюсом, а положительные без десятков(т.е. вводил 25 пришло 5)

 

там изменить то одну цифру надо. 

xellow
Offline
Зарегистрирован: 12.03.2016

ДА я теперь то же понял!))) Но сам бы не допёр, где эти символы считать))) Ещё раз СПАСИБО!

MaksVV
Offline
Зарегистрирован: 06.08.2015

ЕвгенийП пишет:
...Это просто рассуждения о стилистике форума.

да уж, к сожалению классика жанра, 30 постов набили по решению проблемы по скетчу, а оказывается

xellow пишет:

первый пост - это эксперименты..

 

xellow
Offline
Зарегистрирован: 12.03.2016

Блин я просто мозг сломал. пробовал разные варианты....ну и скопировал не ту версию..

Я же сразу спросил что означают +15 и +18. Извиняйте ))

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

xellow пишет:
Напрягать автора, воспоминаниями о том, что он делал несколько лет назад мне не кажется уместным.
Правильно. Напрягать нас воспоминаниями о том, что мы никогда не делали, кажется гораздо более уместным.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Видимо не знал да еще и забыл лучше , чем просто забыл.