ใครเก่งเรื่อง C# บ้างครับตอนนี้ผมจะทำให้ ส่ง mqtt มาสั่ง led

สรุปว่าใช้ Broker ของ HiveMQ MQTT broker แต่ใช้ use ของคนอื่น โอเคเดียวว่างๆ ผมจะลองเล่นดูนะครับ


ผมตั้ง MQTTbox ตามนี้

ตอนนี้ ฮาร์ทแวร์ต่อแบบไหนครับ มีรูปไหม

1 Likes

ตอนนี้คือสั่ง เปิด/ปิด 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

image

เมื่อ NodeMCU อ่านได้ว่าส่งค่า อะไรมามันก็วิ่งเข้าไปทำงานตามลูปของมันแบบนี้

image

เมื่อเรารู้เช่นนี้แล้ว เราก็จะสามารถค่อยๆ จับจุดได้ว่าทำไม มันต้องกดเบิ้ล ถึงจะปิด

ตอนนี้ผมติดตรงเวลา ใส่ topic ของทั้งสองมันทำงานแค่อันเดียวอะครับ ตอนนี้ผมแก้แบบแยก ฝั่ง subscibe และ publish

ตรงนี้แก้ไขไปยังครับ

ไอตรงนี้เอาไว้ทำอะไรครับ อธิบายหน่อย 555