วันนี้จะมานำเสนอการใช้งาน Module เล็กๆ สีฟ้า DHT11 (DHT11 Humitdity and Temperature Sensor กับบอร์ด Ardiono)ที่ใช้ในการวัดอุณหภูมิกับความชื่นในอากาศกันกครับ
ก่อนอื่นมาดู Specification ของ DHT11 กันนะครับว่ามันทำอะไรได้บ้าง
รายละเอียดของ Spec อื่นๆ นอกเหนือจากนี้ดูในที่ Manual นะครับ
จริงๆแล้ว Sensor วัด อุณหภูมิ กับ ความชื้นใน Series นี้มีออกมาหลายรุ่นครับ เช่น DHT11 DHT 22 DHT21 บางทีมาแต่ตัว sensor บางทีมาเป็น module ความแตกต่างก็คือความแม่นยำในการวัดค่าของ sensor ครับ
ทีนี้มาดูวิธีการต่อใช้งานครับ
ในการการต่อวัดแบบปกติ คือ ระยะห่างระหว่าง Sensor กับตัว Arduino ห่างกันไม่เกิน 20 เมตร จะต้องใช้ Pull up resistor ขนาด 5kohm (ว่าง่ายๆ คือต่อ R 5k ไว้กับแหล่งจ่ายแรงดันและต่อเข้าไปที่ขา DATA ด้วย)
Pin 1 ต่อกับ VDD
Pin 2 ต่อเป็นขา DATA
Pin 3 ไม่ได้ใช้
Pin 4 ลงกราวด์
โดยใช้แหล่งจ่ายแรงดัน VDD ขนาด 3-5.5 VDC ครับ ซึ่งข้อดีคือจะทำให้ DHT11 นี้สามารถใช้งานได้กับ Arduino หลายรุ่น ทั้งรุ่นที่มีแรงดัน 3.3 VDC อย่าง Arduino Dueหรือรุ่นยอดฮิตอย่าง UNO และ Mega/Mega ADK ครับ
ทีนี้มาถึงวิธีการส่งข้อมูลของ DHT11กันครับ อุปกรณ์ตัวนี้ใช้การสื่อสารกับ MCU ของเราด้วยวิธี Single-wire Two-way Serial interface ถ้าจะให้แปลเป็นภาษาไทยก็ คือ การสื่อสารอนุกรุมสองทางโดยใช้สายเส้นเดียว เอางี้ครับ แปลให้อีกที การสื่อสารแบบนี้จะใช้สายสื่อสารเพียงเส้นเดียวและส่งข้อมูลได้ทั้งจาก MCU ไปที่ตัว DHT11 และในทางกลับกันก็ได้ครับ
ตกลงกันก่อนนะครับ ต่อไปนี้ผมจะเรียก Arduino ของเราไม่ว่าจะเป็น UNO, Mega, หรือ รุ่นใดๆ ก็แล้วแต่ว่า Master และ DHT11ว่า Slave นะครับ อีกนิดนึงเกี่ยวกับ Pull up resistor นะครับ การใช้ pull up resistor นั้นหมายถึงเราต้องการให้เวลาทำงานปกติในขณะที่ไม่มีอุปกรณ์ทีต่ออยุ๋กับสายสื่อสารของเรา ระดับแรงดันของสัญญาณในสาย Data คึอแรงดันระดับ "สูง" และจะมีแรงดันในระดับต่ำเมื่อมีอุปกรณ์ (จะเป็น Master หรือ Slave ก็ได้) ดึงสัญญาณลงในระดับ "ต่ำ" นะครับ ดังนั้นหากเรามี Scope วัดระดับสัญญาณได้เป็น "สูง" ตลอดเวลา ก็หมายความว่าอุปกรณ์ของเราอาจจะผิดปกตินะครับ
ในการสื่อสารโดยใช้สายเส้นเดียวนั้น จำเป็นต้องใช้โปรโตคอลที่ตกลงกันไว้ระหว่างตัว MCU และ อุปกรณ์ที่ต้องการสื่อสารด้วย (Slave) งั้นมาเริ่มพูดถึงโปรโตคอลที่ว่าเลยดีกว่างครับ อันดับแรก Master หรือ Arduino ของเราจะส่ง Start signal ที่เป็นแรงดันไฟฟ้าระดับต่ำอย่างน้อย 18 ไมโครวินาที ไปที่ Slave เพื่อให้ Slave เข้าใจว่าจะเริ่มสั่งแล้วนะ แล้วรอไป 20-40 ไมโครวินาทีเพื่อรอ Slave ตอบกลับ
ทีนี้เพื่อให้ Master รู้ว่า Slave ก็พร้อม Slave จะส่งแรงดันระดับต่ำกลับไปบ้าง การส่งแรงดันจาก Slave กลับไปจะนาน 80 ไมโครวินาที จากนั้นจะรออีก 80 ไมโครวินาที ก่อนที่จะส่งข้อมูลบิตแรก มาถึงตรงนี้ข้อมูลยังไม่ถูกส่งเลยนะครับ แต่พร้อมจะส่งแล้ว
คราวนี้เรามาดูครับว่าจะส่งบิต "0" กับ บิต "1" อย่างไร สำหรับการส่งบิตเป็น "0" ตัว Slave จะดึงระดับแรงดันลงต่ำนาน 50 ไมโครวินาที และปล่อยเป็นระดับ "สูง" นาน 26-28 ไมโครวินาที ดังรูปด้านด้านบนครับ (ดูช่วง Sending 0)
แต่ถ้าเป็นการส่งข้อมูลเป็น "1" ตัวส่งจะดึงสายสัญญาญลงระดับต่ำ 50 ไมโครวินาที และปล่อยให้เป็นระดับสูงนาน 70 ไมโครวินาที (ดูช่วง Sending 1) เอาละครับ ทีนี้รู้ว่าแต่ละบิต DH11 ส่งมาเป็นบิต "0" หรือ "1" มา และส่งมาจนครบข้อมูลหนึ่งชุดครับ
ในแต่ละชุดของข้อมูลที่ส่งมาจาก DH11ตัว MCU รับข้อมูลแล้วจะต้องเอามาแปลงต่อนะครับ ว่าข้อมูลที่ส่งมามันแปลว่าอะไร แต่ละชุดข้อมูลจะยาว 40 บิต และใช้เวลาส่งประมาณ 40 มิลลิวินาทีครับ
ใน 40 บิตที่ส่งมา ประกอบด้วย " 8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data + 8bit check sum" นะครับ ฟังดูอาจจะยุ่งยากกว่าจะมาตีความหมายได้ แต่ไม่ต้องห่วงครับ มีคนเขียน library ไว้ใช้งานกับ Arduino board ให้เรียบร้อยครับ แค่เอา library มาใส่ให้ถูกแล้วเรียกใช้แค่นั้นครับ แต่คนที่ต้องการเอาไปใช้กับอุปกรณ์อื่นๆ เช่น อ่านค่าเข้า FPGA ก็ขอให้ดูรายละเอียดใน manual นะครับ ในที่นี้ขอข้ามไปก่อน ไม่งั้นคุยกันอีกนาน
สำหรับ library ของ DHT11 ก็มา ทางนี้ ครับ ถ้าไม่ทราบวิธีการติดตั้ง Library ก็ ทางนี้ ครับ
อย่าลืมนะครับ DHT มันออกมาหลายรุ่น library ก็เขียนมาให้ใชได้หลายรุ่น แต่ค่าพารามิเตอร์ในการวัดค่ามันต่างกัน อย่าลืมเลือกรุ่นให้ถูกใน sketch ที่เขียนนะครับ ไม่งั้นอ่านมั่วน่าดู
|
ถ้าต่อทุกอย่างไม่พลาด ก็จะเปิด serial monotor เจอกับหน้าแบบนี้ครับ ตอนอ่านค่านี้ผมเอา DH11 ไปไว้บน Adapter ของโน๊ตบุ๊คครับ เลยอ่านมาได้ค่าที่ดูแล้วร้อนหน่อย ผมไม่ได้นั่วอยู่กลางแดดนะครับ :-)
เอาละครับ เมื่อผ่านตัวอย่างด้านบนมาแล้วแสดงว่า DHT11 ของเราใช้งานได้ปกติ ทีนี้มาลองเอาข้อมูลที่ได้ใส่ไว้ใน SD cardเป็น Temperature and Humidity + Data Logger กัน
เริ่มจากผมไปดูตัวอย่างการใช้งาน SD card moduleทีได้เขียนไปแล้วในบทความก่อนหน้าของ Arduitronics นะครับ จากนั้นเราก็เอาสองตัวอย่างที่ว่ามาปนกันซะเลย
ตัวอย่าง sketch นี้ก็ตามนี้นะครับ
|
ก่อนจะ Verify sketch ตัวนี้ยังมีขั้นตอนอีกนิดครับ เราต้องการใช้ method ที่แปลงค่า floating เป็น String ซะด้วย ไม่งั้นจะเขียนบน SD card ไม่ได้ครับ
ให้เพิม method floatToString.h ดังนี้ครับ
เปิด text editor อะไรก็ได้ (notepad, textpad) แล้ว copy ลงไปตามนี้ครับ
จากนั้น Save file เป็น "floadToString.h" "DHT.h" และ "DHT.cpp" เก็บไว้ที่เดียวกับ Library "DHT" เมื่อซักครู่นี้ครับ ถ้าเก็บไว้ที่อื่น Arduino IDE อาจจะมองไฟล์ไม่เห็นได้ครับ โหลดตามนี้เลยครับ
https://docs.google.com/file/d/0B4Ig-CbpU0IPajJmTzRodFMyN2c/edit?usp=sharing
// floatToString.h //char * floatToString(char * outstr, float value, int places, int minwidth=, bool rightjustify) {
// if no places after decimal, stop now and return
|
Upload แล้วเปิดหน้าจอ Serial monitor จะได้ผลดังนี้ครับ
ไฟล์ที่เก็บข้อมูลของ sketch นี้คือ "datalog.txt"
ถ้าเอา SD card ย้ายไปเปิดบนคอมพิวเตอร์ก็จะเห็นแบบนี้ครับ
ข้อควรระวัง !!!!!
1. อย่าลืมไปสร้างไฟล์ "datalog.txt" ไว้ใน SD card ก่อนนะครับ ไม่อย่างน้้น SD card จะเปิดไฟล์ไม่ได้ และร้องแสดง error
2. อย่าลืมเพิ่ม "floadToString.h" ไว้ใน Folder เดียวกับไฟล์ที่เก็บ Sketch นี้นะครับ ไม่งั้นจะร้อง error หา "floadToString.h" ไม่เจอ
จบแล้วครับ บทความนี้ยาวหน่อยแต่คงได้อะไรไปบ้างครับ ชอบหรือไม่ชอบก็ feedback กลับมาหน่อยนะครับ
ถ้ามีคำถามหรืออยากจะแนะนำอะไร เชิญได้ที่ facebookของเรานะครับ
โดย Mountain "A"
หน้านี้เป็นสารบัญของบทความที่ปรากฏในเว็บของ Arduitronics.com นะครับ จะขอแบ่งออกเป็นหัวข้อตามกลุ่มของสินค้าในร้านดังต่อไปนี้
หน้าที่เข้าชม | 15,375,197 ครั้ง |
ผู้ชมทั้งหมด | 5,878,275 ครั้ง |
เปิดร้าน | 21 พ.ค. 2556 |
ร้านค้าอัพเดท | 5 ก.ย. 2568 |