วันอาทิตย์ที่ 14 สิงหาคม พ.ศ. 2559

เปิดปิด Relay บอร์ด nudemcu กับ netpie ง่ายๆ ไม่ยากอย่างที่คิด

            ก่อนอื่นต้องขอบอกก่อนว่า เคยลองเล่น nodemcu (ESP2866) เมื่อ ประมาณ 1 ปีมาแล้ว แต่ไม่ได้ทำอะไรต่อ วันนี้เป็นโอกาสดี ลองทบทวนความรู้ที่เรียนมาสักหน่อย โดยจะขออธิบายวิธีการทำง่ายๆ ให้เข้าใจกัน โดยเราจะวางแผนก่อน

1. การต่อวงจร ระหว่าง nodemcu กับ relay
2. สมัคร Netpie และสร้าง Application
3. เขียนโปรแกรมลง Nodemcu ร่วมกับการใช้ netpie
4. เชื่อมต่อกับ netpie FreeBoard

4 ขั้นตอน  เริ่มกันเลย

ขั้นตอนที่ 1 การต่อวงจร ระหว่าง nodemcu กับ relay 


 จะต่อรูปแบบนี้

จัดการต่อสาย VCC GND และ output (GPIO 12, 13)




















ต่อเข้ากับ Relay ให้ตรงกัน
เสร็จขั้นตอนแรกแล้ว











ขั้นตอนที่ 2 สมัคร Netpie และสร้าง Application
1. เข้าไปที่ https://netpie.io
2. ทำการสมัคร ระบบจะส่ง SMS มาให้เพื่อ Confirm
3. เข้ามาเมนู Application


4. กดปุ่ม + Application ใส่ชื่อ App ที่ต้องการตั้งให้เรียบร้อย จากนั้นรอการเขียน Code จาก nodemcu

ขั้นตอนที่ 3 เขียนโปรแกรมลง Nodemcu ร่วมกับการใช้ netpie
1. install microgear ก่อน 


2. install esp2866 
3. เมื่อ install ทั้ง 2 เสร็จแล้ว ให้เข้าไปที่ โค้ดตัวอย่าง



4. ปรับแต่ง Code นี้หน่อย  
    1. เพิ่ม Esp2866WIFI มาก่อน  
    2. ใส่ Key และ Password จาก Netpie โดยเข้าไปยัง Application ที่เราสร้างไว้ใน Netpie แล้ว Copy Key / Password มาใส่ใน Code ตามตัวอย่าง
ปรับ Network และ AppID KEY SECRET ALIAS ให้เรียบร้อย
5. ลองทดสอบ Upload Code เข้า Node MCU


Code 

#include

#include
#include
#include
#include
#include
#include

#include
#include
#include
#include
#include
#include



const char* ssid     = "T-TECH";
const char* password = "xxxxx";

#define APPID   "NetPieApp1"
#define KEY      "xxxxx"
#define SECRET  "xxxx"
#define ALIAS   "esp8266"

WiFiClient client;

int timer = 0;
int i =1;
MicroGear microgear(client);

/* If a new message arrives, do this */
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
    Serial.print("Incoming message --> ");
    msg[msglen] = '\0';

      char strState[msglen];
      for (int i = 0; i < msglen; i++) 
      {
        strState[i] = (char)msg[i];
        Serial.print((char)msg[i]);
      }
     
      Serial.println();
    
      String stateStr = String(strState).substring(0, msglen);
    
    //=========== ช่วงประมวลผลคำสั่ง =============
    
      if (stateStr == "SW1ON") 
      {
       digitalWrite(13, HIGH);
        microgear.chat("sw1", "ON");        //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard
      } 
      else if (stateStr == "SW1OFF") 
      {
       digitalWrite(13, LOW);
        microgear.chat("sw1", "OFF");       //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard
      }else  if (stateStr == "SW2ON") 
      {
       digitalWrite(12, HIGH);
        microgear.chat("sw2", "ON");        //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard
      } 
      else if (stateStr == "SW2OFF") 
      {
       digitalWrite(12, LOW);
        microgear.chat("sw2", "OFF");       //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard
      }
     
    //=========== ช่วงประมวลผลคำสั่ง  =============
}

void onFoundgear(char *attribute, uint8_t* msg, unsigned int msglen) {
    Serial.print("Found new member --> ");
    for (int i=0; i
        Serial.print((char)msg[i]);

    Serial.println();  
}

void onLostgear(char *attribute, uint8_t* msg, unsigned int msglen) {
    Serial.print("Lost member --> ");
    for (int i=0; i
        Serial.print((char)msg[i]);
    Serial.println();
}

/* When a microgear is connected, do this */
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
    Serial.println("Connected to NETPIE...");
    /* Set the alias of this microgear ALIAS */
    microgear.setAlias(ALIAS);
}


void setup() {
    /* Add Event listeners */

    /* Call onMsghandler() when new message arraives */
    microgear.on(MESSAGE,onMsghandler);

    /* Call onFoundgear() when new gear appear */
    microgear.on(PRESENT,onFoundgear);

    /* Call onLostgear() when some gear goes offline */
    microgear.on(ABSENT,onLostgear);

    /* Call onConnected() when NETPIE connection is established */
    microgear.on(CONNECTED,onConnected);
    

    Serial.begin(115200);
    Serial.println("Starting...");

    /* Initial WIFI, this is just a basic method to configure WIFI on ESP8266.                       */
    /* You may want to use other method that is more complicated, but provide better user experience */
    if (WiFi.begin(ssid, password)) {
        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
            Serial.print(".");
        }
    }

    Serial.println("WiFi connected");  
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());

    /* Initial with KEY, SECRET and also set the ALIAS here */
    microgear.init(KEY,SECRET,ALIAS);

    /* connect to NETPIE to a specific APPID */
    microgear.connect(APPID);
    pinMode(12, OUTPUT);
    pinMode(13, OUTPUT);
}

void loop() {
     
    /* To check if the microgear is still connected */
    if (microgear.connected()) {
        Serial.println("connected");

        /* Call this method regularly otherwise the connection may be lost */
        microgear.loop();

        
    }
    else {
        Serial.println("connection lost, reconnect...");
        if (timer >= 5000) {
            microgear.connect(APPID);
            timer = 0;
        }
        else timer += 100;
    }
    delay(100);
}


6. ถ้าทุกอย่างไม่ผิดผลาด จะ Connect Netpie ได้ 
7. ลองกลับไปดูที่ Application ใน Netpie จะมี Device เพิ่มขึ้นมาแล้ว 



ขั้นตอนที่ 4. เชื่อมต่อกับ netpie FreeBoard
1. ไป Download Freeboard ที่ https://github.com/netpieio



2. เมื่อ Load เรียบร้อยแล้ว แตก Zip แล้ว เข้าไป Folder จากนั้น เปิด index.html ออกมาเลย
3. Add
4. เลือก microgear

5. กำหนด ค่า ต่าง

กรอกข้อมูล Applicaiton    Key / Password จาก Application บน NETPIE 
และที่สำคัญคือ microgear refferance เพื่ออ้างอิง จากนั้น SAVE
6. Add pane เพื่อเลือก UI ต่างๆ


7. เลือก Button  เราจะทำปุ่มเปิดไฟ


8. กำหนดค่าตามรูป  เดี๋ยวอธิบายอีกที

    ตรงนี้คือการกำหนดปุ่ม และเมื่อกดปุ่มแล้วจะส่งค่า ไปยังอุปกรณ์ของเรา Nodemcu โดย Action ที่จำเป็นคือ onclick action รูปแบบการใส่จะเป็น microgear["device"].chat("esp8266","SW1ON")

  device  = เกิดจากการรกำหนดค่า ในข้อ 5 คือ Refferance 
  esp8266   = ห้องของการส่ง Message ตรงนี้จะสัมพันธ์กับ Code ภาษา C
  SW1ON = message ที่ส่งเข้าอุปกรณ์ ยกตัวอย่าง SW1ON คือ switch 1 ให้ on  หรือ SW1OFF คือ Switch 1 ให้ OFF  ค่า Message นี้จะถูกไปเปรียบเทียบใน Code C ต่อไป


ตอนนี้สร้าง 2 Switch    มี เปิด / ปิด และสถานะการเปิดปิด

จากนั้น กลับไปดูที่ Code  เราสนใจ onMsghandler เป็น Event ที่คอยดักจับ Message ที่เข้ามา


SW1ON, SW2ON, SW1OFF, SW2OFF  ==> คือ message จาก Freeboard เราทำการเลือกเงื่อนไข
โดยใน Code นี้ จะเป็นการเปิด และ ปิดไฟ ที่ GPIO ต่างๆ


/* If a new message arrives, do this */
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
    Serial.print("Incoming message --> ");
    msg[msglen] = '\0';

      char strState[msglen];
      for (int i = 0; i < msglen; i++) 
      {
        strState[i] = (char)msg[i];
        Serial.print((char)msg[i]);
      }
     
      Serial.println();
    
      String stateStr = String(strState).substring(0, msglen);
    
    //=========== ช่วงประมวลผลคำสั่ง =============
    
      if (stateStr == "SW1ON") 
      {
       digitalWrite(13, HIGH);
        microgear.chat("sw1", "ON");        //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard
      } 
      else if (stateStr == "SW1OFF") 
      {
       digitalWrite(13, LOW);
        microgear.chat("sw1", "OFF");       //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard
      }else  if (stateStr == "SW2ON") 
      {
       digitalWrite(12, HIGH);
        microgear.chat("sw2", "ON");        //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard
      } 
      else if (stateStr == "SW2OFF") 
      {
       digitalWrite(12, LOW);
        microgear.chat("sw2", "OFF");       //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard
      }
     
    //=========== ช่วงประมวลผลคำสั่ง  =============
}


ลองทำทดสอบดู ครับ .....   ครั้งหน้าจะทำเป็น VDO มาให้ดูครับ





สอนเขียนโปรแกรม ในขอนแก่น และภาคอีสาน

สอนเขียนโปรแกรม ในขอนแก่น และภาคอีสาน (Programming , KhonKaen ) ประสบการณ์.มากกว่า 18 ปี ป.ตรี วิทยาการคอมพิวเตอร์ ม.กรุงเทพ ป.โท วิทยาการคอ...