Tutorial membuat program Ir remote dasar

Ini adalah artikel yang menjelaskan kode program Arduino untuk membaca sinyal dari remote IR.

Membaca Sinyal Remote IR dengan Arduino dan Sensor IR Receiver

Artikel ini akan membahas cara menggunakan Arduino, sensor IR Receiver (seperti VS1838B atau TSOP4838), dan pustaka IRremote untuk membaca sinyal dari remote kontrol inframerah (IR). Kode yang disertakan akan mendeteksi sinyal, mengidentifikasi protokolnya (misalnya NEC, SONY, atau SAMSUNG), dan menampilkan data yang diterima melalui Serial Monitor.

Komponen yang Dibutuhkan

 * Papan Arduino (Uno, Nano, atau lainnya)

 * Sensor IR Receiver (3 pin: VCC, GND, dan Signal)

 * Remote Kontrol IR

 * Kabel Jumper

Pemasangan Komponen

Pasang sensor IR Receiver ke Arduino Anda. Pin data (sinyal) dari sensor dihubungkan ke pin digital 2 pada Arduino. Pin VCC ke 5V, dan GND ke GND. Pastikan polaritasnya benar.

Kode Program

Kode program di bawah ini menggunakan pustaka IRremote. Jika Anda belum memilikinya, Anda bisa menginstalnya melalui Arduino IDE > Sketch > Include Library > Manage Libraries... lalu cari "IRremote".

Berikut adalah kode untuk mencari code ir:

#include <IRremote.h>


int RECV_PIN = 2; // Pin untuk sensor penerima IR


IRrecv irrecv(RECV_PIN); // Buat objek penerima

decode_results results; // Variabel untuk menyimpan hasil dekode


void setup() {

  Serial.begin(9600); // Mulai komunikasi serial

  irrecv.enableIRIn(); // Aktifkan penerima IR

  Serial.println("IR Receiver aktif. Arahkan remote dan tekan tombol.");

}


void loop() {

  if (irrecv.decode(&results)) { // Cek jika ada sinyal IR yang diterima

    Serial.println("\n--- Sinyal IR Diterima ---");


    // Tampilkan protokol berdasarkan tipe dekode

    Serial.print("Protokol: ");

    switch (results.decode_type) {

      case NEC:

        Serial.println("NEC");

        break;

      case SONY:

        Serial.println("SONY");

        break;

      case SAMSUNG:

        Serial.println("SAMSUNG");

        break;

      case RC5:

        Serial.println("RC5");

        break;

      case RC6:

        Serial.println("RC6");

        break;

      case JVC:

        Serial.println("JVC");

        break;

      case PANASONIC:

        Serial.println("PANASONIC");

        break;

      case SHARP:

        Serial.println("SHARP");

        break;

      default:

        Serial.println("UNKNOWN");

        break;

    }


    Serial.print("Nilai Dekode (Hex): ");

    Serial.println(results.value, HEX);


    Serial.print("Jumlah Pulsa Raw: ");

    Serial.println(results.rawlen);


    Serial.println("Data Raw (microseconds):");

    for (int i = 0; i < results.rawlen; i++) {

      Serial.print(results.rawbuf[i]);

      if (i < results.rawlen - 1) {

        Serial.print(", ");

      }

    }

    Serial.println("\n--------------------------");


    irrecv.resume(); // Lanjutkan mode penerimaan

  }

}




Cara Kerja Kode

 * Inisialisasi (setup): Program memulai komunikasi serial dan mengaktifkan IR receiver untuk mendengarkan sinyal.

 * Loop Utama (loop): Program secara terus-menerus memeriksa apakah ada sinyal IR yang masuk.

 * Mendekode Sinyal: Jika sinyal diterima, fungsi irrecv.decode() akan memprosesnya. Pustaka IRremote memiliki algoritma untuk mengidentifikasi berbagai protokol sinyal IR.

 * Menampilkan Hasil: Program akan mencetak informasi sinyal ke Serial Monitor, termasuk:

   * Protokol: Nama protokol yang teridentifikasi, seperti NEC, SONY, atau lainnya.

   * Nilai Dekode (Hex): Nilai unik dari tombol yang ditekan dalam format heksadesimal.

   * Data Raw: Pulsa sinyal mentah dalam mikrosekon, yang menunjukkan waktu antara pulsa HIGH dan LOW.

Cara Penggunaan

Setelah mengunggah kode ke Arduino, buka Serial Monitor pada Arduino IDE (pastikan baud rate 9600). Arahkan remote IR Anda ke sensor, dan tekan tombol apa pun. Anda akan melihat data sinyal muncul di layar, yang berisi protokol, nilai heksadesimal, dan data mentah.

Ini adalah langkah awal yang sangat penting untuk proyek-proyek yang membutuhkan kontrol melalui remote, seperti mengendalikan robot, lampu, atau peralatan elektronik lainnya.


Anda juga bisa menerapkan code di bawah code yang di pakai di sound system miniatur akbar lighting

Jpg


==================================

#include <IRremote.h>

#include <Servo.h>


// ====== Pin Definitions ======

const int IR_RECEIVE_PIN = 2; // Pin for IR receiver

const int SERVO_PIN_1 = 3;    // PWM

const int SERVO_PIN_2 = 5;    // PWM

const int SERVO_PIN_3 = 6;    // PWM

const int SERVO_PIN_4 = 9;    // PWM

const int RELAY_PIN = 4;      // Pin for Relay


// Use an array for LEDs for easier management

const int LED_PINS[] = {7, 8, 10, 11, 12, 13, A0, A1, A2, A3, A4, A5};

const int NUM_LEDS = sizeof(LED_PINS) / sizeof(LED_PINS[0]);


// ====== IR Remote Codes ======

// Servo Modes

const long IR_SERVO_MODE_1 = 0xFF30CF;

const long IR_SERVO_MODE_2 = 0xFF18E7;

const long IR_SERVO_MODE_3 = 0xFF7A85;

const long IR_SERVO_MODE_4 = 0xFF10EF;

const long IR_SERVO_MODE_5 = 0xFF38C7;

const long IR_SERVO_MODE_6 = 0xFF5AA5;

const long IR_SERVO_MODE_7 = 0xFF42BD;

const long IR_SERVO_MODE_8 = 0xFF4AB5;

const long IR_SERVO_MODE_9 = 0xFF52AD;


// Servo Speed

const long IR_SPEED_MINUS = 0xFF6897;

const long IR_SPEED_PLUS = 0xFF9867;


// LED Global Control

const long IR_LED_ALL_ON_OFF = 0xFFA25D;


// Mode LED (1)

const long IR_LED1_ALT_SPEED_TOGGLE = 0xFF629D;

const long IR_LED1_STROBE_TOGGLE = 0xFFE21D;


// Mode LED (2)

const long IR_LED2_CHASE_SLOW = 0xFF22DD;

const long IR_LED2_CHASE_FAST = 0xFF02FD;

const long IR_LED2_GROUPS_FAST = 0xFFC23D;


// Mode LED (3)

const long IR_LED3_TOGGLE_ON_OFF = 0xFFE01F;

const long IR_LED3_BLINK_SLOW = 0xFFA857;


// Mode (4)

const long IR_LED_MODE_4_RANDOM = 0xFF906F;


// Relay Control

const long IR_RELAY_PULSE = 0xFFB04F;


// ====== Servo Objects ======

Servo servo1;

Servo servo2;

Servo servo3;

Servo servo4;


// ====== IR Receiver Object ======

IRrecv irrecv(IR_RECEIVE_PIN);

decode_results results;


// ====== State Variables ======

// Servo State

int currentServoMode = 0;

int servoStep = 0;

unsigned long lastServoMoveTime = 0;

int servoMoveDelay = 20; // Default speed for smooth movement

const int SERVO_MIN_DELAY = 5;

const int SERVO_MAX_DELAY = 50;


// New variables for Estafet Mode 1

bool isMode1InitialMoveDone = false;

int grup1EstafetStep = 0;

int grup2EstafetStep = 0;

unsigned long grup2StartTime = 0;

const unsigned long GRUP2_DELAY = 1000; // 1 second delay for group 2


int targetAngle1 = 50, currentAngle1 = 50;

int targetAngle2 = 50, currentAngle2 = 50;

int targetAngle3 = 50, currentAngle3 = 50;

int targetAngle4 = 50, currentAngle4 = 50;


// LED State Variables

bool allLedsGlobalOn = false;


// Mode LED 1 (D7 & D8)

// Now using two separate state variables for each toggle button

int ledMode1_altSpeed_pattern = 0; // 0=OFF, 1=ON TOGETHER, 2=ALTERNATING SLOW

int ledMode1_strobe_pattern = 0;   // 0=OFF, 1=STROBE FAST, 2=STROBE SLOW

bool ledMode1_alternatingState = false;

unsigned long lastLedMode1ChangeTime = 0;


// Mode LED 2 (D10 to A4)

int ledMode2_pattern = 0; // 0=OFF, 1=CHASE SLOW, 2=CHASE FAST, 3=GROUPS FAST

int ledMode2_chaseSubPattern = 0; // 0=Chase Asli, 1=Running Light, 2=Progress Bar

int ledMode2_chaseStep = 0;

int ledMode2_chaseDirection = 1;

int ledMode2_groupStep = 0;

unsigned long lastLedMode2ChangeTime = 0;

const int LED2_CHASE_ORDER[] = {2, 3, 4, 5, 6, 7, 8, 9, 10};

const int NUM_LED2_CHASE = sizeof(LED2_CHASE_ORDER) / sizeof(LED2_CHASE_ORDER[0]);


// Mode LED 3 (A5)

int ledMode3_pattern = 0; // 0=OFF, 1=ON, 2=BLINK SLOW

bool ledMode3_onOffState = false;

bool ledMode3_blinkingState = false;

unsigned long lastLedMode3ChangeTime = 0;


// Mode LED 4 (Random)

bool isLedMode4Active = false;

unsigned long lastLedMode4ChangeTime = 0;

const int LED4_RANDOM_DELAY = 80;


const int LED_DELAY_SLOW = 500;

const int LED_DELAY_FAST = 150;

const int LED_BLINK_SLOW_DELAY = 600;

const int LED_STROBE_FAST_DELAY = 100;

const int LED_STROBE_SLOW_DELAY = 500;


// Relay State

bool relayPulsing = false;

unsigned long relayPulseStartTime = 0;

const unsigned long RELAY_PULSE_DURATION = 750;


// --- STATE VARIABLES FOR LED 7 & 8 ---

bool led7_state_before_mode3 = false;

bool led8_state_before_mode3 = false;

bool is_in_mode3 = false;


// ====== Helper Functions ======

void turnOffAllLeds() {

    for (int i = 0; i < NUM_LEDS; i++) {

        digitalWrite(LED_PINS[i], LOW);

    }

}


void turnOffAllServos() {

    currentServoMode = 0;

    targetAngle1 = 50; targetAngle2 = 50; targetAngle3 = 50; targetAngle4 = 50; // Set to neutral

    servoStep = 0;

}


void turnOffLedMode1() {

    digitalWrite(LED_PINS[0], LOW);

    digitalWrite(LED_PINS[1], LOW);

    ledMode1_altSpeed_pattern = 0;

    ledMode1_strobe_pattern = 0;

    ledMode1_alternatingState = false;

}


void turnOffLedMode2() {

    for (int i = 2; i <= 10; i++) {

        digitalWrite(LED_PINS[i], LOW);

    }

    ledMode2_pattern = 0;

    ledMode2_chaseSubPattern = 0;

    ledMode2_chaseStep = 0;

    ledMode2_chaseDirection = 1;

    ledMode2_groupStep = 0;

}


void turnOffLedMode3() {

    digitalWrite(LED_PINS[11], LOW);

    ledMode3_pattern = 0;

    ledMode3_onOffState = false;

    ledMode3_blinkingState = false;

}


void turnOffLedMode4() {

    isLedMode4Active = false;

    for (int i = 0; i < NUM_LEDS; i++) {

        digitalWrite(LED_PINS[i], LOW);

    }

}


void turnOffRelay() {

    digitalWrite(RELAY_PIN, LOW);

    relayPulsing = false;

}


// ====== Setup Function ======

void setup() {

    Serial.begin(9600);

    Serial.println("IR Remote Servo & Advanced LED Control Ready!");

    randomSeed(analogRead(A5));


    // Attach servos

    servo1.attach(SERVO_PIN_1);

    servo2.attach(SERVO_PIN_2);

    servo3.attach(SERVO_PIN_3);

    servo4.attach(SERVO_PIN_4);


    // Set initial servo positions to neutral (50 degrees)

    servo1.write(50);

    servo2.write(50);

    servo3.write(50);

    servo4.write(50);


    // Set ALL LED pins as outputs and turn off initially

    for (int i = 0; i < NUM_LEDS; i++) {

        pinMode(LED_PINS[i], OUTPUT);

        digitalWrite(LED_PINS[i], LOW);

    }


    // Set Relay pin as output and turn off initially

    pinMode(RELAY_PIN, OUTPUT);


    // Enable IR receiver

    irrecv.enableIRIn();

}


// ====== Non-Blocking Servo Movement Handler ======

void handleServoMovement() {

    if (millis() - lastServoMoveTime >= servoMoveDelay) {

        lastServoMoveTime = millis();

        if (currentAngle1 != targetAngle1) { int moveDir = (targetAngle1 > currentAngle1) ? 1 : -1; currentAngle1 += moveDir; servo1.write(currentAngle1); }

        if (currentAngle2 != targetAngle2) { int moveDir = (targetAngle2 > currentAngle2) ? 1 : -1; currentAngle2 += moveDir; servo2.write(currentAngle2); }

        if (currentAngle3 != targetAngle3) { int moveDir = (targetAngle3 > currentAngle3) ? 1 : -1; currentAngle3 += moveDir; servo3.write(currentAngle3); }

        if (currentAngle4 != targetAngle4) { int moveDir = (targetAngle4 > currentAngle4) ? 1 : -1; currentAngle4 += moveDir; servo4.write(currentAngle4); }

    }

}


// ====== Servo Mode Logic Handler ======

void handleServoModes() {

    // Check if we are exiting a mode

    if (is_in_mode3 && currentServoMode != 3) {

        is_in_mode3 = false;

        // Restore LED states when exiting Mode 3

        digitalWrite(LED_PINS[0], led7_state_before_mode3);

        digitalWrite(LED_PINS[1], led8_state_before_mode3);

        Serial.println("Exiting Mode 3. LED states restored.");

    }

    

    switch (currentServoMode) {

        case 1:

            // Gerakan inisiasi ke 50 derajat

            if (!isMode1InitialMoveDone) {

                targetAngle1 = 50; targetAngle2 = 50; targetAngle3 = 50; targetAngle4 = 50;

                if (currentAngle1 == 50 && currentAngle2 == 50 && currentAngle3 == 50 && currentAngle4 == 50) {

                    isMode1InitialMoveDone = true;

                    // Start the estafet for both groups

                    targetAngle1 = 100;

                    grup2StartTime = millis() + GRUP2_DELAY; // Schedule Group 2 start

                    grup1EstafetStep = 1;

                    grup2EstafetStep = 0; // Ensure Group 2 doesn't start until timer

                }

            } else {

                // Gerakan Estafet Grup 1 (S1 dan S3)

                switch (grup1EstafetStep) {

                    case 1: // S1 ke 100

                        if (currentAngle1 == targetAngle1) {

                            targetAngle3 = 90;

                            grup1EstafetStep = 2;

                        }

                        break;

                    case 2: // S3 ke 90

                        if (currentAngle3 == targetAngle3) {

                            targetAngle1 = 5;

                            grup1EstafetStep = 3;

                        }

                        break;

                    case 3: // S1 ke 5

                        if (currentAngle1 == targetAngle1) {

                            targetAngle3 = 20;

                            grup1EstafetStep = 4;

                        }

                        break;

                    case 4: // S3 ke 20

                        if (currentAngle3 == targetAngle3) {

                            targetAngle1 = 100;

                            grup1EstafetStep = 1; // Kembali ke langkah awal

                        }

                        break;

                }


                // Gerakan Estafet Grup 2 (S2 dan S4) dengan penundaan

                if (millis() >= grup2StartTime) {

                    switch (grup2EstafetStep) {

                        case 0: // Mulai dengan S2 ke 100

                            targetAngle2 = 100;

                            grup2EstafetStep = 1;

                            break;

                        case 1: // S2 ke 100

                            if (currentAngle2 == targetAngle2) {

                                targetAngle4 = 90;

                                grup2EstafetStep = 2;

                            }

                            break;

                        case 2: // S4 ke 90

                            if (currentAngle4 == targetAngle4) {

                                targetAngle2 = 5;

                                grup2EstafetStep = 3;

                            }

                            break;

                        case 3: // S2 ke 5

                            if (currentAngle2 == targetAngle2) {

                                targetAngle4 = 20;

                                grup2EstafetStep = 4;

                            }

                            break;

                        case 4: // S4 ke 20

                            if (currentAngle4 == targetAngle4) {

                                targetAngle2 = 100;

                                grup2EstafetStep = 1; // Kembali ke langkah awal

                            }

                            break;

                    }

                }

            }

            break;


        case 2:

            // Gerakan S3 & S4 bersamaan

            if (currentAngle1 == targetAngle1 && currentAngle2 == targetAngle2 && currentAngle3 == targetAngle3 && currentAngle4 == targetAngle4) {

                if (servoStep == 0) { targetAngle1 = 80; targetAngle2 = 20; servoStep = 1; }

                else if (servoStep == 1) { targetAngle3 = 20; targetAngle4 = 80; servoStep = 2; }

                else if (servoStep == 2) { targetAngle1 = 20; targetAngle2 = 80; servoStep = 3; }

                else if (servoStep == 3) { targetAngle3 = 80; targetAngle4 = 20; servoStep = 0; }

            }

            break;


        case 3:

            // Gerakan servo dan LED yang disinkronkan

            if (!is_in_mode3) {

                // Simpan status LED 7 & 8 sebelum masuk Mode 3

                led7_state_before_mode3 = digitalRead(LED_PINS[0]);

                led8_state_before_mode3 = digitalRead(LED_PINS[1]);

                turnOffLedMode1(); // Matikan mode LED 1 yang sedang aktif untuk menghindari konflik

                is_in_mode3 = true;

                Serial.println("Entering Mode 3. LED states saved.");

            }


            // Gerakan awal untuk S1 & S2 ke 50 (hanya sekali)

            if (currentAngle1 != 50 || currentAngle2 != 50) {

                targetAngle1 = 50; targetAngle2 = 50;

                // Jangan lakukan apa-apa sampai kedua servo mencapai 50

            } else {

                // Pergerakan utama S3 & S4

                if (currentAngle3 == targetAngle3 && currentAngle4 == targetAngle4) {

                    if (servoStep == 0) {

                        targetAngle3 = 100; 

                        targetAngle4 = 20; // Gerakan berlawanan

                        servoStep = 1;

                    } else {

                        targetAngle3 = 20; 

                        targetAngle4 = 100; // Gerakan berlawanan

                        servoStep = 0;

                    }

                }


                // Kontrol LED 7 & 8 berdasarkan posisi S3 & S4

                if (currentAngle3 >= 99) {

                    digitalWrite(LED_PINS[1], HIGH); // LED 8 nyala

                }

                if (currentAngle3 <= 21) {

                    digitalWrite(LED_PINS[1], LOW); // LED 8 mati

                }


                if (currentAngle4 >= 99) {

                    digitalWrite(LED_PINS[0], HIGH); // LED 7 nyala

                }

                if (currentAngle4 <= 21) {

                    digitalWrite(LED_PINS[0], LOW); // LED 7 mati

                }

            }

            break;


        case 4:

            if (currentAngle1 == 50 && currentAngle2 == 50 && currentAngle3 == targetAngle3 && currentAngle4 == targetAngle4) {

                if (servoStep == 0) { targetAngle3 = 20; targetAngle4 = 20; servoStep = 1; }

                else { targetAngle3 = 80; targetAngle4 = 80; servoStep = 0; }

            }

            break;


        case 5:

            if (currentAngle1 == targetAngle1 && currentAngle2 == targetAngle2 && currentAngle3 == targetAngle3 && currentAngle4 == targetAngle4) {

                if (servoStep == 0) { targetAngle3 = 30; targetAngle4 = 30; servoStep = 1; }

                else if (servoStep == 1) { targetAngle1 = 80; targetAngle2 = 20; servoStep = 2; }

                else if (servoStep == 2) { targetAngle3 = 50; targetAngle4 = 50; servoStep = 3; }

                else if (servoStep == 3) { targetAngle1 = 20; targetAngle2 = 80; servoStep = 4; }

                else if (servoStep == 4) { targetAngle3 = 80; targetAngle4 = 80; servoStep = 5; }

                else if (servoStep == 5) { targetAngle1 = 80; targetAngle2 = 20; servoStep = 6; }

                else if (servoStep == 6) { targetAngle3 = 50; targetAngle4 = 50; servoStep = 7; }

                else if (servoStep == 7) { targetAngle1 = 20; targetAngle2 = 80; servoStep = 0; }

            }

            break;


        case 6:

            if (currentAngle1 == targetAngle1 && currentAngle2 == targetAngle2 && currentAngle3 == targetAngle3 && currentAngle4 == targetAngle4) {

                if (servoStep == 0) { targetAngle1 = 50; targetAngle2 = 50; servoStep = 1; }

                else if (servoStep == 1) { targetAngle3 = 60; targetAngle4 = 60; servoStep = 2; }

                else if (servoStep == 2) { targetAngle3 = 40; targetAngle4 = 40; servoStep = 3; }

                else if (servoStep == 3) { targetAngle1 = 60; targetAngle2 = 40; servoStep = 4; }

                else if (servoStep == 4) { targetAngle3 = 60; targetAngle4 = 60; servoStep = 5; }

                else if (servoStep == 5) { targetAngle3 = 40; targetAngle4 = 40; servoStep = 6; }

                else if (servoStep == 6) { targetAngle1 = 70; targetAngle2 = 30; servoStep = 7; }

                else if (servoStep == 7) { targetAngle3 = 60; targetAngle4 = 60; servoStep = 8; }

                else if (servoStep == 8) { targetAngle3 = 40; targetAngle4 = 40; servoStep = 9; }

                else if (servoStep == 9) { targetAngle1 = 80; targetAngle2 = 20; servoStep = 10; }

                else if (servoStep == 10) { targetAngle3 = 60; targetAngle4 = 60; servoStep = 11; }

                else if (servoStep == 11) { targetAngle3 = 40; targetAngle4 = 40; servoStep = 12; }

                else if (servoStep == 12) { targetAngle1 = 70; targetAngle2 = 30; servoStep = 13; }

                else if (servoStep == 13) { targetAngle3 = 60; targetAngle4 = 60; servoStep = 14; }

                else if (servoStep == 14) { targetAngle3 = 40; targetAngle4 = 40; servoStep = 15; }

                else if (servoStep == 15) { targetAngle1 = 60; targetAngle2 = 40; servoStep = 16; }

                else if (servoStep == 16) { targetAngle3 = 60; targetAngle4 = 60; servoStep = 17; }

                else if (servoStep == 17) { targetAngle3 = 40; targetAngle4 = 40; servoStep = 0; }

            }

            break;


        case 7:

            if (currentAngle1 == targetAngle1 && currentAngle2 == targetAngle2 && currentAngle3 == targetAngle3 && currentAngle4 == targetAngle4) {

                if (servoStep == 0) { targetAngle3 = 30; targetAngle4 = 30; servoStep = 1; }

                else if (servoStep == 1) { targetAngle1 = 20; targetAngle2 = 20; servoStep = 2; }

                else if (servoStep == 2) { targetAngle1 = 80; targetAngle2 = 80; servoStep = 0; }

            }

            break;


        case 8:

            if (currentAngle1 == targetAngle1 && currentAngle2 == targetAngle2 && currentAngle3 == targetAngle3 && currentAngle4 == targetAngle4) {

                if (servoStep == 0) { targetAngle3 = 30; targetAngle4 = 30; servoStep = 1; }

                else if (servoStep == 1) { targetAngle1 = 80; targetAngle2 = 20; servoStep = 2; }

                else if (servoStep == 2) { targetAngle1 = 20; targetAngle2 = 80; servoStep = 0; }

            }

            break;

        

        case 9:

            // Mode 9: Reset to center

            if (currentAngle1 != 50 || currentAngle2 != 50 || currentAngle3 != 50 || currentAngle4 != 50) {

                targetAngle1 = 50; targetAngle2 = 50; targetAngle3 = 50; targetAngle4 = 50;

            }

            break;

    }

}


// ====== LED Mode 1 (D7 & D8) Handler ======

void handleLedMode1() {

    if (ledMode1_altSpeed_pattern == 2) { // Alternating Slow

        if (millis() - lastLedMode1ChangeTime >= LED_DELAY_SLOW) {

            lastLedMode1ChangeTime = millis();

            ledMode1_alternatingState = !ledMode1_alternatingState;

            digitalWrite(LED_PINS[0], ledMode1_alternatingState ? HIGH : LOW);

            digitalWrite(LED_PINS[1], ledMode1_alternatingState ? LOW : HIGH);

        }

    } else if (ledMode1_strobe_pattern == 1) { // Strobe Fast

        if (millis() - lastLedMode1ChangeTime >= LED_STROBE_FAST_DELAY) {

            lastLedMode1ChangeTime = millis();

            ledMode1_alternatingState = !ledMode1_alternatingState;

            digitalWrite(LED_PINS[0], ledMode1_alternatingState ? HIGH : LOW);

            digitalWrite(LED_PINS[1], ledMode1_alternatingState ? HIGH : LOW);

        }

    } else if (ledMode1_strobe_pattern == 2) { // Strobe Slow

        if (millis() - lastLedMode1ChangeTime >= LED_STROBE_SLOW_DELAY) {

            lastLedMode1ChangeTime = millis();

            ledMode1_alternatingState = !ledMode1_alternatingState;

            digitalWrite(LED_PINS[0], ledMode1_alternatingState ? HIGH : LOW);

            digitalWrite(LED_PINS[1], ledMode1_alternatingState ? HIGH : LOW);

        }

    }

}


// ====== LED Mode 2 (D10 to A4) Handler ======

void handleLedMode2() {

    if (ledMode2_pattern == 1 || ledMode2_pattern == 2) {

        unsigned long currentDelay = (ledMode2_pattern == 1) ? LED_DELAY_SLOW : LED_DELAY_FAST;

        if (millis() - lastLedMode2ChangeTime >= currentDelay) {

            lastLedMode2ChangeTime = millis();

            switch (ledMode2_chaseSubPattern) {

                case 0: // Chase Asli

                    digitalWrite(LED_PINS[LED2_CHASE_ORDER[ledMode2_chaseStep]], LOW);

                    ledMode2_chaseStep = (ledMode2_chaseStep + 1) % NUM_LED2_CHASE;

                    digitalWrite(LED_PINS[LED2_CHASE_ORDER[ledMode2_chaseStep]], HIGH);

                    break;

                case 1: // Running Light

                    for (int i=2; i<=10; i++) { digitalWrite(LED_PINS[i], LOW); }

                    digitalWrite(LED_PINS[LED2_CHASE_ORDER[ledMode2_chaseStep]], HIGH);

                    ledMode2_chaseStep = (ledMode2_chaseStep + 1) % NUM_LED2_CHASE;

                    break;

                case 2: // Progress Bar

                    if (ledMode2_chaseDirection == 1) {

                        digitalWrite(LED_PINS[LED2_CHASE_ORDER[ledMode2_chaseStep]], HIGH);

                        ledMode2_chaseStep++;

                        if (ledMode2_chaseStep >= NUM_LED2_CHASE) {

                            ledMode2_chaseStep = NUM_LEDS - 1;

                            ledMode2_chaseDirection = -1;

                        }

                    } else {

                        digitalWrite(LED_PINS[LED2_CHASE_ORDER[ledMode2_chaseStep]], LOW);

                        ledMode2_chaseStep--;

                        if (ledMode2_chaseStep < 0) {

                            ledMode2_chaseStep = 0;

                            ledMode2_chaseDirection = 1;

                        }

                    }

                    break;

            }

        }

    } else if (ledMode2_pattern == 3) { // Groups Fast

        if (millis() - lastLedMode2ChangeTime >= LED_DELAY_FAST) {

            lastLedMode2ChangeTime = millis();

            for (int i = 2; i <= 10; i++) digitalWrite(LED_PINS[i], LOW);

            ledMode2_groupStep = (ledMode2_groupStep + 1) % 3;

            if (ledMode2_groupStep == 0) {

                digitalWrite(LED_PINS[2], HIGH);

                digitalWrite(LED_PINS[3], HIGH);

                digitalWrite(LED_PINS[4], HIGH);

            } else if (ledMode2_groupStep == 1) {

                digitalWrite(LED_PINS[5], HIGH);

                digitalWrite(LED_PINS[6], HIGH);

                digitalWrite(LED_PINS[7], HIGH);

            } else {

                digitalWrite(LED_PINS[8], HIGH);

                digitalWrite(LED_PINS[9], HIGH);

                digitalWrite(LED_PINS[10], HIGH);

            }

        }

    }

}


// ====== LED Mode 3 (A5) Handler ======

void handleLedMode3() {

    if (ledMode3_pattern == 2) {

        if (millis() - lastLedMode3ChangeTime >= LED_BLINK_SLOW_DELAY) {

            lastLedMode3ChangeTime = millis();

            ledMode3_blinkingState = !ledMode3_blinkingState;

            digitalWrite(LED_PINS[11], ledMode3_blinkingState ? HIGH : LOW);

        }

    }

}


// ====== LED Mode 4 (Random) Handler ======

void handleLedMode4() {

    if (isLedMode4Active) {

        if (millis() - lastLedMode4ChangeTime >= LED4_RANDOM_DELAY) {

            lastLedMode4ChangeTime = millis();

            turnOffAllLeds(); // Turn off all LEDs before lighting up new ones

            int numLedsToLight = random(2, 4);

            bool isLit[NUM_LEDS] = {false};

            for (int i = 0; i < numLedsToLight; i++) {

                int randomIndex;

                do {

                    randomIndex = random(NUM_LEDS);

                } while (isLit[randomIndex]);

                digitalWrite(LED_PINS[randomIndex], HIGH);

                isLit[randomIndex] = true;

            }

        }

    }

}


// ====== Relay Pulse Handler ======

void handleRelayPulse() {

    if (relayPulsing) {

        if (millis() - relayPulseStartTime >= RELAY_PULSE_DURATION) {

            turnOffRelay();

            Serial.println("Relay OFF (Pulse Ended)");

        }

    }

}


// ====== Main Loop Function ======

void loop() {

    // --- Handle IR Remote Input ---

    if (irrecv.decode(&results)) {

        Serial.print("Received IR code: 0x");

        Serial.println(results.value, HEX);

        long receivedCode = results.value;


        if (receivedCode != 0xFFFFFFFF) {

            // Servo Mode Selection

            if (receivedCode == IR_SERVO_MODE_1) { currentServoMode = 1; isMode1InitialMoveDone = false; Serial.println("Servo Mode 1 Selected"); }

            else if (receivedCode == IR_SERVO_MODE_2) { currentServoMode = 2; servoStep = 0; targetAngle1 = 80; targetAngle2 = 20; targetAngle3 = 90; targetAngle4 = 90; Serial.println("Servo Mode 2 Selected"); }

            else if (receivedCode == IR_SERVO_MODE_3) { currentServoMode = 3; servoStep = 0; targetAngle1 = 50; targetAngle2 = 50; targetAngle3 = 100; targetAngle4 = 20; Serial.println("Servo Mode 3 Selected"); }

            else if (receivedCode == IR_SERVO_MODE_4) { currentServoMode = 4; servoStep = 0; targetAngle1 = 50; targetAngle2 = 50; targetAngle3 = 80; targetAngle4 = 80; Serial.println("Servo Mode 4 Selected"); }

            else if (receivedCode == IR_SERVO_MODE_5) { currentServoMode = 5; servoStep = 0; targetAngle1 = 80; targetAngle2 = 20; targetAngle3 = 30; targetAngle4 = 30; Serial.println("Servo Mode 5 Selected"); }

            else if (receivedCode == IR_SERVO_MODE_6) { currentServoMode = 6; servoStep = 0; targetAngle1 = 50; targetAngle2 = 50; targetAngle3 = 60; targetAngle4 = 60; Serial.println("Servo Mode 6 Selected"); }

            else if (receivedCode == IR_SERVO_MODE_7) { currentServoMode = 7; servoStep = 0; targetAngle1 = 20; targetAngle2 = 20; targetAngle3 = 30; targetAngle4 = 30; Serial.println("Servo Mode 7 Selected"); }

            else if (receivedCode == IR_SERVO_MODE_8) { currentServoMode = 8; servoStep = 0; targetAngle1 = 80; targetAngle2 = 20; targetAngle3 = 30; targetAngle4 = 30; Serial.println("Servo Mode 8 Selected"); }

            else if (receivedCode == IR_SERVO_MODE_9) { currentServoMode = 9; servoStep = 0; targetAngle1 = 50; targetAngle2 = 50; targetAngle3 = 50; targetAngle4 = 50; Serial.println("Servo Mode 9 Selected"); }


            // Servo Speed Change

            else if (receivedCode == IR_SPEED_MINUS) { servoMoveDelay += 5; if (servoMoveDelay > SERVO_MAX_DELAY) servoMoveDelay = SERVO_MAX_DELAY; Serial.print("Servo Speed Decreased, Delay: "); Serial.println(servoMoveDelay); }

            else if (receivedCode == IR_SPEED_PLUS) { servoMoveDelay -= 5; if (servoMoveDelay < SERVO_MIN_DELAY) servoMoveDelay = SERVO_MIN_DELAY; Serial.print("Servo Speed Increased, Delay: "); Serial.println(servoMoveDelay); }


            // LED Global Control

            else if (receivedCode == IR_LED_ALL_ON_OFF) { 

                allLedsGlobalOn = !allLedsGlobalOn; 

                if (allLedsGlobalOn) {

                    turnOffLedMode1();

                    turnOffLedMode2();

                    turnOffLedMode3();

                    turnOffLedMode4();

                    for (int i = 0; i < NUM_LEDS; i++) { digitalWrite(LED_PINS[i], HIGH); } 

                    Serial.println("All LEDs are now ON (Global)");

                } else { 

                    turnOffAllLeds(); 

                    Serial.println("All LEDs are now OFF (Global)"); 

                } 

            }


            // --- Bagian yang sudah diperbaiki ---

            else if (receivedCode == IR_LED1_ALT_SPEED_TOGGLE) {

                // Matikan mode strobe terlebih dahulu untuk menghindari konflik

                ledMode1_strobe_pattern = 0;

                // Ubah ke mode berikutnya secara berurutan

                ledMode1_altSpeed_pattern = (ledMode1_altSpeed_pattern + 1) % 3;

                

                if (ledMode1_altSpeed_pattern == 0) { // Mode OFF

                    digitalWrite(LED_PINS[0], LOW);

                    digitalWrite(LED_PINS[1], LOW);

                    Serial.println("LED Mode 1: OFF");

                } else if (ledMode1_altSpeed_pattern == 1) { // Mode ON TOGETHER

                    digitalWrite(LED_PINS[0], HIGH);

                    digitalWrite(LED_PINS[1], HIGH);

                    Serial.println("LED Mode 1: Both ON");

                } else if (ledMode1_altSpeed_pattern == 2) { // Mode Alternating Slow

                    lastLedMode1ChangeTime = millis();

                    Serial.println("LED Mode 1: Alternating Slow");

                }

            }

            // --- Akhir dari bagian yang sudah diperbaiki ---

            

            else if (receivedCode == IR_LED1_STROBE_TOGGLE) {

                // Matikan mode alt speed terlebih dahulu

                ledMode1_altSpeed_pattern = 0;

                // Ubah ke mode berikutnya secara berurutan

                ledMode1_strobe_pattern = (ledMode1_strobe_pattern + 1) % 3;

                

                if (ledMode1_strobe_pattern == 0) { // Mode OFF

                    digitalWrite(LED_PINS[0], LOW);

                    digitalWrite(LED_PINS[1], LOW);

                    Serial.println("LED Mode 1 Strobe: OFF");

                } else if (ledMode1_strobe_pattern == 1) { // Mode Strobe Fast

                    lastLedMode1ChangeTime = millis();

                    Serial.println("LED Mode 1: Strobe Fast");

                } else if (ledMode1_strobe_pattern == 2) { // Mode Strobe Slow

                    lastLedMode1ChangeTime = millis();

                    Serial.println("LED Mode 1: Strobe Slow");

                }

            }



            // LED Mode 2 Logic (D10 to A4)

            else if (receivedCode == IR_LED2_CHASE_SLOW) { 

                turnOffLedMode2();

                ledMode2_pattern = 1;

                ledMode2_chaseSubPattern = (ledMode2_chaseSubPattern + 1) % 3;

                ledMode2_chaseStep = 0; 

                ledMode2_chaseDirection = 1; 

                lastLedMode2ChangeTime = millis(); 

                if (ledMode2_chaseSubPattern == 0 || ledMode2_chaseSubPattern == 1) { 

                    digitalWrite(LED_PINS[LED2_CHASE_ORDER[0]], HIGH); 

                } 

                Serial.print("LED Mode 2 Chase Slow Sub-Pattern Toggled to: "); 

                if (ledMode2_chaseSubPattern == 0) Serial.println("Chase Asli"); 

                else if (ledMode2_chaseSubPattern == 1) Serial.println("Running Light"); 

                else if (ledMode2_chaseSubPattern == 2) Serial.println("Progress Bar"); 

            }

            else if (receivedCode == IR_LED2_CHASE_FAST) { 

                turnOffLedMode2();

                ledMode2_pattern = 2; 

                ledMode2_chaseSubPattern = (ledMode2_chaseSubPattern + 1) % 3;

                ledMode2_chaseStep = 0; 

                ledMode2_chaseDirection = 1; 

                lastLedMode2ChangeTime = millis(); 

                if (ledMode2_chaseSubPattern == 0 || ledMode2_chaseSubPattern == 1) { 

                    digitalWrite(LED_PINS[LED2_CHASE_ORDER[0]], HIGH); 

                } 

                Serial.print("LED Mode 2 Chase Fast Sub-Pattern Toggled to: "); 

                if (ledMode2_chaseSubPattern == 0) Serial.println("Chase Asli"); 

                else if (ledMode2_chaseSubPattern == 1) Serial.println("Running Light"); 

                else if (ledMode2_chaseSubPattern == 2) Serial.println("Progress Bar"); 

            }

            else if (receivedCode == IR_LED2_GROUPS_FAST) { 

                if (ledMode2_pattern == 3) {

                    turnOffLedMode2();

                    Serial.println("LED Mode 2 Groups Fast Deactivated"); 

                } else { 

                    turnOffLedMode2();

                    ledMode2_pattern = 3; 

                    ledMode2_groupStep = 0; 

                    digitalWrite(LED_PINS[2], HIGH); 

                    digitalWrite(LED_PINS[3], HIGH); 

                    digitalWrite(LED_PINS[4], HIGH); 

                    lastLedMode2ChangeTime = millis(); 

                    Serial.println("LED Mode 2 Groups Fast Activated"); 

                } 

            }


            // LED Mode 3 Logic (A5)

            else if (receivedCode == IR_LED3_TOGGLE_ON_OFF) { 

                if (ledMode3_pattern == 1) {

                    turnOffLedMode3();

                    Serial.println("LED Mode 3 (A5) Toggled: OFF");

                } else {

                    turnOffLedMode3();

                    ledMode3_pattern = 1;

                    digitalWrite(LED_PINS[11], HIGH);

                    Serial.println("LED Mode 3 (A5) Toggled: ON");

                }

            }

            else if (receivedCode == IR_LED3_BLINK_SLOW) { 

                if (ledMode3_pattern == 2) { 

                    turnOffLedMode3(); 

                    Serial.println("LED Mode 3 (A5) Blinking Slow Deactivated"); 

                } else { 

                    turnOffLedMode3();

                    ledMode3_pattern = 2; 

                    ledMode3_blinkingState = true; 

                    digitalWrite(LED_PINS[11], HIGH); 

                    lastLedMode3ChangeTime = millis(); 

                    Serial.println("LED Mode 3 (A5) Blinking Slow Activated"); 

                } 

            }


            // LED Mode 4 Logic (Random)

            else if (receivedCode == IR_LED_MODE_4_RANDOM) { 

                if (isLedMode4Active) {

                    turnOffLedMode4();

                    Serial.println("LED Mode 4 (Random) Deactivated"); 

                } else {

                    turnOffAllLeds(); // Turn off other LEDs for a clean start to random mode

                    isLedMode4Active = true; 

                    Serial.println("LED Mode 4 (Random) Activated"); 

                    lastLedMode4ChangeTime = millis(); 

                }

            }


            // Relay Pulse

            else if (receivedCode == IR_RELAY_PULSE) { if (!relayPulsing) { digitalWrite(RELAY_PIN, HIGH); relayPulsing = true; relayPulseStartTime = millis(); Serial.println("Relay ON (Pulsing)"); } }

        }

        irrecv.resume();

    }


    // --- Handle Non-Blocking Tasks ---

    handleServoMovement();

    handleServoModes();

    handleLedMode1();

    handleLedMode2();

    handleLedMode3();

    handleLedMode4();

    handleRelayPulse();

}

===========================

Untuk panduan visual lebih detail, Anda dapat menonton video tutorial yang dibuat oleh Akbar audio 95 di chanel youtube

Di dalam tutorial akbar audio ada juga cara menggunakan ir remote untuk kontrol led servo dan juga mesin asap

  • ​#Arduino
  • ​#RemoteIR
  • ​#IRremoteLibrary
  • ​#Elektronika
  • ​#IoT
  • ​#TutorialArduino
  • ​#AkbarAudio95

Komentar

Postingan populer dari blog ini

Tutorial membuat mixer beam miniatur

Coding arduino untuk beam

Membuat strobo dan whal waser dari led ws