Sensor Suhu Kalis Air DS18B20 dengan Arduino: Monitor Suhu Akuarium

Cartoon of a silver stainless-steel DS18B20 waterproof probe hanging into a teal aquarium tank on its black cable with red, yellow and black bare tails, beside a dark-blue OLED module showing abstract white pixel blocks and a white breadboard holding a small blue resistor

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.

Pilihan β€” probe kedua, dan kabel USB kalau anda perlukan satu

ItemPriceQty
Temperature Sensor DS18B20 Temperature Measurement Probe WaterProof 18B20Temperature Sensor DS18B20 Temperature Measurement Probe WaterProof 18B20DS18B20RM4.95
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)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)ATBC100RM4.90

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Ξ©.

Rajah kartun bus 1-Wire open-drain: satu talian mendatar navy dengan tiga suis menarik ke bawah ke ground di bawah dua probe perak dan satu tepi board biru, serta sebatang perintang biru tunggal menarik ke atas ke rel bekalan merah
Semua benda pada bus 1-Wire boleh menarik talian ke bawah. Hanya perintang yang menariknya semula ke atas β€” sebab itulah meninggalkannya mematikan bus terus, bukan sekadar melemahkannya.

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.

Perbandingan kartun hujung wayar stranded kuning β€” urat perak yang terurai menyentuh lubang breadboard sebelah yang ditanda pangkah oren, berbanding wayar yang sama dipulas menjadi hujung kemas dan duduk dalam satu lubang dengan tanda betul teal
Kiri: urat yang terkembang mencapai baris sebelah, iaitu litar pintas antara 5 V dan data. Kanan: hujung wayar yang sama dipulas ketat, duduk dalam satu lubang.

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.

Leave a Reply

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