#include <Arduino.h>
#include "model.h" // File model TinyML (.h hasil ekspor dari Colab)
#include <EloquentTinyML.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// --- Konfigurasi Model TinyML ---
#define N_INPUTS 3
#define N_OUTPUTS 1
#define TENSOR_ARENA_SIZE 2048
Eloquent::TinyML::TfLite<N_INPUTS, N_OUTPUTS, TENSOR_ARENA_SIZE> ml;
// --- Konfigurasi DHT22 ---
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// --- Konfigurasi Soil Moisture ---
#define SOIL_PIN 34
// --- Konfigurasi LCD I2C 16x2 ---
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ganti ke 0x3F jika LCD tidak muncul
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
lcd.clear();
delay(1000);
Serial.println("Memulai TinyML Model...");
ml.begin(model_tflite);
}
void loop() {
// --- Baca sensor ---
float suhu = dht.readTemperature(); // dalam °C
float kelembaban_udara = dht.readHumidity(); // dalam %
int soil_raw = analogRead(SOIL_PIN); // nilai 0–1023
// --- Cek validitas pembacaan DHT ---
if (isnan(suhu) || isnan(kelembaban_udara)) {
Serial.println("Gagal membaca dari sensor DHT22!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sensor DHT error");
delay(2000);
return;
}
// --- Konversi soil moisture ke persen ---
float kelembaban_tanah = map(soil_raw, 1023, 0, 0, 100); // 0% kering, 100% basah
// --- Prediksi TinyML ---
float input[N_INPUTS] = {suhu, kelembaban_udara, kelembaban_tanah};
float output = ml.predict(input);
// --- Tampilkan di Serial Monitor ---
Serial.print("Suhu: "); Serial.print(suhu); Serial.println(" °C");
Serial.print("Kelembaban Udara: "); Serial.print(kelembaban_udara); Serial.println(" %");
Serial.print("Kelembaban Tanah: "); Serial.print(kelembaban_tanah); Serial.println(" %");
Serial.print("Output Model: "); Serial.println(output);
if (output > 0.5) {
Serial.println("Status: Menyiram");
} else {
Serial.println("Status: Tidak Menyiram");
}
// --- Tampilkan di LCD I2C ---
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("KU:");
lcd.print((int)kelembaban_udara);
lcd.print(" SU:");
lcd.print((int)suhu);
lcd.setCursor(0, 1);
lcd.print("KT:");
lcd.print((int)kelembaban_tanah);
if (output > 0.5) {
lcd.print(" ON");
} else {
lcd.print(" OFF");
}
delay(5000); // Delay 5 detik sebelum pengulangan
}