Первый скетч оригинал, выводит температуру с 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
}