Probe kalis air DS18B20 membaca suhu air melalui satu pin Arduino sahaja: merah ke 5 V, hitam ke GND, kuning ke D2, dan satu perintang 4.7 kΞ© dari talian kuning itu naik ke 5 V. Perintang itu bukan penambah baik: pada bus 1-Wire, itulah satu-satunya benda yang mampu menarik talian ke tinggi, jadi tanpanya probe langsung tidak menjawab β imbasan bus tidak jumpa apa-apa.
Apa yang anda perlukan untuk memantau suhu air akuarium dengan Arduino?
Probe kalis air DS18B20 ialah kapsul keluli tahan karat lebih kurang 6 mm garis pusatnya, pada kabel hitam sepanjang satu meter yang berakhir dengan tiga hujung wayar stranded telanjang β merah, kuning dan hitam. Satu meter itulah kekangan binaan ini: ia sampai dari air ke satu tempat kering di sebelah tangki, tidak lebih jauh daripada itu. Selebihnya dalam senarai ini cuma memberinya sebuah board induk, sebuah paparan, dan satu perintang itu.
Senarai komponen β pemantau suhu air akuarium DS18B20 dengan paparan OLED
Pilihan β probe kedua, dan kabel USB kalau anda perlukan satu
Probe DS18B20 kedua berkongsi pin yang sama dan perintang pull-up tunggal yang sama, dan itulah yang anda mahukan untuk air-masuk berbanding air-keluar, atau dua tangki pada satu board. Kabel USB A-to-B pula ialah kabel yang diterima oleh soket segi empat bersaiz penuh pada Uno β tambah satu kalau bentuk itu belum ada dalam laci anda.
Bentuk penyambung menentukan sama ada komponen ini bertemu atau tidak. OLED putih 0.96 inci tiba dengan header male empat pinnya sudah disolder dan bersilkscreen GND, VCC, SCL, SDA β ground dahulu, dan berbaloi dibaca terus dari board dan bukan diagak, kerana jirannya ialah 5 V. Header itu dicucuk ke breadboard 400 titik, dan jumper male-to-male membawa setiap baris ke soket female pada Uno. Probe itu pula langsung tiada plug: tiga hujung wayarnya masuk terus ke lubang breadboard.
Kenapa DS18B20 perlukan perintang pull-up 4.7 kΞ©?
Pin data DS18B20 ialah open drain: di dalam probe, DQ bersambung ke sebuah transistor yang boleh menarik talian turun ke ground, dan tidak bersambung ke apa-apa yang boleh menolaknya naik. Pin Arduino pula berkelakuan sama semasa ia bercakap. Jadi pada bus 1-Wire, setiap peserta mampu menghasilkan logik rendah dan tiada satu pun mampu menghasilkan logik tinggi β perintang yang naik ke 5 V itulah keseluruhan mekanisme yang menaikkan talian tersebut. Tinggalkan ia, dan talian itu cuma terapung β tiada idle tinggi, tiada denyutan reset, tiada jawapan.
Datasheet menukarkan hal itu menjadi satu tarikh akhir. Untuk menghantar 1, master menarik talian ke rendah, melepaskannya, dan talian itu mesti kembali ke logik tinggi yang sah dalam masa 15 Β΅s dari permulaan slot masa. Perintang dan kapasitans bus membentuk lengkung pengecasan RC, jadi tarikh akhir itu sebenarnya satu bajet rintangan. Kabel probe satu meter tambah satu baris breadboard berada pada aras 100 pF: 4.7 kΞ© Γ 100 pF memberi pemalar masa 0.47 Β΅s, jadi talian pulih dalam lebih kurang satu mikrosaat β lima belas kali ganda di dalam tingkap masa itu. Sepuluh kiloohm menggandakannya kepada kira-kira dua mikrosaat, dan itulah sebabnya satu probe pada satu meter kabel memang boleh jalan dengan 10 kΞ©. Tambah probe dan tambah meter, kapasitans pun naik; menghampiri 1.5 nF, lengkung 10 kΞ© baru dua pertiga jalan naik apabila tarikh akhir 15 Β΅s berlalu dan bit mula tercicir, sementara 4.7 kΞ© masih tiba dengan margin.
Jadi jawapan pembeliannya ialah satu perintang 4.7 kΞ©, 1/4 W untuk keseluruhan bus β satu biji, bukan satu setiap probe, kerana probe-probe itu bergantung pada talian yang sama secara selari. Ia tiada polariti, jadi arah pemasangan tidak penting. Daripada pek campuran, 4.7 kΞ© ialah jalur kuning-ungu-hitam-perang pada komponen metal-film biru lima jalur (470 Γ 10), dan kuning-ungu-merah pada komponen karbon empat jalur yang lebih lama. Dua biji 10 kΞ© dalam pasangan baris yang sama menjadi 5 kΞ©.

Bagaimana cara mendawai DS18B20 ke Arduino Uno?
Hujung wayar DS18B20 ialah wayar stranded halus, bertimah dan terkembang di hujungnya, sedangkan lubang breadboard dibina untuk pin pejal. Pulas setiap hujung itu ketat-ketat antara jari dan ibu jari sebelum ia mendekati board β satu urat sesat yang menjambatani baris sebelah akan meletakkan 5 V pada talian data. Kalau anda ada besi pematerian, secalit timah pada pulasan itu ialah penyelesaian yang lebih kukuh.
| Wayar | Pergi ke | Kenapa |
|---|---|---|
| Probe MERAH | Uno 5V |
VDD β normal power, jadi cip itu tidak perlu mencuri arus daripada talian data |
| Probe HITAM | Uno GND |
Rujukan ground untuk bus |
| Probe KUNING | Uno D2 |
DQ, talian data 1-Wire β mana-mana pin digital kecuali 0 dan 1 boleh digunakan kalau anda tukar dalam code, kerana dua pin itu membawa Serial Monitor |
| Perintang 4.7 kΞ© | Baris kuning β 5V |
Pull-up itu. Satu untuk seluruh bus, tidak kira berapa banyak probe |
OLED GND |
Uno GND |
Pin pertama pada header β baca silkscreen sebelum mencucuk |
OLED VCC |
Uno 5V |
Bekalan paparan, berkongsi rel yang sama dengan probe |
OLED SCL |
Uno A5 |
Clock IΒ²C β pin tetap pada Uno, bukan pilihan bebas |
OLED SDA |
Uno A4 |
Data IΒ²C |
Bekalkan kuasa ke board dahulu: satu jumper dari soket 5V Uno ke jalur merah breadboard, satu lagi dari GND ke jalur biru. Tiga baris dalam jadual itu mahukan 5 V sedangkan Uno cuma ada satu soket β jadi kekalkan semuanya pada bahagian board yang sama dengan dua jumper tadi. Satu lajur lima lubang breadboard kemudian menjadi keseluruhan bus itu: hujung wayar kuning, satu kaki perintang 4.7 kΞ© dan jumper ke D2 semuanya mendarat di situ, dan kaki sebelah lagi perintang itu mencapai rel 5 V.
Hanya kapsul keluli dan kabelnya sahaja yang dimeterai β Uno, breadboard dan paparan tidak, jadi letakkan semuanya di rak kering di atas paras air dan jatuhkan kabel itu masuk melepasi bibir tangki. Gantungkan kapsul itu di air terbuka, jauh daripada aliran keluar heater: kalau ia terletak rapat pada heater, ia membaca heater, bukan tangki. Keluli tahan karat juga boleh bernoda dan berbintik dalam air masin β periksa kapsul itu setiap kali anda membersihkan tangki air masin. Semua yang ada di sini ialah 5 V DC; heater akuarium pula ialah perkakas kuasa sesalur (mains), dan tiada apa-apa pada breadboard ini yang patut didawai untuk menyuisnya.

Library mana yang diperlukan code DS18B20 Arduino β OneWire atau DallasTemperature?
DS18B20 perlukan dua library yang membuat kerja berbeza. OneWire oleh Paul Stoffregen membuat bit-bang bagi pemasaan mikrosaat yang dituntut oleh bus itu; DallasTemperature oleh Miles Burton duduk di atasnya dan menukarkan semua itu menjadi arahan yang mudah dibaca. Pasang kedua-duanya daripada Library Manager, berserta pasangan Adafruit SSD1306 dan GFX yang turut digunakan oleh pemantau suhu udara DHT11 kami.
/*
Probe kalis air DS18B20 -> pemantau suhu air pada OLED 0.96"
Arduino Uno + OneWire + DallasTemperature + Adafruit SSD1306
SATU perintang 4.7k antara wayar DATA kuning dan 5V. Seluruh bus
perlukan tepat satu sahaja, tidak kira berapa banyak probe pada pin itu.
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
const uint8_t ONE_WIRE_PIN = 2; // wayar kuning probe mendarat di sini
const uint8_t MAX_PROBES = 2; // naikkan nilai ini kalau anda tambah probe
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensors(&oneWire);
DeviceAddress probe[MAX_PROBES];
uint8_t found = 0;
void printRom(const uint8_t *addr) {
for (uint8_t i = 0; i < 8; i++) {
if (addr[i] < 0x10) Serial.print('0');
Serial.print(addr[i], HEX);
}
}
void scanBus() {
sensors.begin(); // jalankan carian 1-Wire dari awal
uint8_t onBus = sensors.getDeviceCount();
found = (onBus < MAX_PROBES) ? onBus : MAX_PROBES;
Serial.print(F("Probes on the bus: "));
Serial.println(onBus);
for (uint8_t i = 0; i < found; i++) {
if (sensors.getAddress(probe[i], i)) {
Serial.print(F(" index "));
Serial.print(i);
Serial.print(F(" ROM "));
printRom(probe[i]); // catat nombor ini, labelkan kabel itu
Serial.println();
sensors.setResolution(probe[i], 12); // langkah 0.0625 C, conversion 750 ms
}
}
}
void setup() {
Serial.begin(9600);
// Kebanyakan modul 0.96" menjawab pada 0x3C; sebilangan kecil diset ke 0x3D.
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED not answering - check SDA/SCL and 5V"));
for (;;) { }
}
oled.setTextColor(SSD1306_WHITE);
scanBus();
// "YES" di sini bermakna ada probe yang VDD-nya diikat ke GND dan sedang
// mencuri kuasa dari talian data - sebab biasa bacaan tersangkut pada 85.00.
Serial.print(F("Parasite power: "));
Serial.println(sensors.isParasitePowerMode() ? F("YES") : F("no"));
}
void loop() {
if (found == 0) { // pull-up yang tiada nampak MACAM INI, bukan macam -127
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(0, 0);
oled.print(F("NO PROBE FOUND"));
oled.setCursor(0, 16);
oled.print(F("CHECK 4.7k -> 5V"));
oled.setCursor(0, 28);
oled.print(F("AND YELLOW ON D2"));
oled.display();
scanBus(); // terus mencari, jadi membetulkan wayar akan memulihkannya
delay(1000);
return;
}
sensors.requestTemperatures(); // memblok sehingga probe kata ia siap (maksimum 750 ms)
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(0, 0);
oled.print(F("WATER TEMP"));
for (uint8_t i = 0; i < found; i++) {
float c = sensors.getTempC(probe[i]);
oled.setTextSize(2);
oled.setCursor(0, 18 + i * 24);
if (c <= DEVICE_DISCONNECTED_C) { // -127: tiada siapa menjawab
oled.print(F("--.- C"));
Serial.println(F("-127 : no reply - check the 4.7k and the wiring"));
} else {
oled.print(c, 1);
oled.print(F(" C"));
Serial.print(i);
Serial.print(F(" : "));
Serial.println(c, 2);
if (c > 84.9 && c < 85.1) { // nilai lalai scratchpad ketika kuasa dihidupkan
Serial.println(F(" 85.00 : read before conversion, or starved supply"));
}
}
}
oled.display();
delay(1000);
}
Pada Uno, sketch ini compile menjadi 19,620 bait flash β 60% daripada 32 KB β dengan 595 bait RAM statik; library paparan kemudian memperuntukkan frame buffer 1,024 bait apabila begin() berjalan, jadi lebih kurang 1.6 KB daripada 2 KB Uno sudah terikat sebelum pemboleh ubah anda sendiri masuk. Itulah sebabnya setiap string tetap di sini dibalut dalam F(): kalau tidak dibalut, setiap satunya akan disalin ke dalam baki yang tinggal dan bukannya kekal dalam flash. requestTemperatures() memblok sehingga probe melaporkan conversion-nya sudah selesai β library DallasTemperature memeriksa bus berulang kali dan bukannya tidur untuk selang tetap, jadi tempoh menunggu itu dihadkan oleh maksimum 750 ms dalam datasheet pada 12 bit, bukan ditetapkan pada nilai itu; 9 bit menurunkan siling tersebut kepada 93.75 ms dan mengasarkan langkahnya kepada 0.5 Β°C.
Bacaan itu ada tugas kedua kalau anda sudah menjalankan meter kualiti air TDS kami. Kekonduksian naik lebih kurang 2% setiap darjah Celsius, jadi binaan itu menganggap 25 Β°C dan tangki yang lebih sejuk akan terbaca sedikit rendah. DS18B20 pada pinnya sendiri menyerahkan nombor sebenar kepada sketch tersebut β Uno yang sama, satu probe tambahan, dan anggapan itu bertukar menjadi ukuran.
Bagaimana beberapa probe DS18B20 berkongsi satu pin Arduino?
Setiap DS18B20 keluar dari kilang dengan kod ROM 64-bit yang dilaser ke dalamnya: kod keluarga 8-bit (28h untuk komponen ini), nombor siri 48-bit yang unik kepada cip itu, dan CRC 8-bit ke atas tujuh bait yang lain. Tiada dua probe menjawab kepada nombor yang sama, jadi master boleh menyasarkan satu probe pada satu masa walaupun semuanya berkongsi satu wayar. Ia menemuinya dengan menyusuri bus bit demi bit β di tempat dua probe berbeza, ia mengambil satu cabang, menghabiskan alamat itu, kemudian kembali untuk yang satu lagi β dan itulah yang dibaca keluar oleh getAddress() dalam sketch di atas.
Dalam praktik: kedua-dua hujung wayar kuning masuk ke lajur breadboard yang sama, kedua-dua merah ke rel merah, kedua-dua hitam ke rel biru, dan perintang 4.7 kΞ© tunggal itu kekal di tempatnya β perintang kedua cuma memotong separuh rintangan pull-up tanpa sebarang faedah. Jalankan sketch dengan Serial Monitor terbuka pada 9600 baud, dan setiap kod ROM tercetak sekali ketika permulaan. Untuk tahu yang mana satu, celup satu probe dalam air suam, perhatikan indeks mana yang bergerak, dan lilit sekeping pita sebagai bendera pada kabel itu.
Beberapa probe yang mendarat pada satu rel lebih senang ditonton daripada diceritakan:
Apa maksud β127 dan 85.00 pada DS18B20?
DS18B20 ada dua bacaan yang sebenarnya mesej dan bukan suhu β serta satu mesej yang langsung tidak pernah menjadi bacaan.
| Bacaan | Apa sebenarnya ia | Di mana nak cari |
|---|---|---|
Probes on the bus: 0 |
Carian sudah tamat dan tiada apa-apa menjawab β tiada peranti pernah menarik talian ke rendah untuk mengumumkan dirinya | Pull-up dahulu: tanpa perintang, talian tidak boleh idle tinggi, jadi denyutan reset tidak mendapat jawapan. Kemudian lajur hujung wayar kuning, dan nombor pin yang diisytiharkan oleh sketch |
β127.00 |
DEVICE_DISCONNECTED_C β master menghantar denyutan reset dan tiada peranti menjawab |
Probe yang menjawab ketika permulaan tetapi sudah berhenti sejak itu: hujung wayar longgar, satu urat yang bersentuhan putus-putus, atau kabel terpicit di bawah penutup tangki |
85.00 |
Nilai lalai daftar suhu ketika kuasa dihidupkan, masih belum tersentuh | Bacaan diambil sebelum conversion selesai, atau bekalan yang jatuh voltan semasa conversion berjalan |
| Munasabah tetapi beku | Nilai sebenar yang tidak pernah dikemas kini | requestTemperatures() berada di luar loop, jadi scratchpad yang sama dibaca berulang kali selamanya |
Angka +85 Β°C itu ialah nilai reset ketika kuasa dihidupkan bagi daftar suhu itu sendiri, jadi cip yang sudah dibekalkan kuasa tetapi belum habis conversion akan menyerahkannya kepada sebarang bacaan. Ia juga menunjuk kepada bekalan yang tidak cukup, dan di situ masuknya parasite power: DS18B20 boleh berjalan dengan VDD diikat ke ground, menarik apa yang diperlukannya daripada talian data semasa talian itu idle tinggi. Probe kita ada tiga wayar, jadi berikan VDD wayar merah dan 5 V: normal power, iaitu mode yang digunakan di sini. Parasite power pula menuntut master menahan talian itu tinggi sepenuhnya sepanjang conversion, kerana perintang 4.7 kΞ© tidak mampu membekalkan ~1.5 mA yang ditarik oleh cip semasa menukar. Sketch itu mencetak Parasite power: YES kalau ia melihat keadaan tersebut, yang bermakna wayar merah tidak melakukan tugasnya.
Kesilapan biasa yang kami nampak daripada pelanggan sebenar
Beli probe, terlupa perintang. Seorang pelanggan mesej kami: “For the resistor: do you have a 4.7k or 10k 1/4W resistor available? I need about 10 pcs for my DS18B20 pull-up.” Nilainya betul, cuma kuantitinya berlebihan: satu bus perlukan satu perintang sahaja. Probe itu dihantar sebagai probe sahaja β tiada board breakout, tiada perintang.
Menyangka pek starter sudah tentu cukup. Seorang lagi bertanya sama ada satu set itu mengandungi “220 Ohm, 1K Ohm, 4.7K Ohm and 10K Ohm”. Baca apa yang anda sudah ada melalui jalur warna di atas dan bukan dengan harapan, dan kalau anda memang mahu membeli dan bukan menyelongkar laci, belilah nilai itu sendiri β satu komponen 4.7 kΞ© 1/4 W sudah menyelesaikan seluruh bus.
Menjangka paparan akan menyala dengan sendirinya. OLED yang kosong di sebelah probe yang berfungsi hampir selalunya soal alamat IΒ²C: kebanyakan modul 0.96 inci menjawab pada 0x3C, sebilangan kecil pada 0x3D, dan File β Examples β Wire β i2c_scanner akan mencetak alamat sebenar yang ada pada A4/A5, jadi anda menukar satu nombor itu dalam oled.begin() sambil tahu jawapannya, bukan sambil meneka β tabiat yang sama diajar oleh panduan LCD1602 IΒ²C kami.
FAQ
Betulkah DS18B20 memang perlukan perintang?
Ya β satu perintang 4.7 kΞ© 1/4 W antara wayar data dan 5 V, untuk seluruh bus. Probe dan Arduino cuma mampu menarik talian ke rendah, jadi perintang itulah satu-satunya komponen yang mampu menaikkannya; tanpanya bus tidak pernah idle tinggi dan imbasan langsung tidak jumpa probe.
Kenapa DS18B20 saya membaca β127?
β127 ialah nilai sentinel DEVICE_DISCONNECTED_C daripada library: denyutan reset tidak mendapat jawapan. Kalau probe memang tidak pernah dijumpai, sketch akan melaporkan sifar peranti ketika permulaan dan puncanya ialah pull-up yang tiada, perintang di lajur yang salah, atau pin yang salah. β127 yang tulen bermakna ia pernah menjawab sekali kemudian berhenti β hujung wayar longgar atau satu urat yang bersentuhan tipis sahaja.
Boleh guna perintang 10 kΞ© ganti 4.7 kΞ©?
Untuk satu probe pada kabel standard sepanjang satu meter, boleh: talian masih mencapai logik tinggi yang sah dalam lebih kurang dua mikrosaat berbanding tarikh akhir 15 Β΅s. Margin itu mengecil apabila probe dan panjang kabel bertambah, jadi 4.7 kΞ© ialah nilai yang patut dikekalkan. Dua biji 10 kΞ© secara selari memberi 5 kΞ©.
Berapa banyak sensor DS18B20 boleh disambung pada satu pin Arduino?
Cukup untuk mana-mana susunan tangki. Setiap satunya membawa alamat ROM 64-bit yang unik, jadi semuanya berkongsi satu pin dan satu pull-up. Hadnya bersifat elektrik, bukan satu nombor dalam library: jumlah kapasitans kabel akhirnya akan menumpulkan tepi menaik itu.
Adakah DS18B20 cukup tepat untuk akuarium?
Lebih daripada cukup. Ia dispesifikasikan pada Β±0.5 Β°C dari β10 Β°C hingga +85 Β°C dan resolusinya 0.0625 Β°C setiap langkah pada 12 bit, jadi heater yang mula gagal akan menampakkan dirinya lama sebelum hidupan dalam tangki perasan.
Kemas kini terakhir Ogos 2026. Tersangkut? Chat dengan kami di WhatsApp.



Temperature Sensor DS18B20 Temperature Measurement Probe WaterProof 18B20
0.96β OLED Display Module Blue White Screen I2C IIC Serial 128X64 LCD Display Board - 0.96' OLED WHITE
Arduino Uno Compatible SMD UNO R3 with Type B Cable - ATMEGA328P with CH340G-Microcontroller Project
MB102 Breadboard 170 400 830 Holes Breadboard Donut Board Arduino Prototype Multi Color - BREADBOARD (400 HOLES)
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-M 20CM
400 pcs 1/4W Resistor Pack Resistor Kit 20 Common Value with 20 each
Data Cable Type-A Type-C MicroUSB Type-B 0.5m 1m 30cm 0.3m 100cm Data Transfer Upload Code - TYPE-A TO TYPE-B (1.0M)