#include <HardwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// --- KONFIGURASI LCD ---
// Alamat I2C umumnya 0x27. Jika layar gelap, LCD.init() akan gagal.
LiquidCrystal_I2C lcd(0x27, 16, 2);
// --- KONFIGURASI SERIAL KOMUNIKASI ---
// Kita gunakan Serial2.
// Pin 16 (RX) menerima data dari STM32 A9 (TX).
// Pin 17 (TX) mengirim data ke STM32 A10 (RX).
HardwareSerial STM32Serial(2);
// Variabel Data
String dataMasuk;
float t_udara = 0.0;
float h_udara = 0.0;
float t_air = 0.0;
int tanah = 0;
int sisa_air = 0;
String status_pompa = "OFF";
// Timer untuk SlideShow LCD
unsigned long prevMillis = 0;
int halaman = 1;
void setup() {
// Serial Monitor untuk debug di komputer
Serial.begin(115200);
// Serial Komunikasi dengan STM32 (Baudrate 9600 WAJIB SAMA dengan STM32)
STM32Serial.begin(9600, SERIAL_8N1, 16, 17);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Tampilan Awal
lcd.setCursor(0, 0);
lcd.print("MENUNGGU DATA");
lcd.setCursor(0, 1);
lcd.print("DARI STM32...");
delay(1000);
}
void loop() {
// --- 1. TERIMA DATA DARI STM32 ---
if (STM32Serial.available()) {
// Baca data sampai baris baru (\n)
dataMasuk = STM32Serial.readStringUntil('\n');
dataMasuk.trim(); // Hapus spasi/enter sisa
// Tampilkan di Serial Monitor bawah (untuk pengecekan)
// Serial.println("Mentah: " + dataMasuk);
// Pecah data CSV menjadi variabel
parseData(dataMasuk);
}
// --- 2. TAMPILKAN DI LCD (Ganti Halaman Tiap 3 Detik) ---
if (millis() - prevMillis > 3000) {
prevMillis = millis();
// Ganti nomor halaman
if (halaman == 1) halaman = 2;
else halaman = 1;
updateLCD();
}
}
void updateLCD() {
lcd.clear();
if (halaman == 1) {
// --- HALAMAN 1: Lingkungan & Tanah ---
// Baris 1: Suhu Udara & Lembab
lcd.setCursor(0, 0);
lcd.printf("Udr:%.1fC H:%.0f%%", t_udara, h_udara);
// Baris 2: Kondisi Tanah
lcd.setCursor(0, 1);
// Tentukan status teks tanah
String ketTanah = "NORML";
if(tanah > 60) ketTanah = "KERING";
else if(tanah < 30) ketTanah = "BASAH";
lcd.printf("Tnh:%d%% %s", tanah, ketTanah.c_str());
}
else {
// --- HALAMAN 2: Tangki Air & Pompa ---
// Baris 1: Suhu Air & Sisa Air
lcd.setCursor(0, 0);
lcd.printf("Air:%.1fC Sisa:%d", t_air, sisa_air);
// Baris 2: Status Pompa
lcd.setCursor(0, 1);
lcd.printf("Pmp:%s", status_pompa.c_str());
// Peringatan Tambahan jika air habis (< 2cm)
if(sisa_air < 2) {
lcd.print(" HABIS!");
}
}
}
void parseData(String data) {
// Format Data dari STM32:
// t_udara,h_udara,t_air,tanah,sisa_air,status_pompa
int k1 = data.indexOf(',');
int k2 = data.indexOf(',', k1 + 1);
int k3 = data.indexOf(',', k2 + 1);
int k4 = data.indexOf(',', k3 + 1);
int k5 = data.indexOf(',', k4 + 1);
// Pastikan data tidak rusak (harus ada 5 koma)
if (k5 > 0) {
t_udara = data.substring(0, k1).toFloat();
h_udara = data.substring(k1 + 1, k2).toFloat();
t_air = data.substring(k2 + 1, k3).toFloat();
tanah = data.substring(k3 + 1, k4).toInt();
sisa_air = data.substring(k4 + 1, k5).toInt();
status_pompa = data.substring(k5 + 1);
}
}