#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <NeuralNetwork.h>
// Konfigurasi Neural Network
NeuralNetwork *NN;
const unsigned int layers[] = {3, 4, 1}; // Neural Network: 3 input, 4 hidden, 1 output
float *hasilPrediksi; // Hasil prediksi
const float masukan[4][3] = {
{0.1, 0.2, 0.3}, {0.4, 0.5, 0.6}, // Mentah
{0.7, 0.8, 0.9}, {0.2, 0.6, 0.4} // Matang
};
const float keluaranPelatihan[4][1] = {
{0}, {0}, // Mentah
{1}, {1} // Matang
};
// Konfigurasi Pin dan Perangkat
int buttonPin = 2; // Pin untuk tombol
int ledMentah = 4; // Pin LED untuk buah mentah
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD I2C dengan alamat 0x27
// Fungsi Setup
void setup() {
Serial.begin(9600);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Pelatihan NN..");
// Inisialisasi Neural Network
NN = new NeuralNetwork(layers, sizeof(layers) / sizeof(layers[0]));
// Latih Neural Network
for (int epoch = 0; epoch < 10000; epoch++) {
for (int i = 0; i < sizeof(masukan) / sizeof(masukan[0]); i++) {
NN->FeedForward(masukan[i]);
NN->BackProp(keluaranPelatihan[i]);
}
}
lcd.clear();
lcd.print("Tekan tombol");
// Konfigurasi tombol dan LED
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledMentah, OUTPUT);
// Pastikan LED dalam keadaan mati saat awal
digitalWrite(ledMentah, LOW);
}
// --- Fungsi Loop ---
void loop() {
if (digitalRead(buttonPin) == LOW) {
lcd.clear();
lcd.print("Proses...");
delay(1000);
// Generate nilai RGB acak
float merah = random(0, 255) / 255.0;
float hijau = random(0, 255) / 255.0;
float biru = random(0, 255) / 255.0;
// Prediksi menggunakan Neural Network
float masukanPrediksi[3] = {merah, hijau, biru};
hasilPrediksi = NN->FeedForward(masukanPrediksi);
int prediksiKematangan = hasilPrediksi[0] >= 0.5 ? 1 : 0;
// Tampilkan hasil di Serial Monitor
Serial.print("Merah:");
Serial.print(merah, 2);
Serial.print(" Hijau:");
Serial.print(hijau, 2);
Serial.print(" Biru:");
Serial.print(biru, 2);
Serial.print(" Prediksi: ");
Serial.println(prediksiKematangan == 0 ? "Mentah" : "Matang");
// Tampilkan hasil di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Merah:");
lcd.print(merah, 2);
lcd.print(" Hijau:");
lcd.print(hijau, 2);
lcd.setCursor(0, 1);
lcd.print("Biru:");
lcd.print(biru, 2);
lcd.print(" ");
lcd.print(prediksiKematangan == 0 ? "Mentah" : "Matang");
// Kendalikan LED berdasarkan prediksi
if (prediksiKematangan == 1) {
digitalWrite(ledMentah, LOW); // Matang
} else {
digitalWrite(ledMentah, HIGH); // Mentah
}
delay(3000); // Tampilkan hasil selama 3 detik
lcd.clear();
lcd.print("Tekan tombol");
}
}