Program untuk mendeteksi permen dengan berbagai warna menggunakan Arduino, sensor TCS3200, dan LCD I2C. Program ini akan mendeteksi warna permen (merah, jingga, kuning, hijau, biru, nila, dan ungu) dan menampilkan nama warna yang terdeteksi di layar LCD.
Komponen yang Diperlukan
Arduino Uno
Sensor Warna TCS3200
LCD I2C (16x2 atau 20x4)
Kabel Jumper
Dudukan untuk sensor dan LCD
Skema Rangkaian
TCS3200 ke Arduino:
VCC
->5V
GND
->GND
S0
-> Pin Digital8
S1
-> Pin Digital9
S2
-> Pin Digital10
S3
-> Pin Digital11
OUT
-> Pin Digital12
LCD I2C ke Arduino:
VCC
->5V
GND
->GND
SDA
-> Pin AnalogA4
SCL
-> Pin AnalogA5
Kalibrasi Nilai Warna
Sebelum menggunakan program utama, Anda perlu mengukur nilai frekuensi RGB untuk setiap warna permen. Nilai ini akan menjadi acuan untuk mendeteksi warna.
Unggah kode kalibrasi TCS3200 ke Arduino dan buka Serial Monitor.
Letakkan permen dengan warna yang berbeda-beda di bawah sensor.
Catat nilai R, G, B yang ditampilkan untuk setiap warna.
Berikut adalah contoh nilai kalibrasi yang mungkin Anda dapatkan:
Warna | Merah | Jingga | Kuning | Hijau | Biru | Nila | Ungu |
R | 80 | 70 | 65 | 40 | 25 | 35 | 50 |
G | 35 | 50 | 60 | 70 | 40 | 30 | 20 |
B | 35 | 25 | 20 | 40 | 80 | 70 | 60 |
Program Arduino
Pastikan Anda telah menginstal library LiquidCrystal_I2C.h
melalui Library Manager di Arduino IDE. Salin dan tempel kode berikut ke Arduino IDE, dan ubah nilai kalibrasi di bagian #define
sesuai dengan hasil kalibrasi Anda.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definisikan pin sensor TCS3200
#define S0 8
#define S1 9
#define S2 10
#define S3 11
#define OUT 12
// Definisikan nilai kalibrasi (ubah dengan nilai Anda)
#define R_MERAH 80
#define G_MERAH 35
#define B_MERAH 35
#define R_JINGGA 70
#define G_JINGGA 50
#define B_JINGGA 25
#define R_KUNING 65
#define G_KUNING 60
#define B_KUNING 20
#define R_HIJAU 40
#define G_HIJAU 70
#define B_HIJAU 40
#define R_BIRU 25
#define G_BIRU 40
#define B_BIRU 80
#define R_NILA 35
#define G_NILA 30
#define B_NILA 70
#define R_UNGU 50
#define G_UNGU 20
#define B_UNGU 60
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ubah alamat I2C jika perlu
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(OUT, INPUT);
// Mengatur skala frekuensi ke 100%
digitalWrite(S0, HIGH);
digitalWrite(S1, HIGH);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Detektor Warna");
lcd.setCursor(0, 1);
lcd.print("Siap!");
delay(2000);
}
void loop() {
// Bersihkan layar
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mendeteksi...");
// Baca nilai frekuensi R, G, B
int redFrequency = readColor(LOW, LOW);
int greenFrequency = readColor(HIGH, HIGH);
int blueFrequency = readColor(LOW, HIGH);
// Tentukan warna
String detectedColor = recognizeColor(redFrequency, greenFrequency, blueFrequency);
// Tampilkan hasil di LCD
lcd.setCursor(0, 1);
lcd.print(detectedColor);
delay(1000);
}
// Fungsi untuk membaca frekuensi warna
int readColor(int s2, int s3) {
digitalWrite(S2, s2);
digitalWrite(S3, s3);
return pulseIn(OUT, LOW);
}
// Fungsi untuk mengenali warna
String recognizeColor(int r, int g, int b) {
if (isColor(r, g, b, R_MERAH, G_MERAH, B_MERAH, 10)) {
return "Merah";
} else if (isColor(r, g, b, R_JINGGA, G_JINGGA, B_JINGGA, 10)) {
return "Jingga";
} else if (isColor(r, g, b, R_KUNING, G_KUNING, B_KUNING, 10)) {
return "Kuning";
} else if (isColor(r, g, b, R_HIJAU, G_HIJAU, B_HIJAU, 10)) {
return "Hijau";
} else if (isColor(r, g, b, R_BIRU, G_BIRU, B_BIRU, 10)) {
return "Biru";
} else if (isColor(r, g, b, R_NILA, G_NILA, B_NILA, 10)) {
return "Nila";
} else if (isColor(r, g, b, R_UNGU, G_UNGU, B_UNGU, 10)) {
return "Ungu";
} else {
return "Tidak Dikenali";
}
}
// Fungsi bantu untuk membandingkan warna
bool isColor(int r, int g, int b, int r_ref, int g_ref, int b_ref, int tolerance) {
return abs(r - r_ref) < tolerance &&
abs(g - g_ref) < tolerance &&
abs(b - b_ref) < tolerance;
}
Catatan Penting:
Pastikan untuk menyesuaikan alamat I2C pada
LiquidCrystal_I2C lcd(0x27, 16, 2);
jika diperlukan. Alamat yang umum adalah0x27
atau0x3F
.Nilai
tolerance
(toleransi) pada fungsiisColor
menentukan seberapa dekat pembacaan harus dengan nilai kalibrasi. Nilai yang lebih kecil akan lebih akurat tetapi kurang fleksibel, dan sebaliknya. Anda dapat mengubah nilai ini (misalnya, menjadi15
atau20
) jika deteksi warna kurang akurat.
Tidak ada komentar:
Posting Komentar