/*
Name: CarInterface.ino
Created: 3/17/2021 4:15:11 PM
Author: Scott Marley
Code and schematic demonstrating how to interface an Arduino with 12V signals
from a vehicle. This code is for educational purposes only, and should not be
used on public roads unless you know it is legal where you live.
*/
#include <FastLED.h>
#define NUM_LEDS1 18
#define NUM_LEDS2 18
#define NUM_LEDS3 12
#define NUM_LEDS4 12
#define INDICATOR_MS 30
#define BRIGHTNESS 200
// Connections to the 12V signals from vehicle
#define ALARM_INPUT 6
#define LIGHT_INPUT 5
#define BRAKE_INPUT 4
#define L_INDICATOR_INPUT 3
#define R_INDICATOR_INPUT 2
// Connections to the LED strips
#define L_BRAKE_LED_PIN 12
#define R_BRAKE_LED_PIN 9
#define L_INDICATOR_LED_PIN 11
#define R_INDICATOR_LED_PIN 10
// LED arrays for the lights
CRGB l_brake_leds[NUM_LEDS1];
CRGB r_brake_leds[NUM_LEDS2];
CRGB l_indicator_leds[NUM_LEDS3];
CRGB r_indicator_leds[NUM_LEDS4];
// Used for indicator animation
uint8_t indicatorLEDsLit = 0;
void setup() {
FastLED.addLeds<WS2812B, L_BRAKE_LED_PIN, GRB>(l_brake_leds, NUM_LEDS1).setCorrection(TypicalLEDStrip);
FastLED.addLeds<WS2812B, R_BRAKE_LED_PIN, GRB>(r_brake_leds, NUM_LEDS2).setCorrection(TypicalLEDStrip);
FastLED.addLeds<WS2812B, L_INDICATOR_LED_PIN, GRB>(l_indicator_leds, NUM_LEDS3).setCorrection(TypicalLEDStrip);
FastLED.addLeds<WS2812B, R_INDICATOR_LED_PIN, GRB>(r_indicator_leds, NUM_LEDS4).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
pinMode(BRAKE_INPUT, INPUT);
pinMode(L_INDICATOR_INPUT, INPUT);
pinMode(R_INDICATOR_INPUT, INPUT);
pinMode(LIGHT_INPUT, INPUT);
pinMode(ALARM_INPUT, INPUT);
}
void loop() {
// Read the state of the inputs
bool brakeInput = digitalRead(BRAKE_INPUT);
bool LIndicatorInput = digitalRead(L_INDICATOR_INPUT);
bool RIndicatorInput = digitalRead(R_INDICATOR_INPUT);
bool LightInput = digitalRead(LIGHT_INPUT);
bool AlarmInput = digitalRead(ALARM_INPUT);
// Brake lights
if (brakeInput) {
fill_solid(l_brake_leds, NUM_LEDS1, CRGB::Red);
fill_solid(r_brake_leds, NUM_LEDS2, CRGB::Red);
}
else {
fill_solid(l_brake_leds, NUM_LEDS1, CRGB::Black);
fill_solid(r_brake_leds, NUM_LEDS2, CRGB::Black);
}
// Brake lights
if (LightInput) {
fill_solid(l_brake_leds, NUM_LEDS1, CRGB::Red);
fill_solid(r_brake_leds, NUM_LEDS2, CRGB::Red);
}
else {
fill_solid(l_brake_leds, NUM_LEDS1, CRGB::DarkRed);
fill_solid(r_brake_leds, NUM_LEDS2, CRGB::DarkRed);
}
// Indicators
if (LIndicatorInput && !RIndicatorInput) {
// indicatorAnimation(l_indicator_leds);
l_indicator_leds[5] = CRGB::CRGB::Orange;
l_indicator_leds[6] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
l_indicator_leds[4] = CRGB::CRGB::Orange;
l_indicator_leds[7] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
l_indicator_leds[3] = CRGB::CRGB::Orange;
l_indicator_leds[8] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
l_indicator_leds[2] = CRGB::CRGB::Orange;
l_indicator_leds[9] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
l_indicator_leds[1] = CRGB::CRGB::Orange;
l_indicator_leds[10] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
l_indicator_leds[0] = CRGB::CRGB::Orange;
l_indicator_leds[11] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
l_indicator_leds[5] = CRGB::CRGB::Black;
l_indicator_leds[6] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
l_indicator_leds[4] = CRGB::CRGB::Black;
l_indicator_leds[7] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
l_indicator_leds[3] = CRGB::CRGB::Black;
l_indicator_leds[8] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
l_indicator_leds[2] = CRGB::CRGB::Black;
l_indicator_leds[9] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
l_indicator_leds[1] = CRGB::CRGB::Black;
l_indicator_leds[10] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
l_indicator_leds[0] = CRGB::CRGB::Black;
l_indicator_leds[11] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
}
else if (RIndicatorInput && !LIndicatorInput) {
// indicatorAnimation(r_indicator_leds);
r_indicator_leds[5] = CRGB::CRGB::Orange;
r_indicator_leds[6] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
r_indicator_leds[4] = CRGB::CRGB::Orange;
r_indicator_leds[7] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
r_indicator_leds[3] = CRGB::CRGB::Orange;
r_indicator_leds[8] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
r_indicator_leds[2] = CRGB::CRGB::Orange;
r_indicator_leds[9] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
r_indicator_leds[1] = CRGB::CRGB::Orange;
r_indicator_leds[10] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
r_indicator_leds[0] = CRGB::CRGB::Orange;
r_indicator_leds[11] = CRGB::CRGB::Orange;
FastLED.show();
delay(70);
r_indicator_leds[5] = CRGB::CRGB::Black;
r_indicator_leds[6] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
r_indicator_leds[4] = CRGB::CRGB::Black;
r_indicator_leds[7] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
r_indicator_leds[3] = CRGB::CRGB::Black;
r_indicator_leds[8] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
r_indicator_leds[2] = CRGB::CRGB::Black;
r_indicator_leds[9] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
r_indicator_leds[1] = CRGB::CRGB::Black;
r_indicator_leds[10] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
r_indicator_leds[0] = CRGB::CRGB::Black;
r_indicator_leds[11] = CRGB::CRGB::Black;
FastLED.show();
delay(70);
}
// Alarmlichten
if (AlarmInput) {
l_indicator_leds[5] = CRGB::CRGB::Orange;
l_indicator_leds[6] = CRGB::CRGB::Orange;
r_indicator_leds[5] = CRGB::CRGB::Orange;
r_indicator_leds[6] = CRGB::CRGB::Orange;
FastLED.show();
delay(100);
l_indicator_leds[4] = CRGB::CRGB::Orange;
l_indicator_leds[7] = CRGB::CRGB::Orange;
r_indicator_leds[4] = CRGB::CRGB::Orange;
r_indicator_leds[7] = CRGB::CRGB::Orange;
FastLED.show();
delay(100);
l_indicator_leds[3] = CRGB::CRGB::Orange;
l_indicator_leds[8] = CRGB::CRGB::Orange;
r_indicator_leds[3] = CRGB::CRGB::Orange;
r_indicator_leds[8] = CRGB::CRGB::Orange;
FastLED.show();
delay(100);
l_indicator_leds[2] = CRGB::CRGB::Orange;
l_indicator_leds[9] = CRGB::CRGB::Orange;
r_indicator_leds[2] = CRGB::CRGB::Orange;
r_indicator_leds[9] = CRGB::CRGB::Orange;
FastLED.show();
delay(100);
l_indicator_leds[1] = CRGB::CRGB::Orange;
l_indicator_leds[10] = CRGB::CRGB::Orange;
r_indicator_leds[1] = CRGB::CRGB::Orange;
r_indicator_leds[10] = CRGB::CRGB::Orange;
FastLED.show();
delay(100);
l_indicator_leds[0] = CRGB::CRGB::Orange;
l_indicator_leds[11] = CRGB::CRGB::Orange;
r_indicator_leds[0] = CRGB::CRGB::Orange;
r_indicator_leds[11] = CRGB::CRGB::Orange;
FastLED.show();
delay(100);
l_indicator_leds[5] = CRGB::CRGB::Black;
l_indicator_leds[6] = CRGB::CRGB::Black;
r_indicator_leds[5] = CRGB::CRGB::Black;
r_indicator_leds[6] = CRGB::CRGB::Black;
FastLED.show();
delay(100);
l_indicator_leds[4] = CRGB::CRGB::Black;
l_indicator_leds[7] = CRGB::CRGB::Black;
r_indicator_leds[4] = CRGB::CRGB::Black;
r_indicator_leds[7] = CRGB::CRGB::Black;
FastLED.show();
delay(100);
l_indicator_leds[3] = CRGB::CRGB::Black;
l_indicator_leds[8] = CRGB::CRGB::Black;
r_indicator_leds[3] = CRGB::CRGB::Black;
r_indicator_leds[8] = CRGB::CRGB::Black;
FastLED.show();
delay(100);
l_indicator_leds[2] = CRGB::CRGB::Black;
l_indicator_leds[9] = CRGB::CRGB::Black;
r_indicator_leds[2] = CRGB::CRGB::Black;
r_indicator_leds[9] = CRGB::CRGB::Black;
FastLED.show();
delay(100);
l_indicator_leds[1] = CRGB::CRGB::Black;
l_indicator_leds[10] = CRGB::CRGB::Black;
r_indicator_leds[1] = CRGB::CRGB::Black;
r_indicator_leds[10] = CRGB::CRGB::Black;
FastLED.show();
delay(100);
l_indicator_leds[0] = CRGB::CRGB::Black;
l_indicator_leds[11] = CRGB::CRGB::Black;
r_indicator_leds[0] = CRGB::CRGB::Black;
r_indicator_leds[11] = CRGB::CRGB::Black;
FastLED.show();
delay(100);
}
// Hazards
else if (LIndicatorInput && RIndicatorInput) {
fill_solid(l_indicator_leds, NUM_LEDS3, CRGB::Orange);
fill_solid(r_indicator_leds, NUM_LEDS4, CRGB::Orange);
}
else {
fill_solid(l_indicator_leds, NUM_LEDS3, CRGB::Black);
fill_solid(r_indicator_leds, NUM_LEDS4, CRGB::Black);
indicatorLEDsLit = 0;
}
FastLED.show();
}
void indicatorAnimation(CRGB *leds) {
for (int i = 0; i < indicatorLEDsLit; i++) {
leds[i] = CRGB::Orange;
}
EVERY_N_MILLISECONDS(INDICATOR_MS) {
indicatorLEDsLit++;
if (indicatorLEDsLit > NUM_LEDS3) indicatorLEDsLit = NUM_LEDS3;
}
}