#include <LiquidCrystal_I2C.h>
#include <math.h>
// #include<LiquidCrystal.h>
// C++ code
//
// #include <Adafruit_LiquidCrystal.h>
#define MAX_DATA 100
int seconds = 0;
// Adafruit_LiquidCrystal lcd_1(0);
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Struktur untuk menyimpan data poin
typedef struct Point {
float x;
float y;
int label; // Label kelas
} Point;
// Fungsi untuk menghitung jarak Euclidean antara dua poin
float euclideanDistance(struct Point a, struct Point b) {
return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
}
// Fungsi K-NN untuk menentukan label kelas berdasarkan data pelatihan
int knn(struct Point data[], int dataSize, struct Point testPoint, int k) {
float distances[MAX_DATA];
int labels[MAX_DATA];
for (int i = 0; i < dataSize; i++) {
distances[i] = euclideanDistance(data[i], testPoint);
labels[i] = data[i].label;
}
// Bubble sort berdasarkan jarak
for (int i = 0; i < dataSize - 1; i++) {
for (int j = 0; j < dataSize - i - 1; j++) {
if (distances[j] > distances[j + 1]) {
// Menukar jarak
float tempDist = distances[j];
distances[j] = distances[j + 1];
distances[j + 1] = tempDist;
// Menukar label
int tempLabel = labels[j];
labels[j] = labels[j + 1];
labels[j + 1] = tempLabel;
}
}
}
// Menghitung frekuensi dari K tetangga terdekat
int countLabels[MAX_DATA] = {0};
for (int i = 0; i < k; i++) {
countLabels[labels[i]]++;
}
// Menentukan label kelas dengan frekuensi terbanyak
int maxCount = 0, mostFrequentLabel = -1;
for (int i = 0; i < MAX_DATA; i++) {
if (countLabels[i] > maxCount) {
maxCount = countLabels[i];
mostFrequentLabel = i;
}
}
return mostFrequentLabel;
}
void setup() {
// Memulai komunikasi serial
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.begin(16, 2);
// lcd_1.print("hello world");
lcd.setBacklight(1);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("HELLO WORLD !! ");
delay(1000);
lcd.clear();
// Data pelatihan
Point data[] = {
{2.0, 3.0, 0}, {5.0, 4.0, 0},
{8.0, 1.0, 0}, {9.0, 2.0, 0},
{9.0, 6.0, 1}, {4.0, 7.0, 1},
{7.0, 2.0, 1}, {6.0, 2.0, 1}
};
int dataSize = 6;
// Titik uji
Point testPoint = {5.0, 3.0, -1};
// Nilai K
int k = 3;
delay(100);
// Menjalankan algoritma K-NN
int result = knn(data, dataSize, testPoint, k);
delay(100);
// Menampilkan hasil K-NN melalui LCD I2C
// lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TEST = ");
// lcd.print("%.1f", testPoint.x);
lcd.print(testPoint.x);
lcd.setCursor(11, 0);
lcd.print(" & ");
// lcd.print("%.1f", testPoint.y);
lcd.print(testPoint.y);
lcd.setCursor(0, 1);
lcd.print("RESULT = ");
lcd.print(result);
lcd.print(" CLASS ");
delay(100);
// Menampilkan hasil
// Serial.print("Test Point (");
// Serial.print(testPoint.x);
// Serial.print(", ");
// Serial.print(testPoint.y);
// Serial.print(") belongs to class ");
// Serial.println(result);
}
void loop() {
// Tidak ada kode yang diperlukan dalam loop
}