ESP8266 + MQTT + DS18B20 + 3reley

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
dimabolt
Сообщения: 9
Зарегистрирован: Вс янв 07, 2018 11:22 pm
Благодарил (а): 3 раза
Поблагодарили: 3 раза

ESP8266 + MQTT + DS18B20 + 3reley

Сообщение dimabolt » Чт фев 01, 2018 12:21 am

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

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

Код: Выделить всё

// подключаем библиотеку «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.");
               //  "Клиент отключен."
  }
}
СпойлерПоказать

Код: Выделить всё

// подключаем библиотеку «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
}
Ответить