การติดตั้ง Temperature Sensor DS18B20 ให้ใช้งานได้กับ Raspberry Pi

DS18B20 sensor ตรวจวัดอุญหภูมิ ที่ใช้กันแพร่หลายและราคาไม่แพง ใช้ Data bus แบบ 1-Wire คือใช้สายสัญญาณเส้นเดียวทำหน้าที่ทั้งรับและส่งข้อมูลซึ่งคือ pin ที่อยู่ตรงกลาง ดังภาพ




ภาพประกอบจาก 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 ดูตัวอย่างได้ที่นี่
Previous
Next Post »

2 ความคิดเห็น

Write ความคิดเห็น
Unknown
AUTHOR
6 ธันวาคม 2559 เวลา 02:32 delete

ผมทำตามแต่มันไม่ให้ค่าไดเรคทอรี่กลับมาทำยังไงดีครับ

Reply
avatar
Somchai
AUTHOR
7 ธันวาคม 2559 เวลา 19:00 delete

1. ควรมั่นใจว่า ds18b20 ทำงานได้จริง อาจทำได้โดยการตรวจสอบกับ Arduino (http://www.hobbytronics.co.uk/ds18b20-arduino)

2. ทำการ update ด้วยคำสั่ง sudo apt-get update

3. ได้ทำการ enable wire interface ? ตรวจสอบโดย lsmod ควรจะเห็น wire, w1_gpio, w1_therm


Reply
avatar