MQTT с OLED Realy: - дисплей не работает должным образом
Я новичок в Arduino/ESP и пишу код для активации 2 реле с помощью MQTT. Также нравится отображать статус на OLED
вот мой код
#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 "wifipassword"
#define mqtt_server "192.168.1.1"
#define mqtt_user "username"
#define mqtt_password "password"
SSD1306Wire display(0x3c, D2, D1);
const int relay1 = 5;
const int relay2 = 4;
String header;
String display_line2;
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);
//dht.begin();
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);
// Начнем с подключения к сети WiFi
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();
if(strcmp(topic, "livingroom/securitydoor") == 0){
Serial.print("Changing esp01 relay1 to ");
if(messageTemp == "on"){
digitalWrite(relay1, LOW);
Serial.print("On");
doorOpening();
}
else if(messageTemp == "off"){
digitalWrite(relay1, HIGH);
Serial.print("Off");
doorClosing();
}
}
Serial.println();
if(topic=="livingroom/ac"){
Serial.print("Changing esp01 relay2 to ");
if(messageTemp == "on"){
digitalWrite(relay2, LOW);
Serial.print("On");
doorOpening();
}
else if(messageTemp == "off"){
digitalWrite(relay2, HIGH);
Serial.print("Off");
doorClosing();
}
}
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");
}
//----------------------- Светодиодный дисплей----------------------- ---------------
void doorOpening() {
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_24);
display.drawString(0, 0, "Door");
display.setFont(ArialMT_Plain_24);
display.drawString(0, 28, "Opening");
display.display();
}
void doorClosing() {
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_24);
display.drawString(0, 0, "Door");
display.setFont(ArialMT_Plain_24);
display.drawString(0, 28, "Closing");
display.display();
}
на самом деле функция doorOpening() приходит, а функция doorClosing() не приходит на OLED
опять же я не очень силен в программировании и arduino/esp8266
@bentech4u, 👍-1
Обсуждение1 ответ
▲ 0
Я обнаружил проблему, на самом деле контакт реле был определен на D1 & D2 по ошибке я подключил oled к этим контактам
,
@bentech4u
Смотрите также:
- Какие входные контакты я могу использовать на ESP8266 NodeMCU
- ESP8266 не может подключиться к брокеру MQTT
- Однонаправленная связь между NodeMCU и Arduino выплевывает мусор
- Wemos D1 не работает с MH-Z19B (датчик CO2)
- Ошибка программного сброса wdt на NodeMCU (ESP8266)
- Отправьте несколько значений из Arduino Uno в nodeMCU, используя последовательный порт.
- NODEMCU 1.0 HX711 Тензодатчик читает странный текст
- Как защитить ссылку/URL-адрес формы ESP-12E для управления светодиодом
Я бы предложил оставить брокера MQTT и, возможно, OLED из программного обеспечения, пока вы не получите основную функцию открытия и закрытия двери гаража, работающую должным образом. Кроме того, нет причин предполагать, что определенные библиотеки совместимы друг с другом. Даже если они работают на одной платформе Arduino, они могут не работать друг с другом на другой платформе., @st2000
но здесь, если я вызываю функцию в цикле voild, oled отображает то, что я ожидал, и MQTT всегда работает для меня. я думал сделать mqtt и oled перед реальной электрической схемой, @bentech4u
Может быть числом, если у вас могут возникнуть проблемы с кодом или исходным кодом MQTT. Например, вы на самом деле отправляете «OFF» вместо «off» или даже «Off»? Вот почему я сказал сначала делать простые вещи. Убедитесь, что они работают. Затем добавьте к тому, что, как вы знаете, работает. Когда что-то ломается и не можешь разобраться. Было бы время задать вопрос., @st2000
Кстати, рассмотрите возможность использования Tasmota и поддерживаемого продукта на основе Sonoff ESP вместо написания собственного кода. С Tasmota вы можете предположить, что функция MQTT работает, работает веб-сервер, работает WIFI и работает контроль над поддерживаемыми реле Sonoff., @st2000