Hardware & program

ต่อ Hardware

  • นำ Nodemcu ต่อเข้ากับ Prototype board
  • ต่อ LED1 ขั้วบวก เข้ากับ D1 และ LED1 ขั้วลบต่อกับตัวต้านทาน และ ต่อตัวต้านทานลง GND
  • ต่อ LED2 ขั้วบวก เข้ากับ D2 และ LED2 ขั้วลบต่อกับตัวต้านทาน และ ต่อตัวต้านทานลง GND
  • ต่อ LED3 ขั้วบวก เข้ากับ D3 และ LED3 ขั้วลบต่อกับตัวต้านทาน และ ต่อตัวต้านทานลง GND
  • นำสาย USB ต่อ NodeMCU เข้าคอม จะได้ดังรูป

เขียนโปรแกรม

เปิดเข้าโปรแกรม Arduino IDE เลือกบอร์ดที่ใช้เป็น NodeMCU

เข้าเมนู Tool > Board > NodeMCU 1.0 (หรือ NodeMCU 0.9 ตามที่ผู้ใช้เลือกใช้)

เลือก Port ในการลงโปรแกรม

เข้าเมนู Tool > Port > Port ของ NodeMCU (ถ้าไม่รู้ลองถอดสายแล้วดูว่าเมนูไหนหายไปแล้วเสียบใหม่)

เลือก Programmer ในการ Burn program

เข้าเมนู Tool > Programmer > Arduino ISP Parallel Programmer (ถ้า v1.0 ใช้ Parallel Programmer)

ตัวอย่าง โปรแกรม

สามารถดาว์นโหลดได้ ที่นี่

ดึง Library Anto มาใช้

#include <AntoIO.h>

กำหนดการตั้งค่าต่างๆ

// username of anto.io account
const char *user = "user";

// key of permission, generated on control panel anto.io
const char* key = "key";

// your default thing.
const char* thing = "NodeMCU";

// create AntoIO object named anto.
// using constructor AntoIO(user, key, thing)
// or use AntoIO(user, key, thing, clientId)
// to generate client_id yourself.
AntoIO anto(user, key, thing);

bool bIsConnected = false;

User ใช้ username ที่กดดูได้จาก ลิงค์

key ใช้ key ที่เราได้สร้างมาจากหัวข้อ Prepare

thing ใช้ NodeMCU ที่เราได้สร้างมาจากหัวข้อ Create Thing

สร้าง object anto ขึ้นมาเพื่อนำไปใช้งาน

กำหนดตัวแปรที่ใช้ในการรับค่าจาก channel

int Led1,Led2,Led3 = 0;

ตั้งค่าพื้นฐานในการเชื่อมต่อ Wifi,Anto และ กำหนดขา Output ให้กับ Hardware




void setup\(\) {

// SSID and Password of your WiFi access point.

const char\* ssid = "ssid";

const char\* pwd  = "pass";

Serial.begin\(115200\);

delay\(10\);

Serial.println\(\);

Serial.println\(\);

Serial.print\("Anto library version: "\);

Serial.println\(anto.getVersion\(\)\);

// Connect to your WiFi access point

if \(!anto.begin\(ssid, pwd\)\) {

Serial.println\("Connection failed!!"\);

// Stop everything.

while \(1\);

}

Serial.println\(\);

Serial.println\("WiFi connected"\);

Serial.println\("Connecting to MQTT broker"\);

// register callback functions

anto.mqtt.onConnected\(connectedCB\);

anto.mqtt.onDisconnected\(disconnectedCB\);

anto.mqtt.onData\(dataCB\);

anto.mqtt.onPublished\(publishedCB\);

// Connect to Anto.io MQTT broker

anto.mqtt.connect\(\);

Serial.println\("WiFi connected & Connecting to MQTT broker"\);

//port output

//pinMode\(D0,OUTPUT\);

pinMode\(D1,OUTPUT\);

pinMode\(D2,OUTPUT\);

pinMode\(D3,OUTPUT\);

}

ตั้งค่า ssid และ password ในการเชื่อมต่อ wifi

กำหนดค่า Serial ที่ใช้ในการติดต่อสื่อสารเป็น 115200

แสดงเลขเวอร์ชัน Lib ของ Anto สามารถนำไปเชคว่าเป็นเวอร์ชันล่าสุดหรือไม่

เชื่อมต่อ wifi และ anto ด้วย anto.begin แล้วสั่ง Serial print เมื่อเชื่อมต่อสำเร็จ

กำหนดค่า call back functions (คำอธิบายแต่ละ function ดูด้านล่าง)

ตั้งค่า Pin ที่ต่อกับหลอดไฟ D1,D2,D3 ให้เป็น OUTPUT

**ในส่วนของ void loop() จะไม่ได้เขียนโปรแกรมอะไรเพราะเราจะใช้ในส่วนของ call back fuction อย่างเดียว**

void loop() {
// put your main code here, to run repeatedly:
}

**สร้าง function connectedCB() ขึ้นมา**




/\*

connectedCB\(\): a callback function called when the connection to the MQTT broker is establised.    
\*/    
void connectedCB\(\)    
{    
  // If the connection is establised, subscribe channels.

bIsConnected = true;    
  Serial.println\("Connected to MQTT Broker"\);

anto.sub\("LED1"\);    
  anto.sub\("LED2"\);    
  anto.sub\("LED3"\);    
}

เพื่อกำหนดว่า เมื่อ connect กับ MQTT broker แล้วจะให้ทำอะไรต่อ ในที่นี้

เปลี่ยนค่าตัวแปร bIsConnected เป็น true เพื่อบอกว่าต่อกับ MQTT broker ได้แล้ว และ Serial print ออกมา

Anto.sub("LED1") เพื่อ Subscribe channel ที่เราต้องการดึงค่ามาดูเมื่อมีการเปลี่ยนแปลงในที่นี้เรา Subscribe ไว้ 3 channel คือ LED1 , LED2 , LED3

**สร้าง function disconnectedCB() ขึ้นมา**




/\*

disconnectedCB\(\): a callback function called when the connection to the MQTT broker is broken.

\*/

void disconnectedCB\(\)

{

bIsConnected = false;

Serial.println\("Disconnected to MQTT Broker"\);


}

เพื่อกำหนดว่า เมื่อ disconnect กับ MQTT broker แล้วจะให้ทำอะไรต่อ ในที่นี้ ให้ Serial print ออกมาบอก

สร้าง function msgArrvCB(String& topic, String& msg) ขึ้นมา

/*
* msgArrvCB(): a callback function called when there a message from the subscribed channel.
*/
void dataCB(String& topic, String& msg)
{
    uint8_t index = topic.indexOf('/');

    index = topic.indexOf('/', index + 1);
    index = topic.indexOf('/', index + 1);

    topic.remove(0, index + 1);

    Serial.print(topic);
    Serial.print(": ");
    Serial.println(msg);

    if(topic.equals("LED1")){
      value = msg.toInt();
      if(value == 1){
        digitalWrite(D1,HIGH);
      }
      else{
        digitalWrite(D1,LOW);
      }

    }
    else if(topic.equals("LED2")){
     value = msg.toInt();
     if(value == 1){
        digitalWrite(D2,HIGH);
      }
      else{
        digitalWrite(D2,LOW);
      }
    }
    else if(topic.equals("LED3")){
      value = msg.toInt();
      if(value == 1){
        digitalWrite(D3,HIGH);
      }
      else{
        digitalWrite(D3,LOW);
      }
    }
}

[สำคัญ]

เพื่อรับข้อความจาก channel ที่เราไป Subscribe ไว้ โดยจะเก็บไว้ในตัวแปร topic และ msg

เบื้องต้นเราตัด string topic ให้เหลือเฉพาะ ชื่อของ channel ที่ส่งมา

ทำการเช็ค if ว่าชื่อ channel ที่ส่งมาตรงกับ channel ที่เราต้องการใหม ในที่นี้เราดู channel LED1, LED2, LED3

เมื่อมีข้อความจาก channel ให้เราทำอะไรต่อ ในที่นี้เราต้องการคุมหลอดไฟ ตามค่าที่เราได้มาจาก chanal นั้นๆ

ใช้ตัวแปร Led1, led2, led3 รับค่าจากข้อความ msg ที่แปลงเป็น int ด้วย msg.toInt()

สั่งเปิดปิดหลอดไฟ ตามค่า Led1 , led2 , led3 ด้วย digitalWrite()

สร้าง function publishedCB() ขึ้นมา

/*
* publishedCB(): a callback function called when the message is published.
*/
void publishedCB(void)
{
    Serial.println("published");
}

เพื่อกำหนดว่า เมื่อ published ค่าขึ้นไปบน MQTT broker แล้วจะให้ทำอะไรต่อ ในที่นี้ ให้ Serial print ออกมาบอก

results matching ""

    No results matching ""