อุปกรณ์แสดงค่าอุณหภูมิ ความชื้น และฝนด้วย Rain sensor และ DHT22 แสดงค่าบนแพลตฟอร์ม ThingSpeak และ Blynk โดยบอร์ดArduino UNO + WiFi R3 ATmega328P+ESP8266
Rain and Temperature Detector with Arduino UNO+WiFi R3 ATmega328P+ESP8266 using Rain sensor and DHT22 through ThingSpeak Platform and Blynk Application
ขอเกริ่นก่อนนิดนึง งานต่อไปนี้คืองานมินิโปรเจ็คระยะเวลาสั้น ๆ ที่ทำในรายวิชาไมโครคอนโทรลเลอร์นะคะ เก็บรวบรวมรายละเอียดงานที่เคยส่งไปแล้วมาเรียบเรียงไว้เป็นวิทยาทานตัวเอง หรือบุคคลที่สนใจจะทำชิ้นงานที่ใกล้เคียงกันก็สามารถนำไปเป็นแนวทางในการพัฒนาได้ค่ะ เพราะชิ้นงานนี้มีจุดต้องปรับปรุงอีกเย้อะะะเลย55555
ติชมได้นะคะ ^^
การทำงานร่วมกันระหว่างบอร์ด Arduino UNO WiFi R3 ATmega328P + ESP8266 เซ็นเซอร์ตัวจับน้ำฝน และ DHT22 ส่งค่าขึ้นบนแพลตฟอร์ม Thingspeak และแอปพลิเคชัน Blynk
******************************************************
การทำงานของระบบ : เมื่อเซ็นเซอร์ทั้งสองตัวตรวจจับค่าได้แล้วจะเก็บข้อมูลไว้ในบอร์ด Arduino UNO + WiFi R3 ATmega328P แล้วจะส่งข้อมูลดังกล่าวไปยังแพล็ตฟอร์ม ThingSpeak และแอปพลิเคชัน Blynk ผ่าน ESP8266 ด้วยอินเทอร์เน็ต
ส่วน Hardware
- DHT22 ต่อกับแหล่งจ่าย 3.3 v และขา out ต่อกับขา GPIO2 ของช่อง ESP8266 บนบอร์ด Arduino UNO + WiFi ATmega328P + ESP8266
- Rain Sensor ต่อกับแหล่งจ่าย 5 v และขา Analog output ต่อขา A0 ของบอร์ด Arduino UNO ดังรูป
บอร์ด Arduino UNO+WiFi ATmega328P+ESP8266
คือการบูรณาการอย่างเต็มรูปแบบของบอร์ดไมโครคอนโทรลเลอร์ ATmega328P และวงจรรวม WiFi ESP8266 ซึ่งมี Port เป็นของตัวเองและสามารถทำงานร่วมกันหรือแยกกันได้
การประสานการทำงานระหว่างบอร์ด Arduino กับมอดูล ESP8266
การใช้งาน Port แอนะล็อก 0(A0) หรือช่องทาง TOUT ของมอดูล ESP8266 นั้นอาจทำให้เกิดปัญหาในการทับซ้อนของหน้าที่ส่งข้อมูลภายใน
ดังนั้นการแก้ปัญหาในการรับค่าสัญญาณ Analog ของ Rain sensor คือการเชื่อมต่อ Rain sensor เข้ากับ Port แอนะล็อกของบอร์ด Arduino และในการส่งข้อมูลที่ได้รับจาก Sensor นั้น จำเป็นต้องใช้อินเทอร์เน็ตในการส่งข้อมูลไปยังแพลตฟอร์ม ThingSpeak หรือแพลตฟอร์มแอพพลิเคชั่น Blynk
ดังนั้นด้วยคุณสมบัติที่ภายในมีเฟิร์มแวร์ทํางานในลักษณะ Serial-to-WiFi ของมอดูล ESP8266 เป็นส่วนช่วยในการเชื่อมต่อบอร์ดพัฒนาอาดุยโน่กับเครือข่ายอินเทอร์เน็ต และแพลตฟอร์ม
การใช้งานบอร์ดไมโครคอนโทรลเลอร์ชนิดนี้ ต้องมีการเซ็ตค่าเบื้องต้นตามลิงค์นี้ก่อน
วิธีการประสานการทำงานของบอร์ด Arduino UNO+WiFi ATmega328P+ESP8266
หลักการใช้งานร่วมกันของบอร์ด Arduino และมอดูล ESP8266 ภายในบอร์ด
บอร์ด Arduino UNO+WiFi ATmega328P+ESP8266 ถูกเชื่อมโยงการส่งผ่านข้อมูลไปมาโดยช่องทางอนุกรม มีขั้นตอนการใช้งานดังนี้
1. เปิดดิฟสวิตช์ที่ 1 2 3 และ 4 เพื่อไปยังวิธีการทำงานแบบ CH340 เชื่อมต่อกับ UNO R3 และ ESP8266 ดังตารางข้างต้น
2. ในโปรแกรม Arduino IDE ให้ตั้งค่าเป็นบอร์ด Arduino/Genuino Uno และอัพโหลดคำสั่งดังนี้
3. เปลี่ยนวิธีการทำงานเป็นแบบ CH340 เชื่อมต่อและอัพโหลดขึ้น ESP8266 โดยการเปิดดิฟสวิตช์ตัวที่ 5 6 และ 7 ดังตารางข้างต้น
4. ในโปรแกรม Arduino IDE ให้เปลี่ยนไปตั้งค่าบอร์ดเป็น Generic ESP8266 Module และอัพโหลดรหัสคำสั่งดังนี้
5. เมื่ออัพโหลดรหัสคำสั่งทั้งหมดแล้ว ให้เปิดดิฟสวิตช์ตัวที่ 1 2 5 และ 6 เพื่อดูผลลัพธ์บนช่องทางอนุกรม เป็นไปดังรูป
จะเห็นได้ว่าค่าที่เซ็นเซอร์น้ำฝนที่ต่อประสานกับขา Analog ของบอร์ด Arduino ตรวจจับได้ส่งมายังมอดูล ESP8266 เป็นที่เรียบร้อย
.
— — —
อธิบายโค้ดคำสั่ง
- ช่องการทำงานแบบ CH340 เชื่อมต่อกับ UNO R3 และ ESP8266
บรรทัดที่ 1 : ประกาศตัวแปรชนิด int ชื่อว่า rain สำหรับรับค่าจาก Rain sensor
บรรทัดที่ 4 : ตั้งค่า baud = 115200 (เพราะช่องของ Generic ESP8266 module ใช้งาน baud 115200)
บรรทัดที่ 8 : ให้ rain รับค่าจากขาแอนะล็อก A0 ซึ่งต่ออยู่กับ Rain Sensor
*บรรทัดที่ 9 : ประกาศตัวแปรชนิด String ชื่อว่า rainst สำหรับรับค่าที่แปลงจาก int เป็น String จากตัวแปร rain
บรรทัดที่ 10 : print ค่าจากตัวแปร rainst ขึ้นไปยัง Serial Monitor ที่ใช้ค่า baud = 115200
บรรทัดที่ 11 : หน่วงเวลา 2 วินาทีในการ print ค่าแต่ละครั้ง
*การแปลงค่าจาก int เป็น String จะมีผลในการทำงานของฝั่ง Generic ESP8266 module
- ช่องการทำงานเป็นแบบ CH340 เชื่อมต่อและอัพโหลดขึ้น ESP8266
บรรทัดที่ 1 : เรียกใช้ Library <ESP8266WiFi.h> สำหรับการเชื่อมต่ออินเทอร์เน็ต
บรรทัดที่ 3 - 4 : ใส่ชื่อ และรหัส WiFi ที่ต้องการให้บอร์ดเชื่อมต่อ
บรรทัดที่ 6 : ประกาศตัวแปรชนิด String ชื่อว่า dataRead เป็นตัวแปรสำหรับอ่านค่าจากข้อความบน Serial Monitor
บรรทัดที่ 8: ประกาศสร้าง object ของ WifiClient ชื่อ client
บรรทัดที่ 10 - 22 : ภายใน void connectNetwork() คือส่วนของการเชื่อมต่อกับ WiFi
บรรทัดที่ 24 : ตั้งค่า baud = 115200
บรรทัดที่ 28 : เรียกใช้ฟังก์ชัน connectNetwork()
บรรทัดที่ 32 : สร้างเงื่อนไข เมื่อ ฟังก์ชั่น Serial.available() ตรวจสอบว่ามีข้อมูลถูกส่งเข้ามา ให้ทำบรรทัดที่ 33
บรรทัดที่ 33 : ให้ตัวแปร dataRead รับค่าจาก Serial โดยใช้คำสั่ง readStringUntil แล้วกำหนดให้รับค่าจนกว่าจะเจอการขึ้นบรรทัดใหม่ (/n)
บรรทัดที่ 35 : ประกาศตัวแปรชนิด int ชื่อ rainInt = ค่าของ dataRead ที่แปลงเป็น int
บรรทัดที่ 37 - 38 : print ข้อความ “Rain Value from UNO :” และค่าของ rainInt
บรรทัดที่ 40 : หน่วงเวลา 3 วินาที
เพียงเท่านี้บอร์ด Arduino UNO+WiFi ATmega328P+ESP8266 ก็พร้อมใช้งานในการรับส่งค่าเซ็นเซอร์ระหว่างกัน และส่งไปยัง ThingSpeak และ Blynk เรียบร้อยแล้ว
เขียนคำสั่งให้บอร์ดส่งค่าไปยัง ThingSpeak
- ทำความรู้จัก ThingSpeak :
แพลตฟอร์ม ThingSpeak เป็นบริการ Platform as a Services ที่ให้บริการ เก็บข้อมูลตามเวลาจริง แสดงข้อมูลกราฟ และสามารถเปิดดูจากที่ใดก็ได้หากมีอินเทอร์เน็ต ซึ่งผู้ใช้งานจำเป็นต้องลงทะเบียนเพื่อรับบริการการส่งและแสดงข้อมูลผ่านเว็บไซต์
https://thingspeak.com/ โดยค่าจะถูกส่งมาทุก ๆ 15 วินาทีเป็นอย่างน้อย
ค่าที่ส่งไปเก็บข้อมูลนั้นคือค่าที่ได้รับจาก Sensor ทั้งสองตัว ส่งผ่านเครือข่ายอินเทอร์เน็ตโดยมอดูล ESP8266 ที่อยู่บนบอร์ด Arduino UNO+WiFi ATmega328P+ESP8266
ข้อมูลเพิ่มเติมเกี่ยวกับ ThingSpeak —
ส่วนโค้ดคำสั่ง
อธิบายโค้ด :
บรรทัดที่ 1 - 3 : เรียกใช้ Library <ESP8266WiFi.h> <WiFiClient.h> และ <DHT.h>
บรรทัดที่ 4–5 : นิยาม DHTPIN เป็นขา 2 ของบอร์ด และ DHTTYPE เป็นชนิด DHT22
บรรทัดที่ 7 : เซ็ตค่าเซ็นเซอร์ DHT ชื่อ myDht โดยมี pin = DHTPIN และ ชนิด = DHTTYPE
บรรทัดที่ 9–10: เซ็ตค่าชื่อ และรหัส WiFi ที่จะให้บอร์ดเชื่อมต่ออินเทอร์เน็ต
บรรทัดที่ 11 : เซ็ตค่าชื่อ Server = “api.thingspeak.com”
บรรทัดที่ 12–13 : ChNumber คือ Chennel ID และ apiKey คือ Write API Key ซึ่งทั้งสองหมายเลขจะได้มาหลังจากสร้างโปรเจ็คบน ThingSpeak แล้ว
บรรทัดที่ 15 : ประกาศสร้าง object ของ WifiClient ชื่อ client
บรรทัดที่ 17 : ประกาศตัวแปรชนิด String ชื่อว่า dataRead เป็นตัวแปรสำหรับอ่านค่าจากข้อความบน Serial Monitor
บรรทัดที่ 18 : ประกาศตัวแปรชนิด int ชื่อ rainInt ไว้สำหรับรับ ค่าของ dataRead ที่แปลงเป็น int
บรรทัดที่ 20–31 : ภายใน void connectNetwork() คือส่วนของการเชื่อมต่อกับ WiFi
บรรทัดที่ 34 : ภายใน void setup() ตั้งค่า baud = 115200
บรรทัดที่ 36 : เรียกใช้ฟังก์ชัน connectNetwork()
บรรทัดที่ 38 : เริ่มเชื่อมต่อกับเซ็นเซอร์ DHT22
บรรทัดที่ 45 : หน่วงเวลา 2 วินาที
บรรทัดที่ 48 : สร้างเงื่อนไข เมื่อ ฟังก์ชั่น Serial.available() ตรวจสอบว่ามีข้อมูลถูกส่งเข้ามา ให้ทำบรรทัดที่ 49
บรรทัดที่ 49 : ให้ตัวแปร dataRead รับค่าจาก Serial โดยใช้คำสั่ง readStringUntil แล้วกำหนดให้รับค่าจนกว่าจะเจอการขึ้นบรรทัดใหม่ (/n)
บรรทัดที่ 52 : ให้ตัวแปร rainInt = ค่าของ dataRead ที่แปลงเป็น int
บรรทัดที่ 53–54 : print ข้อความ “Rain Value from UNO :” และค่าของ rainInt
บรรทัดที่ 56 : ประกาศตัวแปรชนิด int ชื่อ mapRain เพื่อรับค่าที่แปลงค่าจากตัวแปร rainInt โดยแปลงจากค่า 1023 (ไม่มีฝน)- 0 (ฝนตกหนัก) เป็น 0 (ไม่มีฝน) -100 (ฝนตกหนัก)
บรรทัดที่ 58 : print ค่าของ mapRain
บรรทัดที่ 62–63 : ประกาศตัวแปรสำหรับอ่านค่าจากเซ็นเซอร์ DHT22 โดยให้ humi อ่านค่าความชื้น และ temp อ่านค่าอุณหภูมิ
บรรทัดที่ 66 : สร้างเงื่อนไข เมื่อมีการเชื่อมต่อกับ Server หรือ api.thingspeak.com ให้ทำบรรทัดที่ 67–77
บรรทัดที่ 67 : ประกาศตัวแปรชนิด String ชื่อว่า url ให้ค่า = “/update?api_key=” + apiKey ที่สร้างไว้ก่อนหน้านี ้ซึ่งเป็นการส่งข้อมูลจะส่งโดยใช้ GET Method รูปแบบของ HTTP Request
บรรทัดที่ 68–70 : เป็นการเพิ่มข้อมูลให้ตัวแปร url โดยเพิ่มข้อความ “&field1=” + ข้อมูลภายในตัวแปร mapRain, humi และ temp ที่แปลงเป็น String ส่งไปยัง Server ของเรา
บรรทัดที่ 71–73 : เป็นการส่งข้อความแบบ HTMLไปแสดงบน Web Browser เพื่อส่งและเรียกดูข้อมูลจาก Server ด้วยวิธี GET
อ่านข้อมูลเกี่ยวกับการบันทึกข้อมูลเข้า ThingSpeak เพิ่มเติม
บรรทัดที่ 74–77 : ให้แสดงข้อความบน Serial Monitor เพื่อทดสอบการส่งข้อมูล
บรรทัดที่ 81 : หากไม่เป็นไปตามเงื่อนไข คือไม่มีการเชื่อมต่อกับ Server ให้แสดงข้อความ “Connecting to server: Failed…”
ผลลัพธ์การเขียนโค้ด
เขียนคำสั่งให้บอร์ดส่งค่าไปยัง Blynk
- ทำความรู้จัก Blynk :
ถูกออกแบบมาเพื่อใช้ในการควบคุมอุปกรณ์ Internet of Things ซึ่งมีคุณสมบัติในการควบคุมจากระยะไกลผ่านเครือข่ายอินเตอร์เน็ต และยังสามารถแสดงผลค่าจาก Sensor ต่าง ๆ ได้
ซึ่งอุปกรณ์ในบทความนี้ ใช้งานแอปพลิเคชัน Blynk เพื่อแสดงค่าอุณหภูมิ ความชื้น และส่งข้อความแจ้งเตือนเมื่อฝนตกไปยังโทรศัพท์มือถือของผู้ใช้งานผ่านเครือข่ายอินเทอร์เน็ต ดังนั้นจึงมีความจำเป็นที่ผู้ใช้งานต้องลงทะเบียนรับบริการแพลตฟอร์มดังกล่าวนี้ให้เรียบร้อยก่อนการใช้งาน
ข้อมูลเพิ่มเติมเกี่ยวกับ Blynk—
ส่วนโค้ดคำสั่ง
อธิบายโค้ด :
บรรทัดที่ 1–3 : เรียกใช้ Library <ESP8266WiFi.h> <WiFiClient.h> และ <DHT.h>
บรรทัดที่ 4–5 : นิยาม DHTPIN เป็นขา 2 ของบอร์ด และ DHTTYPE เป็นชนิด DHT22
บรรทัดที่ 6 : เซ็ตค่าเซ็นเซอร์ DHT ชื่อ myDht โดยมี pin = DHTPIN และ ชนิด = DHTTYPE
บรรทัดที่ 8–10: เซ็ตค่าชื่อ และรหัส WiFi ที่จะให้บอร์ดเชื่อมต่ออินเทอร์เน็ต
บรรทัดที่ 11 : เซ็ตค่าชื่อ host = “blynk-cloud.com”
บรรทัดที่ 12 : เซ็ตค่า port=8080
บรรทัดที่ 14 : ประกาศสร้าง object ของ WifiClient ชื่อ client
บรรทัดที่ 16 : ประกาศตัวแปรชนิด String ชื่อว่า dataRead เป็นตัวแปรสำหรับอ่านค่าจากข้อความบน Serial Monitor และ response สำหรับเก็บข้อมูลที่ถูกส่งเข้ามา และใช้งานในฟังก์ชัน httpRequest
บรรทัดที่ 17 : ประกาศตัวแปรชนิด int ชื่อ rainInt ไว้สำหรับรับ ค่าของ dataRead ที่แปลงเป็น int
บรรทัดที่ 18 : ประกาศตัวแปรชนิด bool ชื่อ noti ให้ค่าเริ่มต้นเป็น false สำหรับตรวจสอบเงื่อนไขการแจ้งเตือน
บรรทัดที่ 20–32 : ภายใน void connectNetwork() คือส่วนของการเชื่อมต่อกับ WiFi
บรรทัดที่ 34 : สร้างฟังก์ชันชนิด bool ชื่อ httpRequest