Anak ayam (DOC) butuh kandang hangat yang suhunya turun bertahap setiap minggu. Pilih umur ayam di HP, dan ESP32 mengatur lampu pemanas lewat relay supaya suhu kandang sesuai: 32 °C di minggu pertama, lalu makin sejuk sampai minggu keempat.
Inti proyek ini termostat (seperti proyek 069), tetapi targetnya diambil dari tabel suhu per minggu umur. Peternak cukup menggeser slider Umur, dan target langsung berubah. Lampu menyala kalau suhu 1 °C di bawah target dan mati 1 °C di atas target.
Ada keputusan keselamatan yang berbeda dari proyek akuarium. Di sini, kalau sensor gagal dibaca 3 kali berturut-turut, lampu justru dinyalakan, karena anak ayam lebih cepat mati kedinginan daripada kepanasan sesaat. Pengaman yang benar selalu bergantung pada apa yang dijaga.
Keamanan: lampu pemanas 220V harus dipasang dengan fitting dan kabel yang layak, jauh dari sekam kering, oleh orang yang paham listrik.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Sensor DHT22 (AM2302) + kabel | 1 | Rp32.000 |
| 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) | Rp127.500 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| DHT22 (AM2302) VCC | → | 3V3 | merah |
| DHT22 (AM2302) DATA | → | D4 GPIO4 | hijau |
| DHT22 (AM2302) 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 p148.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 |
|---|---|---|
| Slider Output Umur Ayam (minggu) | ichibot/KODE/p148/minggu | 1–4 |
| Gauge Suhu Kandang | ichibot/KODE/p148/suhu | 20–40 °C |
| Gauge Target Suhu | ichibot/KODE/p148/target | 20–40 °C |
| Indikator Boolean Lampu Pemanas | ichibot/KODE/p148/lampu | ON = 1 “MENYALA”, OFF = 0 |
| Gauge Kelembapan | ichibot/KODE/p148/lembap | 0–100 % |
| Text Log Peringatan | ichibot/KODE/p148/log | menampilkan teks masuk |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary), DHT sensor library (Adafruit), Adafruit Unified Sensor. 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 148 - Kandang Ayam Pintar: Suhu + Lampu Pemanas
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.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_LAMPU = "ichibot/budi1234/p148/lampu";
const char* TOPIK_TARGET = "ichibot/budi1234/p148/target";
const char* TOPIK_MINGGU = "ichibot/budi1234/p148/minggu";
const char* TOPIK_LOG = "ichibot/budi1234/p148/log";
const char* TOPIK_SUHU = "ichibot/budi1234/p148/suhu";
const char* TOPIK_LEMBAP = "ichibot/budi1234/p148/lembap";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
DHT dht(4, DHT22);
const int LAMPU = 26;
// suhu ideal anak ayam (DOC) per minggu umur: minggu 1 = 32 °C lalu turun ±3 °C per minggu
const float SUHU_MINGGU[] = {32, 29, 26, 24};
int minggu = 1;
bool lampu = false;
int gagalBaca = 0;
unsigned long terakhir = 0;
float target() { return SUHU_MINGGU[constrain(minggu, 1, 4) - 1]; }
void aturLampu(bool v) {
if (v == lampu) return;
lampu = v;
digitalWrite(LAMPU, v ? HIGH : LOW);
mqtt.publish(TOPIK_LAMPU, 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];
minggu = constrain(p.toInt(), 1, 4);
mqtt.publish(TOPIK_TARGET, String(target(), 0).c_str(), true);
}
void langganan() {
mqtt.subscribe(TOPIK_MINGGU);
}
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(LAMPU, OUTPUT);
dht.begin();
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir < 10000) return;
terakhir = millis();
float suhu = dht.readTemperature(), lembap = dht.readHumidity();
if (isnan(suhu)) {
if (++gagalBaca == 3) { // sensor rusak: lampu dinyalakan supaya anak ayam tidak kedinginan
aturLampu(true);
mqtt.publish(TOPIK_LOG, "Sensor suhu tidak terbaca! Lampu dinyalakan untuk jaga-jaga, mohon dicek");
}
return;
}
gagalBaca = 0;
if (suhu < target() - 1) aturLampu(true);
else if (suhu > target() + 1) aturLampu(false);
if (suhu > target() + 5) mqtt.publish(TOPIK_LOG, ("Kandang terlalu panas: " + String(suhu, 1) + " °C").c_str());
mqtt.publish(TOPIK_SUHU, String(suhu, 1).c_str());
mqtt.publish(TOPIK_LEMBAP, String(lembap, 0).c_str());
}Langkah 4: Pahami kodenya
- Tabel target per minggu. Angka ini panduan umum, jadi sesuaikan dengan saran penyuluh atau pemasok DOC-mu.
- Keputusan "gagal aman" (fail-safe) yang disesuaikan dengan kebutuhan hewan.
- Minggu 1-4 diubah ke nomor array 0-3.
constrain()menjaga supaya tidak keluar dari tabel.