บทที่ 13: การเขียนโปรแกรมอ่านค่าอุณหภูมิเซนเซอร์ DS18B20
ไอซี DS18B20 Digital Thermometer ของบริษัท Maxim เป็นไอซีที่อยู่ในตระกูล DS18xx มีอยู่หลายรุ่น เช่น DS1820, DS18S20 และ DS18B20 เป็นไอซีที่วัดอุณหภูมิและให้ค่าแบบดิจิทัล เชื่อมต่อในรูปแบบของบัส onewire ไอซีเหล่านี้มีความแตกต่างกันเล็กน้อย แต่ในที่นี้จะกล่าวถึงเฉพาะ DS18B20

ภายในไอซี DS18B20 มีหน่วยความจำ ROM เอาไว้เก็บค่า Serial number ของเซนเซอร์แต่ละตัวในกรณีที่ต้องการต่อเซนเซอร์หลายตัวก็สามารถอ้างอิง Serial number ในการอ่านค่าอุณหภูมิแต่ละตัว และมีหน่วยความจำแบบ SRAM ขนาดความจุ 9 ไบต์ (Byte 0 ถึง Byte 9) และเรียกว่า Scratchpad ส่วนหนึ่งของหน่วยความจำนี้ จะใช้สำหรับเก็บค่าอุณหภูมิที่ได้จากการอ่านและแปลงเป็นข้อมูลดิจิทัลในแต่ละครั้ง (ใช้ 2 ไบต์ และเก็บไว้ใน Byte 0 และ Byte 1) และยังมีการคำนวณค่า CRC (checksum) ขนาดหนึ่งไบต์ด้วย (เก็บไว้ใน Byte 8)

คุณสมบัติของอุปกรณ์
-
ใช้แรงดันไฟเลี้ยง Vdd (หรือ Vcc) ได้ในช่วง 3.0V ถึง 5.5V
-
มี 3 ขา (สำหรับตัวถัง TO-92) คือ Gnd (Pin 1), DQ (Pin 2), Vdd (Pin 3)
-
ใช้งานได้สองแบบ: normal mode (ใช้ทั้ง 3 ขา) และ parasite power mode (ใช้เพียง 2 ขา คือ DQ และ GND ในขณะที่ขา Vdd จะต่อกับขา Gnd)
-
สามารถนำไอซีมาพ่วงต่อกันในบัสเดียว (เส้นสัญญาณ DQ) ได้หลายอุปกรณ์
-
ในการใช้งาน จะต้องต่อ pull-up 4.7kΩ (หรือน้อยกว่าได้เล็กน้อย) ที่ขา DQ กับแรงดันไฟเลี้ยง
-
วัดอุณหภูมิได้ในช่วง -55 °C ถึง +125 °C
-
มีความแม่นยำ ±0.5 °C สำหรับอุณหภูมิในช่วง -10°C ถึง +85°C
-
มีความละเอียดของค่าที่อ่านได้ 12 บิต (Resolution)
-
ใช้เวลาในการแปลงข้อมูลสำหรับ ADC ไม่เกิน 750 msec (มิลลิวินาที) สำหรับข้อมูล 12 บิต
-
ไอซีแต่ละตัวมีหมายเลขเฉพาะตัว ขนาด 64 บิต (64-bit serial code)
-
สำหรับตระกูล DS18B20 มีค่าไบต์สำหรับ 8-bit family code ตรงกับ 28h (0x28) เป็นไบต์แรกของหมายเลขอุปกรณ์
ในการติดต่อสื่อสารกับ DS18B20 จะใช้ขาสัญญาณดิจิทัลเพียงเส้นเดียว (onewire bus) ในการเชื่อมต่อแบบบิตอนุกรมสองทิศทาง (serial data, bi-directional) โดยนำมาเชื่อมต่อกับขา Arduino เพื่ออ่านค่าจากเซนเซอร์

สำหรับบอร์ด Arduino Learning Kit ตัวเซนเซอร์ DS18B20 ไม่ได้ถูกติดตั้งไว้บนบอร์ด แต่จะมีคอนเนคเตอร์สำหรับต่อใช้งาน และในการใช้งานขาที่ต่อจะใช้ขาเดียวกันระหว่าง DHT22 กับ DS18B20ดังนั้นเราจำเป็นต้องเลือกจั้มเปอร์ว่าต้องการติดต่อกับเซนเซอร์ตัวไหนระหว่าง DHT22 หรือ DS18B20 ดังบนความที่ได้กล่าวไว้ก่อนหน้านี้แล้ว


| ขาสัญญาณที่ต่อกับ DS18B20 | |
|---|---|
| Arduino Uno | 4 |
| Arduino Nano | 4 |
| ESP32(ESP-WROM-32) | 23 |
ตารางที่ 13. 1 ขาต่อใช้งานกับเซนเซอร์ DS18B20
การเขียนโปรแกรมสำหรับอ่านค่าอุณหภูมิเซนเซอร์ DS18B20
-
เปิดโปรแกรม Arduino IDE ขึ้นมา เลือกบอร์ดเป็นชนิด Arduino Uno, Nano หรือ ESP32 จากนั้นทำการ ดาวน์โหลดไลบรารี่ DS18B20 คลิกที่ Sketch -> Include Library -> Manage Libraries ดังตัวอย่างรูปด้านล่าง ทำการติดตั้งให้เรียบร้อย (ไลบรารี่นี้สามารถใช้ได้กับ Arduino Uno, Nano และ ESP32)

-
เปิด Example sketch โดยทำการเปิดตัวอย่างโปรแกรมที่มีชื่อว่า Simple โดยคลิกที่ File -> Examples -> OneWire-> DS18x20_Temperature
-
หลังจากเปิด sketch ขึ้นมาแล้ว ให้ทำการแก้ไขบรรทัดที่ 10 โดยแก้ไขขาสัญญาณที่ต่อกับเซนเซอร์ DS18B20

-
จากนั้นทำการ upload โปรแกรมลงบน Arduino หรือ ESP32 แล้วดูผลการรันโปรแกรมที่หน้าจอ Serial Monitor

อธิบายการทำงานของโค้ด
-
บรรทัดที่ 17 – 22 เป็นการประกาศตัวแปรต่าง ๆ ที่นำไปใช้ในโปรแกรม
-
บรรทัดที่ 24 – 30 เป็นการตรวจสอบว่า Arduino เจอเซนเซอร์ DS18B20 หรือไม่ ถ้าไม่เจอให้แสดงข้อความ “No more addresses.” จากนั้นทำการรีเซต
-
บรรทัดที่ 32 – 41 เป็นการแสดงค่าในหน่วยความจำ ROM ของตัวเซนเซอร์ DS18B20
-
บรรทัดที่ 45- 61 เป็นการตรวจสอบว่าเซนเซอร์ที่ต่อเป็นเบอร์อะไร ซึ่งในการทดลองจะเป็น DS18B20
-
บรรทัดที่ 63 – 104 จะเป็นกระบวนการอ่านค่าจากเซนเซอร์ DS18B20 โดยจะถูกเข้ารหัสแบบ CRC ไว้เพื่อป้องกันความผิดพลาดในการส่งข้อมูล ซึ่งจะได้ค่ามาเก็บไว้ในตัวแปร raw
-
บรรทัดที่ 105-111 เป็นการแปลงค่าในตัวแปร raw มาเป็นค่าองศาเซลเซียส และองศาฟาเรนไฮต์ และแสดงค่าออกทาง Serial Monitor ตามลำดับ
แบบฝึกหัดสำหรับทบทวนความเข้าใจ
-
เขียนโปรแกรมโดยให้แสดงค่าบนหน้าจอ LCD16x2 โดย
-
บรรทัดแรกให้แสดงค่าอุณหภูมิเป็นองศาเซลเซียส T: xx.x C
-
บรรทัดที่สองให้แสดงค่าอุณหภูมิเป็นองศาไฟเรนไฮต์ T: xx.x F
-
-
จากโปรแกรมในข้อที่ 1 ให้เขียนเงื่อนไขโดยใช้ความรู้เรื่องการควบคุมรีเลย์ โดย
-
ถ้าอุณหภูมิสูงกว่าอุณหภูมิปัจจุบันไป 2 องศา (ยกตัวอย่างเช่น ตอนนี้อุณหภูมิที่วัดได้ 25 องศา ให้เซตไว้ที่ 27 องศา) ให้รีเลย์ตัวที่ 1 ทำการเปิด และเมื่ออุณหภูมิกลับมาค่าเดิม ให้รีเลย์ตัวที่ 1 ปิด
-
เมื่อเขียนเสร็จให้ทำการทดลองโดยการเพิ่มและลดอุณหภูมิและความชื้นสัมพัทธ์ให้กับเซนเซอร์
-




Leave a Reply