NodeMCU MQTT получает тему, но не вызывает цикл IF
Я новичок в Arduino/ESP и пишу код для активации 2 реле с помощью MQTT. Мое соединение установлено успешно, и я могу получить сообщение/тему, распечатанную на последовательной консоли. Вот мой код:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <PubSubClient.h>
#include <Wire.h>
#include "SSD1306Wire.h"
#define wifi_ssid "SSID"
#define wifi_password "PASSWORD"
#define mqtt_server "192.168.1.1"
#define mqtt_user "mqtt_username"
#define mqtt_password "mqtt_password"
SSD1306Wire display(0x3c, D2, D1);
const int relay1 = 5;
const int relay2 = 4;
String header;
String output5State = "off";
String output4State = "off";
const int output5 = 5;
const int output4 = 4;
WiFiClient wificlient;
WiFiClient espClient;
PubSubClient client(espClient);
ESP8266WebServer server(80);
//------------------- ГЛАВНАЯ СТРАНИЦА ----------
const char MAIN_page[] PROGMEM = R"=====(
<head><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>HOME IOT</title>
<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}
.button { background-color: #195B6A; border: none; color: white; padding: 16px 40px
text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer
body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;
.button2 {background-color: #77878A;
p {font-size: 24px;color: #444444;margin-bottom: 10px;}
</style>
</head>
<body>
<div id="webpage">
<h1>Security Door</h1>
<p><a href="/show/SecurityDoor/Open"><button class="button">Open</button></a></p>
<p><a href="/show/SecurityDoor/Close"><button class="button">Close</button></a></p>
</div>
</body>
</html>
)=====";
//------------------- ГЛАВНАЯ СТРАНИЦА ----------
void setup() {
Serial.begin(9600);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
//--------------------------------------------------------
WiFiManager wifiManager;
//wifiManager.resetSettings();
wifiManager.autoConnect("IOT-LivinRoom");
//--------------------------------------------------------
server.on("/", handle_OnConnect);
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("Initializing OLED Display");
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
Serial.println("HTTP server started");
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
messageTemp += (char)payload[i];
}
Serial.println();
Serial.print(messageTemp);
if(topic=="livingroom/securitydoor"){
Serial.print("Changing esp01 relay1 to ");
if(messageTemp == "on"){
digitalWrite(relay1, LOW);
Serial.print("On");
Serial.print("On from opening");
}
else if(messageTemp == "off"){
digitalWrite(relay1, HIGH);
Serial.print("Off");
Serial.print("On from Closing");
}
}
Serial.println();
if(topic=="livingroom/ac"){
Serial.print("Changing esp01 relay2 to ");
if(messageTemp == "on"){
digitalWrite(relay2, LOW);
Serial.print("On");
Serial.print("On from opening");
}
else if(messageTemp == "off"){
digitalWrite(relay2, HIGH);
doorClosing();
Serial.print("Off");
Serial.print("On from Closing");
}
}
Serial.println();
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
Serial.println("connected");
client.subscribe("livingroom/securitydoor");
client.subscribe("livingroom/ac");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Подождите 5 секунд перед повторной попыткой
delay(5000);
}
}
}
//-------------------------- Пустой цикл------------------- ----
void loop() {
server.handleClient();
if (!client.connected()) {
reconnect();
}
client.loop();
}
//-------------- Функция веб-звонков -----------
void handle_OnConnect() {
String s = MAIN_page; //Чтение HTML-содержимого
server.send(200, "text/html", s);
}
void handle_NotFound(){
server.send(404, "text/plain", "Not found");
}
Проблема: сообщение снизу не печатается последовательно
Serial.print("On");
Serial.print("On from opening");
На самом деле код отображает тему и сообщение в последовательной консоли.
Мой фактический вариант использования — отображение состояния на OLED-дисплее, а также реле управления.
@bentech4u, 👍-1
Обсуждение1 ответ
▲ 0
спасибо за предложения,
Когда я делаю это так, как показано ниже, все работает
if (strcmp(topic, "livingroom/securitydoor") == 0)
{
Serial.print(topic);
}
,
@bentech4u
Смотрите также:
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разница между этими двумя платами NodeMCU?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как определить размер Flash?
- Как изменить имя модуля ESP8266-12E по умолчанию
- Простой запрос GET с ESP8266HTTPClient
- В ESP-12E NodeMCU, какой выход PIN A0?
Это не то, как вы сравниваете строки C. Вы сравниваете там два адреса, и они никогда не совпадут. Почитайте о
strcmp
., @Majenko