Расшифровка скетча управления устройством через MQTT
- Войдите на сайт для отправки комментариев
Добрый вечер. Есть готовый скетч - автозапуск авто через 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]
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/ne-kompiliruetsya-kod#comment-487301
Я что то не так сделал?
Код автор выложил для открытого пользования на массе ресурсов...
Я что то не так сделал?
Ничего. Вы вообще ничего не сделали ни "так", ни "не так". Это просто рассуждения о стилистике форума.
Ничего не понял.. Вы о чём?
Скетч выложу целиком. Суть вопроса: У автора есть возможность задавать время прогрева авто через Приложение Андроид. Задаётся строчкой(если я правильно понял) :
else if (at.indexOf("C5/settimer",4) > -1 ) {Timer = at.substring(at.indexOf("")+15, at.indexOf("")+18).toInt();}
где Timer - переменная времени прогрева
Уважаемый!
Вы скопирастили программу в почти 400 строк, но Вам лениво в ней разобраться. Неужели Вы думаете, что тут найдется идиот, который будет ее читать? Вы не задавались таким простым вопросом?
Обратитесь к создателю программы и, если на то будет его воля, он Вам поможет.
Ну крутой скетч...че...одних delay куча, в loop проверяется ну прям все....машина взлетит, не остановить.
Уважаемые, со скетчем проблем нет, он прекрасно работает. Я интересовался одной лишь строкой из этого скетча.
Большая часть кода мне вполне понятна. Напрягать автора, воспоминаниями о том, что он делал несколько лет назад мне не кажется уместным.
Как мне представлялось форум, как раз то место где задаются вопросы и иногда получают на них ответы.
Между прочим название ветки имеет форума имеет недвусмысленный намёк, что профи вопросы здесь задавать и не должны.
А зачем 400 строк и даже не свёрнутых под спойлер? Вопрос ведь к одной? Их даже просто промотать проблема.
А на счёт substring. Вы должны точно знать с какого по какой символ содержится число с температурой в запросе и только его переводить в переменную.
Как мне представлялось форум, как раз то место где задаются вопросы и иногда получают на них ответы.
в том то и дело, что "иногда". Для этого вопрос должен быть понятно и грамотно сформулирован. что явно не про ваш случай
Код я не свернул по незнанию.. строчку указал сразу, что бы не листать код. Не частый я здесь гость...
"А на счёт substring. Вы должны точно знать с какого по какой символ содержится число с температурой в запросе и только его переводить в переменную. "
Это я примерно и предполагал..но вот только как это определить не могу понять.. Это как то можно увидеть?
Может есть ссылка где почитать?
Вариантов много. Начиная от того что Вы должны знать эту строку, до, вывести строку и посчитать пальцем.
Может есть ссылка где почитать?
ни в какой ссылке вы этого не найдете - для этого надо видеть конкретно ваш запрос MQTt
Этот запрос я могу увидеть на MQTT брокере?
Полагаю название топика нужно сделать с таким же количеством символов. и сделайте скриншот настроек кнопки установки температуры в программе 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();}
да в брокере запрос можно увидеть тут
Полагаю название топика нужно сделать с таким же количеством символов
почему с таким же??? а что, параметры функции substring нам недоступны? мы их подстроить под другую строку не сможем? :)))
а зачем? ТСу так будет проще
Я так и сделал.
и где настройки кнопки?
крупнее топики не видно ж нифига, и показать какой именно топик появляется при нажатии кнопки настройки вашей температуры, остальные то нафига тут
Я так и сделал.
смотрим разницу:
Полагаю название топика нужно сделать с таким же количеством символов. и сделайте скриншот настроек кнопки установки температуры в программе MQTT Dash в смартфоне.
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();}
У автора установка значения идёт через топик SETTIMER, а после этого приходит значение TIMER от ардуины.
У меня SETTMIN приходит с заданным значением, а Tmin отрицательные значения возвращает с плюсом, а положительные без десятков(т.е. вводил 25 пришло 5)
первый пост - это эксперименты..
а результат из поста #23?
вставить так и выложить сюда что в сериал выводится
Ок. Сделаю отпишусь. Спасибо за помощь! Если не против продолжим завтра)
только впредь указывать какая строка парсинга используется в программе, когда вот это проявляется.
там изменить то одну цифру надо.
ДА я теперь то же понял!))) Но сам бы не допёр, где эти символы считать))) Ещё раз СПАСИБО!
да уж, к сожалению классика жанра, 30 постов набили по решению проблемы по скетчу, а оказывается
первый пост - это эксперименты..
Блин я просто мозг сломал. пробовал разные варианты....ну и скопировал не ту версию..
Я же сразу спросил что означают +15 и +18. Извиняйте ))
Видимо не знал да еще и забыл лучше , чем просто забыл.