สร้างอุปกรณ์ IoT ง่าย ๆ ด้วย NETPIE และ NB-IoT
บทความนี้จะสอนการใช้งาน NB-IoT (ใช้ได้ทั้ง True และ AIS) ด้วย NETPIE Platform เบื้องต้น โดยการส่งค่าอุณหภูมิและความชื้นไปยัง Web Application สำเร็จรูป NETPIE Freeboard เพื่อเป็นตัวอย่างสำหรับนำไปประยุกต์เป็นอุปกรณ์ IoT แบบต่าง ๆ ต่อไป
เกริ่นนำ
เมื่อนึกอยากจะสร้างอุปกรณ์ Internet of Things (IoT) ซักตัวนึง คลื่นที่เรามักจะใช้ในการเชื่อมต่อ Internet ก็คือสัญญาณ Wifi ใช่ไหมครับ เพราะเดี๋ยวนี้ไม่ว่าจะบ้านหรือที่ทำงานเราก็มี Wifi ใช้ทั้งนั้น ส่วนถ้าหากอยากจะใช้ในที่ไกล ๆ ไม่มีสัญญาณ WiFi ก็มักจะนิยมใช้ 2G/3G
แต่มาวันนี้ ผมขอนำเสนออีกหนึ่งทางเลือก นั่นก็คือ!! คลื่น NB-IoT ( Narrow Band Internet of Things ) โดยมีคุณสมบัติที่น่าสนใจคือ Long Range & Low Power หรือก็คือ สามารถส่งสัญญาณได้ไกล และใช้พลังงานต่ำครับ (เนื่องจากสัญญาณต่าง ๆ ที่ได้กล่าวถึงข้างบนนั้นใช้พลังงานสูงทั้งสิ้น)
อ่านรายละเอียดเพิ่มเติมเกี่ยวกับ NB-IoT ได้ที่: https://techsauce.co/tech-and-biz/narrow-band-internet-of-things-nb-iot/
ถ้าถูกใจหรือสนใจ NB-IoT ขึ้นมาแล้วล่ะก็…
มาลองสร้างอุปกรณ์ IoT กับสัญญาณ NB-IoT กันเถอะ !!
สำหรับมือใหม่มาก ๆ ที่ไม่เคยสร้างอุปกรณ์ IoT เลย สามารถทำตามเพื่อเรียนรู้วิธีและติดตามผลลัพธ์ได้ แต่แนะนำให้ศึกษาเรื่อง Arduino และ NETPIE เพื่อความเข้าใจยิ่งขึ้นครับ
อุปกรณ์ที่ใช้
- Arduino UNO หรือ Arduino Mega (บทความนี้เลือกใช้ UNO)
- True NB-IoT Shield
- DHT22 (เซ็นเซอร์วัดอุณหภูมิและความชื้น)
ติดตั้ง Arduino Library
Microgear NB-IoT
- เปิดโปรแกรม Arduino IDE
2. คลิกที่เมนู Manage Libraries… โดยเข้าจาก Sketch -> Include Library
3. กรอกข้อความ “microgear-nbiot” ในช่องค้นหา และคลิกที่ microgear-nbiot ที่แสดงขึ้นมา 1 ครั้ง
4. คลิกปุ่ม Install ที่แสดงขึ้นมา
Adafruit Unified Sensor และ DHT Library
ทำซ้ำวิธีเดียวกับ Microgear NB-IoT ในขั้นตอน 3 และ 4 แต่เปลี่ยนข้อความสำหรับค้นหาในขั้นตอนที่ 3 เป็น Adafruit Unified Sensor และ DHT Library
การเชื่อมต่ออุปกรณ์
- ประกบ NB-IoT Shield เข้ากับ Arduino
2. เชื่อมต่อ DHT-22 เข้ากับ NB-IoT Shield ดังรูปภาพ
โค้ดคำสั่ง Arduino
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) // Arduino UNO
#include <AltSoftSerial.h>
AltSoftSerial bc95serial;
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) // Arduino MEGA2560
#define bc95serial Serial1
#endif#include <Arduino.h>
#include <DHT.h>
#include <BC95Udp.h>
#include <MicrogearNB.h>// กำหนดข้อมูลเชื่อมต่อ NETPIE
#define APPID "YOUR_APPID" // ต้องแก้ไข
#define KEY "YOUR_KEY" // ต้องแก้ไข
#define SECRET "YOUR_SECRET" // ต้องแก้ไข// กำหนดข้อมูลเชื่อมต่อ DHT22
#define DHTPIN 7
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);BC95UDP client;
Microgear microgear(&client);#define MAXBUFFSIZE 32
char payload[MAXBUFFSIZE];
long lastDHTRead = 0;void setup() {
bc95serial.begin(9600);
BC95.begin(bc95serial);
BC95.reset();
Serial.begin(9600);
Serial.println(F("Microgear Arduino NB-IoT Start!"));
Serial.print(F("IMEI: "));
Serial.println(BC95.getIMEI());
Serial.print(F("IMSI: "));
Serial.println(BC95.getIMSI()); Serial.print(F("Attach Network..."));
while (!BC95.attachNetwork()) {
Serial.print(".");
delay(1000);
}
Serial.println(F("\nNB-IOT attached!"));
Serial.print(F("RSSI: "));
// ค่าความแรงสัญญาณ NB-IoT
Serial.println(BC95.getSignalStrength());
Serial.print(F("IPAddress: "));
Serial.println(BC95.getIPAddress()); microgear.init(APPID, KEY, SECRET);
microgear.begin(5555);
}void loop() {
// เซนเซอร์ DHT อ่านถี่เกินไปไม่ได้ จะให้ค่า error
// จึงต้องเช็คเวลาครั้งสุดท้ายที่อ่านค่าว่าทิ้งช่วงนานพอหรือยัง ในที่นี้ตั้งไว้ 1 วินาที
if(millis() - lastDHTRead > 1000){
float humid = dht.readHumidity(); // อ่านค่าความชื้น
float temp = dht.readTemperature(); // อ่านค่าอุณหภูมิ
lastDHTRead = millis();
Serial.print(F("Humid: "));
Serial.print(humid);
Serial.print(F(" %, "));
Serial.print(F("Temp: "));
Serial.print(temp);
Serial.println(F(" C ")); // ตรวจสอบค่า humid และ temp เป็นตัวเลขหรือไม่
if (isnan(humid) || isnan(temp)) {
Serial.println(F("Failed to read from DHT sensor!"));
}
else{
// เตรียมสตริงในรูปแบบ "humid,temp"
String datastring = (String)humid + "," + (String)temp;
Serial.print(F("Sending --> "));
Serial.println(datastring);
datastring.toCharArray(payload, MAXBUFFSIZE-1);
microgear.publish("/nbiot/sensor", payload);
} Serial.print(F("Sent Signal Strength: "));
Serial.println(BC95.getSignalStrength());
microgear.publish("/nbiot/rssi", BC95.getSignalStrength());
} microgear.loop();
}
สำคัญ !! อย่าลืมใส่ appid, key, secret ของตัวเองลงไปใน code ด้วย
เสร็จแล้ว Upload และกด Serial Monitor ดู ถ้าสมบูรณ์และไม่มีอะไรผิดพลาด ก็จะได้ผลลัพธ์แบบดังนี้ (ปล. Microgear NB-IoT ตอนนี้ยังไม่สามารถแสดงสถานะ Online บนเว็บ netpie.io ได้)
ตั้งค่าการแสดงผลบนเว็บ
- เพิ่ม Datasoure
2. เพิ่ม Gauge แสดงค่า RSSI จาก NB-IoT
3. เพิ่ม Gauge แสดงค่า อุณหภูมิและความชื้น จาก NB-IoT
เนื่องด้วยข้อความอุณหภูมิและความชื้นมาคู่กัน เช่น 27.61,60.10 แต่เราอยากได้แค่อุณหภูมิอย่างเดียว คือ 27.61 จึงจำเป็นต้องใช้ split เพื่อแยกข้อความ 2 ตัวที่เชื่อมกันด้วยเครื่องหมาย , ออกมา
เสร็จแล้วววว เย้!
เมื่อทำตามขั้นตอนต่าง ๆ เสร็จแล้ว ก็จะได้อุปกรณ์ส่งค่าความแรงสัญญาณ, อุณหภูมิ และความชื้น ขึ้น Internet เปิดที่ไหนบนโลกก็ได้แล้วตอนนี้
หรือจะเปิดดูจาก application netpie บนมือถือก็ได้
ข้อจำกัด
ข้อจำกัดของ NETPIE & NB-IoT ตอนนี้ (11/11/2561) คือ ไม่สามารถแสดงสถานะการ Offline หรือ Online บนหน้าเว็บไซต์ netpie.io ได้นะครับ แต่ยังสามารถส่งค่าจากอุปกรณ์มายัง NETPIE ได้เท่านั้น ยังไม่เหมาะที่จะทำงานที่มีการส่งค่าจาก NETPIE ไปยังอุปกรณ์
ทิ้งท้าย
สำหรับมือใหม่อาจใช้เวลาในการทำความคุ้นเคยกับโปรแกรมใหม่ ๆ กันนานพอสมควร หากสุดท้ายแล้วพยายามแล้วไม่ได้จริง ๆ สามารถสอบถามมาได้ทุกอย่างเลยในคอมเม้นข้างล่างเลยครับ
หวังว่าจะมีประโยชน์กับหลาย ๆ ท่านเพื่อนำไปพัฒนาเป็นอุปกรณ์ IoT ที่ตอบโจทย์ผู้ใช้งานยิ่ง ๆ ขึ้นไป และหลากหลายยิ่งขึ้น ถ้าอยากให้บทความต่อไปสอนเรื่องอะไรก็คอมเม้นบอกกันข้างล่างได้เช่นกันครับ
พูดคุย แลกเปลี่ยน สอบถามข้อมูลเกี่ยวกับ NETPIE ได้ที่
Facebook Group: https://www.facebook.com/groups/netpie
ติดตามข่าวสาร ติดต่อธุรกิจกับ NEXPIE ได้ที่
Facebook Fanpage: https://www.facebook.com/nexpie