//library
#include <Wire.h> //Untuk komunikasi I2C, dalam hal ini untuk mengontrol LCD.
#include <LiquidCrystal_I2C.h> //mengatur tampilan LCD I2C
#include <NeuralNetwork.h> //librari untuk syaraf tiruan
NeuralNetwork *NN; //Inisialisasi objek Neural Network
const unsigned int layers[] = {3, 4, 1}; // Struktur jaringan saraf tiruan dengan 3 lapisan (3 input, 4 hidden layer, dan 1 output).
float *output; // Menyimpan hasil keluaran dari jaringan saraf tiruan
// Training data untuk mendeteksi kematangan buah
//Mendeklarasikan data latihan untuk jaringan saraf. Setiap baris mewakili warna RGB untuk sampel buah
const float inputs[4][3] = { //Matriks input yang berisi nilai warna untuk mendeteksi kematangan buah.
{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 KematanganBuah[4][1] = { //Matriks output yang berisi status kematangan buah;
{0}, // mentah
{0}, // mentah
{1}, // matang
{1} // matang
};
int buttonPin = 14; // Pin untuk tombol push
int ledMatangPin = 25; // Pin untuk LED buah matang
int ledMentahPin = 32; // Pin untuk LED buah mentah
bool newDataAvailable = false; // Variabel untuk menandai apakah data baru tersedia untuk ditampilkan.
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(buttonPin, INPUT_PULLUP); // Set pin tombol sebagai INPUT_PULLUP
pinMode(ledMatangPin, OUTPUT); // Set pin LED matang sebagai output
pinMode(ledMentahPin, OUTPUT); // Set pin LED mentah sebagai output
NN = new NeuralNetwork(layers, sizeof(layers) / sizeof(layers[0])); // inisialisasi objek neural network
lcd.setCursor(0,0);
lcd.print("Training...");
// training neural network
for (int epoch = 0; epoch < 10000; epoch++) { //JST dilatih selama 10000 iterasi
for (int i = 0; i < sizeof(inputs) / sizeof(inputs[0]); i++) {
NN->FeedForward(inputs[i]); // Feed forward propagation
NN->BackProp(KematanganBuah[i]); // Backpropagation
}
}
NN->print(); // menampilkan informasi JST ke serial monitor
lcd.clear();
lcd.print("tekan tombol");
}
void loop() {
if (digitalRead(buttonPin) == LOW) { // Saat tombol ditekan
lcd.clear();
lcd.print("Proses.....");
delay(1000);
lcd.clear();
//Menghasilkan nilai acak untuk warna merah, hijau, dan biru dalam rentang 0 hingga 1.
float merah = random(0, 255) / 255.0;
float hijau = random(0, 255) / 255.0;
float biru = random(0, 255) / 255.0;
// membuat input array
float input[3] = {merah, hijau, biru};
// JST menghitung keluaran berdasarkan input warna RGB
output = NN->FeedForward(input);
//menentukan kematangan buah berdasarkan nilai keluaran
int prediksiKematangan = output[0] >= 0.5 ? 1 : 0;
// Display on Serial Monitor
Serial.print("Merah: ");
Serial.print(merah);
Serial.print(" - Hijau: ");
Serial.print(hijau);
Serial.print(" - Biru: ");
Serial.print(biru);
Serial.print(" - Tingkat Kematangan: ");
if (prediksiKematangan == 0) {
Serial.println("Mentah");
} else {
Serial.println("Matang");
}
// Display the result on 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("Biru: ");
lcd.print(biru);
lcd.setCursor(0, 1);
lcd.print("Kondisi: ");
if (prediksiKematangan == 0) {
lcd.print("Mentah");
digitalWrite(ledMentahPin, HIGH); // Menyalakan LED untuk buah mentah
digitalWrite(ledMatangPin, LOW); // Mematikan LED untuk buah matang
} else {
lcd.print("Matang");
digitalWrite(ledMatangPin, HIGH); // Menyalakan LED untuk buah matang
digitalWrite(ledMentahPin, LOW); // Mematikan LED untuk buah mentah
}
newDataAvailable = true; // Set status data baru tersedia
}
// Reset status data baru tersedia setelah diproses
if (newDataAvailable) {
newDataAvailable = false;
delay(1000);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("tekan tombol");
lcd.setCursor(3,1);
lcd.print("kembali..");
// Mematikan kedua LED setelah selesai ditampilkan
digitalWrite(ledMatangPin, LOW);
digitalWrite(ledMentahPin, LOW);
}
}