บทที่ 13: การเขียนโปรแกรมอ่านค่าอุณหภูมิเซนเซอร์ DS18B20

UTEN BOONLIAM Avatar
บทที่ 13 / 26

บทที่ 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

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

  1. เปิด Example sketch โดยทำการเปิดตัวอย่างโปรแกรมที่มีชื่อว่า Simple โดยคลิกที่ File -> Examples -> OneWire-> DS18x20_Temperature

  2. หลังจากเปิด sketch ขึ้นมาแล้ว ให้ทำการแก้ไขบรรทัดที่ 10 โดยแก้ไขขาสัญญาณที่ต่อกับเซนเซอร์ DS18B20

  1. จากนั้นทำการ 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 ตามลำดับ

แบบฝึกหัดสำหรับทบทวนความเข้าใจ

  1. เขียนโปรแกรมโดยให้แสดงค่าบนหน้าจอ LCD16x2 โดย

    • บรรทัดแรกให้แสดงค่าอุณหภูมิเป็นองศาเซลเซียส T: xx.x C

    • บรรทัดที่สองให้แสดงค่าอุณหภูมิเป็นองศาไฟเรนไฮต์ T: xx.x F

 

 

 

  1. จากโปรแกรมในข้อที่ 1 ให้เขียนเงื่อนไขโดยใช้ความรู้เรื่องการควบคุมรีเลย์ โดย

    • ถ้าอุณหภูมิสูงกว่าอุณหภูมิปัจจุบันไป 2 องศา (ยกตัวอย่างเช่น ตอนนี้อุณหภูมิที่วัดได้ 25 องศา ให้เซตไว้ที่ 27 องศา) ให้รีเลย์ตัวที่ 1 ทำการเปิด และเมื่ออุณหภูมิกลับมาค่าเดิม ให้รีเลย์ตัวที่ 1 ปิด

    • เมื่อเขียนเสร็จให้ทำการทดลองโดยการเพิ่มและลดอุณหภูมิและความชื้นสัมพัทธ์ให้กับเซนเซอร์

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *