ทุกวันนี้ IoT เข้ามามีบทบาทสำคัญในการขับเคลื่อนเศรษฐกิจและนวัตกรรม และอุปกรณ์ก็หาซื้อง่าย ราคาถูก รวมไปถึงมีเครื่องมืออำนวยความสะดวกต่อการเรียนรู้และพัฒนาเยอะมาก บทความอีกนับไม่ถ้วน ที่หาอ่านได้ทั่วไป วันนี้เลยถือโอกาสทดลองบอร์ดที่ชื่อ NodeMCU v3 กับ chip EPS8266 ที่เชื่อมโลก internet ผ่าน wifi แบบง่ายดาย โดยโจทย์ที่จะทำคือ “อุปกรณ์ตรวจวัดอุณหภูมิและความชื้น” ซึ่งสิ่งที่ต้องมีก็คือ
Jump to Contents
System Requirement
- NodeMCU v3 1 ชิ้น ราคาต่อหน่วย ~ 80 บาท
- DHT22 1 ชิ้น ราคาต่อหน่วย ~130 บาท
- USB to Micro USB 1 เส้น
- Adaptor สำหรับชาร์ตมือถือ output 5v
Additions
ส่วนนี้ใช้ทดสอบเท่านั้น พอใช้จริงแล้วไม่ได้เสียบใช้งานเลย ในบทความนี้ไม่จำเป็นต้องใช้
- Breadboard 2 ชิ้น ราคาต่อหน่วย ~30 บาท
- สายจั้มเปอร์ ผู้-ผู้ ราคาต่อหน่วย ~25 บาท
- Resistor 4.7k 1/4w 1 ตัว ราคาต่อหน่วย ~1 บาท
ประกอบร่าง NodeMCU v3 และ DHT22
การเชื่อมต่อนั้นทำได้หลายแบบ ขึ้นอยู่กับว่าเราจะสะดวกใช้งานแบบไหน บางท่านก็ใช้ Breadboard มาต่อ บางท่านก็บัดกรีัตรงๆ ซึ่งภาพที่ผมหามาก็จะประมาณนี้
ลองประกอบตามตัวอย่างแล้วพบว่าใช้งานไม่ได้ อันเนื่องจาก… (ยังไม่บอกตอนนี้)
ซึ่งเราไม่ต้องไปสนใจว่าใครจะใช้ pin ไหนส่งและรับข้อมูล ให้เราดูจาก pin map ของ NodeMCU v3 ของเราว่ามันมีอะไรให้ใช้บ้าง และเราค่อย map pin ให้ตรงกับโปรแกรมที่เขียนมารับเท่านั้นเอง
ส่วนสำคัญของ DHT22 pin จะมี 3 ส่วน แค่นี้ครับ 1) ไฟเข้า 2) ข้อมูล 3) กราวด์
Pin ที่ผมใช้งานดังนี้
- Vcc ต่อกับ VU สีแดง
- Data ต่อกับ D2 สีเขียว
- Ground ต่อกับ G สีดำ
ภาพสุดท้ายออกมาแบบนี้
Install Arduino IDE
https://www.arduino.cc/en/software ส่วนหนึ่งก็คือโปรแกรมสำหรับเขียน code นี่แหละ เลือกได้ตามใจชอบเลย หรือจะใช้ notepad เขียนก็ยังได้ แต่เจ้า Arduino IDE มันจะต้องใช้ compile code เราเข้าไปใส่ไว้ใน board เราถึงต้องติดตั้งไว้
โหลดมาแล้วติดตั้งไปเลยไม่ต้องสนใจอะไร เสร็จแล้วเปิดขึ้นมาดูจะพบหน้าตาแบบนี้ ให้รอแป๊บนึง
หน้าจอเริ่มต้นของโปรแกรม มันจะสร้างไฟล์ sketch ตัวอย่าง มาให้ตามวันที่ดังภาพ
Install Library
หลังจากติดตั้ง IDE แล้วมันก็จะมี library บางส่วนติดตั้งมาอยู่แล้ว แต่ในโปรเจคนี้เราต้องติดตั้งเพิ่มเติมโดยเปิดโปรแกรม Arduino IDE จากนั้นไปที่ Tools
> Manage Libraries...
หรือกด Ctrl + Shift + I
ค้นหาชื่อต่อไปนี้ Adafruit Unified Sensor , จากนั้นกด Install
- Adafruit Unified Sensor 1.1.4
- WiFi 1.2.7
- DHT sensor library 1.3.8
- TridentTD_LineNotify 3.0.0
DHT Sensor library : หากใช้เวอร์ชั่นใหม่แล้ว sensor ไม่ทำงาน หรือ รับส่งข้อมูลได้บ้างไม่ได้บ้าง อาจไม่ได้เป็นเพราะ sensor มันเสีย แต่อาจเป็นเพราะ library มันไม่ support กับ nodeMCU ที่เราซื้อมา อาจจะด้วยกระบวนการผลิต หรือ chip คนละรุ่นกันก็ตาม ให้ลองมาใช้ vesion 1.3.8 ดูครับ
Install Driver CH341SER
หากไม่ติดตั้ง driver ตัวนี้ เวลาที่เสียบอุปกรณ์เข้าไป มันจะมองไม่เห็น port COM ให้ติดตั้งก่อน โดย Download ไฟล์จากลิงค์นี้ได้เลย
http://www.wch-ic.com/downloads/CH341SER_EXE.html
จากนั้นกด Setup.exe
> install
และรอให้เสร็จ
หลังติดตั้งแล้วลองเสียบสาย Micro USB เข้ากับ NodeMCU หากมีเสียงแสดงว่าอปกรณ์ใช้งานได้ จากนั้นเปิดไปที่ Device manager
ในส่วนของ Port (COM & LPT)
จะพบกับ USB-SERIAL CH340
จากนั้นเปิด Arduino IDE ขึ้นมา เลือกไปที่ Tool
> Port:
เลือกไปที่ port ของอุปกรณ์ (ในรูปคือ COM3)
Additional Boards Manager
เนื่องจากบอร์ด esp8266 ไม่ได้อยู่ในรายการของ Arduino เราจึงต้องระบุเข้าไปเอง เป็น additional board โดยเข้าไปที่ File
> Preferences
> Additional Boards Manager URLs
(หากเพิ่มมากกว่า 1 url ให้ใช้ comma , คั่น)
https://arduino.esp8266.com/stable/package_esp8266com_index.json
ไปที่ Tools
> Boards Manager
จากนั้นเลือก ESP8266 board และเลือก NodeMCU 1.0
Sample Project Blink แบบบ้าน ๆ
เริ่มต้นทดสอบ code project แรกด้วยการทำไฟกระพริบ เปิด Arduino IDE ขึ้นมา ให้เลือกไปที่ File
> Example
> 01.Basics
> Blink
จะได้ชุดคำสั่งมาชุดหนึ่ง เพื่อทดสอบการทำงานของ NodeMCU ให้ตรวจสอบ COM Port ว่าเลือกไว้หรือยัง และ Board Manger ตรงกับรุ่นของ board ที่เรากำลังใช้งานอยู่ จากนั้นกดลูกศร เพื่อ Upload รอจนเสร็จ
ผลลัพท์ไฟกระพริบ
เริ่มโปรเจค DHT
เชื่อมต่อสาย jumper กับ Sensor DHT22 ให้เรียบร้อย ตามตัวอย่างข้างต้น เปิด Arduino IDE เข้าที่ File
> Examples
> DHT Sensor library
> DHTtester
จากนั้น Upload
เมื่อ Upload เสร็จแล้ว รออุปกรณ์ reboot ใหม่ เราจะดูค่าผ่าน Serial Monitor เข้าไปที่ Tools
> Serial Monitor
มันก็จะแสดงผลประมาณนี้
แจ้งเตือนผ่าน LINE Notify
เพิ่ม Library ชื่อ “TridentTD_LineNotify” เพื่อให้ NodeMCU ของเรามันสามารถส่งการแจ้งเตือน หรือข้อความผ่าน LINE Notify ได้ ซึ่งเป็นวิธีที่นิยม เพราะมันสะดวกและไม่มีค่าใช้จ่าย โดยรายละเอียดของการติดตั้ง สามารถอ่านดูได้จากที่นี่
https://github.com/TridentTD/TridentTD_LineNotify
เมื่อนำมาประกอบร่างแล้ว code สำเร็จก็จะออกมาดังที่เห็น
// Including the ESP8266 WiFi library
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <TridentTD_LineNotify.h>
#include "DHT.h"
// Uncomment one of the lines below for whatever DHT sensor type you're using!
//#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
#define LINE_TOKEN "*** LINE TOKEN ***" // บรรทัดที่ 13 ใส่ รหัส TOKEN ที่ได้มาจากข้างบน
#define NODE "ESP8266_DHT_Demo"
// Replace with your network details
const char *ssid = "*** wifi 2.4ghz name ***";
const char *password = "*** wifi password ***";
// DHT Sensor Data PIN
const int DHTPin = 4; // D1
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);
// Temporary variables
static char celsiusTemp[7];
static char fahrenheitTemp[7];
static char humidityTemp[7];
// only runs once on boot
void setup()
{
delay(1000);
Serial.begin(9600);
WiFi.mode(WIFI_OFF); //Prevents reconnection issue (taking too long to connect)
delay(1000);
WiFi.mode(WIFI_STA); //This line hides the viewing of ESP as wifi hotspot
WiFi.begin(ssid, password); //Connect to your WiFi router
Serial.println("");
Serial.print("Connecting");
// Wait for connection
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
//If connection successful show IP address in serial monitor
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //IP address assigned to your ESP
Serial.println(LINE.getVersion());
LINE.setToken(LINE_TOKEN);
dht.begin();
}
// runs over and over again
void loop()
{
delay(20000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f))
{
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));
// Send LINE Notify if heatindex over.
if (hic > 45.00)
{
LINE.notify("😐 ดูเหมือนห้องจะร้อนนะครับ\n" + String(NODE) + " : Heat index " + String(hic) + "°C " + "\n🌡 " + String(t) + "°C 💧" + String(h) + "%");
}
}
เมื่อห้องร้อนกว่าที่กำหนด ก็จะได้ข้อความส่งเข้ามาแบบนี้เลย
ทิ้งท้าย
draft บทความนี้ทิ้งไว้นานมาก ตั้งแต่ปลายปี 2020 ปัจจุบันอาจจะมี library บางตัวเปลี่ยนแปลงไปทางผู้เขียนต้องอภัยไว้ ณ ที่นี้ด้วย ซึ่งในบทความนี้ยังไม่ได้แนะนำการส่งข้อมูลเก็บในฐานข้อมูล ผ่าน POST/GET Request ซึ่งจะต้องใช้ library อื่น และยังต้องมีการสร้าง API สำหรับรับข้อมูลด้วย อาจจะทำให้บทความนี้ยาวมากเกินไป จึงขอเว้นไว้ในคร่าวหน้า เพราะในส่วนที่ทำจะมี dashboard ด้วย เนื้อหาจะเป็น http post, nodejs, realtime dashboard
publish เมื่อ 4 กุมภาพันธ์ 2023 เนื่องจากรื้อฟื้นความรู้ ที่เคยทำไว้ วันนี้เลยได้กล่องไหมขัดฟันเอามาใส่ ESP8266 กับ DHT11 ได้พอดีเลย จึงตัดสินใจเขียนบทความนี้ให้จบ ^^;