Probe DS18B20 tahan air mengukur suhu akuarium, dan ESP32 menyalakan pemanas lewat relay saat air terlalu dingin. Suhu target diatur dengan slider. Grafik di Klenik memperlihatkan suhu air siang dan malam.
DS18B20 dibaca seperti proyek 023, kali ini dengan ESP32. Logikanya termostat: pemanas menyala kalau suhu di bawah target - 0,5 °C dan mati di atas target + 0,5 °C. Di antara keduanya pemanas mempertahankan keadaan terakhir, supaya relay tidak ceklak-ceklik setiap kali suhu bergeser 0,1 °C.
Kalau sensor terlepas, pustaka mengembalikan angka -127. ESP32 menganggap itu bahaya dan langsung mematikan pemanas. Pemanas yang terus menyala tanpa sensor bisa merebus ikan.
Keamanan: pemanas akuarium memakai listrik 220V. Pakai pemanas akuarium yang sudah punya termostat sendiri sebagai pengaman kedua, dan minta orang yang paham listrik memasang kabel relay ke stop kontak. Untuk belajar, ganti pemanas dengan lampu USB (lihat proyek 081).
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Sensor DS18B20 waterproof 1 m | 1 | Rp14.500 |
| Modul relay 1 channel 5V | 1 | Rp17.000 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 6 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp110.000 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Adaptor + probe DS18B20 VCC | → | 3V3 | merah |
| Adaptor + probe DS18B20 DAT | → | D4 GPIO4 | kuning |
| Adaptor + probe DS18B20 GND | → | GND | hitam |
| Relay 1 ch 5V (jumper H) DC+ | → | VIN | oranye |
| Relay 1 ch 5V (jumper H) DC− | → | GND | hitam |
| Relay 1 ch 5V (jumper H) IN | → | D26 GPIO26 | biru |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p069.json, ganti budi1234 dengan KODE-mu, lalu import di Klenik (menu titik tiga → Export / Import → Import → Ganti total). Langkah lengkapnya ada di Panduan Klenik.
| Widget | Topic | Setting |
|---|---|---|
| Gauge Suhu Air | ichibot/KODE/p069/suhu | 15–40 °C |
| Indikator Boolean Pemanas | ichibot/KODE/p069/pemanas | ON = 1 “MEMANASKAN”, OFF = 0 |
| Slider Output Suhu Target | ichibot/KODE/p069/target | 22–30 °C |
| Chart Grafik Suhu Air | ichibot/KODE/p069/suhu | 20–32 °C |
| Text Log Peringatan | ichibot/KODE/p069/log | menampilkan teks masuk |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary), OneWire, DallasTemperature. Board di Arduino IDE: ESP32 Dev Module.
Isi dulu nama WiFi dan password di bagian ISI DULU, lalu ganti budi1234 di baris topic dengan KODE-mu, lalu upload dan buka Serial Monitor (115200).
// Proyek 069 - Suhu Air Akuarium + Pemanas
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";
// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_PEMANAS = "ichibot/budi1234/p069/pemanas";
const char* TOPIK_TARGET = "ichibot/budi1234/p069/target";
const char* TOPIK_LOG = "ichibot/budi1234/p069/log";
const char* TOPIK_SUHU = "ichibot/budi1234/p069/suhu";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
OneWire kabelData(4); // modul adaptor sudah berisi resistor 4,7k
DallasTemperature sensor(&kabelData);
const int RELAY = 26;
float target = 27.0; // suhu yang diinginkan (°C)
bool pemanas = false;
unsigned long terakhir = 0;
void aturPemanas(bool v) {
if (v == pemanas) return;
pemanas = v;
digitalWrite(RELAY, v ? HIGH : LOW);
mqtt.publish(TOPIK_PEMANAS, v ? "1" : "0", true);
}
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
target = p.toFloat();
}
void langganan() {
mqtt.subscribe(TOPIK_TARGET);
}
sambungWiFi() dan sambungMQTT(): sama di semua proyek (klik untuk lihat)
void sambungWiFi() {
WiFi.begin(WIFI_NAMA, WIFI_PASS);
Serial.print("WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" OK, IP " + WiFi.localIP().toString());
}
void sambungMQTT() {
while (!mqtt.connected()) {
if (mqtt.connect(WiFi.macAddress().c_str())) {
Serial.println("Terhubung ke Klenik");
langganan();
} else {
Serial.println("Broker gagal, coba lagi 3 detik");
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(RELAY, OUTPUT);
sensor.begin();
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir >= 5000) {
terakhir = millis();
sensor.requestTemperatures();
float suhu = sensor.getTempCByIndex(0);
if (suhu == DEVICE_DISCONNECTED_C) {
aturPemanas(false); // sensor lepas: lebih aman pemanas mati
mqtt.publish(TOPIK_LOG, "Sensor suhu tidak terbaca, pemanas dimatikan");
return;
}
if (suhu < target - 0.5) aturPemanas(true);
else if (suhu > target + 0.5) aturPemanas(false);
mqtt.publish(TOPIK_SUHU, String(suhu, 1).c_str());
if (suhu > 32) mqtt.publish(TOPIK_LOG, ("Air terlalu panas: " + String(suhu, 1) + " °C").c_str());
}
}Langkah 4: Pahami kodenya
DEVICE_DISCONNECTED_Cbernilai -127, tanda sensor tidak menjawab. Pemanas dimatikan demi keamanan.- Termostat dengan histeresis ±0,5 °C. Angka 0,5 bisa diperbesar kalau relay terlalu sering berpindah.
- Peringatan terpisah dari termostat: suhu di atas 32 °C berbahaya untuk kebanyakan ikan hias, misalnya saat akuarium terkena matahari langsung.