Minggu, 31 Agustus 2025

Tutorial Arduino Indonesia : Mesin Pendeteksi Warna Permen

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

  1. Arduino Uno

  2. Sensor Warna TCS3200

  3. LCD I2C (16x2 atau 20x4)

  4. Kabel Jumper

  5. Dudukan untuk sensor dan LCD


Skema Rangkaian

  1. TCS3200 ke Arduino:

    • VCC -> 5V

    • GND -> GND

    • S0 -> Pin Digital 8

    • S1 -> Pin Digital 9

    • S2 -> Pin Digital 10

    • S3 -> Pin Digital 11

    • OUT -> Pin Digital 12

  2. LCD I2C ke Arduino:

    • VCC -> 5V

    • GND -> GND

    • SDA -> Pin Analog A4

    • SCL -> Pin Analog A5


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.

  1. Unggah kode kalibrasi TCS3200 ke Arduino dan buka Serial Monitor.

  2. Letakkan permen dengan warna yang berbeda-beda di bawah sensor.

  3. Catat nilai R, G, B yang ditampilkan untuk setiap warna.

Berikut adalah contoh nilai kalibrasi yang mungkin Anda dapatkan:

WarnaMerahJinggaKuningHijauBiruNilaUngu
R80706540253550
G35506070403020
B35252040807060

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.

C++
#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 adalah 0x27 atau 0x3F.

  • Nilai tolerance (toleransi) pada fungsi isColor 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, menjadi 15 atau 20) jika deteksi warna kurang akurat.

Tidak ada komentar:

Posting Komentar