ภาพปก DS18B20 ESP32 วัดอุณหภูมิน้ำ ต่อวงจรและโค้ด PlatformIO

ต่อ DS18B20 กับ ESP32 วัดอุณหภูมิน้ำ พร้อมโค้ด PlatformIO

บทนำ

อยากวัดอุณหภูมิน้ำด้วย ESP32 แต่ไม่รู้จะต่อ DS18B20 อย่างไร? บางคนต่อสายแล้วอ่านได้ -127°C หรือ 85°C ทั้งที่น้ำมีอุณหภูมิปกติ บทความนี้เริ่มตั้งแต่เตรียมอุปกรณ์ ต่อวงจร ใส่ Pull-up ตั้งค่า PlatformIO ทดสอบ Serial Monitor และไล่หาสาเหตุเมื่ออ่านค่าไม่ได้

DS18B20 คืออะไร?

DS18B20 เป็นเซนเซอร์อุณหภูมิแบบดิจิทัลสื่อสารด้วย 1-Wire โดยใช้ DATA หนึ่งขาพร้อมกับสายไฟเลี้ยงและกราวด์ (ในโหมดจ่ายไฟแยก 3 สาย) สเปกจาก Datasheet: VDD 3.0–5.5V, ช่วงวัด -55 ถึง +125°C, ความแม่นยำที่ระบุ ±0.5°C ในช่วง -10 ถึง +85°C และความละเอียด 9–12 bit การแปลงอุณหภูมิที่ความละเอียด 12-bit ใช้เวลาสูงสุด 750 ms ทั้งนี้ความแม่นยำของหัววัดแบบสเตนเลสสำเร็จรูปขึ้นกับคุณภาพสินค้าและการประกอบด้วย

อุปกรณ์

ภาพถ่ายจริงของ ESP32 DevKit V1 และหัววัด DS18B20 บน Breadboard
ภาพอุปกรณ์จริงที่ใช้ประกอบบทความ DevaDIY
  • ESP32 DevKit V1 หนึ่งบอร์ด
  • DS18B20 หัววัดกันน้ำจากร้าน MASSMORE หนึ่งตัว (ตรวจตัวเลือกสินค้าและ Pinout จากร้านก่อนใช้งาน)
  • ตัวต้านทาน Pull-up 4.7kΩ หนึ่งตัว
  • Breadboard, สาย Jumper, สาย USB
  • VS Code + PlatformIO

เลือกซื้ออุปกรณ์สำหรับทำโปรเจกต์

ถ้ามี ESP32 อยู่แล้ว ไม่จำเป็นต้องซื้อบอร์ดใหม่ครับ ให้เลือก DS18B20 แบบ 3 สายและตรวจว่ามีตัวต้านทาน Pull-up ติดตั้งอยู่บนโมดูลหรือยัง

อุปกรณ์ข้อควรตรวจลิงก์
ESP32 DevKit V130-pin และพอร์ต USB ตรงกับที่ใช้ดู ESP32 บน Shopee (Affiliate)
DS18B20 หัววัดกันน้ำ — GusTron (ตัวเลือก Affiliate)ชุดจริงในบทความเป็น MASSMORE; ลิงก์นี้เป็นสินค้าทางเลือก ให้ตรวจ VDD / DQ / GND และ Pinout จากผู้ขายดู DS18B20 บน Shopee (Affiliate)
ตัวต้านทาน 4.7kΩ 1/4W Carbon Film 10 ชิ้นใช้ Pull-up จาก DQ ไป 3.3V; ตรวจว่าชุด DS18B20 มี Pull-up บนโมดูลแล้วหรือไม่ดูตัวต้านทาน 4.7kΩ บน Shopee (Affiliate)
Breadboard MB-102 / GL-12 — GusTronบอร์ดทดลองใช้ต่อวงจรดู Breadboard บน Shopee (Affiliate)
สาย Jumper 40 เส้น — GusTronเลือกหัวสายให้เหมาะสมกับ GPIO และ Breadboardดูสาย Jumper บน Shopee (Affiliate)

วิธีต่อสาย

ภาพชุดโมดูล DS18B20 และ ESP32 บน Breadboard
หัววัด DS18B20 และโมดูลต่อสายที่ใช้ในชุดทดลอง
DS18B20ESP32
VDD3V3
DATA / DQGPIO26
GNDGND
Resistor 4.7kΩคั่นระหว่าง DATA กับ 3V3
ผังวงจร DS18B20 ต่อกับ ESP32 GPIO26 และตัวต้านทาน Pull-up 4.7kΩ
ผังเชิงตรรกะสำหรับตรวจสาย ไม่ใช่ตำแหน่งขาจริงของบอร์ด

Pull-up 4.7kΩ ทำหน้าที่อะไร?

ตั้งค่า PlatformIO

สร้างโปรเจกต์ Board: esp32dev, Framework: Arduino แล้วใช้ไฟล์ 04_Code/platformio.ini ในชุดตัวอย่างนี้ ซึ่งมีไลบรารี paulstoffregen/OneWire และ milesburton/DallasTemperature และตั้ง Serial Monitor 115200 baud

ตัวอย่างโค้ด

ภาพหน้าจอ platformio.ini สำหรับ ESP32 และ DallasTemperature
ไฟล์ platformio.ini จากภาพที่ถ่ายจริง
ภาพหน้าจอซอร์สโค้ด main.cpp ของโปรเจกต์ DS18B20 ESP32
ภาพไฟล์ซอร์สโค้ดจาก VS Code

เปิดไฟล์ 04_Code/src/main.cpp ในชุดงานนี้ โค้ดกำหนด GPIO26, เริ่ม DallasTemperature, ตั้งความละเอียด 12-bit, อ่านทุก 2 วินาทีและตรวจสถานะก่อนพิมพ์ค่า โดย requestTemperatures() เป็นการรอแปลงค่าแบบ blocking ในตัวอย่างนี้ หากไม่พบเซนเซอร์จะลองค้นหาใหม่

platformio.ini

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps =
  paulstoffregen/OneWire
  milesburton/DallasTemperature

src/main.cpp

#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>

constexpr uint8_t ONE_WIRE_PIN = 26;
constexpr unsigned long READ_INTERVAL_MS = 2000;

OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensors(&oneWire);
unsigned long lastRead = 0;

void setup() {
  Serial.begin(115200);
  sensors.begin();
  sensors.setResolution(12);
  Serial.printf("DS18B20 devices found: %d\n", sensors.getDeviceCount());
}

void loop() {
  if (millis() - lastRead < READ_INTERVAL_MS) return;
  lastRead = millis();

  if (sensors.getDeviceCount() == 0) {
    sensors.begin(); // Retry device discovery after disconnect
    if (sensors.getDeviceCount() == 0) {
      Serial.println("ERROR: DS18B20 not detected; check power, data, pull-up");
      return;
    }
  }

  sensors.requestTemperatures(); // Blocking, up to 750 ms at 12-bit
  const float temperatureC = sensors.getTempCByIndex(0);
  if (temperatureC == DEVICE_DISCONNECTED_C || !isfinite(temperatureC)) {
    Serial.println("ERROR: sensor read failed (-127 C)");
    sensors.begin(); // Allow recovery after reconnecting
    return;
  }
  Serial.printf("Water temperature: %.2f C\n", temperatureC);
}

ทดสอบผ่าน Serial Monitor

เมื่ออ่านได้ -127°C หรือเซนเซอร์หาย

ค่า -127°C ในไลบรารี DallasTemperature คือ DEVICE_DISCONNECTED_C โดยทั่วไปหมายถึงอ่านข้อมูลไม่สำเร็จ ให้ตรวจ VDD, GND, DATA, ตัวต้านทาน Pull-up, ขา GPIO, สายขาด/สัญญาณรบกวน และการสลับสายที่หัววัด โค้ดตัวอย่างตรวจค่านี้แล้วแสดง ERROR แทนการแสดงเป็นอุณหภูมิน้ำจริง

ทำไมอ่านได้ 85°C?

85°C เป็นค่าเริ่มต้นใน temperature register หลัง Power-on reset ของ DS18B20 จึงอาจปรากฏหากอ่านก่อนจบการแปลงค่า หรือเกิดการรีเซ็ต/ไฟเลี้ยงไม่เสถียร ไม่ควรตีความ 85°C ว่าเป็นความผิดพลาดทุกกรณี เพราะน้ำอาจมีอุณหภูมิ 85°C จริงได้ ตรวจลำดับ requestTemperatures(), ระยะเวลารอ, การจ่ายไฟ และทดสอบซ้ำก่อนตัดสินว่าเป็นค่าผิดพลาด

ข้อจำกัดและข้อควรระวัง

  • Probe สเตนเลสที่ประกาศว่า Waterproof ไม่ได้แปลว่าสายหรือรอยต่อทุกส่วนทนน้ำระยะยาว
  • 12-bit resolution คือความละเอียดในการแสดง/แปลง ไม่ใช่คำรับรองความแม่นยำ ±0.0625°C
  • ถ้าเดินสายยาว สัญญาณ 1-Wire อาจผิดพลาด ต้องตรวจการต่อกราวด์ การรบกวนและ topology
  • ตัวอย่างนี้เป็น External-power 3-wire ไม่ใช่ Parasite-power
  • โค้ดนี้ยังไม่ได้ Build/Upload/ทดสอบฮาร์ดแวร์จริงในรอบเขียนบทความ จึงห้ามอ้างว่าใช้งานผ่านแล้ว

นำไปใช้กับ Smart Farm อย่างไร?

วัดอุณหภูมิสารละลายในถังปลูก ตรวจดูการเปลี่ยนแปลงรายวัน และนำค่าไปแสดงพร้อม pH/EC ใน Dashboard ได้ แต่การต่อเซนเซอร์สำเร็จยังไม่ใช่หลักฐานว่าระบบชดเชย EC หรือควบคุมฟาร์มทำงานถูกต้อง ต้องพัฒนาและทดสอบส่วนเหล่านั้นแยกกัน

FAQ

DS18B20 ใช้ 3.3V ได้หรือไม่?

ได้ตามสเปก 3.0–5.5V ของชิป โดยในวงจรนี้ต่อไฟเลี้ยงและ Pull-up ที่ 3.3V

ต่อ DS18B20 หลายตัวกับ GPIO เดียวได้หรือไม่?

1-Wire รองรับหลายอุปกรณ์บนบัสเดียวกัน แต่ต้องระบุ Device Address ของแต่ละตัวและตรวจวงจร/สายสัญญาณให้เหมาะสม โค้ดนี้สาธิตตัวแรกเพียงตัวเดียว

DS18B20 ต้องต่อเข้ากับ ADC หรือ ADS1115 ไหม?

ไม่ต้อง เพราะเป็นเซนเซอร์ดิจิทัล 1-Wire ไม่ใช่เซนเซอร์แรงดัน Analog

สรุป

การเริ่มต้นใช้ DS18B20 กับ ESP32 ไม่ซับซ้อน: ต่อสายให้ถูก ใส่ Pull-up 4.7kΩ ไปยัง 3.3V เลือก GPIO26 ติดตั้ง OneWire/DallasTemperature แล้วอ่านและตรวจสถานะด้วย PlatformIO จุดสำคัญคืออย่าปล่อยให้ -127°C หรือค่าเริ่มต้นที่ยังไม่ได้ตรวจสอบกลายเป็นข้อมูลอุณหภูมิที่ระบบนำไปใช้งานต่อ

บทความที่เกี่ยวข้อง

เอกสารอ้างอิง

Shopping Cart
Scroll to Top