ESP8266 + MQTT + DS18B20 + 2reley

Тема в разделе "ESP8266, ESP32", создана пользователем dimabolt, 1 фев 2018.

  1. dimabolt

    dimabolt Нуб

    Доброго дня, помогите пожалуйста объединить 2 скеча. Писал их не я, все вязто на просторах интернета.

    Первый скетч оригинал, выводит температуру с DS18B20 в веб интерфейс.
    Веб интерфейс не нужен, нужно только вывод температуры в топик ESP01/ONE_WIRE через mqtt

    Код (C++):
    // подключаем библиотеку «ESP8266WiFi»:
    #include <ESP8266WiFi.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    // вписываем здесь SSID и пароль для вашей WiFi-сети:
    const char* ssid = "WiFi_67";
    const char* password = "1234567890";
    // контакт для передачи данных подключен к D1 на ESP8266 12-E (GPIO5):
    #define ONE_WIRE_BUS 4
    // создаем экземпляр класса oneWire; с его помощью
    // можно коммуницировать с любыми девайсами, работающими
    // через интерфейс 1-Wire, а не только с температурными датчиками
    // от компании Maxim/Dallas:
    OneWire oneWire(ONE_WIRE_BUS);
    // передаем объект oneWire объекту DS18B20:
    DallasTemperature DS18B20(&oneWire);
    char temperatureCString[6];
    char temperatureFString[6];
    // веб-сервер на порте 80:
    WiFiServer server(80);
    // блок setup() запускается только один раз – при загрузке:
    void setup() {
      // инициализируем последовательный порт (для отладочных целей):
      Serial.begin(115200);
      delay(10);
      DS18B20.begin(); // по умолчанию разрешение датчика – 9-битное;
                       // если у вас какие-то проблемы, его имеет смысл
                       // поднять до 12 бит; если увеличить задержку,
                       // это даст датчику больше времени на обработку
                       // температурных данных
      // подключаемся к WiFi-сети:
      Serial.println();
      Serial.print("Connecting to "); // "Подключаемся к "
      Serial.println(ssid);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi connected"); // "Подключение к WiFi выполнено"
      // запускаем веб-сервер:
      server.begin();
      Serial.println("Web server running. Waiting for the ESP IP...");
                  // "Веб-сервер запущен. Ожидание IP-адреса ESP..."
      delay(10000);
      // печатаем IP-адрес ESP:
      Serial.println(WiFi.localIP());
    }
    void getTemperature() {
      float tempC;
      float tempF;
      do {
        DS18B20.requestTemperatures();
        tempC = DS18B20.getTempCByIndex(0);
        dtostrf(tempC, 2, 2, temperatureCString);
        tempF = DS18B20.getTempFByIndex(0);
        dtostrf(tempF, 3, 2, temperatureFString);
        delay(100);
      } while (tempC == 85.0 || tempC == (-127.0));
    }
    // блок loop() будет запускаться снова и снова:
    void loop() {
      // начинаем прослушку входящих клиентов:
      WiFiClient client = server.available();
      if (client) {
        Serial.println("New client");  //  "Новый клиент"
        // создаем переменную типа «boolean»,
        // чтобы определить конец HTTP-запроса:
        boolean blank_line = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
         
            if (c == '\n' && blank_line) {
                getTemperature();
                client.println("HTTP/1.1 200 OK");
                client.println("Content-Type: text/html");
                client.println("Connection: close");
                client.println();
                // веб-страница с данными о температуре:
                client.println("<!DOCTYPE HTML>");
                client.println("<html>");
                client.println("<head></head><body><h1>ESP8266 - Temperature</h1><h3>Temperature in Celsius: ");
                client.println(temperatureCString);
                client.println("*C</h3><h3>Temperature in Fahrenheit: ");
                client.println(temperatureFString);
                client.println("*F</h3></body></html>");
                break;
            }
            if (c == '\n') {
              // если обнаружен переход на новую строку:
              blank_line = true;
            }
            else if (c != '\r') {
              // если в текущей строчке найден символ:
              blank_line = false;
            }
          }
        }
        // закрываем соединение с клиентом:
        delay(1);
        client.stop();
        Serial.println("Client disconnected.");
                   //  "Клиент отключен."
      }
    }
     
  2. dimabolt

    dimabolt Нуб

    Код (C++):
    [code=cpp]
    // подключаем библиотеку «ESP8266WiFi»:
    #include <ESP8266WiFi.h>
    #include <OneWire.h>
    #include <PubSubClient.h>
    #include <DallasTemperature.h>

    // Update these with values suitable for your network.

    const char* ssid = "WiFi_67";
    const char* password = "1234567890";
    const char* mqtt_server = "10.0.1.38";

    #define RELE_1 14                       // Реле №1
    #define RELE_2 13                       // Реле №2
    #define RELE_3 13                       // Реле №3
    #define ONE_WIRE_BUS 4                  // Температура
    #define BUTTON_1 12                       // Кнопочный выключатель №1
    #define BUTTON_2 5                        // Кнопочный выключатель №2
    #define BUTTON_3 15                       // Кнопочный выключатель №3
    #define relays_topic1 "ESP01/RELE_1"          // Топик реле №1
    #define relays_topic2 "ESP01/RELE_2"          // Топик реле №2
    #define relays_topic3 "ESP01/RELE_3"          // Топик реле №3
    #define ONE_WIRE_BUS1 "ESP01/ONE_WIRE"         // Топик ONE_WIRE


    WiFiClient espClient;
    PubSubClient client(espClient);
    long lastMsg = 0;
    long last_mls = millis();
    char msg[50];
    int value = 0;
    int hum = 0;
    int diff = 1;
    boolean rState1 = false;
    boolean rState2 = false;
    boolean rState3 = false;
    boolean btnPress1 = false;
    boolean btnPress2 = false;
    boolean btnPress3 = false;
    boolean lastbtnStat1 = false;
    boolean lastbtnStat2 = false;
    boolean lastbtnStat3 = false;

    // создаем экземпляр класса oneWire; с его помощью
    // можно коммуницировать с любыми девайсами, работающими
    // через интерфейс 1-Wire, а не только с температурными датчиками
    // от компании Maxim/Dallas:
    OneWire oneWire(ONE_WIRE_BUS);

    // передаем объект oneWire объекту DS18B20:
    DallasTemperature DS18B20(&oneWire);
    char temperatureCString[6];
    char temperatureFString[6];

    void setup() {
    // инициализируем последовательный порт (для отладочных целей):
      Serial.begin(115200);
      delay(10);
      DS18B20.begin(); // по умолчанию разрешение датчика – 9-битное;
                       // если у вас какие-то проблемы, его имеет смысл
                       // поднять до 12 бит; если увеличить задержку,
                       // это даст датчику больше времени на обработку
                       // температурных данных
      pinMode(RELE_1, OUTPUT);
      pinMode(RELE_2, OUTPUT);
      pinMode(RELE_3, OUTPUT);
      pinMode(BUTTON_1, INPUT);
      pinMode(BUTTON_2, INPUT);
      pinMode(BUTTON_3, INPUT);
      pinMode(ONE_WIRE_BUS, INPUT);
      digitalWrite(RELE_1, rState1);
      digitalWrite(RELE_2, rState2);
      digitalWrite(RELE_3, rState3);
      Serial.begin(115200);
      client.setServer(mqtt_server, 1883);
      client.setCallback(callback);
      delay(100);
      WiFi.begin(ssid, password);
      delay(6000);
      client.connect("ESP8266Client");
      client.subscribe(relays_topic1);
      client.subscribe(relays_topic2);
      client.subscribe(relays_topic3);
      client.subscribe(ONE_WIRE_BUS1);  
      lastbtnStat1 = digitalRead(BUTTON_1);
      lastbtnStat2 = digitalRead(BUTTON_2);
      lastbtnStat3 = digitalRead(BUTTON_3);
    }



    void reconnect_server() {
     
      if (WiFi.status() != WL_CONNECTED){
        WiFi.begin(ssid, password);
        Serial.println("");
        Serial.println("WiFi connect...");
      } else {
        Serial.println("");
        Serial.println("WiFi connected");
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());
      }
       
      if(!client.connected() && WiFi.status() == WL_CONNECTED){  
        if (client.connect("ESP8266Client")) {    
          Serial.println("Mosquitto connect...");
      client.subscribe(relays_topic1);
      client.subscribe(relays_topic2);
      client.subscribe(relays_topic3);
      client.subscribe(ONE_WIRE_BUS1);
        } else {    
          Serial.print("failed connect Mosquitto, rc=");
          Serial.print(client.state());
          Serial.println("");
        }
      }
    }


    // Блок [обратная связь] ****************************************************
    void callback(char* topic, byte* payload, unsigned int length) {
        Serial.print("Message arrived [");
        Serial.print(topic);
        Serial.print("] ");
        String strTopic = String(topic);
        String strPayload = String((char*)payload);
      for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
      }
      Serial.println();
    // Блок [Управление Реле 1 из MajorDomo] ************************************
    if (strTopic == "ESP01/RELE_1") {
        if ((char)payload[0] == '1') {
            rState1 = true;
            digitalWrite(RELE_1, rState1);
        }
        else {
            rState1 = false;
            digitalWrite(RELE_1, rState1);
        }
    }
    // END Блок [Управление Реле 1 из MajorDomo] ********************************
    // Блок [Управление Реле 2 из MajorDomo] ************************************
    if (strTopic == "ESP01/RELE_2") {
        if ((char)payload[0] == '1') {
            rState2 = true;
            digitalWrite(RELE_2, rState2);
        }
        else {
            rState2 = false;
            digitalWrite(RELE_2, rState2);
        }
    }
    // Блок [Управление Реле 2 из MajorDomo] ************************************
    // Блок [Управление Реле 3 из MajorDomo] ************************************
    if (strTopic == "ESP01/RELE_3") {
        if ((char)payload[0] == '1') {
            rState3 = true;
            digitalWrite(RELE_3, rState3);
        }
        else {
            rState3 = false;
            digitalWrite(RELE_3, rState3);
        }
    }
    // Блок [Управление Реле 3 из MajorDomo] ************************************
    }
    // END Блок [обратная связь] ************************************************



    bool checkBound(float newValue, float prevValue, float maxDiff) {
      return newValue < prevValue - maxDiff || newValue > prevValue + maxDiff;
    }



    // Выключатель №1
    void buttonWF(){
      btnPress1 = digitalRead(BUTTON_1);
      if (btnPress1 && !lastbtnStat1){
        delay(400); // защита от дребезга (600 мсек.)
        btnPress1 = digitalRead(BUTTON_1);
     
        if(btnPress1){
          rState1 = !rState1;
          digitalWrite(RELE_1, rState1);
          // публикуем изменение состояния реле на брокер    
          client.publish(relays_topic1, String(rState1).c_str(), true);
        }
      }
      lastbtnStat1 = btnPress1;
    }
    // END Выключатель №1

    // Выключатель №2

    void buttonWD(){
      btnPress2 = digitalRead(BUTTON_2);
      if (btnPress2 && !lastbtnStat2){
        delay(400); // защита от дребезга (600 мсек.)
        btnPress2 = digitalRead(BUTTON_2);
     
        if(btnPress2){
          rState2 = !rState2;
          digitalWrite(RELE_2, rState2);
          // публикуем изменение состояния реле на брокер    
          client.publish(relays_topic2, String(rState2).c_str(), true);
        }
      }
      lastbtnStat2 = btnPress2;
    }
    // END Выключатель №2

    // Выключатель №3


    void buttonWG(){
      btnPress3 = digitalRead(BUTTON_3);
      if (btnPress3 && !lastbtnStat3){
        delay(400); // защита от дребезга (600 мсек.)
        btnPress3 = digitalRead(BUTTON_3);
     
        if(btnPress3){
          rState3 = !rState3;
          digitalWrite(RELE_3, rState3);
          // публикуем изменение состояния реле на брокер    
          client.publish(relays_topic3, String(rState3).c_str(), true);
        }
      }
      lastbtnStat3 = btnPress3;
    }
    // END Выключатель №3

    void getTemperature() {
      sensors.requestTemperatures();
    float celsius = sensors.getTempCByIndex(0);
    Serial.println(sensors.getTempCByIndex(0));
    char temperaturenow [15];
    dtostrf(celsius,7, 3, temperaturenow); //// convert float to char
    client.publish(ONE_WIRE_BUS1, String(temperaturenow).c_str(), true);
    }

    void loop() {

      client.loop();
      // 120 секунд периодичность проверки переподключения
      if (millis() - last_mls > 120000) {
        last_mls = millis();
        reconnect_server();
      }
      buttonWF(); // Функция кнопки №1 без фиксации и публикация статуса реле на MQTT
      buttonWD(); // Функция кнопки №1 без фиксации и публикация статуса реле на MQTT
      buttonWG(); // Функция кнопки №1 без фиксации и публикация статуса реле на MQTT
      getTemperature(); // Функция кнопки №1 без фиксации и публикация статуса реле на MQTT
    }
    [/code]
     
  3. ИгорьК

    ИгорьК Гуру

    А два реле?
     
    Последнее редактирование: 1 фев 2018
  4. dimabolt

    dimabolt Нуб

    два реле оставить хотелось бы и управление ими, точнее 3 реле и управление, веб интерфейс я имел ввиду не нужен из первого скетча где про датчик температуры речь идет. Мне бы самумом понять конечно как объединять такие скетчи.
     
  5. ИгорьК

    ИгорьК Гуру

    Ну, если бы одно реле, я бы, наверно сделал. А два и три - не, не мое :(
     
    issaom нравится это.
  6. dimabolt

    dimabolt Нуб

    Там реле уже работают и кнопки с публикацией в mqtt работают, необходимо туда добавить DS18b20