#include <WiFi.h>
#include <DHT.h>
#include <RTClib.h>
#include <Wire.h>
#include <ArduinoJson.h>
// Pin definitions
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define TRIG_PIN 5
#define ECHO_PIN 18
#define PULSE_SENSOR_PIN A0 // Simulasi dengan analog input
#define LOAD_CELL_PIN A3 // Simulasi load cell dengan potensiometer
#define LED_HIJAU 2
#define LED_KUNING 25
#define LED_MERAH 26
#define BUZZER_PIN 27
// Sensor objects
DHT dht(DHT_PIN, DHT_TYPE);
RTC_DS3231 rtc;
// Variables untuk monitoring kambing
float suhuLingkungan, kelembabanLingkungan;
long jarak;
int beratPakan;
int detakJantung;
bool kambing_hadir = false;
bool kambing_sudah_makan = false;
String status_kesehatan = "Normal";
// Jadwal makan kambing (3x sehari)
int jam_makan[3] = {6, 12, 18}; // 06:00, 12:00, 18:00
bool sudah_makan_hari_ini[3] = {false, false, false};
// Data untuk machine learning
struct KambingData {
float suhu;
float kelembaban;
int detak_jantung;
int berat_pakan_tersisa;
bool sudah_makan;
int jam_terakhir_makan;
String timestamp;
};
// Threshold values untuk kambing
const float SUHU_NORMAL_MIN = 38.0; // Suhu normal kambing 38-40°C
const float SUHU_NORMAL_MAX = 40.0;
const int DETAK_NORMAL_MIN = 70; // Detak jantung kambing 70-90 bpm
const int DETAK_NORMAL_MAX = 90;
const int JARAK_DETEKSI = 50; // Jarak deteksi kambing di palung (cm)
const int BERAT_PAKAN_MINIMUM = 20; // Minimum pakan yang harus tersedia
void setup() {
Serial.begin(115200);
// Initialize pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_HIJAU, OUTPUT);
pinMode(LED_KUNING, OUTPUT);
pinMode(LED_MERAH, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Initialize sensors
dht.begin();
// Initialize RTC
if (!rtc.begin()) {
Serial.println("RTC tidak ditemukan!");
while (1);
}
// Set waktu jika RTC belum diset (untuk simulasi)
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Serial.println("=== SISTEM MONITORING KAMBING IoT ===");
Serial.println("Sistem siap digunakan!");
// Test LED dan buzzer
testLedBuzzer();
}
void loop() {
// Baca semua sensor
bacaSensor();
// Cek jadwal makan
cekJadwalMakan();
// Analisis kesehatan kambing
analisisKesehatan();
// Update status LED
updateStatusLed();
// Kirim data untuk ML processing
kirimDataML();
// Display informasi
tampilkanInfo();
delay(5000); // Update setiap 5 detik
}
void bacaSensor() {
// Baca DHT22
suhuLingkungan = dht.readTemperature();
kelembabanLingkungan = dht.readHumidity();
// Baca Ultrasonic (deteksi keberadaan kambing)
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
jarak = duration * 0.034 / 2;
// Deteksi keberadaan kambing
kambing_hadir = (jarak < JARAK_DETEKSI && jarak > 5);
// Baca simulasi detak jantung (analog input)
int rawPulse = analogRead(PULSE_SENSOR_PIN);
detakJantung = map(rawPulse, 0, 4095, 60, 100); // Simulasi 60-100 bpm
// Baca simulasi berat pakan (potensiometer)
int rawWeight = analogRead(LOAD_CELL_PIN);
beratPakan = map(rawWeight, 0, 4095, 0, 100); // 0-100% kapasitas pakan
}
void cekJadwalMakan() {
DateTime now = rtc.now();
int jam_sekarang = now.hour();
// Reset status makan setiap hari baru
static int hari_terakhir = now.day();
if (now.day() != hari_terakhir) {
for (int i = 0; i < 3; i++) {
sudah_makan_hari_ini[i] = false;
}
hari_terakhir = now.day();
}
// Cek apakah sudah waktu makan
for (int i = 0; i < 3; i++) {
if (jam_sekarang == jam_makan[i] && !sudah_makan_hari_ini[i]) {
Serial.println(">>> WAKTU MAKAN KAMBING! <<<");
bunyikanAlarm(3); // Bunyi 3x
// Cek apakah kambing datang makan dalam 30 menit
unsigned long waktu_mulai = millis();
bool kambing_datang = false;
while (millis() - waktu_mulai < 1800000) { // 30 menit = 1800000 ms
bacaSensor();
if (kambing_hadir && beratPakan < 80) { // Pakan berkurang
sudah_makan_hari_ini[i] = true;
kambing_sudah_makan = true;
kambing_datang = true;
Serial.println("Kambing sudah makan pada jadwal ke-" + String(i+1));
break;
}
delay(10000); // Cek setiap 10 detik
}
if (!kambing_datang) {
Serial.println("WARNING: Kambing tidak makan sesuai jadwal!");
bunyikanAlarm(5); // Alarm panjang
}
}
}
}
void analisisKesehatan() {
// Reset status
status_kesehatan = "Normal";
bool ada_masalah = false;
// Cek suhu tubuh kambing (estimasi dari suhu lingkungan + offset)
float estimasi_suhu_tubuh = suhuLingkungan + 10; // Estimasi suhu tubuh
if (estimasi_suhu_tubuh < SUHU_NORMAL_MIN || estimasi_suhu_tubuh > SUHU_NORMAL_MAX) {
status_kesehatan = "Demam/Hipotermia";
ada_masalah = true;
}
// Cek detak jantung
if (detakJantung < DETAK_NORMAL_MIN || detakJantung > DETAK_NORMAL_MAX) {
status_kesehatan = "Detak Jantung Abnormal";
ada_masalah = true;
}
// Cek pakan
if (beratPakan < BERAT_PAKAN_MINIMUM) {
status_kesehatan = "Pakan Habis";
ada_masalah = true;
}
// Cek kelembaban lingkungan
if (kelembabanLingkungan > 80 || kelembabanLingkungan < 40) {
status_kesehatan = "Lingkungan Tidak Optimal";
ada_masalah = true;
}
// Machine Learning prediction (simulasi)
String prediksi_ml = prediksiKesehatanML();
if (ada_masalah) {
bunyikanAlarm(2);
Serial.println("PERINGATAN: " + status_kesehatan);
}
}
String prediksiKesehatanML() {
// Simulasi algoritma machine learning sederhana
// Dalam implementasi nyata, ini akan mengirim data ke server ML
float skor_kesehatan = 100;
// Faktor suhu
float estimasi_suhu = suhuLingkungan + 10;
if (estimasi_suhu < SUHU_NORMAL_MIN || estimasi_suhu > SUHU_NORMAL_MAX) {
skor_kesehatan -= 30;
}
// Faktor detak jantung
if (detakJantung < DETAK_NORMAL_MIN || detakJantung > DETAK_NORMAL_MAX) {
skor_kesehatan -= 25;
}
// Faktor makan
int makan_hari_ini = 0;
for (int i = 0; i < 3; i++) {
if (sudah_makan_hari_ini[i]) makan_hari_ini++;
}
if (makan_hari_ini < 2) {
skor_kesehatan -= 20;
}
// Faktor lingkungan
if (kelembabanLingkungan < 40 || kelembabanLingkungan > 80) {
skor_kesehatan -= 15;
}
// Prediksi berdasarkan skor
if (skor_kesehatan >= 90) return "Sehat - Siap Panen dalam 1-2 minggu";
else if (skor_kesehatan >= 70) return "Sehat - Perlu monitoring rutin";
else if (skor_kesehatan >= 50) return "Perlu Perhatian - Cek kesehatan";
else return "Sakit - Segera hubungi dokter hewan";
}
void updateStatusLed() {
// Reset semua LED
digitalWrite(LED_HIJAU, LOW);
digitalWrite(LED_KUNING, LOW);
digitalWrite(LED_MERAH, LOW);
if (status_kesehatan == "Normal" && kambing_sudah_makan) {
digitalWrite(LED_HIJAU, HIGH); // Sehat
} else if (status_kesehatan.indexOf("Tidak Optimal") != -1 || !kambing_sudah_makan) {
digitalWrite(LED_KUNING, HIGH); // Perhatian
} else {
digitalWrite(LED_MERAH, HIGH); // Bahaya
}
}
void bunyikanAlarm(int jumlah) {
for (int i = 0; i < jumlah; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(500);
digitalWrite(BUZZER_PIN, LOW);
delay(300);
}
}
void kirimDataML() {
// Simulasi pengiriman data untuk machine learning
DynamicJsonDocument doc(1024);
DateTime now = rtc.now();
doc["timestamp"] = String(now.year()) + "-" + String(now.month()) + "-" + String(now.day()) +
" " + String(now.hour()) + ":" + String(now.minute());
doc["suhu_lingkungan"] = suhuLingkungan;
doc["kelembaban"] = kelembabanLingkungan;
doc["estimasi_suhu_tubuh"] = suhuLingkungan + 10;
doc["detak_jantung"] = detakJantung;
doc["berat_pakan"] = beratPakan;
doc["kambing_hadir"] = kambing_hadir;
doc["sudah_makan"] = kambing_sudah_makan;
doc["status_kesehatan"] = status_kesehatan;
doc["prediksi_ml"] = prediksiKesehatanML();
String jsonString;
serializeJson(doc, jsonString);
Serial.println("DATA ML: " + jsonString);
}
void tampilkanInfo() {
DateTime now = rtc.now();
Serial.println("\n=== STATUS MONITORING KAMBING ===");
Serial.printf("Waktu: %02d/%02d/%04d %02d:%02d:%02d\n",
now.day(), now.month(), now.year(),
now.hour(), now.minute(), now.second());
Serial.println("--- SENSOR DATA ---");
Serial.printf("Suhu Lingkungan: %.1f°C\n", suhuLingkungan);
Serial.printf("Estimasi Suhu Tubuh: %.1f°C\n", suhuLingkungan + 10);
Serial.printf("Kelembaban: %.1f%%\n", kelembabanLingkungan);
Serial.printf("Detak Jantung: %d bpm\n", detakJantung);
Serial.printf("Jarak Deteksi: %ld cm\n", jarak);
Serial.printf("Berat Pakan: %d%%\n", beratPakan);
Serial.println("--- STATUS KAMBING ---");
Serial.printf("Kambing Hadir: %s\n", kambing_hadir ? "Ya" : "Tidak");
Serial.printf("Status Kesehatan: %s\n", status_kesehatan.c_str());
Serial.printf("Prediksi ML: %s\n", prediksiKesehatanML().c_str());
Serial.println("--- JADWAL MAKAN ---");
for (int i = 0; i < 3; i++) {
Serial.printf("Jadwal %d (%02d:00): %s\n",
i+1, jam_makan[i],
sudah_makan_hari_ini[i] ? "Sudah Makan" : "Belum Makan");
}
Serial.println("=====================================\n");
}
void testLedBuzzer() {
Serial.println("Testing LED dan Buzzer...");
digitalWrite(LED_HIJAU, HIGH);
delay(500);
digitalWrite(LED_HIJAU, LOW);
digitalWrite(LED_KUNING, HIGH);
delay(500);
digitalWrite(LED_KUNING, LOW);
digitalWrite(LED_MERAH, HIGH);
delay(500);
digitalWrite(LED_MERAH, LOW);
digitalWrite(BUZZER_PIN, HIGH);
delay(200);
digitalWrite(BUZZER_PIN, LOW);
Serial.println("Test selesai!");
}