สรุปว่าใช้ Broker ของ HiveMQ MQTT broker แต่ใช้ use ของคนอื่น โอเคเดียวว่างๆ ผมจะลองเล่นดูนะครับ
ตอนนี้ ฮาร์ทแวร์ต่อแบบไหนครับ มีรูปไหม
ตอนนี้คือสั่ง เปิด/ปิด led online ได้แล้วใช่ไหมครับ
ใช่ครับผมตอนนี้สั่งเปิดปิดได้แล้วแต่มันจะบัคตรงเวลา led เปิด2 ดวงเวลาจะปิดต้องคลิก 2 ครั้งถึงจะดับ
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define LED D5
#define LED1 D4
#define LED2 D3
#define LED3 D2
int sw = D6;
long lastMsg = 0;
char boss[50];
int value = 0;
String savetxt;
//Enter your wifi credentials
const char* ssid = "Home Boss_2.4G";
const char* password = "0984364710";
//Enter your mqtt server configurations
const char* mqttServer = "broker.mqtt-dashboard.com"; //Enter Your mqttServer address
const int mqttPort = 1883; //Port number
const char* mqttUser = "inboss"; //User
const char* mqttPassword = "mme28038"; //Password
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
delay(1000);
pinMode(LED, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.print("Connected to WiFi :");
Serial.println(WiFi.SSID());
client.setServer(mqttServer, mqttPort);
client.setCallback(MQTTcallback);
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("ESP8266", mqttUser, mqttPassword )) {
Serial.println("connected");
} else {
Serial.print("failed with state ");
Serial.println(client.state()); //If you get state 5: mismatch in configuration
delay(2000);
}
}
client.publish("intboss", "Hello from ESP8266");
client.publish("inboss", "Hello from ESP8266");
client.subscribe("inboss");
}
void MQTTcallback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
String message;
for (int i = 0; i < length; i++) {
message = message + (char)payload[i]; //Conver *byte to String
}
Serial.print(message);
//LED on
if (message == "a") {
digitalWrite(LED, HIGH);
client.publish("inboss", "LED1 ON");
Serial.println(" [ LED1 ON ]");
}
if (message == "s") {
digitalWrite(LED1, HIGH);
client.publish("inboss", "LED2 ON");
Serial.println(" [ LED2 ON ]");
}
if (message == "d") {
digitalWrite(LED2, HIGH);
client.publish("inboss", "LED3 ON");
Serial.println(" [ LED3 ON ]");
}
if (message == "f") {
digitalWrite(LED3, HIGH);
client.publish("inboss", "LED4 ON");
Serial.println(" [ LED4 ON ]");
}
// led off
if (message == "z") {
digitalWrite(LED, LOW);
client.publish("inboss", "LED1 OFF");
Serial.println(" [ LED1 OFF ]");
}
if (message == "x") {
digitalWrite(LED1, LOW);
client.publish("inboss", "LED2 OFF");
Serial.println(" [ LED2 OFF ]");
}
if (message == "c") {
digitalWrite(LED2, LOW);
client.publish("inboss", "LED3 OFF");
Serial.println(" [ LED3 OFF ]");
}
if (message == "v") {
digitalWrite(LED3, LOW);
client.publish("inboss", "LED4 OFF");
Serial.println(" [ LED4 OFF ]");
}
Serial.println();
Serial.println("-----------------------");
}
void loop() {
sw = digitalRead(D6);
client.loop();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
value++;
snprintf (boss, 50, "Handsome Boss #%ld", value);
Serial.print("Nodemcu message: ");
Serial.println(boss);
client.publish("inboss", boss);
}
if (sw == 1) {
client.publish("inboss", "SW ON");
delay(500);
}
}
อันนี้คือแก้หรอครับ
เปล่าครับ ผมเอามาวางเพื่อไว้ดูโค้ตในกระทู้นี้ประกอบไปเลย จะได้ไม่ต้องสลับไปดูใน IDE
แล้วที่ว่าต้อกด 2 ครั้งคือกดตรงไหนครับ
กดใน โปรแกรมครับ
ตอนนี้ผมกำลังหาวิธีแก้ พอผมกด Subscibe รอไปสักผมใส่ topic ของ Publish แล้วอยู่ดี ค่าของ Subscibe มันมาอยู่ใน inboss แทนอะครับ
Code
เวลาที่กด เปิดมันส่งค่า อะไรขึ้นไปครับ
เปิดนี้คือ อะไรหรอครับอันนี้ code ผม ก็อปวางอย่างเดียว 5555
ใน C# กดปุ่มให้เปิด led ครับ
เวลากดที่ปุ่ม led1 มันจะส่งค่า “a” มาให้กับ NodeMCU
เมื่อ NodeMCU อ่านได้ว่าส่งค่า อะไรมามันก็วิ่งเข้าไปทำงานตามลูปของมันแบบนี้
เมื่อเรารู้เช่นนี้แล้ว เราก็จะสามารถค่อยๆ จับจุดได้ว่าทำไม มันต้องกดเบิ้ล ถึงจะปิด
ตอนนี้ผมติดตรงเวลา ใส่ topic ของทั้งสองมันทำงานแค่อันเดียวอะครับ ตอนนี้ผมแก้แบบแยก ฝั่ง subscibe และ publish
ตรงนี้แก้ไขไปยังครับ
ไอตรงนี้เอาไว้ทำอะไรครับ อธิบายหน่อย 555