วิธีการใช้งานเซนเซอร์วัดความชื้นและอุณหภูมิภายนอกอาคาร AM2306
บทความนี้เป็นการแนะนำการใช้ nodemcu v2 (หรือ v3ก็ได้) มาอ่านเซนเซอร์ AM2306 ที่เป็นเวอร์ชั่น RS485 (Modbus RTU) เพื่อนำค่าที่ได้ไปใช้งานต่อเช่น การวัดอุณหภูมิและความชื้นภายนอกโรงเรือนปลูกผัก หรืออาคารโรงงานอุตสหกรรม หรือภายในโรงงานที่มีฝุ่นหรือมีการโดนน้ำบ่อย ๆ
ข้อดี ของการใช้เซนเซอร์ตัวนี้คือสื่อสารผ่าน protocal Modbus RTU ทำให้สามารถใช้งานพร้อมกันได้หลายตัวโดยใช้สายสัญญาณเพียงแค่ 2 เส้น และยังได้ประโยชน์จาก RS485 ในการลากสายยาว ๆ เป็นร้อยเมตรได้อีกด้วยครับ
ข้อเสีย คือต้องใช้โมดูลแปลงสัญญาณ RS485 ให้เป็น TTL เพื่อให้ Microcontroller อ่านระดับสัญญาณของ RS485 ได้ และโดยส่วนใหญ่โมดูลที่รองรับการสื่อสาร RS485 มีราคาแพงกว่า
บทความนี้จะเน้นตัวอย่างการอ่านค่าอย่างง่าย ผ่านโมดูลแปลงสัญญาณ TTL เป็น RS485 ชื่อว่า MAX485 โดยโมดูลตัวนี้มีขาสัญญาณ RO และ DI เป็นขาสัญญาณรับส่งข้อมูลแบบ TTL แต่ด้วย RS485 จำเป็นต้องมีการกำหนดทิศทางการสื่อสารเพื่อไม่ให้เกิดการส่งรับซ้ำซ้อนกัน โดย MAX485 เลยมีขา RE และ DE เพิ่มเติมในการกำหนดทิศทาง ดังนั้นเราจะหา Libraries ที่รองรับโมดูลตัวนี้เพื่อให้สามารถอ่านเขียนได้ง่าย ไม่ต้องมาคอยกำหนดทิศทางด้วยตัวเอง โดย Library นี้คือ ModbusMaster สามารถใช้ได้ทั้ง ESP32 และ ESP8266 รวมไปถึง Arduino
อุปกรณ์ที่ใช้ในการทดลองนี้
2. AM2306
3. Breadboard
4. max485
5. jumper
วิธีการต่อ
ESP8266 |
MAX485 |
Vin |
VCC |
GND |
GND |
D2 |
DE, RE |
D5 |
RO |
D4 |
DI |
MAX485 |
AM2306 |
VCC |
สายสีแดง |
GND |
สายสีดำ |
A |
สายสีเหลือง |
B |
สายสีขาว |
ขั้นตอนอ่านค่าเซนเซอร์โชว์ใน Serial monitor
1. ติดตั้ง Library ชื่อ ModbusMaster ตามลิ้งด้านล่าง
https://github.com/4-20ma/ModbusMaster
หรือค้นหา ModbusMaster ในหน้า Manage Libraries กรณีใช้ Arduino IDE
หรือค้นหา ModbusMaster ในหน้า Libraries กรณีใช้ platformIO
2. ตัวอย่างโค้ด
เมื่อดู Datasheet ของ AM2306 เราจะเห็นว่าหากเราต้องการค่าความชื้นและอุณหภูมิ เราต้องใช้ฟังก์ชัน read multiple registers (0x10) ซึ่งตรงกับฟังก์ชัน readHoldingRegister ของ Library ModbusMaster โดยจะเริ่มอ่านตั้งแต่ address 0x0000 ไปจนถึง 0x0001 รวมทั้งสิ้น 2 register เราจึงเรียกฟังก์ชัน readHoldingRegister(0x00, 2);
Technical Parameters: |
สื่อสารผ่าน RS485 โดยใช้ Modbus สามารถตั้ง ID ได้ตั้งแต่ 1-247 ( default ที่ 1 ) สามารถเปลี่ยน baudrate การสื่อสารได้ตั้งแต่ 9600 - 57600 ( default ที่ 9600 ) Modbus internal register address 0x0000 Humidity <- - - ความชื้น 0x0001 Temperature <- - - อุณหภูมิ 0x0014 Baudrate (High bit) 0x0015 Baudrate (Low bit) 0x0016 Devide ID Read multiple registers : 0x03 <- - - ฟังก์ชัน code ที่ใช้อ่าน Write multiple registers: 0x10
|
3. ทดสอบ
เมื่อเปิด Serial monitor โดย Arduino IDE เราจะเห็นค่าความชื้นเป็น % และ อุณหภูมิในหน่วยองศาเซลเซียสครับ
บทความนี้จะไม่ลงลึกในส่วนของการดู Address ของค่าต่าง ๆ ในส่วนของ Modbus แต่จะให้ตัวอย่างทั้งการเขียนและการอ่านสำหรับเซนเซอร์นี้โดยเฉพาะ ดังนั้นหากต้องการทำความเข้าใจเรื่องที่มาของตัวเลข Address สามารถค้นคว้าข้อมูลเพิ่มเติมได้ผ่านคีย์เวิร์ด Modbus RTU ครับ
ตัวอย่างการเปลี่ยนค่า Address ให้เซนเซอร์ AM2306
จาก Datasheet อีกเช่นเคย เราจะพบว่า เราสามารถเขียน Device address ให้ตัวเซนเซอร์เปลี่ยนเลข address ตัวเองได้ตามต้องการ โดยค่าอยู่ระหว่าง 1-247 ผ่านการเขียนลงฟังก์ชัน writeMultipleRegister ลงบน Address 0x16 ที่กำหนดโดยผู้ผลิต
ตัวอย่างโค้ด
เมื่อทดสอบเปิด Serial monitor
จะเห็นว่าค่าเซนเซอร์ที่ได้มาหลังการเปลี่ยน Address เป็นตัวบ่งชี้ว่าตัว Device address ของเซนเซอร์ได้ถูกเปลี่ยนแล้ว