6. PieSwitchDHT

6.1 เปิดไฟล์ PieSwitchDHT.ino บนโปรแกรม Arduino IDE

#include "config.h"            // เรียกใช้งาน config appid, key, secret, wifi_ssid และ wifi_password  
#include "PieRelay.h"        // เรียกใช้งานไลบรารี่สำหรับควบคุม Relay
#include <ESP8266WiFi.h>    // เรียกใช้งานไลบรารี่สำหรับ esp8266
#include <MicroGear.h>    // เรียกใช้งานไลบรารี่สำหรับเชื่อมต่อ NETPIE
#include "DHT.h"            // เรียกใช้งานไลบรารี่สำหรับอ่านค่า DHT Sensor

#define ENABLE_DHT
#define DHTPIN      14        // กำหนด PIN ที่ต่อขา DATA ของ DHT Sensor
#define DHTTYPE     DHT11    // กำหนดรุ่นของ DHT Sensor

#define RELAYPIN1  13
#define RELAYPIN2  12
#define BUTTONPIN1 2
#define BUTTONPIN2 0

#ifdef ENABLE_DHT
DHT dht(DHTPIN, DHTTYPE);    // สร้าง object สำหรับ DHT Sensor
int lastDHTRead   = 0;        // timestamp ล่าสุดสำหรับอ่านค่า DHT Sensor
int lastFeedWrite = 0;        // timestamp ล่าสุดสำหรับเก็บข้อมูลลง Feed
float humid = 0;            // ตัวแปรเก็บความชื้น
float temp = 0;                // ตัวแปรเก็บอุณหภูมิ
#endif

const char* ssid     = WIFI_SSID;        // กำหนด wifi ssid ในไฟล์ config.h
const char* password = WIFI_PASSWORD;     // กำหนด wifi password ในไฟล์ config.h

WiFiClient client;
MicroGear microgear(client);

PieRelay *sw1, *sw2;
String data;
bool toPublishSW1State, toPublishSW2State;
int lastDHTPublish = 0;        // timestamp ล่าสุดสำหรับส่งค่า DHT Sensor

void stateChange(int relayID, int type, int state) {
  Serial.print("relay "); Serial.print(relayID); Serial.print(" --> "); Serial.println(state?"ON":"OFF");
  if (relayID==1) toPublishSW1State = true;
  if (relayID==2) toPublishSW2State = true;
}

void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
  char m = *(char *)msg;
  msg[msglen] = '\0';
  Serial.print("incoming message: "); Serial.print((char *)topic); Serial.print(" --> "); Serial.println((char*)msg);

  if (msg[0]=='1' && msg[1]=='0') sw1->setState(0);
  if (msg[0]=='1' && msg[1]=='1') sw1->setState(1);
  if (msg[0]=='2' && msg[1]=='0') sw2->setState(0);
  if (msg[0]=='2' && msg[1]=='1') sw2->setState(1);
  if (msg[0]=='1' && msg[1]=='?') toPublishSW1State = true;
  if (msg[0]=='2' && msg[1]=='?') toPublishSW2State = true;
}

void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
    Serial.println("Connected to NETPIE...");
    microgear.setAlias(ALIAS);
    toPublishSW1State = true;
    toPublishSW2State = true;
}

/* 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 */
void initWiFi(){
    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());
}

void setup() {
  Serial.begin(115200);

  sw1 = new PieRelay(1, RELAYPIN1, BUTTONPIN1);
  sw2 = new PieRelay(2, RELAYPIN2, BUTTONPIN2);

  sw1->setCallback(STATECHANGE, stateChange);
  sw2->setCallback(STATECHANGE, stateChange);

  #ifdef ENABLE_DHT
    dht.begin();             // เรียกใช้การอ่านค่า DHT Sensor
  #endif

  initWiFi();

  microgear.on(MESSAGE,onMsghandler);
  microgear.on(CONNECTED,onConnected);
  microgear.init(KEY,SECRET);
  microgear.connect(APPID);

  lastFeedWrite = millis();     // เริ่มต้นเก็บ timestamp สำหรับเก็บข้อมูลลง Feed
}

void loop() {
    #ifdef ENABLE_DHT
      if (millis() - lastDHTRead > 2000) {    // ตรวจสอบ timestamp ล่าสุดที่อ่านค่า DHT Sensor หากเกิน 2 วินาที ให้ทำงานคำสั่งข้างล่าง
        float h = dht.readHumidity();        // อ่านค่าความชื้นเก็บลงตัวแปร h
        float t = dht.readTemperature();        // อ่านค่าอุณหภูมิเก็บลงตัวแปร t
        if (!isnan(h)) humid = h;            // ตรวจสอบความชื้นที่ได้เป็นตัวเลขหรือไม่ ถ้าใช่เก็บลงตัวแปร humid
        if (!isnan(t)) temp = t;            // ตรวจสอบอุณหภูมิที่ได้เป็นตัวเลขหรือไม่ ถ้าใช่เก็บลงตัวแปร temp
        lastDHTRead = millis();            // อัพเดท timestamp ล่าสุดที่อ่านค่าจาก DHT Sensor
      }    
    #endif

    if(WiFi.status()!=WL_CONNECTED){
      WiFi.disconnect();
      initWiFi();
    } else {
        if (microgear.connected()) {
            if (toPublishSW1State) {
              microgear.publish("/state1",sw1->getState()?"1":"0");
              toPublishSW1State = false;
            }

            if (toPublishSW2State) {
              microgear.publish("/state2",sw2->getState()?"1":"0");
              toPublishSW2State = false;
            }

            if (millis() - lastFeedWrite > 15000) {    // ตรวจสอบ timestamp ล่าสุดที่เก็บข้อมูล DHT Sensor ลง Feed หากเกิน 15 วินาที ให้ทำงานคำสั่งข้างล่าง
              data = "temp:"+String(temp)+",humid:"+String(humid);
              Serial.print("Writing data to feed --> ");
              Serial.println(data);
              microgear.writeFeed(FEEDID,data,FEEDAPIKEY);     // เก็บข้อมูล DHT Sensor ลง Feed
              lastFeedWrite = millis();    // อัพเดท timestamp ล่าสุดที่เก็บข้อมูล DHT Sensor ลง Feed
            }

            if (millis() - lastDHTPublish > 2000) {    // ตรวจสอบ timestamp ล่าสุดที่ส่งค่า DHT Sensor หากเกิน 2 วินาที ให้ทำงานคำสั่งข้างล่าง
              data = String(temp)+String(",")+String(humid);
              Serial.print("Publish dht data --> ");
              Serial.println(data);
              microgear.publish("/dht",data);        // ส่งค่า DHT Sensor ไปที่ topic ชื่อ “/dht”
              lastDHTPublish = millis();        // อัพเดท timestamp ล่าสุดที่ส่งค่า DHT Sensor
             }
            microgear.loop();
        }
        else {
          microgear.connect(APPID);
          delay(500);
        }
    }
}

6.2 คลิกที่แท็บ config.h และแก้ไข config ต่างๆให้ถูกต้อง

#define WIFI_SSID      "{SSID}"            // ชื่อ WiFi
#define WIFI_PASSWORD  "{WIFI_PASSWORD}"    // รหัส WiFi

#define APPID          "{APPID}"        // appid หรือ application id ได้จากการสร้าง application บนเว็บ NETPIE
#define KEY            "{KEY}"        // key ได้จากการสร้าง key ภายใต้ application id สร้างได้บนเว็บ NETPIE (แนะนำใช้เป็น Device Key)
#define SECRET         "{SECRET}"    // secret ได้จากการสร้าง key ภายใต้ application id สร้างได้บนเว็บ NETPIE (แนะนำใช้เป็น Device Key)
#define ALIAS          "{ALIAS}"        // alias เป็นชื่อของอุปกรณ์ จะตั้งชื่ออะไรก็ได้ที่จำได้ (ตัวอย่างนี้ใช้เป็น pieswitch)

#define FEEDID         "{FEEDID}"    // ชื่อ FEED สำหรับเก็บข้อมูล
#define FEEDAPIKEY     "{FEEDAPIKEY}"    // API Key สำหรับขออนุญาติเก็บข้อมูลลง Feed

6.3 เข้าไปที่หน้าของ FEED บนเว็บไซต์ https://netpie.io คลิกที่เมนู RESOURCES --> FEEDS กดสร้าง FEED ที่ปุ่ม +

6.4 ตั้งชื่อ Feed และไม่ซ้ำกับชื่อ Feed ของผู้ใช้งานอื่นๆ และกด CREATE

6.5 หลังจากสร้างเรียบร้อยแล้ว จะมีชื่อ Feed เพิ่มขึ้นมา ให้คลิกที่ชื่อ Feed ที่ได้สร้างไว้ ตัวอย่างหน้า Feed

6.6 สร้าง Field สำหรับเก็บข้อมูล โดยคลิกที่ปุ่ม ADD ตั้งชื่อและหน่วยของข้อมูล และกด SAVE

6.7 หลังจากที่เพิ่ม Field temp แล้ว ทำตามข้อ 6.6 อีกครั้งโดยตั้งชื่อเป็น humid

6.8 คลิกที่แท็บ Permission และคัดลอก Default API Key ไปวางไว้ในไฟล์ config.h บน Arduino IDE

config.h :

#define FEEDID         "switchdb"
#define FEEDAPIKEY     "hFEdvEOQWyJt9hf5dJ6i1bvtjjAl2J9C"

6.9 Upload Code ( ดูขั้นตอนการอัพโหลดได้ตามหัวข้อ 4.2-4.4 ) และดูสถานะการเก็บข้อมูลลง Feed ได้ผ่านหน้า Feed บนเว็บไซต์ https://netpie.io/feed

6.10 สร้าง Dashboard บน Freeboard จะสร้างใหม่ หรือใช้ตัวเดียวกันกับตัวเดิมที่สร้างก่อนหน้านี้ก็ได้ (ข้อ 5.5) และ Import ไฟล์ json ที่อยู่ใน Folder ชื่อ PieSwitchDHT และเลือกไฟล์ freeboard_config.json จะได้ Dashboard ดังภาพ

6.11 ทำตามข้อ 5.8 และส่วนที่เพิ่มขึ้นมาจะสังเกตเห็นว่ามี Datasource ชื่อ dhtFeed เพิ่มขึ้นมา และ Widget Gauge และ Graph

6.12 แก้ไข Datasource ชื่อ dhtFeed

  • {FEEDID} เป็นชื่อ Feed ที่สร้างบนเว็บไซต์ https://netpie.io/feed
  • {FEED_APIKEY} เป็น Default API Key (ดูข้อ 6.8)

6.13 เมื่อแก้ไขเสร็จ กดปุ่ม SAVE จะสังเกตเห็นกราฟแสดงขึ้นมาด้านล่าง (เมื่อมีการเก็บข้อมูลลง Feed แล้ว)

6.14 จากนั้นแก้ไขส่วนที่เป็น Widget Gauge โดยนำเมาส์ไปวางบน widget ที่ต้องการแก้ไข จะมีเมนูที่ hidden อยู่ปรากฏขึ้นมา คลิกที่ปุ่ม

6.15 ในช่อง VALUE ให้แก้ {APPID} เป็นชื่อเดียวกันกับชื่อ Application ที่ได้สร้างตามข้อ 3.2

ยกตัวอย่าง Application ID ชื่อ PieSwitch

datasources["switchDS"]["/PieSwitch/dht"].split(',')[0]

แก้ไข Widget Gauge ของ humid ส่วนของ VALUE จาก {APPID} เป็นชื่อของ Application เหมือนกัน

6.16 ถ้าหากต้องการทำให้ Freeboard สั่งงานอัตโนมัติ ก็สามารภที่จะเขียนคำสั่งเพิ่มเติมได้ โดยแก้ไขในส่วนของช่อง VALUE (เปิดขยายช่องสำหรับเขียนโค้ดเพิ่มโดยกดที่ .JS EDITOR เมื่อเขียนเสร็จก็กด CLOSE)

ตัวอย่าง ถ้าอุณหภูมิสูงกว่า 30 องศา ให้สั่งสวิตซ์ตัวที่ 1 เปิด หากต่ำกว่าหรือเท่ากับ 30 ให้ปิด

การเขียนโค้ดเขียนลักษณะดังด้านล่าง และสุดท้ายต้องจะ return ค่าผลลัพธ์ที่ต้องการแสดงผลออกมาด้วย เพียงแค่เพิ่มเงื่อนไขสำหรับสั่งงานเข้าไป

if(datasources["switchDS"]["/SwitchWorkShop/dht"].split(',')[0]>30) // ตรวจสอบเงื่อนไข
    microgear["switchDS"].chat("pieswitch","11");  // ใช้คำสั่ง microgear สั่งเปิดสวิตซ์ตัวที่ 1
else 
    microgear["switchDS"].chat("pieswitch","10");  // ใช้คำสั่ง microgear สั่งปิดสวิตซ์ตัวที่ 1
return datasources["switchDS"]["/SwitchWorkShop/dht"].split(',')[0]   // ค่าที่ส่งกลับไปแสดงผลบน Gauge

ตัวอย่างผลลัพธ์

อุณหภูมิต่ำกว่าหรือเท่ากับ 30 องศาเซลเซียส สั่งปิดสวิสต์ตัวที่ 1 อัตโนมัติ

อุณหภูมิสูงกว่า 30 องศาเซลเซียส สั่งเปิดสวิสต์ตัวที่ 1 อัตโนมัติ

results matching ""

    No results matching ""