💡 Proyek Arduino: Membuat Lampu Sein Motor dengan LED WS2812
Dalam dunia otomotif, keselamatan adalah hal utama. Salah satu komponen penting yang mendukung keselamatan pengendara adalah lampu sein—alat sederhana namun sangat vital untuk memberi tanda belok kepada pengguna jalan lain. Lalu, bagaimana jika kita membuat sendiri sistem lampu sein yang lebih interaktif dan menarik menggunakan Arduino?
Pada proyek kali ini, kita akan membahas bagaimana cara membuat lampu sein motor digital menggunakan Arduino UNO, LED Neopixel WS2812, dan push button. Proyek ini sangat cocok bagi Anda yang ingin menggabungkan dunia elektronik mikrokontroler dengan kendaraan bermotor, baik untuk modifikasi, hobi, maupun pembelajaran dasar sistem kontrol digital.
Tidak hanya sekadar nyala-mati, lampu sein ini akan menyala secara dinamis dan dapat diatur polanya menggunakan kode pemrograman di Arduino. Ditambah lagi, penggunaan LED WS2812 (Neopixel) akan memberikan tampilan yang lebih modern dan keren dibanding lampu biasa.
Melalui artikel ini, Anda akan mendapatkan:
Skema rangkaian lengkap
Penjelasan fungsi komponen
Kode Arduino siap pakai
Tips modifikasi dan pengembangan lebih lanjut
Yuk, langsung kita mulai proyek ini dan ciptakan lampu sein motor yang pintar dan estetik!
berikut codenya di bawah
#include "FastLED.h"
#define NUM_LEDS 16
CRGB leds[NUM_LEDS];
#define PIN 8
boolean exitFunction;
// LEDs and switchs
const byte ledPin1 = 10;
const byte ledPin2 = 11;
const byte ledPin3 = 12;
const byte buttonPin1 = 3;
const byte buttonPin2 = 4;
const byte buttonPin3 = 5;
// Booleans for input states
volatile bool D2_state = LOW;
volatile bool D3_state = LOW;
volatile bool D4_state = LOW;
int ledState = LOW; // ledState used to set the LED
unsigned long previousMillis = 0; // will store last time LED was updated
const long interval = 300; // interval at which to blink (milliseconds)
// delay for button press
unsigned long delay_press = 400; // in milliseconds
unsigned long delay_press_last = 0;
void setup() {
Serial.begin(9600);
exitFunction = false;
// Set LEDs as outputs
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
// Set switches as inputs with pullups
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(buttonPin3, INPUT_PULLUP);
FastLED.addLeds<WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
// Enable PCIE2 Bit3 = 1 (Port D)
PCICR |= B00000100;
// Enable PCINT18, PCINT19, PCINT20 (Pins D2 , D3 , D4)
PCMSK2 |= B00011100;
// \\\\\___PIN D0
// \\\\
// \\\\___PIN D1
// \\\
// \\\___PIN D2 (Enable)
// \\
// \\___PIN D3 (Enable)
// \
// \___PIN D4 (Enable)
}
void loop() {
exitFunction = false;
for (int i=0; i<NUM_LEDS; i++) {
leds[i] = CRGB::Black;
FastLED.show();
}
if (D2_state == HIGH) {
pattern1();
}
if (D3_state == HIGH) {
pattern2();
}
if (D4_state == HIGH) {
pattern3();
}
}
void pattern1() {
while(1)
{
if (millis() - previousMillis >= interval) {
previousMillis = millis();
// if the LED is off turn it on and vice-versa:
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(ledPin1, ledState);
}
for (int j=1; j<=2; j++) {
for (int i=NUM_LEDS-1; i>=0; i--) {
if (exitFunction == true) return;
if (j == 1) {
leds[i] = CRGB::Orange; delay(40);
FastLED.show();
}
if (j == 2) {
leds[i] = CRGB::Black; delay(20);
FastLED.show();
}
}
}
} // end while(1)
}
void pattern2() {
while(1)
{
if (millis() - previousMillis >= interval) {
previousMillis = millis();
// if the LED is off turn it on and vice-versa:
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(ledPin2, ledState);
}
for (int j=1; j<=2; j++) {
for (int i=0; i<NUM_LEDS; i++) {
if (exitFunction == true) return;
if (j == 1) {
leds[i] = CRGB::Orange; delay(40);
FastLED.show();
}
if (j == 2) {
leds[i] = CRGB::Black; delay(20);
FastLED.show();
}
}
}
} // end while(1)
}
void pattern3() {
while(1) {
float r, g, b;
// FADE IN
for(int i = 0; i <= 255; i++) {
if (exitFunction == true) return;
r = (i/256.0)*255;
g = (i/256.0)*0;
b = (i/256.0)*0;
fill_solid(leds, NUM_LEDS, CRGB(r, g, b));
FastLED.show();
delay(2);
}
// FADE OUT
for(int i = 255; i >= 0; i--) {
if (exitFunction == true) return;
r = (i/256.0)*255;
g = (i/256.0)*0;
b = (i/256.0)*0;
fill_solid(leds, NUM_LEDS, CRGB(r, g, b));
FastLED.show();
delay(2);
}
}
}
ISR (PCINT2_vect)
{
// Port D Interrupt occured
// prevent double execution at button keypress
if( millis() - delay_press_last > delay_press ){
// Check if this was D2 //////////////////////
if (digitalRead(buttonPin1) == LOW) {
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
//Pin D2 triggered the ISR on a Falling pulse
D2_state = !D2_state;
//Set LED 1 to state of D2_state boolean
digitalWrite(ledPin1, D2_state);
}
if (D2_state == LOW) {
exitFunction = true;
} else {
D3_state = LOW;
D4_state = LOW;
}
//////////////////////////////////////////////
// Check if this was D3 //////////////////////
if (digitalRead(buttonPin2) == LOW) {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin3, LOW);
//Pin D3 triggered the ISR on a Falling pulse
D3_state = !D3_state;
//Set LED 2 to state of D3_state boolean
digitalWrite(ledPin2, D3_state);
}
if (D3_state == LOW) {
exitFunction = true;
} else {
D2_state = LOW;
D4_state = LOW;
}
//////////////////////////////////////////////
// Check if this was D4 //////////////////////
if (digitalRead(buttonPin3) == LOW) {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
//Pin D4 triggered the ISR on a Falling pulse
D4_state = !D4_state;
//Set LED 3 to state of D4_state boolean
digitalWrite(ledPin3, D4_state);
}
if (D4_state == LOW) {
exitFunction = true;
} else {
D2_state = LOW;
D3_state = LOW;
}
//////////////////////////////////////////////
delay_press_last = millis();
}
}