Как отвязаться от wifi?

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

  1. Drunkbarbarian

    Drunkbarbarian Нерд


    объяснение требуется.
    Код (C++):
      if (!client.connected())
      {
        Serial.print("Попытка подключения...");
        String clientId = "OBOGREV_1";//обязательно задан клиент ID
        Serial.print("Client Id:  ");
        Serial.println(clientId);
        if ( client.connect(clientId.c_str(), user_name, mqtt_pswd) )
        {
          Serial.println("ПОДКЛЮЧЕН!");

          client.subscribe("load1O");
          client.subscribe("GISTER_11");
          client.subscribe("GISTER_12");
         
        }
    В старом коде строка
    if ( client.connect(clientId.c_str(), user_name, mqtt_pswd) )
    что делает?
     
  2. SergeiL

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

    Можно ставить и в подрозетник.
    И размер меньше продаваемых устройств можно сделать.
    Вот, только по квартире:
    ESP.png
     
    Drunkbarbarian нравится это.
  3. Drunkbarbarian

    Drunkbarbarian Нерд

    Привет! А чем переводите ~220 в 3.3В и какие реле?
     
  4. SergeiL

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

    Здесь информация.
     
    Drunkbarbarian нравится это.
  5. SergeiL

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

    Последнее время управление светом делаю на своих димерах .
    В свое время по форуму Амперки прошло "Цунами".
    На этой волне я затер свои темы, сейчас жалко конечно...
     
  6. ИгорьК

    ИгорьК Гуру

    Организует ветвление (if) в зависимости от результата подключения к брокеру.
     
    Drunkbarbarian нравится это.
  7. Drunkbarbarian

    Drunkbarbarian Нерд

    Добрый день, господа! Не понимаю пока millis(). Не получается написать таймер включения контактора на определенный период. Прошу помочь наиболее опытных товарищей. По окончании этого периода контактор должен выключаться.
    Код (C++):
    int run_1;
    int Tim_1 = 0;
    uint32_t interval_time_1 = 0;


      if  ((run_1 == 1) && (client.connected()))
    {
        if (millis() - interval_time_1  > 100)
        {    
          //interval_time_1 = millis();
          digitalWrite(RELAY1, HIGH);
        }
        if (millis() - interval_time_1  > Tim_1)
        {
          interval_time_1 = millis();    
          digitalWrite(RELAY1, LOW);
          interval_time_1 = 0;
          run_1 = 0;
          EEPROM.write(1,run_1);
          EEPROM.commit();
          client.publish("load_N", "0");
        }  
      if  ((run_1 == 0) || (!client.connected()))
      {
       digitalWrite(RELAY1, LOW);
      }
    }


     
     
  8. b707

    b707 Гуру

    Код (C++):
    if  ((run_1 == 1) )
    {
          interval_time_1 = millis();
          digitalWrite(RELAY1, HIGH);
          run_1 =0;
        }
    if (millis() - interval_time_1  > Tim_1)
        {
       
          digitalWrite(RELAY1, LOW);
         
        }
     
     
    Drunkbarbarian нравится это.
  9. Drunkbarbarian

    Drunkbarbarian Нерд

    Спасибо, друг!
     
  10. Drunkbarbarian

    Drunkbarbarian Нерд

    Всем привет. Устройства работают все, решил немного модернизировать. Но столкнулся с новой проблемой. Никак не пойму millis().
    В общем хочу сделать так, чтоб можно было таймингом управлять с нескольких устройств. И при выключении тайминга инфа отображалась на всех устройствах управления.
    Код (C++):
    //есть два топика
    // Relay2 (Load1R) Topic
      if( strcmp(topic, "B2_NASOS") == 0 )
     
      {
        if ((char)payload[0] == '0')
       
        {    
          run_2 = 0;
       
          EEPROM.write(2,run_2);
          EEPROM.commit();
        }
        if ((char)payload[0] == '1')
        {
          run_2 = 1;
       
          EEPROM.write(2,run_2);
          EEPROM.commit();
        }
      }
      if( strcmp(topic, "B2_Timing_Nasos") == 0 )
      {
          Tim_1 = atoi(message);
          Tim_1 = Tim_1 * 60000;
          if (Tim_1 >= 0)
          {
          EEPROM.write(10, Tim_1);
          EEPROM.commit();
          }
      }

    /// дальше не получается выставить нормальную задержку, как-то все мгновенно отключается. Надо чтобы по истечении времени Tim_1 срабатывала передача в обратную сторону топика B2_NASOS.

      if  (run_2 == 1)
      {
      interval_time_1 = millis();
      digitalWrite(RELAY2, HIGH);
      run_2 = 0;
      }
       if (millis() - interval_time_1  > Tim_1)
      {
       digitalWrite(RELAY2, LOW);
       client.publish("B2_NASOS", "0");
       interval_time_1 = 0;
       }

     
     
  11. Drunkbarbarian

    Drunkbarbarian Нерд

    Бьюсь уже неделю по вечерам "головой об стенку", все получается. Но не millis().
    Прошу подсказать владеющих вопросом.
     
  12. b707

    b707 Гуру

    нифига не понятно, что именно не получается...
     
  13. SergeiL

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

    Тут много непонятного, вы же только кусок кода привели.
    Непонятны типы переменных.

    Непонятно, что вы сохраняете в EEPROM ( по тому, что до этого умножаете на 60 000 явно - не то ) в строке:
    Код (C++):
    EEPROM.write(10, Tim_1);
    Согласно документации:
    Непонятно, что вы хотели сделать (но явно не то, что делаете), написав :
    Код (C++):
       interval_time_1 = 0;
    Если выполнить данный код 1 раз, нужно завести флаг и проверять его на входе, а внутри менять, для того, чтобы больше не заходить.
     
    Последнее редактирование: 4 июн 2021
  14. Drunkbarbarian

    Drunkbarbarian Нерд

    Код (C++):
    #include <EEPROM.h>
    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <ESP8266WebServer.h>
    #include <ESP8266HTTPUpdateServer.h>
    #include <SPI.h>

    #define RELAY1    16 //насос
    #define ONE_WIRE_BUS 4 //
    int run_1;
    int Tim_1 = 0;
    int Sec_1 = 1000;
    //long previousMillis_time = 5000;//0
    uint32_t interval_time_1;
    uint32_t timeWhenLostBroker = 0;
    uint32_t timePublicTopic = 0;
    //unsigned long next_time;

    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);


    #define ssid "Skynet"        
    #define password "xxxxxxxxx"    
    #define mqtt_server "xxxxxxxx"  
    const int mqtt_port = xxx;
    #define user_name "NASOS_1"      // username
    #define mqtt_pswd "xxxxx"   // password


    #define OTAUSER         "admin"  
    #define OTAPASSWORD     "xxxxxxxx"  
    #define OTAPATH         "/soft"
    #define SERVERPORT      80        
    ESP8266WebServer HttpServer(SERVERPORT);
    ESP8266HTTPUpdateServer httpUpdater;



    WiFiClient espClient;
    PubSubClient client(espClient);
    //uint32_t lastMsg = 0; ///только плюс
    int16_t lastMsg = 0; ///проверить!!! может принимать и + и -
    #define MSG_BUFFER_LEN  10u
    char msg[MSG_BUFFER_LEN];

    // Setup WiFi Connection
    void setup_wifi()
    {
      delay(10);
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);

      WiFi.begin(ssid, password);

      while (WiFi.status() != WL_CONNECTED)
      {
        delay(5000);
        Serial.print(".");
      }
      httpUpdater.setup(&HttpServer, OTAPATH, OTAUSER, OTAPASSWORD);
      HttpServer.onNotFound(handleNotFound);
      HttpServer.begin();
      Serial.println("");
      Serial.println("WiFi пашет!!!");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    }

    void setup()
    // Serial.begin(115200);
    {
      sensors.begin();
     
      EEPROM.begin(512);
      run_1 = EEPROM.read(1);
      Tim_1 = EEPROM.read(2);
      bool interv_1 = false;
    {

      // Initialize Relay's Pins as Output
      pinMode(RELAY1, OUTPUT );
      digitalWrite(RELAY1, LOW);
       // Intiialize Serial Communication for Debug Messages
      Serial.begin(115200);
      // Setup NodeMcu with WiFi
      setup_wifi();
      client.setServer(mqtt_server, mqtt_port);
      client.setCallback(callback);
    }

     
     
    }

    void callback(char* topic, byte* payload, uint16_t length)
    {
      char message[15];
      uint8_t i;

     
      Serial.print("Пришло сообщение [");
      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();
     
      // Relay1 (Load1R) Topic
      if( strcmp(topic, "load_N") == 0 )
     
      {
        if ((char)payload[0] == '0')
       
        {    
          run_1 = 0;
          //Serial.println(run_1);
          EEPROM.write(1,run_1);
          EEPROM.commit();
          digitalWrite(RELAY1, LOW);
        }
        if ((char)payload[0] == '1')
        {
          run_1 = 1;
          //Serial.println(run_1);
          EEPROM.write(1,run_1);
          EEPROM.commit();
        }
      }
     

      if( strcmp(topic, "Timing_Nasos") == 0 )
      {
          Tim_1 = atoi(message);
          Tim_1 = Tim_1 * 60000;
          if (Tim_1 >= 0)
          {
          EEPROM.write(2, Tim_1);
          EEPROM.commit();
          }
      }
    }
    void reconnect()
    {
      // Loop until we're reconnected
      //while (!client.connected())
      if (!client.connected())
      {
        Serial.print("Attempting CloudMQTT connection...");
        String clientId = "NASOS_1";//обязательно задан клиент ID
        Serial.print("Client Id:  ");
        Serial.println(clientId);
        if ( client.connect(clientId.c_str(), user_name, mqtt_pswd) )
        {
          Serial.println("connected");

          client.subscribe("load_N");
          client.subscribe("Timing_Nasos");    
        }
        else
        {
          digitalWrite(RELAY1, LOW);
          Serial.print("failed, rc=");
          Serial.print(client.state());
          //Serial.println(" try again in 5 seconds");
          // Wait 5 seconds before retrying
          delay(5000);
        }
      }
    }


    void loop()
    {
    sensors.requestTemperatures();
    float celsius = sensors.getTempCByIndex(0);
    Serial.print("Температура воздуха = ");
    Serial.println(sensors.getTempCByIndex(0));

    char buffer[20];
    /////////////////////////////////////////////////
    /////////////////////////////////////////////////
      if  (run_1 == 1)
      {
      interval_time_1 = millis();
      digitalWrite(RELAY1, HIGH);
      run_1 = 0;
      }
       if (millis() - interval_time_1  > Tim_1)
      {
       digitalWrite(RELAY1, LOW);
       client.publish("load_N", "0");    // ВОТ ЗДЕСЬ НЕ СОВСЕМ ПОНЯТНО, КАК СДЕЛАТЬ ФЛАГ, НУЖНО ПЕРЕДАВАТЬ ("load_N", "0") ПО ОКОНЧАНИИ                                                        //ВРЕМЕННОГО ИНТЕРВАЛА.
       interval_time_1 = 0;
       }
     
    ////////////////////////////////////////////////
    ////////////////////////////////////////////////
      if (client.connected())
      {
      if (!timePublicTopic)
       {
    timePublicTopic = millis();
       }
       if (millis() - timePublicTopic > 10000)
       {
        timePublicTopic = 0;

    char temperaturenow [15];
    dtostrf(celsius, 6, 1, temperaturenow); ////7 знаков общее и 1 знака после запятой
    client.publish("TEMP_NASOS_1", temperaturenow); /// send char

    int Yrssi = WiFi.RSSI();
    int radixY = 10;
    char *RSSI_1;
    RSSI_1 = itoa(Yrssi,buffer,radixY);
    client.publish("RSSI_NASOS_1", RSSI_1);

     
    int a = Tim_1/60000; // исходник
    int radixa = 10; //система счисления
    char *G_1;  //указатель на результат
    G_1 = itoa(a,buffer,radixa);
    client.publish("Timing_Nasos", G_1);

    IPAddress ip = WiFi.localIP();
    String IPlocal = ip.toString();
    client.publish("IP_NASOS_1", IPlocal.c_str());
      }
    }




    Serial.print("Переменная run_1 = ");
    Serial.println(run_1);
    Serial.print("Таймер Насоса в минутах = ");
    Serial.println(Tim_1/60000);
    Serial.print("Переменная Tim_1 = ");
    Serial.println(Tim_1);
    Serial.print("Локальный IP = ");
    Serial.println(WiFi.localIP());
    Serial.print("RSSI =  ");
    Serial.println(WiFi.RSSI());

      if (!client.connected())
    {
    if (!timeWhenLostBroker)
    {
    timeWhenLostBroker = millis();
    }
    if (millis() - timeWhenLostBroker > 30000)
    {
    timeWhenLostBroker = 0;
    reconnect() ;
    }
    }
    {
      HttpServer.handleClient();       // Прослушивание HTTP-запросов от клиентов
    }

    client.loop();
    long now = millis();
    }


    void handleNotFound() {
      HttpServer.send(404, "text/plain", "404: Not found");
    }
     
  15. Drunkbarbarian

    Drunkbarbarian Нерд

    Вот первая версия написанного. С флагом не очень понятно. Что может быть флагом?
    if digitalWrite(RELAY1, LOW)
    {client.publish("load_N", "0");}

    так вроде не должно работать, да и не флаг это...
     
  16. SergeiL

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

    Вот я почему то так и думал.
    Смотрите у вас есть таке строки:
    Код (C++):
    int Tim_1 = 0;
    .......................
    Tim_1 = Tim_1 * 60000;
    .......................
    EEPROM.write(2, Tim_1);
     
    И в сообщении приходит количество минут.
    Во первых, переменная типа int может иметь значения от -32768…32767, и умножение на 60000 в int уже не лезет сразу же.
    Тут нужна переменная long или unt32_t. Дальше вы ее сохраняете в EEPROM, а в EEPROM данной функцией можно сохранить только 1 байт.
    Сохраняйте в EEPROM кол. минут из сообщения, а потом умножайте их на 60000 после получения текущего значения millis().
    По флагу вечером с дачи напишу.
     
  17. Drunkbarbarian

    Drunkbarbarian Нерд

    Привет. Буду пробовать. Спасибо.
    Жду по флагу объяснения.
     
  18. Drunkbarbarian

    Drunkbarbarian Нерд

    как-то вот так наверное получится
    Код (C++):
      if  (run_2 == 1)
      {
      interval_time_1 = millis();
      digitalWrite(RELAY2, HIGH);
      run_2 = 0;
      }
       if (millis() - interval_time_1  > Tim_1 * 60000)
      {
       digitalWrite(RELAY2, LOW);
       client.publish("B2_NASOS", "0");
      }
     
  19. Drunkbarbarian

    Drunkbarbarian Нерд

    а тут так
    Код (C++):
      if( strcmp(topic, "Timing_Nasos") == 0 )
      {
          Tim_1 = atoi(message);
          //Tim_1 = Tim_1 * 60000;
          if (Tim_1 >= 0)
          {
          EEPROM.write(2, Tim_1);
          EEPROM.commit();
          }
     
  20. Drunkbarbarian

    Drunkbarbarian Нерд

    uint32_t Tim_1 = 0;

    проверить не могу. Шнур перетерся.
    И флаг наверное надо вписать вместо выражения
    client.publish("B2_NASOS", "0");