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

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

  1. SergeiL

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

    Код (C++):
        static run_flag=0;

        if  (run_2 == 1)
        {
            interval_time_1 = millis();
            digitalWrite(RELAY2, HIGH);
            run_2 = 0;
            run_flag = 1;
        }
        if (run_flag && millis() - interval_time_1  > Tim_1)
        {
            digitalWrite(RELAY2, LOW);
            client.publish("B2_NASOS", "0");
            run_flag=0;
        }
    Флаг тоже можно сохранить в EEPROM, иначе при пропадании питания насос не выключится.
    Tim_1 у вас уже лонг, поэтому когда вы получаете по mqtt время, сразу можно его умножить на 60 000, а в EEPROM сохранить без умножения. У вас же не будет интервалов более 255 минут?
    И в setup при считывании из EEPROM, считайте его, умножьте на 60000 и используйте уже Tim_1.
    Это получение по mqtt:
    Код (C++):

    uint8_t interval;

      if( strcmp(topic, "Timing_Nasos") == 0 )
      {
          uint8_t interval;
          interval = atoi(message);
          Tim_1 = interval * 60000;
          EEPROM.write(2, interval);
          EEPROM.commit();
      }

     
    Это setup():
    Код (C++):
    void setup()
    // Serial.begin(115200);
    {
      uint8_t interval;

      sensors.begin();
      EEPROM.begin(512);
      run_1 = EEPROM.read(1);
      interval = EEPROM.read(2);
      Tim_1= interval*60000;
      bool interv_1 = false;
    {
     
     
    Последнее редактирование: 6 июн 2021
  2. 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;
    uint32_t interval_time_1;
    uint32_t timeWhenLostBroker = 0;
    uint32_t timePublicTopic = 0;
    static int run_flag = 0;
    uint8_t interval;
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);


    #define ssid "Skynet"        
    #define password "*******"    
    #define mqtt_server "********"
    const int mqtt_port = 1111;
    #define user_name "NASOS_1"      
    #define mqtt_pswd "*******"  


    #define OTAUSER         "******"  
    #define OTAPASSWORD     "******"  
    #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()
    {
      sensors.begin();
      EEPROM.begin(512);
      run_1 = EEPROM.read(1);
      interval = EEPROM.read(2);
      Tim_1 = interval * 60000;
    {
      // Initialize Relay's Pins as Output
      pinMode(RELAY1, OUTPUT );
      digitalWrite(RELAY1, LOW);
      Serial.begin(115200);
      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 )
      {
          interval = atoi(message);
          Tim_1 = interval * 60000;
          if (interval >= 0)
          {
          EEPROM.write(2, interval);
          EEPROM.commit();
          }
      }
    }
    // Reconnect with Server Function
    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;
      run_flag = 1;
      }
       if (run_flag && millis() - interval_time_1  > Tim_1)
      {
       digitalWrite(RELAY1, LOW);
       client.publish("load_N", "0");
       run_flag = 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(interval);
    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");
    }
     
  3. Drunkbarbarian

    Drunkbarbarian Нерд

    Серег, глянь пожалуйста! Хочу услышать замечания.
    И мне не понятна строка: if (run_flag && millis() - interval_time_1 > Tim_1)
    run_flag && millis() - что это значит?
    Дай коммент.

    if (run_1 == 1)
    {
    interval_time_1 = millis(); //одно = другому
    digitalWrite(RELAY1, HIGH);
    run_1 = 0;
    run_flag = 1;
    }
    if (run_flag && millis() - interval_time_1 > Tim_1) // переменная и миллис - (interval_time_1 = millis) > интервала включения. run_flag && millis() - как понять?
    {
    digitalWrite(RELAY1, LOW);
    client.publish("load_N", "0");
    run_flag = 0;
    }
     
  4. SergeiL

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

    Если убрать run_flag, мы будем попадать в "if" на каждом вызове loop, когда время превысит интервал Tim_1.
    Нужно сделать так, чтобы мы туда попали один раз, выключили, послали сообщение о выключении, и больше не заходили.
    Для этого мы вводим run_flag.
    Когда включаем реле - взводим его в "1" (все, что не ноль - это "True" или "Истина").
    В loop, в это условие мы попадаем когда (run_flag && (millis() - interval_time_1 > Tim_1)).
    Это означает, когда run_flag равен "true" или "истина" или "1" И ( в if логическое И записывается как &&) с момента запоминания времени прошло более Tim_1 времени - заходим в условие. А в условии мы
    Код (C++):
    run_flag = 0;
    для того чтобы в условие больше не заходить, до того как снова включат реле и интервал времени закончится.

    Если переменную
    Код (C++):
    static int run_flag = 0;
    делать глобальную, static можно не ставить, если в других файлах проекта переменной с таким же именем нет. И для флага проще взять байтовую переменную, я пропустил в своем посте тип :(. Достаточно минимального по размеру uint8_t.
     
  5. SergeiL

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

    Проверку на ">=0" можно убрать, так как:
    Код (C++):
    uint8_t interval;
    uint8_t - это беззнаковое и меньше 0 она не может быть, поэтому я ее и выкинул.