สิ่งที่ต้องเตรียม
- ระบบปฏิบัติการ Ubuntu 16.04 LTS
- Service MongoDB (สามารถดูวิธีติดตั้งและการใช้งานเบื้องต้นได้ที่นี่)
- NodeJS เพื่อมาเป็น Server ในการรับข้อมูลและเขียนลง Database
- Express เป็นตัว Run RESTAPI ของเราครับผม
- Board IOT รุ่น NodeMCU ESP8266
- Sensor ที่ต้องการจะใช้ในการส่งค่า ( ในตัวอย่างนี้ใช้ Sensor DHT )
- สาย USB ไว้เชื่อมต่อระหว่างบอร์ดกับ Computer
เมื่อเตรียมอุปกรณ์พร้อมแล้วก็มาดูวิธีทำกันเลยครับ
ขั้นตอนที่ 1 : ทำการติดตั้ง MongoDB
- สามารถทำตามบทความด้านล่างนี้ได้เลย
ขั้นตอนที่ 2 : ทำการติดตั้ง NodeJS, npm
- ตัวอย่างนี้เราจะใช้ NodeJS v.8.9.x นะครับ เพราะเวอร์ชั่นอื่น จะมีปัญหากับการใช้ Express
- ทำการเปิดหน้าต่าง Terminal ใน Ubuntu และพิมพ์คำสั่งด้านล่างนี้
$ sudo apt-get update
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
$ sudo apt-get install -y nodejs
- ติดตั้ง npm (Node Package Manager) เป็นตัวช่วยติดตั้ง Modules
$ sudo apt-get install npm
- เช็คว่าเราลงสำเร็จหรือไม่ ด้วยการตรวจสอบ Version ของแต่ละตัว
$ node -v
$ npm -v
ขั้นตอนที่ 3 : ติดตั้ง Modules ต่างๆที่จำเป็นในการทำงาน
- ติดตั้ง Express ไว้สำหรับเป็น Web Framework Modules สำหรับการ routes การ request ต่างๆ เช่น GET POST PUT DELETE เป็นต้น
$ sudo npm install express --save
- ต่อไปติดตั้ง Promise Modules
$ sudo npm install promise --save
- ต่อไปเป็น modules > Mongojs ไว้สำหรับเชื่อมต่อ MongoDB กับ NodeJS
$ sudo npm install mongojs --save
- และนี่เป็น modules ตัวสุดท้ายละครับ นั่นก็คือ forever เป็น tool สำหรับสั่งให้ NodeJS ของเรามีการทำงานอยู่ตลอดเวลา เมื่อมี Error เกิดขึ้นจะทำการ Restart ให้เราทันที
$ sudo npm install -g forever
ทีนี้เราก็ติดตั้ง Modules ที่จำเป็นครบแล้วไปต่อกันที่ Code ของเรากันเลยครับ
ขั้นตอนที่ 4 : เริ่มเขียน Code เพื่อทำการ Run Server ของเรา
ให้สามารถรับข้อมูลจาก NodeMCU ได้และเก็บข้อมูลลงฐานข้อมูล MongoDB
- อันดับแรกสร้าง folder งานของเราก่อนด้วยคำสั่ง
$ mkdir iot-mongodb
$ cd iot-mongodb
- จากนั้นทำการสร้าง File ที่มีชื่อว่า app.js เป็นไฟล์การทำงานของเรา
- หรือเข้าไปโหลดได้ใน Github ของผมครับตามลิ้งด้านล่างนี้เลย
- ต่อไปจะมาอธิบาย Code ในแต่ละส่วนนะครับ ส่วนที่สำคัญๆ
const express = require(‘express’)
const app = express()
var port = 4000var mongojs = require(‘mongojs’)
var Promise = require(‘promise’)
var myiotdb = mongojs(‘test’)
var dhtdb = mongojs(‘test’)
- ส่วนนี้เป็นการเรียก modules ต่างๆ เข้ามาเพื่อมาทำงานและกำหนดตำแหน่งที่เก็บข้อมูลของเรา
app.get(‘/’, function (req, res) {
res.send(“My IOT Protocol ready !”)
})
- ส่วนนี้เป็นการเขียนการ Route เป็นการ GET ออกมาจะแสดงข้อมูลอะไร เช่นถ้าเราเข้า localhost:4000 ก็จะแสดงข้อความมาว่า “My IOT Protocol ready !”
/* For DHT write */
app.get(‘/writedht/:t/:h’, function (req, res) {
var strParseWriteReq = JSON.stringify(req.params)
var strWriteReq = JSON.parse(strParseWriteReq)
t = strWriteReq.t
h = strWriteReq.h
writeDHT(t, h, res)
})/* For DHT data read */
app.get(‘/readdht/:datasize’, function (req, res) {
var strParseReadReq = JSON.stringify(req.params)
var strReadReq = JSON.parse(strParseReadReq)
datasize = strReadReq.datasize
readDHT(datasize, res)
})
- ส่วนนี้เป็นการ route ให้มีการเขียนข้อมูลลงไปยัง Database ของเรา และการอ่านค่าข้อมูลจาก MongoDB
ขั้นตอนที่ 5 : เป็นการ Coding ลง NodeMCU ของเราครับ
- Code ตัวนี้ก็มีอยู่ใน Github ของผมเหมือนกับ อยู่ใน testProject > testProject.ino
#include "ESP8266WiFi.h"
#include "DHT.h"const char *ssid = "SSID WIFI";
const char *passw = "PASSWORD WIFI";#define host "IP-Address Sever"
#define port 4000
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);String response;
float value;
String _str, _res, _t, _h;
float t, h;void setup() {Serial.begin(115200);
WiFi.begin(ssid, passw);Serial.print("WiFi connecting..");while ((WiFi.status() != WL_CONNECTED)) {
delay(200);
Serial.print(".");
}if (WiFi.status() == WL_CONNECTED) {
Serial.println("Connected !");
sayHi();
} else {
Serial.println("Disconnected !");
}
}void loop() {
t = dht.readTemperature();
h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.println("Temperature is " + String(t) + " celcuis");
Serial.println("Humidity is " + String(h) + " %RH");
Serial.println("----------------------------------------");
WriteDHT(t, h);
delay(5000);}String sayHi() {
WiFiClient client;
if (client.connect(host, port)) {
_str = "GET /";
_str += " HTTP/1.1\r\n";
_str += "Host: ";
_str += host;
_str += ":";
_str += port;
_str += "\r\n";
_str += "Connection: keep-alive\r\n\r\n";client.print(_str);delay(3000);while (client.available()) {
_res = client.readStringUntil('\r');
}return _res;} else {
//..
}
}String WriteDHT (float t, float h) {_t = String(t);
_h = String(h);WiFiClient client;
if (client.connect(host, port)) {_str = "GET /writedht/";
_str += _t;
_str += "/";
_str += _h;
_str += " HTTP/1.1\r\n";
_str += "Host: ";
_str += host;
_str += ":";
_str += port;
_str += "\r\n";
_str += "Connection: keep-alive\r\n\r\n";client.print(_str);delay(3000);
Serial.println("Add Data to MongoDB Success");
while (client.available()) {
_res = client.readStringUntil('\r');
}return _res;
} else {
//Nothing..
}
}
- ทำการ Upload Code นี้ลงไปใน NodeMCU ของเราได้เลยครับ
จากนั้นทำการ Run NodeMCU แล้ว Board ของเราก็จะทำงานและ Sensor ก็จะทำการ Detect ข้อมูลมาและนำข้อมูลส่งไปเขียนที่ฐานข้อมูล MongoDB ของเรา ถ้าเขียนข้อมูลลงใน MongoDB สำเร็จถือเป็นอันว่าโปรเจคของเราเสร็จสิ้นแล้วครับ
- วิธีเช็คข้อมูลว่าเข้า MongoDB มั้ย ให้ไปที่เครื่องที่ Run Service ของ MongoDB ของเราแล้วทำการรันคำสั่ง ดังนี้
$ mongo
- จากนั้นทำการเข้าไปใน DB ที่กำหนด
> use test
> db.dht.find()
- ถ้ามีข้อมูลอยู่ในนี้เป็นอันสำเร็จครับผม
ผมขอจบการเขียนบทความนี้เพียงเท่านี้ครับ อาจจะเป็นประโยชน์ไม่มากก็น้อยครับขอบคุณครับ
Reference
- https://github.com/flamezaxaou10/IoT-Protocol-MongoDB
- http://code.isaranu.com/node/2017/nodejs-iot-simple-protocol-dashboard.php
- http://medium.com/@flame.zaxaou/วิธีติดตั้ง-mongodb-และการใช้งานเบื้องต้น-บน-ubuntu-16–04-lts-dab357bbc5a1
- https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/chapter1.html