Доброго дня, помогите пожалуйста объединить 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."); // "Клиент отключен." } }
Код (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 реле и управление, веб интерфейс я имел ввиду не нужен из первого скетча где про датчик температуры речь идет. Мне бы самумом понять конечно как объединять такие скетчи.