Esp8266 не подписывается на топик с телефона

Тема в разделе "ESP8266, ESP32", создана пользователем Drunkbarbarian, 22 июн 2020.

  1. Drunkbarbarian

    Drunkbarbarian Нерд

    • 5.10. Запрещено публиковать исходный код без BB-кода — CODE.
    Пытаюсь с телефона ввести произвольные цифровые значения. ЕSP в мониторе порта пишет всякую дрянь отличную от той, что я ввожу. Не понимаю как изменить код.
    Задача стоит в изменении гистерезисов в температурных данных.
    Прошу помочь глубокоуважаемое сообщество, объяснить, что делаю не так.
    Кусок кода:

    Вставьте код по правилам форума!
     
  2. b707

    b707 Гуру

    а я как раз думаю. что он пишет вам именно то. что вы вводите.
    приведите для примера, что вы пытаетесь передавать и что вам печатает строка t_Gist_1 = ?
     
  3. SergeiL

    SergeiL Оракул Модератор

    Что, в вашем понимании, должны вывести строки:?
    Код (C++):
    Serial.print((char)payload, DEC);

    t_Gist_1 == (char)payload[0];
    Serial.println(t_Gist_1);
    Сколько тут ошибок?
     
    Daniil нравится это.
  4. Daniil

    Daniil Гуру

    Очевидно, ноль. Код же работает)
     
    SergeiL нравится это.
  5. Drunkbarbarian

    Drunkbarbarian Нерд

    мне двузначные числа нужны. К примеру, ввел "25" в телефоне, должны прилететь цифры "25", ну и так далее...Я не программист по образованию, вникать приходится сходу, по примерам. Поэтому прошу понять и простить))....Скрины приходящих непонятных значений завтра кину, сборка на работе. В монитор прилетают 4х значные цифры, две из которых сохраняются в EEPROM.
    Что не так с кодом?
     
  6. SergeiL

    SergeiL Оракул Модератор

    Для начала вставьте код правильно в первое сообщение.
    Напишите, как и какими топиками отправляете данные с телефона.
     
  7. b707

    b707 Гуру

    так все правильно. Те "25", что вы отправляете - это не число 25, а два символа, '2' и '5', У каждого из этих символов двухзначный код ASCII - у двойки 50, у пятерки - 53. Вот и получается, что вы ввели "25". а на выходе получили 5053

    нужно обрабатывать приходящие значения как строчки и сначала преобразовывать их в числа, а уже потом использовать в программе и писать в ЕЕПРОМ
     
  8. Drunkbarbarian

    Drunkbarbarian Нерд

    Покажете примером как это преобразовывается? То, что это ASCII я догнал. Принцип преобразования не очень понятен.
     
  9. SergeiL

    SergeiL Оракул Модератор

    Еще раз: Вставьте код в соответствии с правилами форума, смотрите пункт "4 - Вставка кода" Правила здесь
     
  10. Drunkbarbarian

    Drunkbarbarian Нерд

    Код (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");
    }
     
  11. SergeiL

    SergeiL Оракул Модератор

    Еще раз: Напишите, какими топиками отправляете данные с телефона. :)
     
  12. Drunkbarbarian

    Drunkbarbarian Нерд

    топики Gisterezis_1 и Gisterezis_2. Переменные для сохранения данных из топиков t_Gist_1 и t_Gist_2.
     
  13. Drunkbarbarian

    Drunkbarbarian Нерд

    Код (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();
      }
    Пришлось ввести доппеременные. Заработает?
     
  14. SergeiL

    SergeiL Оракул Модератор

    Нет.
    Если Вам нужны топики 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();
      }
    }
     
  15. Drunkbarbarian

    Drunkbarbarian Нерд

    Спасибо, добрый человек! Попробую.
     
  16. Drunkbarbarian

    Drunkbarbarian Нерд

    Осмелюсь спросить. А возможно ли данные переменных Gist_1 и Gist_2 из кода публиковать обратно в те же топики Gisterezis_1 и Gisterezis_2, тем самым проверяя сохранились ли данные после установки?
     
  17. Drunkbarbarian

    Drunkbarbarian Нерд

    попробовал сделать кодом:
    Код (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?