กระทู้เมื่อเร็วๆ นี้

หน้า: [1] 2 3 ... 10
1
การประกาศใช้ฟังก์ชั่นเมื่อใช้กับ Visual C#
โค๊ด: [Select]
using System.Runtime.InteropServices;
public class PortAccessAPI
{
    [DllImport("inpout32.dll", EntryPoint = "Out32")]
    public static extern void Output(int address, int value);
    [DllImport("inpout32.dll", EntryPoint = "Inp32")]
    public static extern int Input(int address);
}

ฟังก์ชั่นใช้งานเมื่อต้องการส่งค่าออกพอร์ต
โค๊ด: [Select]
int value = 24;
PortAccessAPI.Output(0x378, value);

ฟังก์ชั่นใช้งานเมื่อต้องการรับค่าจากพอร์ต
โค๊ด: [Select]
int value;
value = PortAccessAPI.Input(adress);

ตำแหน่งการประกาศใช้ฟังก์ชั่น
2
งานครั้งที่ 47 [iot#22 NETPIE] วิธีส่งข้อมูลจำนวนมากขึ้น NETPIE แบบไม่ติดลิมิต
NETPIE ยอมให้มีการส่งค่าได้สูงสุด 4 ครั้งใน 1 วินาที (เพื่อป้องกันการโจมตีเซิร์ฟเวอร์) ดังนั้นการส่งข้อมูลที่เกิน 4 ครั้งในครั้งที่เกิน NETPIE จะไม่รับค่านั้น วิธีการแก้ไขสามารถทำได้โดยการรวบรวมข้อมูลหลาย ๆ อย่างที่ต้องการส่งเป็นข้อความเดียวแล้วส่งไปในครั้งเดียวแทนการส่งข้อมูลหลายครั้ง

ลักษณะการส่งข้อมูล
1. กรณีที่ส่งข้อมูลมากกว่า 4 ครั้งใน 1 วินาที ข้อมูลในครั้งที่เกิน NETPIE จะไม่รับ (ข้อมูลนั้นจะสูญหาย)


2. วิธีการแก้ไขทำได้โดยการรวมข้อมูลให้เป็นข้อความเดียวแล้วส่งไปในครั้งเดียวแทน


คอนเซ็ปต์หลักของงาน
บอร์ดตรวจสอบสถานะของขาพอร์ตแล้วรวบรวมสถานะเป็นข้อความเดียวกันโดยแยกข้อมูลดัวยเครื่องหมาย , ก่อนส่งให้ NETPIE

[ขั้นตอนการดำเนินการ]
-สร้าง Application ID
-สร้าง Device Key สำหรับใช้กับบอร์ดทดลอง
-สร้าง Session Key สำหรับใช้กับ FreeBoard
-เขียนโค้ดเพื่อใช้งาน
-ออกแบบ FreeBoard

ซึ่งรายละเอียดเป็นดังนี้
วงจรที่ใช้ทดลอง ทั้งที่เป็นบอร์ด NodeMCU และ WeMOS D1 mini ที่ใช้งานเชื่อมต่อเดิมในงานนั้น ๆ ตัวอย่างเช่น


ส่วนของการดำเนินการ NETPIE
1. เริ่มต้นการใช้งานโดยเข้าไปที่ https://netpie.io/ (หากยังไม่สมัครให้ดำเนินการ)
   (1) ล็อกอิน
   (2) คลิกที่ APPLICATIONS


2. คลิกสร้าง Application คลิกที่ตำแหน่งดังรูป (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 46 ข้ามขั้นตอนนี้ไป)


3. ใส่รายละเอียดของ Application  (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 46 ข้ามขั้นตอนนี้ไป)
   (1) ตั้งชื่อ Application (ชื่อที่ไม่ซ้ำกับใคร ๆ)
   (2) คลิก CREATE


4. สร้าง Application Key  คลิกที่ตำแหน่งดังรูป  (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 46 ข้ามขั้นตอนนี้ไป)


5. สร้าง Application Key (Device Key)  (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 46 ข้ามขั้นตอนนี้ไป)
   (1) ตั้งชื่อ
   (2) เลือกชนิด (เลือกเป็น Device Key)
   (3) คลิก CREATE


6. สร้าง Application Key (Session Key)  (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 46 ข้ามขั้นตอนนี้ไป)
   (1) ตั้งชื่อ
   (2) เลือกชนิด (เลือกเป็น Session Key)
   (3) คลิก CREATE


7. คลิกที่ชื่อ Application Device   (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 46 ข้ามขั้นตอนนี้ไป)


8. คลิกที่ (1) เพื่อดูรหัส นำรหัสที่ปรากฏไปใช้ในโค้ดโปรแกรม


ส่วนจัดการโค้ด
9. แก้ไขรายละเอียดของโปรแกรม
   (1) นำค่าจากขั้นตอน 3,8 มาใส่ในโค้ด
   (2) กำหนดชื่อของบอร์ด
   (3) กำหนดชื่อเป้าหมายที่ต้องการสื่อสาร


10. โค้ดในส่วนที่ใช้ตรวจสอบข้อความที่ได้รับมาจาก NETPIE เพื่อควบคุมการติดดับของ LED


11. โค้ดในส่วนที่ส่งข้อความเข้า NETPIE
   (1) ตรวจสอบสถานะของลอจิกที่ขาพอร์ตแล้วกำหนดข้อความเป็น 1, และ 0, แทนสถานะ
   (2) รวบรวมสถานะของขาพอร์ตทุกขาไว้ในตัวแปรเดียว
   (3) ส่งข้อความขึ้น NETPIE


โค้ดโปรแกรม
โค๊ด: [Select]
#include <ESP8266WiFi.h>
#include <MicroGear.h>

const char* ssid= "wifi_name";
const char* password = "wifi_password";

#define APPID   "Application_ID"
#define KEY     "Application_ KEY"
#define SECRET  "Application_SECRET"

#define ALIAS   "Board1"
#define TARGET   "LivingRoom"
#define LED1     D1
#define LED2     D2
#define LED3     D3
#define LED4     D4
WiFiClient client;
int timer = 0;
MicroGear microgear(client);
void onMsghandler(char* topic, uint8_t* msg, unsigned int msglen) {
  Serial.print("Incoming message --> ");
  Serial.print(topic);
  Serial.print(" : ");
  char strState[msglen];
  for (int i = 0; i < msglen; i++) {
    strState[i] = (char)msg[i];
    Serial.print((char)msg[i]);
  }
  String stateStr = String(strState).substring(0, msglen);
  Serial.println(stateStr);
  if (stateStr == "LED1ON") digitalWrite(LED1, HIGH);
  else if (stateStr == "LED1OFF") digitalWrite(LED1, LOW);
  else if (stateStr == "LED2ON") digitalWrite(LED2, HIGH);
  else if (stateStr == "LED2OFF") digitalWrite(LED2, LOW);
  else if (stateStr == "LED3ON") digitalWrite(LED3, HIGH);
  else if (stateStr == "LED3OFF") digitalWrite(LED3, LOW);
  else if (stateStr == "LED4ON") digitalWrite(LED4, HIGH);
  else if (stateStr == "LED4OFF") digitalWrite(LED4, LOW);
}
void onFoundgear(char* attribute, uint8_t* msg, unsigned int msglen) {
  Serial.print("Found new member --> ");
  for (int i = 0; i < msglen; 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 < msglen; i++)
    Serial.print((char)msg[i]);
  Serial.println();
}
/*When a microgear is connected, dothis*/
void onConnected(char* attribute, uint8_t* msg, unsigned int msglen) {
  Serial.println("Connected to NETPIE...");
  /* Set the alias of this microgearALIAS */
  microgear.setAlias(ALIAS);
}
void setup()
{
  microgear.on(MESSAGE, onMsghandler);
  microgear.on(PRESENT, onFoundgear);
  microgear.on(ABSENT, onLostgear);
  microgear.on(CONNECTED, onConnected);

  Serial.begin(115200);
  Serial.println("Starting...");
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);     
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  if (WiFi.begin(ssid, password))
  {
    while (WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      Serial.print(".");
    }
  }
  Serial.println("WiFiconnected");
  microgear.init(KEY, SECRET, ALIAS);
  microgear.connect(APPID);
}
void loop()
{
  if (microgear.connected()) {
    microgear.loop();
    String status_LED1,status_LED2,status_LED3,status_LED4,data2freeboard;
    status_LED1= digitalRead(LED1)? "1,":"0,";
    status_LED2= digitalRead(LED2)? "1,":"0,";
    status_LED3= digitalRead(LED3)? "1,":"0,";
    status_LED4= digitalRead(LED4)? "1,":"0,";           
    data2freeboard = status_LED1+status_LED2+status_LED3+status_LED4 ;
    microgear.chat(TARGET, data2freeboard);
    Serial.print("Send message to NetPie: ");
    Serial.println(data2freeboard);
  }
  else {
    Serial.println("connection lost, reconnect...");
    if (timer >= 5000) {
      microgear.connect(APPID);
      timer = 0;
    }
    else timer += 100;
  }
  delay(1000);
}

12. อัพโหลดโปรแกรม แล้วเปิด Serial monitor


ส่วนจัดการ FreeBoard
13. คลิกสร้าง FreeBoard ดังรูป (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 46 และต้องการใช้ตัวเดิมให้ข้ามขั้นตอนนี้ไป)
   -คลิก RESOURCES เลือก FREEBOARDS
 
   -คลิกที่ +


12. ตั้งชื่อ FreeBoard (ชื่อต้องไม่ซ้ำใคร) (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 46 ข้ามขั้นตอนนี้ไป)


13. คลิกที่ชื่อ FreeBoard


14. คลิกที่รูปประแจ


15. คลิก ADD (Data Source)   (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 47 และต้องการใช้ตัวเดิมจะมีข้อมูลอยู่แล้วให้ข้ามขั้นตอนนี้ไป)


16. เลือก NETPIE Microgear   (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 46 ข้ามขั้นตอนนี้ไป)


17. เปิดหน้า Application ทำการคลิกที่ Session key เพื่อดูรหัส   (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 46 ข้ามขั้นตอนนี้ไป)


18. ใส่รายละเอียด   (หากผู้ใช้งานได้ทำแล้วในงานครั้งที่ 46 ข้ามขั้นตอนนี้ไป)
   (1) ตั้งชื่อ Data Source
   (2) ใส่ Key ต่าง ๆ จากข้อ 17


สร้างกระดานแสดงข้อความ Text
19. เมื่อบอร์ดเชื่อมต่อตัวเลขเวลาจะเดิน ทำการคลิก ADD PANE


20. คลิกที่รูปบวก


21. เลือก Text


22. คลิกที่ Data Source จะปรากฏรายการชื่อให้เลือกชื่อที่ตรงกับ Data Source ที่ใช้งานปัจจุบันหน้านี้


23. คลิกต่อ ให้สังเกตุรายการ Target ที่ปรากฏ เลือกชื่อ Target ให้ตรงกับโค้ดที่เขียนบนบอร์ด โดยชื่อ Target จะขึ้นได้เมื่อบอร์ดเชื่อมต่อแล้ว(ตัวเลขนาฬิกาเดิน)


สร้างปุ่มกดแบบ Toggle
24. ข้อความที่ส่งมาจากบอร์ดจะปรากฏ ทำการเพิ่มวิตเจ็ตโดยกดที่ ADD PANE


25. คลิกที่ +


26. เลือก Toggle


27. รายละเอียด
   (1) ใส่ชื่อสวิตช์เป็น LED1
   (2) คลิกที่ DATASOURCE
   (3) เลือกชื่อ DataSource ที่เราสร้างไว้


28. ต่อ..
   (1) รายละเอียด Target จะปรากฏขึ้น ให้เลือก Target ตัวที่เขียนไว้ในโค้ด (จะขึ้นก็ต่อเมื่อบอร์ดส่งค่าขึ้น NETPIE สังเกตจากตัวเลขเวลา)
   (2) คลิก JS EDITOR


29. เพิ่มคำสั่งเพื่อตัดข้อความที่รับเข้ามาโดยเอาเฉพาะตัวแรกที่ส่งมาตรวจสอบว่าเป็นค่า '1' ซึ่งเป็นค่าที่ส่งมาหรือไม่ ใช้คำสั่ง
   .split(",")[0]=='1'
   หมายถึงแยกข้อความด้วยเครื่องหมาย , และข้อมูลแรกเป็น '1' หรือไม่


30. ใส่คำสั่งที่ต้องการให้ทำเมื่อคลิก ON และ OFF ในที่นี้ต้องการให้ DataSouce ส่งค่าไปยังบอร์ดที่ชื่อว่า Board1 ว่า LED1ON เมื่อคลิก ON และส่งคำว่า LED1OFF เมื่อคลิก OFF รูปแบบดังนี้
   microgear["FreeBoard1"].chat("Board1","LED1ON")
   microgear["FreeBoard1"].chat("Board1","LED1OFF")


31. ทำการคลิกทดสอบแล้วดูผลที่บอร์ด  แล้วคลิก + เพื่อเพิ่มสวิตช์ตัวที่ 2,3,4 ตามลำดับ คำสั่งเพิ่มในแต่ละปุ่มเป็นดังนี้
   .split(",")[1]=='1'       สำหรับสวิตช์ตัวที่ 2
   .split(",")[2]=='1'       สำหรับสวิตช์ตัวที่ 3
   .split(",")[3]=='1'       สำหรับสวิตช์ตัวที่ 4
ส่วนคำสั่งเมื่อกดสวิตช์ ON และ OFF ใช้คำสั่งแบบสวิตช์ตัวที่ 1 เพียงแต่แก้เป็น LED2ON,LED2OFF,LED3ON,LED3OFF....


สร้างหลอดแสดงผล
32. ทดลองคลิกสวิตช์แล้วดูผลที่บอร์ด คลิกที่ ADD PANE เพื่อเพิ่มวิตเจ็ต


33. คลิก +


34. คลิกเลือก Indicator Light


35. รายละเอียด
   (1) ใส่ชื่อสวิตช์เป็น LED1
   (2) คลิกที่ DATASOURCE
   (3) เลือกชื่อ DataSource ที่เราสร้างไว้


36. ต่อ..
   (1) รายละเอียด Target จะปรากฏขึ้น ให้เลือก Target ตัวที่เขียนไว้ในโค้ด (จะขึ้นก็ต่อเมื่อบอร์ดส่งค่าขึ้น NETPIE สังเกตจากตัวเลขเวลา)
   (2) คลิก JS EDITOR


37. เพิ่มคำสั่งเพื่อตัดข้อความที่รับเข้ามาโดยเอาเฉพาะตัวแรกที่ส่งมาตรวจสอบว่าเป็นค่า '1' ซึ่งเป็นค่าที่ส่งมาหรือไม่ ใช้คำสั่ง
   .split(",")[0]=='1'
   หมายถึงแยกข้อความด้วยเครื่องหมาย , และข้อมูลแรกเป็น '1' หรือไม่


38. ทดสอบโดยคลิกสวิตช์ LED1 แล้วดูผลที่บอร์ด  แล้วคลิก + เพื่อเพิ่มหลอด์ตัวที่ 2,3,4 ตามลำดับ คำสั่งเพิ่มในแต่ละปุ่มเป็นดังนี้
   .split(",")[1]=='1'       สำหรับหลอดไฟตัวที่ 2
   .split(",")[2]=='1'       สำหรับหลอดไฟตัวที่ 3
   .split(",")[3]=='1'       สำหรับหลอดไฟตัวที่ 4


39. ทดสอบโดยคลิกสวิตชแต่ละตัว แล้วดูผลที่บอร์ดและหน้า FreeBoard

3
งานครั้งที่ 46 [iot#21 NETPIE] ควบคุมการติดดับ LED 1 ตัวด้วยวิธี Chat
การสื่อสารภายในกลุ่มเป็นการรับส่งข้อความไปมาหากันซึ่งเป็นข้อความอะไรก็ได้ ขึ้นอยู่กับผู้พัฒนาจะออกแบบ แต่จะต้องเป็นที่เข้าใจระหว่างกัน เช่น ข้อความว่าคำว่า ON ผู้พัฒนาเป็นผู้กำหนดให้หมายถึงสิ่งใดในอุปกรณ์ในกลุ่ม โดยลักษณะการส่งข้อความแบ่งตามจุดหมายปลายทางแบ่งได้สองแบบ คือ
   1. ข้อความที่ส่งแบบเจาะจงผู้รับ การส่งลักษณะนี้จะใช้ฟังก์ชั่น microgear.chat()
   2. ข้อความที่ส่งแบบไม่เจาะจง่ผู้รับ แต่ส่งเข้าหาสิ่งที่เรียกว่า topic การส่งลักษณะนี้จะใช้ฟังก์ชั่น microgear.publish()

งานครั้งนี้เป็นการทดลองการส่งข้อความแบบเจาะจงผู้รับคือการ chat
คุณสมบัติของการ Chat คือการส่งข้อความโดยระบุผู้รับมีลักษณะดังนี้
1. เมื่อผู้รับออนไลน์อยู่แล้วผู้ส่งได้ส่งข้อความไปหาผู้รับโดยระบุชื่อผู้รับ ผู้รับจะได้รับข้อความนั้น


2. เมื่อผู้รับออฟไลน์ (ออกจากระบบ)ผู้ส่งได้ส่งข้อความไปหาผู้รับโดยระบุชื่อผู้รับ ผู้รับจะไม่ได้รับข้อความนั้น


3. เมื่อผู้รับออนไลน์และใช้ชื่อเดียวกัน ผู้ส่งได้ส่งข้อความไปหาผู้รับโดยระบุชื่อผู้รับ ผู้รับที่ชื่อเดียวกันจะได้รับข้อความนั้น

คำเตือน: ความถี่ในการส่งข้อความขึ้น NETPIE กำหนดส่งได้ไม่เกิน 4 ครั้งใน 1 วินาที หากผู้ใช้งานส่งเกินข้อความครั้งที่ส่งเกิน NETPIE จะไม่รับข้อความที่เกินนั้น ๆ (เรียกว่าติดลิมิต)

คอนเซ็ปต์หลักของงาน
บอร์ดรับข้อความจาก FreeBoard NETPIE มาควบคุมการติดดับของ LED และให้บอร์ดส่งสถานะของ LED ไปแสดงบน FreeBoard

[ขั้นตอนการดำเนินการ]
-สร้าง Application ID
-สร้าง Device Key สำหรับใช้กับบอร์ดทดลอง
-สร้าง Session Key สำหรับใช้กับ FreeBoard
-เขียนโค้ดเพื่อใช้งาน
-ออกแบบ FreeBoard

ซึ่งรายละเอียดเป็นดังนี้
วงจรที่ใช้ทดลอง ทั้งที่เป็นบอร์ด NodeMCU และ WeMOS D1 mini ที่ใช้งานเชื่อมต่อเดิมในงานนั้น ๆ ตัวอย่างเช่น


ส่วนของการดำเนินการ NETPIE
1. เริ่มต้นการใช้งานโดยเข้าไปที่ https://netpie.io/ (หากยังไม่สมัครให้ดำเนินการ)
   (1) ล็อกอิน
   (2) คลิกที่ APPLICATIONS


2. คลิกสร้าง Application คลิกที่ตำแหน่งดังรูป


3. ใส่รายละเอียดของ Application
   (1) ตั้งชื่อ Application (ชื่อที่ไม่ซ้ำกับใคร ๆ)
   (2) คลิก CREATE


4. สร้าง Application Key  คลิกที่ตำแหน่งดังรูป


5. สร้าง Application Key (Device Key)
   (1) ตั้งชื่อ
   (2) เลือกชนิด (เลือกเป็น Device Key)
   (3) คลิก CREATE


6. สร้าง Application Key (Session Key)
   (1) ตั้งชื่อ
   (2) เลือกชนิด (เลือกเป็น Session Key)
   (3) คลิก CREATE


7. คลิกที่ชื่อ Application Device


8. คลิกที่ (1) เพื่อดูรหัส นำรหัสที่ปรากฏไปใช้ในโค้ดโปรแกรม


ส่วนจัดการโค้ด
9. ติดตั้งไลบรารี่ใช้งาน NETPIE ดำเนินการดังรูป


10. พิมพ์ในช่องค้นหาว่า microgear


11. แก้ไขรายละเอียดของโปรแกรม
   (1) นำค่าจากขั้นตอน 3,8 มาใส่ในโค้ด
   (2) กำหนดชื่อของบอร์ด
   (3) กำหนดชื่อเป้าหมายที่ต้องการสื่อสาร


โค้ดโปรแกรม
โค๊ด: [Select]
#include <ESP8266WiFi.h>
#include <MicroGear.h>
const char* ssid= "wifi_name";
const char* password = "wifi_password";

#define APPID   "Application_ID"
#define KEY     "Application_ KEY"
#define SECRET  "Application_SECRET"
#define ALIAS   "Board_name"
#define TARGET   "Target_name"
#define LED     D1
WiFiClient client;
int timer = 0;
MicroGear microgear(client);
void onMsghandler(char* topic, uint8_t* msg, unsigned int msglen){
  Serial.print("Incoming message --> ");
  Serial.print(topic);
  Serial.print(" : ");
  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 == "CH1ON")
  {
    digitalWrite(LED,HIGH);
    Serial.println("ON LED");
  }
  else if(stateStr == "CH1OFF")
  {
    digitalWrite(LED,LOW); 
    Serial.println("OFF LED");
  }
}
void onFoundgear(char* attribute, uint8_t* msg, unsigned int msglen){
  Serial.print("Found new member --> ");
  for(int i=0; i<msglen; 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<msglen; i++)
  Serial.print((char)msg[i]);
  Serial.println();
}
/*When a microgear is connected, dothis*/
void onConnected(char* attribute, uint8_t* msg, unsigned int msglen){
  Serial.println("Connected to NETPIE...");
  /* Set the alias of this microgearALIAS */
  microgear.setAlias(ALIAS);
}
void setup()
{
  microgear.on(MESSAGE,onMsghandler);
  microgear.on(PRESENT,onFoundgear);
  microgear.on(ABSENT,onLostgear);
  microgear.on(CONNECTED,onConnected);

  Serial.begin(115200);
  Serial.println("Starting...");
  pinMode(LED,OUTPUT);
  digitalWrite(LED,LOW);

  if(WiFi.begin(ssid, password))
  {
    while(WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      Serial.print(".");
    }
  }
  Serial.println("WiFiconnected");
  microgear.init(KEY,SECRET,ALIAS);
  microgear.connect(APPID);
}
void loop()
{
  if(microgear.connected()){
    microgear.loop();
    bool led = digitalRead(LED);
    String status_LED;
    if(led == HIGH){
      status_LED="CH1ON,";
    }
    else{
      status_LED="CH1OFF,";
    }
    String data2freeboard = status_LED ;
    microgear.chat(TARGET,data2freeboard);
    Serial.print("Send message to NetPie: ");
    Serial.println(data2freeboard);
  }
  else{
    Serial.println("connection lost, reconnect...");
    if(timer >= 5000){
      microgear.connect(APPID);
      timer=0;
    }
    else timer += 100;
  }
  delay(1000);
}
ส่วนจัดการ FreeBoard
12. คลิกเลือก FREEBOARDS ดังรูป


13. คลิกสร้าง FreeBoard ดังรูป
 

12. ตั้งชื่อ FreeBoard (ชื่อต้องไม่ซ้ำใคร)


13. คลิกที่ชื่อ FreeBoard


14. คลิกที่รูปประแจ


15. คลิก ADD (Data Source)


16. เลือก NETPIE Microgear


17. เปิดหน้า Application ทำการคลิกที่ Session key เพื่อดูรหัส


18. ใส่รายละเอียด
   (1) ตั้งชื่อ Data Source
   (2) ใส่ Key ต่าง ๆ จากข้อ 17


สร้างปุ่มกดเปิด/ปิดแบบ Toggle
19. เมื่อบอร์ดเชื่อมต่อตัวเลขเวลาจะเดิน ทำการคลิก ADD PANE


20. คลิกที่รูปบวก


21. เลือก Toggle


22. คลิกที่ Data Source จะปรากฏรายการชื่อให้เลือกชื่อที่ตรงกับ Data Source ที่ใช้งานปัจจุบันหน้านี้


23. คลิกต่อ ให้สังเกตุรายการ Target ที่ปรากฏ โดยชื่อ Target จะขึ้นได้เมื่อบอร์ดเชื่อมต่อแล้ว(ตัวเลขนาฬิกาเดิน) แล้วคลิกที่ JS EDITOR


24. เพื่อคำสั่งตัดคำเพื่อตรวจสอบต่อท้ายเป็น .split(",")[0]=='CH1ON'  เนื่องจากบอร์ดส่งข้อความนี้ขึ้นมาเมื่อ LED ติดสว่าง
CH1ON คือข้อความที่บอร์ดส่งขึ้นมายัง NETPIE ซึ่งผู้ใช้งานสามารถใช้ข้อความอื่นได้ตามต้องการ


25. รายละเอียดที่มาของค่าต่าง ๆ


26. ใส่คำสั่งเมื่อสวิตช์อยู่ในสถานะ ON และ OFF โดย DataSource ที่ชื่อว่า FreeBoard1 ส่งข้อความว่า CH1ON ไปยัง Board1 รูปแบบ
microgear["FreeBoard1"].chat("Board1","CH1ON")
microgear["FreeBoard1"].chat("Board1","CH1OFF")
CH1ON,CH1OFF เป็นข้อความที่ FreeBoard ส่งไปยังบอร์ดโดยที่ตัวบอร์ดต้องเขียนโค้ดตรวจสอบคำนี้เพื่อใช้ควบคุมงาน ผู้ใช้งานสามารถใช้ข้อความอื่น ๆ ได้ตามความต้องการ


27. รายละเอียดของปุ่ม ON


28. ผลจะได้ ลองทดสอบโดยการคลิก สังเกตผลที่เกิดขึ้นที่บอร์ด


29. เมื่อคลิก OFF


สร้างหลอดแสดงผล
30. คลิกตามลำดับ


31. เลือกดังรูป


32. คลิกที่ Data Source จะปรากฏรายการชื่อให้เลือกชื่อที่ตรงกับ Data Source ที่ใช้งานปัจจุบันหน้าน


33. คลิกต่อ ให้สังเกตุรายการ Target ที่ปรากฏ โดยชื่อ Target จะขึ้นได้เมื่อบอร์ดเชื่อมต่อแล้ว(ตัวเลขนาฬิกาเดิน)


34. คลิกที่ JS EDITOR


35. เพื่อคำสั่งตัดคำเพื่อตรวจสอบต่อท้ายเป็น .split(",")[0]=='CH1ON'  เนื่องจากบอร์ดส่งข้อความนี้ขึ้นมาเมื่อ LED ติดสว่าง


36. ผลจะได้ ลองทดสอบโดยการคลิกสวิตช์สังเกตผลที่เกิดขึ้นที่บอร์ดและที่หลอดไฟที่สร้างขึ้น


สร้างสวิตช์กด
37. คลิก ADD PANE


38. เลือก Button


39. ใส่รายละเอียด สวิตช์ ON
   (1) ข้อความแสดงบนตัวสวิตช์
   (2) เลือกสี
   (3) ใส่คำสั่งเมื่อปุ่มถูกกด
   microgear["FreeBoard1"].chat("Board1","CH1ON")


40. เฟิ่มสวิตช์


41. ใส่รายละเอียดเช่นเดียวกับข้อ 39 เพียงแต่เป็นสวิตช์ OFF


42. เมื่อสร้างเสร็จ


43. ทดสอบการทำงาน พร้อมดูผลที่บอร์ด

4
งานครั้งที่ 45 [iot#20 Line Notify] การแจ้งเตือนผ่านโปรแกรมไลน์
การแจ้งเตือนผ่านโปรแกรมไลน์หรือที่เรียกว่า LINE Notify เป็นบริการของ LINE ที่ให้สามารถส่งข้อความ การแจ้งเตือนต่าง ๆ ไปยังบัญชีของผู้ใช้งานหรือกลุ่มต่าง ๆ ที่ผู้ใช้งานมีอยู่ งานด้าน iot สามารถใช้ประโยชน์ในส่วนนี้ได้โดยอาจให้แจ้งเตือนสิ่งต่าง ๆ ที่บอร์ด iot ตรวจพบ และการทดลองในงานนี้
มีส่วนที่ต้องส่งค่าอุณหภูมิและความชื้นขึ้นแจ้งผลผ่านโปรแกรมไลน์ซึ่งการเขียนโค้ดที่บอร์ดควบคุมจำเป็นต้องมีไลบรารี่สำหรับอ่านค่าจากโมดูลอ่านค่าอุณหภูมิและความชื้น ท่านใดยังไม่ได้ดำเนินการให้ศึกษาขั้นตอนได้ในงานครั้งที่ 8 การเขียนโปรแกรมอ่านค่าอุณหภูมิและความชื้นด้วย DHT11 เบื้องต้น

คอนเซ็ปต์หลักของงาน
บอร์ดส่งค่าที่เป็นข้อความหรือรูปภาพแจ้งเตือนผ่านโปรแกรมไลน์


ผู้ใช้งานต้องมีบัญชีโปรแกรมไลน์และได้ดำเนินการสร้าง User/Password ไว้สำหรับใช้งานโปรแกรมไลน์ผ่านคอมพิวเตอร์แล้ว

[ขั้นตอนการดำเนินการ]
-ออกรหัส Token ของแกรมไลน์
-นำรหัสมาใส่ในโค้ดโปรแกรม
-เขียนโค้ดเพื่อใช้งาน

ซึ่งรายละเอียดเป็นดังนี้
1. วงจรที่ใช้ทดลอง
   -กรณีที่ใช้ NodeMCU

   -กรณีที่ใช้ WeMOS D1 mini


2. ผลที่ต้องการในงานครั้งนี้


วิธีสร้าง Line Token
1. เริ่มขั้นตอนสร้างโปรเจค โดยเข้าไปที่ https://notify-bot.line.me/en/
   (1) ล็อกอินด้วยยูสเซอร์/พาสเวิร์ดที่ได้ลงทะเบียนไว้ในโปรแกรมไลน์ (หากยังไม่สร้างให้ไปดำเนินการสร้างก่อน)
   (2) คลิกที่ "หน้าของฉัน"


2. เลื่อนลงมาจนพบการออก Access Token แล้วคลิก "ออก Token"


3. ใส่รายละเอียด
   (1) ใส่ชื่อ Token ที่ต้องการให้แสดงเป็นชื่อนั้น ๆ
   (2) เลือกเป้าหมายการแจ้งเตือน โดยให้แจ้งเตือนเฉพาะไลน์ส่วนตัว หรือกลุ่มที่ผู้ใช้งานมีก็ได้
   (3) คลิก "ออก Token"


4. จะปรากฏหน้าต่างแสดงรหัส Token ทำการคลิกปุ่มคัดลอก

เมื่อคัดลอกแล้วให้หาที่วางรหัสไว้ก่อน หากไม่วางไว้จะต้องสร้างรหัสใหม่เนื่องจากระบบไม่มีการจำรหัสไว้ให้

ส่วนจัดการโค้ด
การใช้งานแจ้งเตือนผ่านโปรแกรมไลน์จำเป็นต้องใช้ไลบรารี่ช่วยงานโดยดำเนินการดังนี้

5. ดาวน์โหลดไลบรารี่โดยเข้าไปที่เวปไซต์ https://github.com/TridentTD/TridentTD_LineNotify แล้วคลิกดาวน์โหลดตามลำดับ


6. ทำการติดตั้งไลบรารี่ที่ดาวน์โหลดมา ดำเนินการดังรูป


7. เปิดไฟล์ตัวอย่าง "LineNotify" ดังรูป


8. แก้ไขค่า
   (1) User / Password ของไวไฟที่จะให้บอร์ด iot จับสัญญาณ
   (2) รหัส Token ที่ได้จากขั้นตอนที่ 4


9. ฟังก์ชั่นต่าง ๆ ที่มีให้ใช้งาน
   *สติกเกอร์ไอดีสามารถดูได้จากไฟล์ https://devdocs.line.me/files/sticker_list.pdf


10. ทำการบันทึกไฟล์ไว้ในตำแหน่งอื่น (Save as) ก่อนการอัพโหลด เพื่อให้การแสดงผลภาษาไทยได้ถูกต้อง
   (1) ผลการรันจากการอัพโหลดที่ไม่ได้บันทึกไฟล์ในตำแหน่งใหม (ภาษาไทยไม่ถูกต้อง)
   (2) ผลการรันจากการอัพโหลดที่บันทึกไฟล์ในตำแหน่งใหม่ (ภาษาไทยถูกต้อง)


ตัวอย่างโปรแกรมแจ้งเตือนอุณหภูมิ
11. แปลงค่าตัวเลขเป็นสตริงก่อนส่งค่า


โค้ดโปรแกรม
โค๊ด: [Select]
#include <TridentTD_LineNotify.h>
#include <DHT.h>
#define DHTPIN D1         //pin connect DHT
#define DHTTYPE DHT11     //DHT11, DHT22 type of Sensor
#define SSID        "--------------------"
#define PASSWORD    "--------------------"
#define LINE_TOKEN  "--------------------"

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200); Serial.println();
  Serial.println(LINE.getVersion());
  WiFi.begin(SSID, PASSWORD);
  Serial.printf("WiFi connecting to %s\n",  SSID);
  while(WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(400); }
  Serial.printf("\nWiFi connected\nIP : ");
  Serial.println(WiFi.localIP()); 
  LINE.setToken(LINE_TOKEN);  // กำหนด Line Token
  dht.begin();
}
void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  int adc=analogRead(A0);
  if (isnan(t) || isnan(h))
  {
    Serial.println("Error reading DHT!");
    delay(1000);
    return;   
  }
  else
  {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print("\t");
    Serial.print("Temp: ");
    Serial.println(t);
    Serial.println("...............................");   
    LINE.notify("อุณหภูมิขณะนี้ "+String(t)+" องศา");
    LINE.notify("ความชื้นขณะนี้ "+String(h)+" %");     
  }
  delay(60000);
}
ทดสอบการทำงาน
12. หลังจากการ upload โค้ด สังเกตผลการแจ้งเตือนที่โปรแกรมไลน์


ตัวอย่างโปรแกรมแจ้งเตือนบุกรุก
13. ใช้สวิตช์แทนเซนเซอร์ตรวจจับ โดยให้การอินเตอร์รัพท์สำหรับการตรวจสอบเซนเซอร์
*ฟังก์ชั่น LINE.notify() ไม่สามารถใส่ไว้ในโปรแกรมตอบสนองการอินเตอร์รัพท์ได้ (ภายในโปรแกรมตอบสนองการอินเตอร์รัพท์ควรใช้ฟังก์ชั่นการทำงานที่น้อยที่สุด)

โค้ดโปรแกรม
โค๊ด: [Select]
#include <TridentTD_LineNotify.h>
#define sensor1 D5 
#define sensor2 D6
#define LED1 D7
#define LED2 D8
#define SSID        "--------------------"
#define PASSWORD    "--------------------"
#define LINE_TOKEN  "--------------------"

int i;
void setup() {
  Serial.begin(115200); Serial.println();
  Serial.println(LINE.getVersion());
  WiFi.begin(SSID, PASSWORD);
  Serial.printf("WiFi connecting to %s\n",  SSID);
  while(WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(400); }
  Serial.printf("\nWiFi connected\nIP : ");
  Serial.println(WiFi.localIP());
  pinMode(LED1,OUTPUT); 
  pinMode(LED2,OUTPUT);
  pinMode(sensor1,INPUT_PULLUP); 
  pinMode(sensor2,INPUT_PULLUP);
  LINE.setToken(LINE_TOKEN); 
  LINE.notify("System Start Ready"); 
  attachInterrupt(digitalPinToInterrupt(sensor1), Alarm1, FALLING);
  attachInterrupt(digitalPinToInterrupt(sensor2), Alarm2, FALLING); 
}
void loop() {
  if(digitalRead(LED1)==HIGH){
    LINE.notify("พบการบุกรุกจุดที่ 1");
    Serial.println("พบการบุกรุกจุดที่ 1");
    for(i=1000;i>0;i--){
      delay(5);
    }
    digitalWrite(LED1,LOW);   
  }
  if(digitalRead(LED2)==HIGH){
    LINE.notify("พบการบุกรุกจุดที่ 2"); 
    Serial.println("พบการบุกรุกจุดที่ 2");
    for(i=1000;i>0;i--){
      delay(5);
    }
    digitalWrite(LED2,LOW);       
  }     
}
void Alarm1() {
    digitalWrite(LED1,HIGH);
    i=0;
}
void Alarm2() {
    digitalWrite(LED2,HIGH);
    i=0;
}
ทดสอบการทำงาน
13. หลังจากการ upload โค้ด สังเกตผลการแจ้งเตือนที่โปรแกรมไลน์
5
งานครั้งที่ 44 [iot#19 GoogleSheetAPI] บันทึกค่าลงบน Google Sheet
Google Sheet เป็นโปรแกรมที่มีการทำงานคล้ายกับ Excell เพียงแต่ทำงานจะต้องมีการเชื่อมต่ออินเตอร์เน็ต หากงาน iot สามารถบันทึกข้อมูลต่าง ๆ ของบอร์ดลงใน Google Sheet ได้ผู้ใช้งานสามารถนำข้อมูลไปใช้งานได้อีกมากมายเนื่องจาก Google Sheet สามารถเขียนสูตรคำนวณค่าได้หรือผู้ใช้งานต้องการที่จะนำข้อมูลมาประมวลผลใน Excell ก็สามารถทำได้โดยง่ายการทดลองนี้จะทำการบันทึกค่าจำนวน 4 ค่าด้วยกันได้แก่
- ค่าที่อ่านได้จากพอร์ตแอนะล็อก
- ค่าอุณหภูมิ
- ค่าความชื้น
- ค่าเวลาที่ทำการวัด ซึ่งเป็นเวลาที่อ่านจากเซิร์ฟเวอร์นาฬิกาสากล
ซึ่งการเขียนโค้ดที่บอร์ดควบคุมจำเป็นต้องมีไลบรารี่สำหรับอ่านค่าจากโมดูลอ่านค่าอุณหภูมิและความชื้น ท่านใดยังไม่ได้ดำเนินการให้ศึกษาขั้นตอนได้ในงานครั้งที่ 8 การเขียนโปรแกรมอ่านค่าอุณหภูมิและความชื้นด้วย DHT11 เบื้องต้น

คอนเซ็ปต์หลักของงาน
บอร์ดส่งค่าข้อมูลทั้ง 4 อย่างขึ้นบันทึกบน Google Sheet

[ขั้นตอนการดำเนินการ]
-สร้างโปรเจคงานใน Google API
-นรหัสไคลเอ็นต์ของโปรเจคงานมาใส่ในโค้ดโปรแกรม
-สร้างไฟล์ชีต Google Sheet เพื่อรับค่า
-เขียนโค้ดเพื่อใช้งาน
ซึ่งรายละเอียดเป็นดังนี้
1. วงจรที่ใช้ทดลอง ทั้งที่เป็นบอร์ด NodeMCU และ WeMOS D1 mini

2. ผลที่ต้องการในงานครั้งนี้เป็นการนำค่าที่ได้บันทึกลง Google sheet


ส่วนจัดการ Google API
1. เริ่มขั้นตอนสร้างโปรเจค โดยเข้าไปที่ https://console.developers.google.com
   (1) ล็อกอินด้วยอีเมล์ gmail (หากไม่มีให้สมัครใช้งาน gmail ก่อน)
   (2) ในกรณีที่เคยสร้างโปรเจคไว้แล้ว (เป็นโปรเจคของงาน Firebase ก็สามารถใช้ได้)


2. ในกรณีที่ยังไม่มีโปรเจคงาน สามารถสร้างโปรเจคได้ 2 จุด (1) หรือ (2)


3. กรณีที่คลิก "เลือกโครงการ" ให้คลิกเพิ่มโปรเจคที่ปุ่ม (+)


4. กรณีที่คลิก "สร้างโครงการ" จะปรากฏหน้าต่างให้คลิก "สร้าง"


5. ทำการตั้งชื่อโครงการ (1) แล้วคลิกสร้าง (2)


6. ชื่อโครงการจะปรากฏขึ้น (1) แล้วคลิกดูรายการ API ที่ "ดูทั้งหมด..." (2)


7. เลื่อนหา API ที่ชื่อว่า "Google Sheet API" แล้วคลิก


8. คลิกเปิดใช้


9. เมื่อสร้างเสร็จจะได้ คลิก "สร้างข้อมูลรองรับ"


10. คลิก "สร้างข้อมูลรองรับ"


11. คลิก "รหัสไคลเอ็นต์ OAuth"


12. คลิกตามรูป


13. ตั้งชื่อตามต้องการ (ควรเป็นภาษาอังกฤษ)


14. คลิกตามรูป


15. ผลจะได้ รหัสที่จะนำไปใช้งาน


16. ผู้ใช้งานสามารถคัดลอกรหัสดังกล่าวได้ในโปรแกรมอื่นก่อนก็ได้ เช่นไปวางไว้ในโปรแกรม Notepad


17. หรือผู้ใช้สามารถดูรหัสภายหลังได้ โดยคลิกชื่อรหัสไคลเอ็นต์(ที่ได้สร้างไว้)ดังรูป


18. รหัสจะได้


19. ทำการสร้างเอกสาร Google Sheet ในกูเกิลไดร์ฟ คลิกที่่ (1)->(2)
https://drive.google.com/drive/my-drive


20. รหัสของไฟล์ Google Sheet จะอยู่ระหว่างเครื่องหมาย / ดังรูปทำการคัดลอกเพื่อนำไปใช้งาน (ชื่อชีตสามารถแก้ไขได้โดยการคลิกที่ชื่อแล้วพิมพ์ชื่อใหม่ตามต้องการ)


ส่วนจัดการโค้ด
การใช้งาน Google Sheet API จำเป็นต้องใช้ไลบรารี่ช่วยงานโดยดำเนินการดังนี้

21. ดาวน์โหลดไลบรารี่โดยเข้าไปที่เวปไซต์ แล้วคลิกดาวน์โหลดตามลำดับ


22. ทำการติดตั้งไลบรารี่ที่ดาวน์โหลดมา ดำเนินการดังรูป
https://github.com/KhonKaenMakerClub/EspGoogleApi


23. เปิดไฟล์ตัวอย่าง "InsertGoogleSheets" ดังรูป


24. ใส่รหัสทั้ง 3 อย่างลงโค้ด


25. ป้อนชื่อไวไฟและพาสเวิร์ดที่จะให้บอร์ดจับสัญญาณ


26. ทำการอัพโหลด..แล้วเปิด Serial monitor เพื่อดูผล
   (1) เข้าเวปไซต์ที่ปรากฏในหน้าจอ
   (2) ใช้รหัสที่ปรากฏป้อนลงในเวปไซต์


27. ป้อนรหัสที่ได้จากหน้าจอ Serial monitor


28. เลือกบัญชี Gmail


29. คลิกอนุญาต


30. การดำเนินการเสร็จสิ้น


31. เปิดกลับไปดูเอกสาร Google Sheet ที่สร้างไว้จะปรากฏข้อมูล


32. หน้าต่าง Serial monitor จะปรากฏข้อความดังรูป


ข้อผิดพลาดที่อาจเกิดขึ้น
33. หากเกิดข้อผิดพลาดหน้าต่าง Serial monitor จะปรากฏข้อความดังรูป


34. ให้ทำการเพิ่มคำสั่ง true ท้ายฟังก์ชั่น gSheets.begin


ตัวอย่างโปรแกรม
บันทึกค่าแอนะล็อก, อุณหภูมิ, ความชื้น, เวลา, วันเดือนปี ที่บันทึก
โค้ดโปรแกรม
โค๊ด: [Select]
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <GSheets.h>
#include <DHT.h>
#include <time.h>
#include <SimpleTimer.h>
#define DHTPIN D1         //pin connect DHT
#define DHTTYPE DHT11     //DHT11, DHT22 type of Sensor

//------ Config -------//
const String client_id = "------- client id -------";
const String client_secret = "------- secret ------";
const String sheet_id = "----- sheet id -----";
GSheets gSheets;
ESP8266WiFiMulti WiFiMulti;

char ntp_server1[20] = "pool.ntp.org";
char ntp_server2[20] = "time.nist.gov";
char ntp_server3[20] = "time.uni.net.th";

int timezone = 7*3600;
int dst = 0;
float h;
float t;
int adc;

DHT dht(DHTPIN, DHTTYPE); 
SimpleTimer timer;

void setup(){
  Serial.begin(115200);
  Serial.println();
  for(uint8_t t = 5; t > 0; t--) {
    Serial.printf("[SETUP] WAIT %d...\n", t);
    delay(1000);
  }
  WiFiMulti.addAP("---ssid---", "--- password  ---");
 
  configTime(timezone, dst, ntp_server1, ntp_server2, ntp_server3);
  Serial.println("\nWaiting for time");
  while (!time(nullptr)) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
  dht.begin();
  gSheets.begin(client_id,client_secret,sheet_id);       
//  gSheets.begin(client_id,client_secret,sheet_id,true);
  timer.setInterval(10000, sendState);   
}

void loop() {
  Serial.println(NowTime());
  Serial.println(NowDate()); 
  delay(2500);

  h = dht.readHumidity();
  t = dht.readTemperature();
  adc=analogRead(A0);
  if (isnan(t) || isnan(h))
  {
    Serial.println("Error reading DHT!");
    delay(500);
    return;
  }
  digitalWrite(D0,LOW);   
  Serial.print("Analog value: ");
  Serial.print(adc);
  Serial.print("\t");
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print("\t");
  Serial.print("Temp: ");
  Serial.println(t);
  Serial.println("...............................");
  timer.run();
}
void sendState(){
  if((WiFiMulti.run() == WL_CONNECTED)) {
    gSheets.addColumn("Analog",String(adc));
    gSheets.addColumn("Temperature",String(t));
    gSheets.addColumn("Humidity",String(h));
    gSheets.addColumn("Time",NowTime());
    gSheets.addColumn("Date",NowDate());         
    if(gSheets.insertRow()){
      Serial.println("---- inserted row ----");
    }
  }
}
String NowTime() {
  time_t now = time(nullptr);
  struct tm* p_tm=localtime(&now);
  String timeNow = "";
  timeNow += String(p_tm->tm_hour);
  timeNow += ":";
  timeNow += String(p_tm->tm_min);
  timeNow += ":";
  timeNow += String(p_tm->tm_sec);
  return timeNow;
}
String NowDate() {
  time_t now = time(nullptr);
  struct tm* p_tm=localtime(&now);
  String dateNow = "";
  dateNow += String(p_tm->tm_mday);
  dateNow += "/";
  dateNow += String(p_tm->tm_mon + 1);
  dateNow += "/"; 
  dateNow += String(p_tm->tm_year + 1900);
  return dateNow;
}


ทดสอบการทำงาน
35. ผลการบันทึกค่าลง Google Sheet

6
งานครั้งที่ 43 [iot#18 Firebase] บันทึกค่าบน Firebase แสดงผลบน Fireboard
งาน 2 ครั้งที่ผ่านมาเป็นการส่งค่าขึ้น Firebase โดยค่าที่ส่งล่าสุดจะไปทับตำแหน่งค่าที่ส่งไปก่อนหน้านั้น เหตุที่เป็นเช่นนี้เนื่องจากใช้ฟังก์ชั่นการส่งเป็น setInt, SetFloat  ในกรณีที่ผู้ใช้งานต้องการบันทึกค่าเก็บไว้ดูโดยยังคงค่าเก่าที่เคยส่งขึ้นไป อาจเพื่อนำไปวิเคราะห์ค่าต่าง ๆ ตามความต้องการ Firebase สามารถทำได้เช่นกันเพียงแต่เปลี่ยนมาใช้ฟังก์ชั่น push แทน ซึ่งงานครั้งนี้จะส่งค่าขึ้นบันทึกบน Firebase จำนวน 4 ค่าด้วยกันได้แก่
- ค่าที่อ่านได้จากพอร์ตแอนะล็อก
- ค่าอุณหภูมิ
- ค่าความชื้น
- ค่าเวลาที่ทำการวัด ซึ่งเป็นเวลาที่อ่านจากเซิร์ฟเวอร์นาฬิกาสากล
ซึ่งการเขียนโค้ดที่บอร์ดควบคุมจำเป็นต้องมีไลบรารี่สำหรับอ่านค่าจากโมดูลอ่านค่าอุณหภูมิและความชื้น ท่านใดยังไม่ได้ดำเนินการให้ศึกษาขั้นตอนได้ในงานครั้งที่ 8 การเขียนโปรแกรมอ่านค่าอุณหภูมิและความชื้นด้วย DHT11 เบื้องต้น

คอนเซ็ปต์หลักของงาน
บอร์ดส่งค่าข้อมูลทั้ง 4 อย่างขึ้นบันทึกบน Firebase แล้วนำค่าไปแสดงผลที่ Fireboard


[ขั้นตอนการดำเนินการ]
-สร้างโปรเจคงานใน Firebase
-นำรหัสลับของโปรเจคงานใน Firebase มาใส่ในโค้ดโปรแกรม
-นำค่าโฮสต์ของโปรเจคมาใส่ในโปรแกรม
-เขียนโค้ดเพื่อใช้งาน
-สร้างหน้าต่างแสดงผลที่ Fireboard

ซึ่งรายละเอียดเป็นดังนี้
1. วงจรที่ใช้ทดลอง ทั้งที่เป็นบอร์ด NodeMCU และ WeMOS D1 mini


2. ผลที่ต้องการในงานครั้งนี้เป็นการนำค่าที่ได้บันทึกลง Firebase มาแสดงผลบน Fireboard


ส่วนจัดการ Firebase
1. เริ่มขั้นตอนสร้างโปรเจค โดยเข้าไปที่ https://firebase.google.com
   (1) ล็อกอินด้วยอีเมล์ gmail (หากไม่มีให้สมัครใช้งาน gmail ก่อน)
   (2) คลิกที่ปุ่ม "ไปที่คอนโซล"


2. การใช้งานโปรเจค มี 2 ทางเลือกสำหรับผู้ที่เคยสร้างโปรเจคมาแล้ว
   (1) โดยคลิกที่คำว่า "เพิ่มโครงการ" สำหรับผู้ที่ต้องการสร้างโปรเจคงานใหม่
   (2) คลิกเลือกชื่อโปรเจคสำหรับผู้ที่ต้องการใช้โปรเจคเก่าที่เคยสร้างมาแล้ว
   *งานนี้ใช้โปรเจคเก่าที่เคยสร้างมาแล้ว สำหรับท่านใดที่ต้องการสร้างโปรเจคใหม้ให้ย้อนกลับไปดูวิธีการในงานครั้งที่ 41


3. ขั้นตอนไปหา รหัสลับ โดยเริ่มจาก
   (1) คลิกที่รูปเฟือง
   (2) คลิก "การตั้งค่าโครงการ"


4. ดำเนินการต่อโดย
   (1) คลิกที่แท็ป "บัญชีบริการ"
   (2) คลิกที่ "ข้อมูลลับฐานข้อมูล"
   (3) เลื่อนเมาส์มาลอย ๆ ในส่วนท้ายข้อความที่เป็น ........ แล้วคลิกที่คำว่า "แสดง" ทำการคลิกที่รูปสี่เหลี่ยมเพื่อคัดลอกนำไปใช้งาน


5. คัดลอกตำแหน่งโฮสต์ โดยคลิกที่ (1) Database  แล้วคลุมดำที่ตำแหน่งโฮสต์ (2) คัดลอกเอาเฉพาะข้อความที่อยู่หลัง // และอยู่ก่อน /


โค้ดโปรแกรม
โค๊ด: [Select]
#include <ESP8266WiFi.h>
#include <time.h>
#include <FirebaseArduino.h>
#include <DHT.h>
#define DHTPIN D1         //pin connect DHT
#define DHTTYPE DHT11     //DHT11, DHT22 type of Sensor

#define WIFI_SSID       "wifi_name"
#define WIFI_PASSWORD   "wifi_password"
#define FIREBASE_HOST "host_firebase"
#define FIREBASE_AUTH "secret_code"

char ntp_server1[20] = "pool.ntp.org";
char ntp_server2[20] = "time.nist.gov";
char ntp_server3[20] = "time.uni.net.th";

int timezone = 7*3600;
int dst = 0;
DHT dht(DHTPIN, DHTTYPE); 
void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");     
  Serial.println(WiFi.localIP()); 
  Serial.println(""); 

  configTime(timezone, dst, ntp_server1, ntp_server2, ntp_server3);
  Serial.println("\nWaiting for time");
  while (!time(nullptr)) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
  dht.begin();
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}

void loop() {
  Serial.println(NowTime());
  delay(1000);

  float h = dht.readHumidity();
  float t = dht.readTemperature();
  int adc=analogRead(A0);
  if (isnan(t) || isnan(h))
  {
    Serial.println("Error reading DHT!");
    delay(1000);
    return;
  }
  digitalWrite(D0,LOW);   
  Serial.print("Analog value: ");
  Serial.print(adc);
  Serial.print("\t");
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print("\t");
  Serial.print("Temp: ");
  Serial.println(t);
  Serial.println("...............................");

  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& root = jsonBuffer.createObject();
  root["analog"] = adc;
  root["temperature"] = t;
  root["humidity"] = h;
  root["time"] = NowTime();
 
  String name = Firebase.push("logDevice01", root);

  if (Firebase.failed()) {
      Serial.print("pushing /logs failed:");
      Serial.println(Firebase.error()); 
      return;
  }
 
  Serial.print("pushed: /logDevice01/");
  Serial.println(name);
  delay(30000);
}
String NowTime() {
  time_t now = time(nullptr);
  struct tm* p_tm=localtime(&now);
  String timeNow = "";
  timeNow += String(p_tm->tm_hour);
  timeNow += ":";
  timeNow += String(p_tm->tm_min);
  timeNow += ":";
  timeNow += String(p_tm->tm_sec);
  timeNow += " ";
  timeNow += String(p_tm->tm_mday);
  timeNow += "-";
  timeNow += String(p_tm->tm_mon + 1);
  timeNow += "-"; 
  timeNow += String(p_tm->tm_year + 1900);
  return timeNow;
}

6. เนื่องจากมีข้อมูลจำนวนหลายตัวที่ต้องการส่ง เพื่อให้สามารถส่งขึ้นได้ในครั้งเดียวจึงใช้วิธีผนวกตัวข้อมูลให้อยู่ในรูปแบบของ JSON ฟังก์ชั่นหลัก ๆที่ใช้งานดังนี้
    (1) ผนวกข้อมูลทั้งหมดในรูปแบบ JSON
    (2) บันทึกข้อมูลบน Firebase
    (3) ตรวจสอบว่าหากบันทึกล้มเหลวให้กลับไปเริ่มใหม่
    (4) แสดงชื่อชุดข้อมูลที่ Firebase ตั้งขึ้นเพื่อใช้ในการบันทึก


ทดสอบการทำงาน
7. อัพโหลด เปิดดูผลที่ Serial monitor


8. หลังจากการ upload โค้ด สังเกตผลที่เกิดขึ้นที่เวป firebase โดยเข้าไปดูใน Database จะเห็นการบันทึกข้อมูลเป็นชุด ๆ


9. นำข้อมูลที่บันทึกบน Firebase สามารถแสดงค่าบน Fireboard (เป็นเวปไซต์ที่พัฒนาขึ้นโดย www.ioxhop.com สามารถใช้งานได้ฟรี) โดยเข้าไปที่ https://fireboard.xyz/ ลงชื่อเข้าใช้ด้วยบัญชี gmail


10. เริ่มสร้างบอร์ดเพื่อแสดงผลคลิกตามรูป


11. จะปรากฏตั้งค่าบอร์ดโดยจะต้องนำค่าทั้ง 2 ค่าจาก Firebase มาใส่


12. เข้ายังเวปไซต์ Firebase คลิกตามลำดับ (1), (2)ดังรูป


13. ปรากฏหน้าต่างที่บรรจุค่าที่ต้องนำไปใส่ใน Fireboard ดังรูป


14. คัดลอกค่าทั้ง 2 จาก Firebase ไปกำหนดค่าใน Fireboard ดังรูป (คลิกที่แท็ปทั่วไปตั้งค่าบอร์ดตามต้องการ)


15. ทำการเพิ่มโมดูลการแสดงผล


16. ตัวอย่างต้องการแสดงผล "อุณหภูมิ" โดยแสดงผลเป็นกราฟ การกำหนดค่าข้อมูลจะใช้ชื่อข้อมูลจาก Firebase เพื่อนำส่วนข้อมูลที่ต้องการมาแสดงผล


17. ตัวอย่างการเพิ่มโมดูลแสดงผลที่เป็นกราฟแสดง อุณหภมิ ความชื้น และแสดงข้อมูลทั้งหมดเป็นแบบตาราง

7
งานครั้งที่ 42 [iot#17 Firebase] ส่งค่าตัวเลข,ค่าความชื้น,ค่าอุณภูมิขึ้นบน Firebase
Firebase สามารถรับค่าที่ส่งมาจากบอร์ดเข้ามาเป็นตัวเลขได้ทั้งที่เป็นตัวเลขจำนวนเต็มและที่เป็นตัวเลขทศนิยม การทดลองในงานนี้เป็นการส่งค่าตัวเลขที่อ่านได้จากพอร์ตแอนะล็อกและค่าอุณหภูมิ, ความชื้น ซึ่งการเขียนโค้ดที่บอร์ดควบคุมจำเป็นต้องมีไลบรารี่สำหรับอ่านค่าจากโมดูลอ่านค่าอุณหภูมิและความชื้น ท่านใดยังไม่ได้ดำเนินการให้ศึกษาขั้นตอนได้ในงานครั้งที่ 8 การเขียนโปรแกรมอ่านค่าอุณหภูมิและความชื้นด้วย DHT11 เบื้องต้น

คอนเซ็ปต์หลักของงาน
บอร์ดส่งค่าตัวเลขทั้งที่เป็นเลขจำนวนเต็มและเลขทศนิยมขึ้น Firebase


[ขั้นตอนการดำเนินการ]
-สร้างโปรเจคงานใน Firebase
-นำรหัสลับของโปรเจคงานใน Firebase มาใส่ในโค้ดโปรแกรม
-นำค่าโฮสต์ของโปรเจคมาใส่ในโปรแกรม
-เขียนโค้ดเพื่อใช้งาน

ซึ่งรายละเอียดเป็นดังนี้
1. วงจรที่ใช้ทดลอง ทั้งที่เป็นบอร์ด NodeMCU และ WeMOS D1 mini


ส่วนจัดการ Firebase
1. เริ่มขั้นตอนสร้างโปรเจค โดยเข้าไปที่ https://firebase.google.com
   (1) ล็อกอินด้วยอีเมล์ gmail (หากไม่มีให้สมัครใช้งาน gmail ก่อน)
   (2) คลิกที่ปุ่ม "ไปที่คอนโซล"


2. การใช้งานโปรเจค มี 2 ทางเลือกสำหรับผู้ที่เคยสร้างโปรเจคมาแล้ว
   (1) โดยคลิกที่คำว่า "เพิ่มโครงการ" สำหรับผู้ที่ต้องการสร้างโปรเจคงานใหม่
   (2) คลิกเลือกชื่อโปรเจคสำหรับผู้ที่ต้องการใช้โปรเจคเก่าที่เคยสร้างมาแล้ว
   *งานนี้ใช้โปรเจคเก่าที่เคยสร้างมาแล้ว สำหรับท่านใดที่ต้องการสร้างโปรเจคใหม้ให้ย้อนกลับไปดูวิธีการในงานครั้งที่ 41


3. ขั้นตอนไปหา รหัสลับ โดยเริ่มจาก
   (1) คลิกที่รูปเฟือง
   (2) คลิก "การตั้งค่าโครงการ"


4. ดำเนินการต่อโดย
   (1) คลิกที่แท็ป "บัญชีบริการ"
   (2) คลิกที่ "ข้อมูลลับฐานข้อมูล"
   (3) เลื่อนเมาส์มาลอย ๆ ในส่วนท้ายข้อความที่เป็น ........ แล้วคลิกที่คำว่า "แสดง" ทำการคลิกที่รูปสี่เหลี่ยมเพื่อคัดลอกนำไปใช้งาน


5. คัดลอกตำแหน่งโฮสต์ โดยคลิกที่ (1) Database  แล้วคลุมดำที่ตำแหน่งโฮสต์ (2) คัดลอกเอาเฉพาะข้อความที่อยู่หลัง // และอยู่ก่อน /


ฟังก์ชั่นหลัก ๆ ที่ใช้งาน Firebase งานครั้งนี้เป็นตัวอย่างการใช้คำสั่ง 2 คำสั่ง
 .setInt
 .setFloat
เป็นฟังก์ชั่นที่ส่งค่าตัวเลขขึ้นยัง Firebase โดยไปทับค่าเก่าที่เคยส่งไปก่อนหน้านี้

โค้ดโปรแกรม
โค๊ด: [Select]
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#include <DHT.h>
#define DHTPIN D1         //pin connect DHT
#define DHTTYPE DHT11     //DHT11, DHT22 type of Sensor

#define WIFI_SSID       "wifi_name"
#define WIFI_PASSWORD   "wifi_password"
#define FIREBASE_HOST "host_firebase"
#define FIREBASE_AUTH "secret_code"

const String deviceNumber = "Device-001";

DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(115200);
  Serial.println(WiFi.localIP());
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.print("connected: ");
  Serial.println(WiFi.localIP());

  dht.begin();
     
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);

}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  int adc=analogRead(A0);
  if (isnan(t) || isnan(h))
  {
    Serial.println("Error reading DHT!");
  }
  else
  {
    digitalWrite(D0,LOW);   
    Serial.print("Analog value: ");
    Serial.print(adc);
    Serial.print("\t");
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print("\t");
    Serial.print("Temp: ");
    Serial.println(t);
    Serial.println("...............................");   
    Firebase.setInt(deviceNumber + "/Analog value", adc);
    Firebase.setFloat(deviceNumber + "/Humidity", h);
    Firebase.setFloat(deviceNumber + "/Temperature", t);       
  }
  delay(5000);   
}

6. แก้ไขค่าต่าง ๆ ในโปรแกรม
    (1) ชื่อไฟไวและพาสเวิร์ดไวไฟ
    (2) โฮสต์ของโปรเจคที่ได้จากคัดลอกในข้อ 9
    (3) รหัสลับของโปรเจคที่ได้จากคัดลอกในข้อ 6


7. ฟังก์ชั่นใช้งาน Firebase เป็นฟังก์ชั่นส่งค่าขึ้น Firebase โดยเพิ่มหัวข้อรับค่าในแต่ละค่าไปพร้อมกับคำสั่งส่ง


ทดสอบการทำงาน
8. หลังจากการ upload โค้ด สังเกตผลที่เกิดขึ้นที่เวป firebase


9. ผู้ใช้งานสามารถเพิ่มบอร์ดในการส่งค่าขึ้นได้โดยแยกหัวข้อในการส่งทำให้ Firebase สามารถแสดงค่าจากบอร์ดหลายบอร์ดได้ในโปรเจคเดียว

8
งานครั้งที่ 41 [iot#16 Firebase] ควบคุมการติดดับ LED ด้วย Firebase
Firebase เป็นบริการ Cloud ชนิดหนึ่งของกูเกิลมีบริการหลากหลายอย่างหนึ่งในนั้นสามารถนำมาใช้งาน iot ได้ ผู้ใช้งานสามารถนำข้อมูลที่ได้นำไปพัฒนาต่อได้หลากหลายอย่างสำหรับงานครั้งนี้เป็นการนำเสนอการควบคุมการติดดับของ LED ผ่านทาง Firebase

คอนเซ็ปต์หลักของงาน
บอร์ดส่งค่า 0 ไปยังโหนดของ Firebase เมื่อตอนเริ่มการทำงานของบอร์ด หลังจากนั้นให้บอร์ดรับค่าที่ส่งจาก Firebase กลับมายังบอร์ดเพื่อควบคุมการติดดับของ LED

[ขั้นตอนการดำเนินการ]
-สร้างโปรเจคงานใน Firebase
-นำรหัสลับของโปรเจคงานใน Firebase มาใส่ในโค้ดโปรแกรม
-นำค่าโฮสต์ของโปรเจคมาใส่ในโปรแกรม
-เขียนโค้ดเพื่อใช้งาน

ซึ่งรายละเอียดเป็นดังนี้
วงจรที่ใช้ทดลอง ทั้งที่เป็นบอร์ด NodeMCU และ WeMOS D1 mini ที่ใช้งานเชื่อมต่อเดิมในงานนั้น ๆ ตัวอย่างเช่น


ส่วนจัดการ Firebase
1. เริ่มขั้นตอนสร้างโปรเจค โดยเข้าไปที่ https://firebase.google.com
   (1) ล็อกอินด้วยอีเมล์ gmail (หากไม่มีให้สมัครใช้งาน gmail ก่อน)
   (2) คลิกที่ปุ่ม "ไปที่คอนโซล"


2. คลิกสร้างโปรเจค โดยคลิกที่คำว่า "เพิ่มโครงการ"


3. ใส่รายละเอียดของโปรเจค
   (1) ตั้งชื่อโปรเจค
   (2) เลือกประเทศ
   (3) คลิกสร้างโครงการ


4. ขั้นตอนไปหา รหัสลับ โดยเริ่มจาก
   (1) คลิกที่รูปเฟือง
   (2) คลิก "การตั้งค่าโครงการ"


5. ดำเนินการต่อโดย
   (1) คลิกที่แท็ป "บัญชีบริการ"
   (2) คลิกที่ "ข้อมูลลับฐานข้อมูล"
   (3) เลื่อนเมาส์มาลอย ๆ ในส่วนท้ายข้อความที่เป็น ........ แล้วคลิกที่คำว่า "แสดง"


6. รหัสลับเดิมที่เป็นจุด ๆ จะแสดงเป็นตัวอักษร ให้คลิกที่รูปสี่เหลี่ยมเพื่อคัดลอกนำไปใช้งาน (อาจนำไปว่าในเอกสารใด ๆ เพื่อพักไว้ก่อน)


7. ทำการสร้างดาต้าเบส
   (1) คลิกที่ "Database"
   (2) คลิกที่ "เริ่มต้นการใช้งาน" ในกลุ่มของ "Realtime Database"


8. กฏความปลอดภัย คลิกที่ (1) และ (2) ตามลำดับ


9. คัดลอกตำแหน่งโฮสต์ โดยเอาเฉพาะข้อความที่อยู่หลัง // และอยู่ก่อน /


ส่วนจัดการโค้ด
10. การใช้งาน Firebase จำเป็นต้องเพิ่่มไลบรารี่เพื่อให้สามารถใช้งานได้ โดยเข้าไปดาวน์โหลดไลบรารี่เป็นไฟล์ zip ได้ที่
https://github.com/firebase/firebase-arduino


11. ดำเนินการติดตั้งไลบรารี่ ดังรูป
 

คำสั่งต่างๆของ Library ที่มีให้ใช้งาน
โค๊ด: [Select]
void set(String path, JsonVariant value)
void setBool(String path, String value)
void setInt(String path, String value)
void setFloat(String path, String value)
void setString(String path, String value)

String push(String path, JsonVariant value)
String pushBool(String path, String value)
String pushInt(String path, String value)
String pushFloat(String path, String value)
String pushString(String path, String value)

FirebaseObject get(String path)
bool getBool(String path)
int getInt(String path)
float getFloat(String path)
String getString(String path)

void remove(String path)
void stream(String path)
bool available()
bool success()
bool failed()
String error()
FirebaseObject readEvent()

งานครั้งนี้เป็นตัวอย่างการใช้คำสั่ง 2 คำสั่งคือ .setInt และ .getInt

โค้ดโปรแกรม
โค๊ด: [Select]
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>

#define WIFI_SSID       "wifi_name"
#define WIFI_PASSWORD   "wifi_password"
#define FIREBASE_HOST "host_firebase"
#define FIREBASE_AUTH "secret_code"

#define LED1 D1
#define LED2 D2
#define LED3 D3
#define LED4 D4
void setup() {
  Serial.begin(115200);
  Serial.println(WiFi.localIP());
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.print("connected: ");
  Serial.println(WiFi.localIP());
 
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
     
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
  Firebase.setInt("device/LED1", 0);
  Firebase.setInt("device/LED2", 0);
  Firebase.setInt("device/LED3", 0);
  Firebase.setInt("device/LED4", 0);     
}
void loop() {
  digitalWrite(LED1, Firebase.getInt("device/LED1"));
  digitalWrite(LED2, Firebase.getInt("device/LED2"));
  digitalWrite(LED3, Firebase.getInt("device/LED3"));
  digitalWrite(LED4, Firebase.getInt("device/LED4"));     
  delay(200);
}

12. แก้ไขค่าต่าง ๆ ในโปรแกรม
    (1) ชื่อไฟไวและพาสเวิร์ดไวไฟ
    (2) โฮสต์ของโปรเจคที่ได้จากคัดลอกในข้อ 9
    (3) รหัสลับของโปรเจคที่ได้จากคัดลอกในข้อ 6


13. ฟังก์ชั่นใช้งาน Firebase
    (1) เริ่มใช้งาน Firebase
    (2) ส่งค่าตัวเลขไปยังโนดที่กำหนด


14. รับค่าตัวเลขจากโนดต่าง ๆ ของ Firebase มาควบคุมการติดดับของ LED


ทดสอบการทำงาน
15. หลังจากการ upload โค้ด สังเกตผลที่เกิดขึ้นที่เวป firebase


16. ทดลองคลิกที่ตัวเลข ทำการเปลี่ยนค่าเป็นเลข 1 และสังเกตผลที่เกิดขึ้นที่บอร์ดทดลอง


17. ทดลองเปลี่ยนตัวอื่น ๆ สังเกตผลที่เกิดขึ้นที่บอร์ดทดลอง


9
งานครั้งที่ 40 [iot#15 Anto] แสดงค่าจากดาต้าเซอร์วิส (ราคาน้ำมัน, NGV ,สภาพอากาศ ฯลฯ)
Anto มีบริการเสริมให้ผู้ใช้งานสามารถเรียกค่าเอาไปใช้งานตามความต้องการได้ ค่าจากบริการเสริมนี้อยู่ในกลุ่มของ Data Service มีให้ใช้งานหลายค่าได้แก่ราคาน้ำมันทุกประเภท ราคาแก้ส NGV ค่าอุณหภูมิ,ความชื้น,สภาพอากาศต่าง ๆ (ปัจจุบันมีเฉพาะกรุงเทพ) สำหรับผู้ที่ยังไม่ได้สมัครใช้งาน Anto สามารถศึกษาขั้นตอนได้จากงานครั้งที่ 36 [iot#11 Anto ] เริ่มต้นการใช้งาน Anto (ควบคุม LED)

คอนเซ็ปต์หลักของงาน
บอร์ดอ่านค่าเฉพาะส่วนที่ต้องการจากดาต้าเซอร์วิสทุก 3 วินาที


[ขั้นตอนการดำเนินการ]
-ใช้ Thing เดิมที่ใช้งานอยู่
-ใช้ key เดิมใน Thing ที่ใช้งานอยู่
-นำค่า Thing, Key มาใส่ในโค้ดเพื่อสื่อสารกับเซิร์ฟเวอร์
-เขียนโค้ดเพื่อใช้งาน

ซึ่งรายละเอียดเป็นดังนี้
1. วงจรที่ใช้ทดลอง ทั้งที่เป็นบอร์ด NodeMCU และ WeMOS D1 mini ที่ใช้งานเชื่อมต่อเดิมในงานนั้น ๆ ตัวอย่างเช่น


2. รายการข้อมูลจากดาต้าเซอร์วิสที่มีให้บริการ
   (1) คลิก Data Service
   (2) ชื่อเซอร์วิส
   (3) เซอร์วิสโค้ด (ค่าที่นำไปใส่ในโค้ดโปรแกรม)
   (4) ค่าล่าสุดของเซอร์วิสนั้น ๆ
   (5) เวลาที่อัพเดตล่าสุด


เตรียมค่าที่เอาไปใช้ในการเขียนโค้ดโปรแกรม
ซึ่งต้องนำค่าจากเวปไซต์ไปใส่ในโค้ดจำนวน 3 ค่าคือ
-USERNAME
-Key (Token) ของ Thing ไหนก็ได้แต่ต้องเป็น Thing ที่นำไปใช้งานในโค้ดนี้
-Thing ใช้ตัวไหนก็ได้

3. UserName ดูได้จากเมนู Account ดังรูป


4. Key (Token) ต้องเลือกรายการ Key ที่สร้างให้เชื่อมโยงใน Thing ที่ต้องการใช้งาน
   (1) เข้าไปที่เมนู Key
   (2) คลิกคัดลอก จากคีย์ที่ถูกสร้างใช้งานในครั้งนี้ (สังเกตจากคำอธิบาย)  แล้วนำไปวางในโค้ดโปรแกรม


5. Thing คลิกที่เมนู Thing เลือกชื่อที่ต้องการนำไปเขียนโปรแกรม


ส่วนจัดการโค้ด
6. แก้ค่าต่าง ๆ ของโค้ดโปรแกรมดังนี้
    (1) ใส่รายละเอียดของไวไฟที่บอร์ดควบคุมใช้เชื่อมต่อ
    (2) ใส่ค่า user(UserName), token(key),thing(Thing) ที่คัดลอกมาจากเวปไซต์จากข้อ 3-5
    (3) กำหนดค่าราคาน้ำมันที่เพิ่มขึ้นในแต่ละพื้นที่ เป็นราคาในแต่ละพื้นที่-ราคากรุงเทพ
   *สามารถเข้าไปดูได้ที่ http://www.pttplc.com/th/media-center/oil-price/pages/province-oil-price.aspx?s=2


7. ฟังก์ชั่นที่ใช้อ่านค่าจากเซอร์วิสที่ส่งมาจากเซิร์ฟเวอร์ Anto เป็นดังรูป
    (1) ตัวแปรสตริงค์สำหรับเก็บค่าที่ได้รับจากเซอร์วิส
    (2) ค่าเซอร์วิสที่ต้องการอ่านจากเซิร์เวอร์ Anto (ในที่นี้ต้องการอ่านค่าน้ำมันแก้สโซฮอล 95 ซึ่งโค้ดเซอร์วิสเป็น "gas.95e10.price")
   (3) บวกราคาเพิ่มเมื่ออยู่ต่างจังหวัด ซึ่งจะต้องแปลงค่าจากตัวแปรสตริงค์เป็นตัวแปรทศนิยมก่อนการบวก


โค้ดโปรแกรม
โค๊ด: [Select]
#include <AntoIO.h>
#include <SimpleTimer.h>
const char *ssid = "wifi_name";
const char *pass = "wifi_password";
const char *user = "user_name";
const char *token = "TokenKey";
const char *thing = "thing_name";
AntoIO anto(user, token, thing);

float localCharge=0.32;             /* price of chaiyaphum*/

void setup()
{ Serial.begin(115200);
  Serial.println();
  Serial.println();
  Serial.print("Anto library version: ");
  Serial.println(anto.getVersion());
  Serial.print("\nTrying to connect ");
  Serial.print(ssid);
  Serial.println("...");
  while (!anto.wifi.begin(ssid, pass));
  Serial.println("\nConnected");
}
void loop() {
  testService();
  delay(3000);
}
void testService(void)
{
  String str;
  float price;
  if (anto.http.request(str, "gas.95e10.price")){
    price=localCharge+str.toFloat();
    Serial.print("Gasohol 95(E10) price :");
    Serial.println(price);
  }
  else{
    Serial.println("Can't Read Gasohol 95(E10) price");   
  }
  if (anto.http.request(str, "gas.hsd.price")){
    price=localCharge+str.toFloat();
    Serial.print("High-speed Diesel price :");
    Serial.println(price);
  }
  else{
    Serial.println("Can't Read High-speed Diesel price");
  } 
  Serial.println();
}
ทดสอบการทำงาน
8. หลังจากการ upload โค้ด เปิดดูสถานะของบอร์ดได้จาก Channel  เมื่อบอร์ดยังออนไลน์อยู่สถานะจะสลับไปมาแต่ถ้าหากบอร์ดหลุดจากการเชื่อมต่อกับเซิร์ฟเวอร์สถานะจะหยุดนิ่ง

10
งานครั้งที่ 39 [iot#14 Anto] แสดงสถานะการออนไลน์ของบอร์ด
การควบคุมบอร์ด iot ไม่ว่าจะใช้บริการ cloud จากค่ายไหนก็ตามเป็นการสั่งการผ่านเครือข่ายอินเตอร์เน็ตซึ่งบอร์ดจะสามารถทำงานตามที่สั่งได้บอร์ดนั้นจะต้องเชื่อมต่ออินเตอร์เน็ตและจะต่อเชื่อมต่อกับ cloud อยู่ด้วย วิธีที่จะให้ผู้ใช้งานรู้ว่าบอร์ดที่กำลังจะสั่งงานนั้นออนไลน์อยู่หรือไม่นั้นใช้วิธีการให้บอร์ดส่งค่าสถานะมาแสดงผลอยู่ต่อเนื่องหากยังเชื่อมต่ออยู่ ทำให้ผู้ใช้งานรับรู้สถานะการออนไลน์ได้ วิธีนี้สามารถใช้กับ cloud ทุกค่าย แต่มีข้อเสียหนึ่งประการคือจะต้องเสียช่องทางการสื่อสารไป 1 ช่องทางเพื่อใช้ในการแสดงสถานะการออนไลน์ของบอร์ด งานครั้งนี้ยกตัวอย่างการใช้ cloud ของค่าย Anto สำหรับผู้ที่ยังไม่ได้สมัครใช้งาน Anto สามารถศึกษาขั้นตอนได้จากงานครั้งที่ 36 [iot#11 Anto ] เริ่มต้นการใช้งาน Anto (ควบคุม LED)

คอนเซ็ปต์หลักของงาน
บอร์ดส่งสถานะ 0 และ 1 สลับกันไปทุก 1 วินาทีขึ้นเซิร์ฟเวอร์เพื่อแสดงผลหน้าเวปไซต์


[ขั้นตอนการดำเนินการ]
-ใช้ Thing เดิมที่ใช้งานอยู่
-สร้าง Channel สำหรับแสดงสถานะบอร์ด (Channel คือช่องทางการสื่อสารซึ่งอยู่ภายใน Thing)
-กำหนดค่า Channel ใน key
-นำค่า Thing, Channel, Key มาเขียนโค้ดเพื่อส่งข้อมูลขึ้นเซิร์ฟเวอร์
-ออกแบบหน้าเวปสำหรับใช้สื่อสารกับบอร์ด
-เขียนโค้ดเพื่อใช้งาน

ซึ่งรายละเอียดเป็นดังนี้
1. วงจรที่ใช้ทดลอง ทั้งที่เป็นบอร์ด NodeMCU และ WeMOS D1 mini ที่ใช้งานเชื่อมต่อเดิมในงานนั้น ๆ ตัวอย่างเช่น


2. งานครั้งนี้เป็นการแสดงสถาะนะของบอร์ด หากมีการเชื่อมต่อปกติสถานะจะสลับไปมาดังรูป แต่ถ้าหากบอร์ดหลุดจากการเชื่อมต่อสถานะจะหยุดนิ่ง


ส่วนจัดการเวปไซต์
3. ทำการสร้าง Channel สำหรับการแสดงผลสถานะของบอร์ด
   (1) คลิก Thing
   (2) รายการ Thing ที่สร้างไว้แล้ว
   (3) คลิกที่แว่นขยายเพื่อเพิ่ม Channel สำหรับแสดงสถานะบอร์ด (เพิ่มเข้าใน Thing ที่ใช้งานปกติ)


4. คลิกสร้าง Channel  สำหรับแสดงสถานะบอร์ด


5. ใส่รายละเอียดของ Channel ที่จะสร้าง
   (1) ชื่อ Channel
   (2) คำอธิบาย
   (3) ชนิดของการแสดงผล


6. Channel  ที่ถูกสร้างขึ้นเพื่อแสดงสถานะบอร์ด


7. กำหนดการรับค่าเข้า Channel  โดยคลิกที่ key (1)-->(2) ตามลำดับ


8. กำหนดการรับค่าของ Channel  แสดงสถานะบอร์ดที่ถูกสร้างขึ้น


เตรียมค่าที่เอาไปใช้ในการเขียนโค้ดโปรแกรม
ซึ่งต้องนำค่าจากเวปไซต์ไปใส่ในโค้ดจำนวน 4 อย่างได้แก่
-USERNAME
-Key (Token)
-Thing
-Channel

9. UserName ดูได้จากเมนู Account ดังรูป


10. Key (Token) ต้องเลือกรายการ Key ที่สร้างให้เชื่อมโยงใน Thing ที่ต้องการใช้งาน
   (1) เข้าไปที่เมนู Key
   (2) คลิกคัดลอก จากคีย์ที่ถูกสร้างใช้งานในครั้งนี้ (สังเกตจากคำอธิบาย)  แล้วนำไปวางในโค้ดโปรแกรม


11. Thing คลิกที่เมนู Thing เลือกชื่อที่ต้องการนำไปเขียนโปรแกรม


12. Channel สามารถเข้าไปดูรายการได้โดยคลิกที่แว่นขยายของ Thing


ส่วนจัดการโค้ด
13. แก้ค่าต่าง ๆ ของโค้ดโปรแกรมดังนี้
    (1) ใส่รายละเอียดของไวไฟที่บอร์ดควบคุมใช้เชื่อมต่อ
    (2) ใส่ค่า user(UserName), token(key),thing(Thing) ที่คัดลอกมาจากเวปไซต์จากข้อ 9-12
    (3) เริ่มใช้งานไลบรารี่ SimpleTime (เรียกใช้ฟังก์ชั่นตามคาบเวลาที่กำหนด)
    (4) กำหนดตัวแปรสร้างสถานะ


14. ฟังก์ชั่นที่ใช้สำหรับส่งสถานะขึ้นเซิร์ฟเวอร์ Anto เป็นดังรูป
    (1) ฟังก์ชั่นกำหนดคาบเวลาส่งค่าขึ้นเซิร์ฟเวอร์โดยให้เรียกใช้ฟังก์ชั่นย่อยตามเวลาที่กำหนด ตัวอย่างนี้ให้เรียกทุก ๆ 1 วินาที
    (2) ฟังก์ชั่นส่งค่าขึ้นเซิร์ฟเวอร์ โดยค่าจะถูกกลับเป็นตรงข้ามทุกครั้งเมื่อมีการเรียกใช้ และการส่งจะส่งไปยัง Channel "BoardStatus" ซึ่งได้สร้างขึ้นเพื่อรับค่าไว้แล้ว


โค้ดโปรแกรม
โค๊ด: [Select]
#include <AntoIO.h>
#include <SimpleTimer.h>
const char *ssid = "wifi_name";
const char *pass = "wifi_password";
const char *user = "user_name";
const char *token = "TokenKey";
const char *thing = "thing_name";
AntoIO anto(user, token, thing);
SimpleTimer timer;
bool state;
void setup()
{
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.print("Anto library version: ");
  Serial.println(anto.getVersion());
  Serial.print("\nTrying to connect ");
  Serial.print(ssid);
  Serial.println("...");
  timer.setInterval(1000, sendState);
  anto.begin(ssid, pass, messageReceived);
  Serial.println("\nConnected Anto done");
}
void sendState(){
  state=!state;
  anto.pub("BoardStatus",state); 
}
void loop() {
  anto.mqtt.loop();
  timer.run();
}
void messageReceived(String thing, String channel, String payload) {
  Serial.print("Recieved: ");
  Serial.print(thing);
  Serial.print("/");
  Serial.print(channel);
  Serial.print("-> ");
  Serial.println(payload);
}
ทดสอบการทำงาน
15. หลังจากการ upload โค้ด เปิดดูสถานะของบอร์ดได้จาก Channel  เมื่อบอร์ดยังออนไลน์อยู่สถานะจะสลับไปมาแต่ถ้าหากบอร์ดหลุดจากการเชื่อมต่อกับเซิร์ฟเวอร์สถานะจะหยุดนิ่ง

หน้า: [1] 2 3 ... 10