Пытаюсь с телефона ввести произвольные цифровые значения. ЕSP в мониторе порта пишет всякую дрянь отличную от той, что я ввожу. Не понимаю как изменить код. Задача стоит в изменении гистерезисов в температурных данных. Прошу помочь глубокоуважаемое сообщество, объяснить, что делаю не так. Кусок кода: Вставьте код по правилам форума!
а я как раз думаю. что он пишет вам именно то. что вы вводите. приведите для примера, что вы пытаетесь передавать и что вам печатает строка t_Gist_1 = ?
Что, в вашем понимании, должны вывести строки:? Код (C++): Serial.print((char)payload, DEC); t_Gist_1 == (char)payload[0]; Serial.println(t_Gist_1); Сколько тут ошибок?
мне двузначные числа нужны. К примеру, ввел "25" в телефоне, должны прилететь цифры "25", ну и так далее...Я не программист по образованию, вникать приходится сходу, по примерам. Поэтому прошу понять и простить))....Скрины приходящих непонятных значений завтра кину, сборка на работе. В монитор прилетают 4х значные цифры, две из которых сохраняются в EEPROM. Что не так с кодом?
Для начала вставьте код правильно в первое сообщение. Напишите, как и какими топиками отправляете данные с телефона.
так все правильно. Те "25", что вы отправляете - это не число 25, а два символа, '2' и '5', У каждого из этих символов двухзначный код ASCII - у двойки 50, у пятерки - 53. Вот и получается, что вы ввели "25". а на выходе получили 5053 нужно обрабатывать приходящие значения как строчки и сначала преобразовывать их в числа, а уже потом использовать в программе и писать в ЕЕПРОМ
Покажете примером как это преобразовывается? То, что это ASCII я догнал. Принцип преобразования не очень понятен.
Еще раз: Вставьте код в соответствии с правилами форума, смотрите пункт "4 - Вставка кода" Правила здесь
Код (C++): #include <EEPROM.h> #include <ESP8266WiFi.h> #include <PubSubClient.h> #include <OneWire.h> #include <DallasTemperature.h> #include <ESP8266WebServer.h> #include <ESP8266HTTPUpdateServer.h> #define RELAY1 16 //обогрев #define RELAY2 14 //насос #define RELAY3 12 //компрессор #define RELAY4 13 // ? #define ONE_WIRE_BUS 4 // int run_1; int t_Gist_1; int t_Gist_2; long previousMillis_time = 0; long interval_time = 300; OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); #define ssid "Skynet" #define password "**********" #define mqtt_server "wqtt.ru" const int mqtt_port = ****; #define user_name "MOZG1" #define mqtt_pswd "***********" #define OTAUSER "Den" #define OTAPASSWORD "Bel" #define OTAPATH "/soft" #define SERVERPORT 80 ESP8266WebServer HttpServer(SERVERPORT); ESP8266HTTPUpdateServer httpUpdater; WiFiClient espClient; PubSubClient client(espClient); int16_t lastMsg = 0; #define MSG_BUFFER_LEN 10u char msg[MSG_BUFFER_LEN]; void setup_wifi() { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } httpUpdater.setup(&HttpServer, OTAPATH, OTAUSER, OTAPASSWORD); HttpServer.onNotFound(handleNotFound); HttpServer.begin(); Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void setup() // Serial.begin(115200); { sensors.begin(); EEPROM.begin(512); run_1 = EEPROM.read(1); t_Gist_1 = EEPROM.read(2); t_Gist_2 = EEPROM.read(3); { pinMode(RELAY1, OUTPUT ); pinMode(RELAY2, OUTPUT ); pinMode(RELAY3, OUTPUT ); pinMode(RELAY4, OUTPUT ); digitalWrite( RELAY1, LOW); digitalWrite( RELAY2, LOW); digitalWrite( RELAY3, LOW); digitalWrite( RELAY4, LOW); Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); } } void callback(char* topic, byte* payload, uint16_t length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (uint16_t i = 0; i < length; i++) { Serial.print((char)payload, DEC); } Serial.println(); if( strcmp(topic, "load1R") == 0 ) { if ((char)payload[0] == '0') { run_1 = 0; Serial.println(run_1); EEPROM.write(1,run_1); EEPROM.commit(); } if ((char)payload[0] == '1') { run_1 = 1; Serial.println(run_1); EEPROM.write(1,run_1); EEPROM.commit(); } } if( strcmp(topic, "load2R") == 0 ) { if ((char)payload[0] == '1') { digitalWrite( RELAY2, HIGH); } else { digitalWrite( RELAY2, LOW); } } if( strcmp(topic, "load3R") == 0 ) { if ((char)payload[0] == '1') { digitalWrite( RELAY3, HIGH); } else { digitalWrite( RELAY3, LOW); } } if( strcmp(topic, "load4R") == 0 ) { if ((char)payload[0] == '1') { digitalWrite( RELAY4, HIGH); } else { digitalWrite( RELAY4, LOW); } } if( strcmp(topic, "Gisterezis_1") == 0 ) { t_Gist_1 == (char)payload[0]; Serial.println("t_Gist_1 = "); Serial.println(t_Gist_1); EEPROM.write(2,t_Gist_1); EEPROM.commit(); } if( strcmp(topic, "Gisterezis_1") == 0 ) { t_Gist_2 == (char)payload[0]; Serial.println("t_Gist_2 = "); Serial.println(t_Gist_2); EEPROM.write(3,t_Gist_2); EEPROM.commit(); } } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting CloudMQTT connection..."); String clientId = "MOZG1";//обязательно задан клиент ID Serial.print("Client Id: "); Serial.println(clientId); if ( client.connect(clientId.c_str(), user_name, mqtt_pswd) ) { Serial.println("connected"); client.subscribe("load1R/#"); client.subscribe("load2R/#"); client.subscribe("load3R/#"); client.subscribe("load4R/#"); client.subscribe("Gisterezis_1/#"); client.subscribe("Gisterezis_2/#"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void loop() { sensors.requestTemperatures(); float celsius = sensors.getTempCByIndex(0); Serial.println(sensors.getTempCByIndex(0)); char temperaturenow [15]; dtostrf(celsius,6, 1, temperaturenow); client.publish("DS18B20", temperaturenow); Serial.println("run_1= "); Serial.println(run_1); if ((run_1 == 1) && (sensors.getTempCByIndex(0) <= t_Gist_1)) { digitalWrite( RELAY1, HIGH); } Serial.println("run_1= "); Serial.println(run_1); Serial.println("Гистерезис_1 = "); Serial.println(t_Gist_1); Serial.println("Гистерезис_2 = "); Serial.println(t_Gist_2); if (!client.connected()) { reconnect() ; } { HttpServer.handleClient(); } client.loop(); long now = millis(); } void handleNotFound() { HttpServer.send(404, "text/plain", "404: Not found"); }
Код (C++): if( strcmp(topic, "Gisterezis_1") == 0 ) { t_Gist_1 = (char)payload[0]; Gist_1 = t_Gist_1.toInt(); Serial.println("Gist_1 = "); Serial.println(Gist_1); EEPROM.write(2,Gist_1); EEPROM.commit(); } if( strcmp(topic, "Gisterezis_1") == 0 ) { t_Gist_2 = (char)payload[0]; Gist_2 = t_Gist_2.toInt(); Serial.println("Gist_2 = "); Serial.println(Gist_2); EEPROM.write(3,Gist_2); EEPROM.commit(); } Пришлось ввести доппеременные. Заработает?
Нет. Если Вам нужны топики Gisterezis_1 и Gisterezis_2, тогда нужно на них и подписываться. Зачем у Вас решетка в конце? Так и указывайте: Код (C++): client.subscribe("Gisterezis_1"); client.subscribe("Gisterezis_2"); Это во первых. Во вторых, в сообщении #3 я не зря вас спросил про ошибки, их там много Объяснять долго, одним из возможных, правильных вариантов будет вариант ниже. Исправил только для "Gisterezis_1". Остальные топики сделаете по аналогии. Код (C++): void callback(char* topic, byte* payload, uint16_t length) { char message[15]; uint8_t i; Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (i = 0; i < length; i++) { Serial.print((char)payload[i]); message[i] = (char)payload[i]; } message[i] = 0; Serial.println(); if ( strcmp(topic, "Gisterezis_1") == 0 ) { t_Gist_1 = atoi(message); Serial.print("t_Gist_1 = "); Serial.println(t_Gist_1); EEPROM.write(2, (uint8_t) t_Gist_1); EEPROM.commit(); } }
Осмелюсь спросить. А возможно ли данные переменных Gist_1 и Gist_2 из кода публиковать обратно в те же топики Gisterezis_1 и Gisterezis_2, тем самым проверяя сохранились ли данные после установки?
попробовал сделать кодом: Код (C++): int a = Gist_1; // исходник int radixa = 10; //система счисления char buffer[20]; char *G_1; //указатель на результат G_1 = itoa(a,buffer,radixa); client.publish("Gisterezis_1", G_1); Появился нюанс. Не могу теперь менять значения...Как значение из buffer заменить на значение из EEPROM?