#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <NeuralNetwork.h>
NeuralNetwork *NN;
const unsigned int lapisan[] = {3, 4, 1}; // 3 lapisan: 3 input neuron (nilai warna), 4 neuron tersembunyi, 1 neuron keluaran
float *keluaran; // Nilai lapisan keluaran
// Data pelatihan untuk deteksi kematangan buah
const float masukan[4][3] = {
{0.1, 0.2, 0.3}, // Mentah
{0.4, 0.5, 0.6}, // Mentah
{0.7, 0.8, 0.9}, // Matang
{0.2, 0.6, 0.4} // Matang
};
const float keluaranDiharapkan[4][1] = {
{0}, // Mentah
{0}, // Mentah
{1}, // Matang
{1} // Matang
};
int pinTombol = 0; // Pin untuk tombol push (misalnya GPIO 0 pada ESP32)
int pinPotensiometer = 34; // Pin untuk potensiometer (analog, GPIO 34 pada ESP32)
int pinLED = 13; // Pin untuk LED (misalnya GPIO 13 pada ESP32)
bool dataBaruTersedia = false; // Status data baru yang tersedia
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inisialisasi objek LCD I2C dengan alamat 0x27 dan ukuran 16x2
void setup() {
Serial.begin(9600);
lcd.init(); // Inisialisasi LCD I2C dengan ukuran 16x2
lcd.backlight(); // Aktifkan backlight LCD
pinMode(pinTombol, INPUT_PULLUP); // Set pin tombol sebagai INPUT_PULLUP
pinMode(pinLED, OUTPUT); // Set pin LED sebagai OUTPUT
NN = new NeuralNetwork(lapisan, sizeof(lapisan) / sizeof(lapisan[0])); // Inisialisasi objek NeuralNetwork
lcd.setCursor(0, 0);
lcd.print("Training...");
// Melatih jaringan saraf tiruan
for (int epoch = 0; epoch < 10000; epoch++) {
for (int i = 0; i < sizeof(masukan) / sizeof(masukan[0]); i++) {
NN->FeedForward(masukan[i]); // Proses feed forward
NN->BackProp(keluaranDiharapkan[i]); // Backpropagation dengan keluaran diharapkan
}
}
NN->print();
lcd.clear();
lcd.print("tekan tombol");
}
void loop() {
// Baca nilai potensiometer dan konversi menjadi ambang batas kematangan (0.0 hingga 1.0)
float ambangKematangan = analogRead(pinPotensiometer) / 4095.0; // ESP32 memiliki resolusi ADC 12-bit (0-4095)
if (digitalRead(pinTombol) == LOW) { // Saat tombol ditekan
lcd.clear();
lcd.print("Proses.....");
delay(1000);
lcd.clear();
// Hasilkan nilai warna acak
float merah = random(0, 255) / 255.0;
float hijau = random(0, 255) / 255.0;
float biru = random(0, 255) / 255.0;
// Buat array input
float masukan[3] = {merah, hijau, biru};
// Feed forward ke jaringan saraf tiruan untuk mendapatkan keluaran
keluaran = NN->FeedForward(masukan);
// Tentukan kematangan buah berdasarkan ambang batas dari potensiometer
int prediksiKematangan = keluaran[0] >= ambangKematangan ? 1 : 0;
// Tampilkan prediksi di Serial Monitor
Serial.print("Merah: ");
Serial.print(merah);
Serial.print(" - Hijau: ");
Serial.print(hijau);
Serial.print(" - Biru: ");
Serial.print(biru);
Serial.print(" - Prediksi Kematangan: ");
if (prediksiKematangan == 0) {
Serial.println("Mentah");
digitalWrite(pinLED, LOW); // Matikan LED jika buah mentah
} else {
Serial.println("Matang");
digitalWrite(pinLED, HIGH); // Nyalakan LED jika buah matang
}
// Tampilkan hasil di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Merah: ");
lcd.print(merah);
lcd.setCursor(0, 1);
lcd.print("Hijau: ");
lcd.print(hijau);
delay(2000); // Tunggu 2 detik untuk menampilkan nilai warna
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Biru: ");
lcd.print(biru);
lcd.setCursor(0, 1);
lcd.print("Kematangan: ");
if (prediksiKematangan == 0) {
lcd.print("Mentah");
} else {
lcd.print("Matang");
}
dataBaruTersedia = true; // Set status data baru tersedia
}
// Reset status data baru tersedia setelah diproses
if (dataBaruTersedia) {
dataBaruTersedia = false;
delay(1000);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("tekan tombol");
lcd.setCursor(3, 1);
lcd.print("kembali..");
digitalWrite(pinLED, LOW); // Matikan LED setelah tampilan selesai
}
}