บทนำ
อยากวัดอุณหภูมิน้ำด้วย 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 หัววัดกันน้ำจากร้าน MASSMORE หนึ่งตัว (ตรวจตัวเลือกสินค้าและ Pinout จากร้านก่อนใช้งาน)
- ตัวต้านทาน Pull-up 4.7kΩ หนึ่งตัว
- Breadboard, สาย Jumper, สาย USB
- VS Code + PlatformIO
เลือกซื้ออุปกรณ์สำหรับทำโปรเจกต์
ถ้ามี ESP32 อยู่แล้ว ไม่จำเป็นต้องซื้อบอร์ดใหม่ครับ ให้เลือก DS18B20 แบบ 3 สายและตรวจว่ามีตัวต้านทาน Pull-up ติดตั้งอยู่บนโมดูลหรือยัง
| อุปกรณ์ | ข้อควรตรวจ | ลิงก์ |
|---|---|---|
| ESP32 DevKit V1 | 30-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 |
|---|---|
| VDD | 3V3 |
| DATA / DQ | GPIO26 |
| GND | GND |
| Resistor 4.7kΩ | คั่นระหว่าง DATA กับ 3V3 |
Pull-up 4.7kΩ ทำหน้าที่อะไร?
ตั้งค่า PlatformIO
สร้างโปรเจกต์ Board: esp32dev, Framework: Arduino แล้วใช้ไฟล์ 04_Code/platformio.ini ในชุดตัวอย่างนี้ ซึ่งมีไลบรารี paulstoffregen/OneWire และ milesburton/DallasTemperature และตั้ง Serial Monitor 115200 baud
ตัวอย่างโค้ด


เปิดไฟล์ 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/DallasTemperaturesrc/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 หรือค่าเริ่มต้นที่ยังไม่ได้ตรวจสอบกลายเป็นข้อมูลอุณหภูมิที่ระบบนำไปใช้งานต่อ




