ภาพประกอบจาก http://cpre.kmutnb.ac.th/esl/learning/index.php?article=ds18b20-temperature-sensor |
ใน Raspbian รุ่นล่าสุด (released 2016-05-27) ได้มีการติดตั้ง driver สำหรับ 1-Wire มาด้วยแล้วจึงง่ายมากเที่จะติดตั้ง DS18B20 กับ Raspberry Pi
ขั้นตอนการเตรียม Raspbian
1.การกำหนด Pinการสื่อสารผ่าน 1-wire bus เราต้องกำหนด Pin บน Raspberry Pi ไว้ล่วงหน้าโดยการไปกำหนดไว้ใน /boot/config.txt โดยแยกได้อีกสองกรณีคือ
1.1 ต้องการใช้ค่า default โดย Raspbian จะกำหนดให้ Pin 7 (GPIO4) เป็น Pin ที่สื่อสารด้วย 1-wire bus ให้เพิ่มข้อความนี้ใน /boot/config.txt
dtoverlay=w1-gpio
1.2 ต้องการกำหนดตำแหน่ง Pin ด้วยตัวเอง ให้เพิ่มข้อความนี้ใน /boot/config.txt
dtoverlay=w1-gpio-pullup,gpiopin=XX
โดย XX คือ GPIO (ไม่ใช่ตำแหน่งของ Pin) ยกตัวอย่างในกรณีของผมใช้ GPIO 26 (Pin 37) ก็จะเป็น dtoverlay=w1-gpio-pullup,gpiopin=26 เป็นต้น
2. การ Load driver สามารถแยกได้สองกรณี
2.1 ใช้งานเฉพาะครั้ง
sudo modprobe w1-gpio
sudo modprobe w1-therm
2.2 Load เองหลัง Boot time โดยเพิ่มข้อความใน /etc/modules
w1-gpio
w1-therm
3. ทำการ reboot แล้วทดสอบด้วยคำสั่ง lsmod ท่านควรจะพบกับ module ชื่อ w1_therm, w1_gpio และ wire หากไม่พบลองทบทวนขั้นตอนอีกครั้งWiring
DS18B20 ใช้ไฟเลี้ยง 3.3 - 5.5 V แต่ผมเลือกใช้ 3.3 V จาก Raspberry Pi (Pin1) ครับ ใช้ GPIO 26 หรือ Pin 37 ต่อกับ Data Pin (pin กลาง) ในกรณีที่ใช้ค่า default ต้องต่อกับ GPIO 4 หรือ Pin 7 เท่านั้น ต่อ Pin ซ้ายมือของ DS18B20 เข้ากับ GND (Pin 6) บน Raspberry Pi ระหว่าง VDD กับ Data ก็ใช้ 4.7kΩ ต่อแบบ pull-up ไว้ด้วย ตามภาพ
การอ่านค่าอุณหภูมิ
DS18B20 นี้สามารถอ่านค่าอุณหภูมิได้ตั้งแต่ -55 °C ถึง +125 °C และมีความแม่นยำ ±0.5 °C สำหรับอุณหภูมิในช่วง -10°C ถึง +85°C (https://www.maximintegrated.com/en/products/analog/sensors-and-sensor-interface/DS18B20.html) ซึ่งมากพอสำหรับการวัดอุณหภูมิห้องทั่วไป โดยข้อมูลจะถูก Raspbian นำไปเขียนไว้ที่ /sys/bus/w1/devices/[sensor id]/w1_slaveสิ่งที่เราต้องทราบคือ sensor id ของ DS18B20 เมื่อใช้คำสั่ง ls /sys/bus/w1/devices ดูจะพบ directory ที่มีชื่อขึ้นต้นด้วย 28-xxxxxxxxxxxx ซึ่งนั้นคือ sensor-id ที่เราต้องการ (จากรูปจะเห็นมีสอง id ปรากฎขึ้นมาเพราะผมติดตั้ง DS18B20 2 ตัว ครับ)
เช่น หากต้องการอ่านค่าอุณหภูมิจาก sensor หมายเลข 28-0000066a6165 ก็สามารถใช้คำสั่ง
cat /sys/bus/w1/devices/28-0000066a6165/w1_slave
ก็จะได้ผลดังภาพ
บรรทัดแรกบอกเราว่าการอ่านค่านั้นสำเร็จ (YES) ในบรรทัดที่สองตัวเลขที่อยู่หลัง "t=" นั้นคือค่าของอุณหภูมิในหน่วย Celsius ครับ หากจะนำค่านี้ไปใช้ต้องทำการหารด้วย 1000 เสียก่อน จากภาพคืออุณหภูมิคือ 32.375 °C
หมายเหตุ
1. ข้อดีของการใช้ DS18B20 คือการสื่อสารผ่านระบบ data bus นั่นคือเราสามารถติดตั้ง sensor ได้มากกว่า 1 ตัวเข้ากับ Raspberry Pi ได้ในเวลาเดียวกัน ดังภาพ2. ได้มีการให้ข้อมูลว่าน่าจะใช้ความยาวของ cable ได้ถึง 10 เมตรสำหรับการต่อ DS18B20 เข้ากับ Raspberry Pi ที่ 3.3 V (https://www.raspberrypi.org/forums/viewtopic.php?f=37&t=30026)
3. ผมเขียน Python Library สำหรับ DS18B20 ใน RPi.GPIO.TH ดูตัวอย่างได้ที่นี่
Sign up here with your email
2 ความคิดเห็น
Write ความคิดเห็นผมทำตามแต่มันไม่ให้ค่าไดเรคทอรี่กลับมาทำยังไงดีครับ
Reply1. ควรมั่นใจว่า ds18b20 ทำงานได้จริง อาจทำได้โดยการตรวจสอบกับ Arduino (http://www.hobbytronics.co.uk/ds18b20-arduino)
Reply2. ทำการ update ด้วยคำสั่ง sudo apt-get update
3. ได้ทำการ enable wire interface ? ตรวจสอบโดย lsmod ควรจะเห็น wire, w1_gpio, w1_therm
ConversionConversion EmoticonEmoticon