อุปกรณ์แสดงค่าอุณหภูมิ ความชื้น และฝนด้วย 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

Nada Chemreh
7 min readApr 21, 2020

ขอเกริ่นก่อนนิดนึง งานต่อไปนี้คืองานมินิโปรเจ็คระยะเวลาสั้น ๆ ที่ทำในรายวิชาไมโครคอนโทรลเลอร์นะคะ เก็บรวบรวมรายละเอียดงานที่เคยส่งไปแล้วมาเรียบเรียงไว้เป็นวิทยาทานตัวเอง หรือบุคคลที่สนใจจะทำชิ้นงานที่ใกล้เคียงกันก็สามารถนำไปเป็นแนวทางในการพัฒนาได้ค่ะ เพราะชิ้นงานนี้มีจุดต้องปรับปรุงอีกเย้อะะะเลย55555

ติชมได้นะคะ ^^

แสดงค่าผ่านแอปพลิเคชัน Blynk และแพล็ตฟอร์ม ThingSpeak

การทำงานร่วมกันระหว่างบอร์ด Arduino UNO WiFi R3 ATmega328P + ESP8266 เซ็นเซอร์ตัวจับน้ำฝน และ DHT22 ส่งค่าขึ้นบนแพลตฟอร์ม Thingspeak และแอปพลิเคชัน Blynk

Arduino UNO + WiFi R3 ATmega328P + ESP8266
เซ็นเซอร์ตรวจวัดอุณหภูมิและความชื้น DHT22
Rain Sensor
แอปพลิเคชัน Blynk
แพล็ตฟอร์ม ThingSpeak

******************************************************

บล็อกไดอะแกรมการทำงานนร่วมกันของระบบ

การทำงานของระบบ : เมื่อเซ็นเซอร์ทั้งสองตัวตรวจจับค่าได้แล้วจะเก็บข้อมูลไว้ในบอร์ด Arduino UNO + WiFi R3 ATmega328P แล้วจะส่งข้อมูลดังกล่าวไปยังแพล็ตฟอร์ม ThingSpeak และแอปพลิเคชัน Blynk ผ่าน ESP8266 ด้วยอินเทอร์เน็ต

ส่วน Hardware

การต่อประสานระหว่าง Rain sensor และ DHT22 กับบอร์ด Arduino UNO+WiFi ATmega328P+ESP8266
  • DHT22 ต่อกับแหล่งจ่าย 3.3 v และขา out ต่อกับขา GPIO2 ของช่อง ESP8266 บนบอร์ด Arduino UNO + WiFi ATmega328P + ESP8266
  • Rain Sensor ต่อกับแหล่งจ่าย 5 v และขา Analog output ต่อขา A0 ของบอร์ด Arduino UNO ดังรูป
ประกอบเซ็นเซอร์น้ำฝน DHT และบอร์ดเข้ากับกล่องที่เตรียมไว้
ส่วนป้องกันน้ำเข้าเซ็นเซอร์แบบง่าย ๆ เร่งด่วน ไม่การันตีความปลอดภัย ._.

บอร์ด Arduino UNO+WiFi ATmega328P+ESP8266

คือการบูรณาการอย่างเต็มรูปแบบของบอร์ดไมโครคอนโทรลเลอร์ ATmega328P และวงจรรวม WiFi ESP8266 ซึ่งมี Port เป็นของตัวเองและสามารถทำงานร่วมกันหรือแยกกันได้

Arduino UNO + WiFi R3 ATmega328P + ESP8266

การประสานการทำงานระหว่างบอร์ด 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 UNO+WiFi ATmega328P+ESP8266
การต่อประสานระหว่าง Rain sensor (และ DHT22) กับบอร์ด 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…”

ผลลัพธ์การเขียนโค้ด

ผลลัพธ์บนแพลตฟอร์ม ThingSpeak
ผลลัพธ์บนช่องทางอนุกรม

เขียนคำสั่งให้บอร์ดส่งค่าไปยัง 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

--

--