#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <NeuralNetwork.h>
NeuralNetwork *NN;
// Modifikasi layer Neural Network menjadi 3 input neurons, 4 hidden neurons, dan 1 output neuron
const unsigned int layers[] = {3, 4, 1};
float *output; // Menyimpan nilai output dari jaringan saraf
// Data latih untuk mendeteksi tingkat kematangan buah: mentah, matang, busuk
const float inputs[6][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
{0.9, 0.8, 0.7}, // Busuk
{0.8, 0.9, 0.6} // Busuk
};
// Output yang diharapkan: 0 = Mentah, 1 = Matang, 2 = Busuk
const float expectedOutput[6][1] =
{
{0}, // Mentah
{0}, // Mentah
{1}, // Matang
{1}, // Matang
{2}, // Busuk
{2} // Busuk
};
int buttonPin = 2; // Pin untuk tombol push
bool DataBaruAda = false; // Status data baru
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inisialisasi LCD I2C
void setup()
{
Serial.begin(9600);
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Aktifkan backlight LCD
pinMode(buttonPin, INPUT_PULLUP); // Set tombol sebagai INPUT_PULLUP
// Inisialisasi Neural Network dengan layer
NN = new NeuralNetwork(layers, sizeof(layers) / sizeof(layers[0]));
lcd.setCursor(0,0);
lcd.print("Harap Bersabar");
// Melatih Neural Network
for (int Literasi = 0; Literasi < 10000; Literasi++)
{
for (int i = 0; i < sizeof(inputs) / sizeof(inputs[0]); i++)
{
NN->FeedForward(inputs[i]); // Feed forward dengan input
NN->BackProp(expectedOutput[i]); // Backpropagation dengan output yang diharapkan
}
}
NN->print(); // Tampilkan informasi jaringan saraf
lcd.clear();
lcd.print("Tekan Aja");
}
void loop()
{
if (digitalRead(buttonPin) == LOW)
{
lcd.clear();
lcd.print("Proses.....");
delay(1000);
lcd.clear();
// Menghasilkan warna acak
float Merah = random(0, 255) / 255.0;
float Hijau = random(0, 255) / 255.0;
float Kuning = random(0, 255) / 255.0;
// Input warna
float input[3] = {Merah, Hijau, Kuning};
// Feed forward input ke Neural Network
output = NN->FeedForward(input);
// Prediksi tingkat kematangan buah berdasarkan output
int PrediksiKematangan;
if (output[0] < 0.5)
{
PrediksiKematangan = 0; // Mentah
}
else if (output[0] < 1.5)
{
PrediksiKematangan = 1; // Matang
}
else
{
PrediksiKematangan = 2; // Busuk
}
// Tampilkan prediksi di serial monitor
Serial.print("Merah: ");
Serial.print(Merah);
Serial.print(" - Hijau: ");
Serial.print(Hijau);
Serial.print(" - Kuning: ");
Serial.print(Kuning);
Serial.print(" - Prediksi Kematangan: ");
if (PrediksiKematangan == 0)
{
Serial.println("Mentah");
}
else if (PrediksiKematangan == 1)
{
Serial.println("Matang");
}
else
{
Serial.println("Busuk");
}
// Tampilkan hasil prediksi pada 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);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Kuning: ");
lcd.print(Kuning);
lcd.setCursor(0, 1);
lcd.print("Kematangan: ");
if ({PrediksiKematangan} == 0)
{
lcd.print("Mentah");
}
else if (PrediksiKematangan == 1)
{
lcd.print("Matang");
}
else
{
lcd.print("Busuk");
}
DataBaruAda = true;
}
// Reset status setelah data diproses
if (DataBaruAda)
{
DataBaruAda = false;
delay(1000);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("tekan tombol");
lcd.setCursor(3,1);
lcd.print("Lagi");
}
}