It was some pain in the a*** to run the wires into the car and I was looking for a simple and elegant solution.
And I was hit by inspiration!
I found the solution!
A DRL which power ON at the engine start and goes OFF a few minutes after the engine is stopped!
But how?
Simple, with an Arduino we test the battery voltage and decide to go ON or OFF because the lead-acid car battery goes under 12.8 V when the engine is stopped and above 13.4 when the engine is running!
Here is the code:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// About using interrupts: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ | |
/* | |
We will use volatile integer. | |
A variable should be declared volatile whenever its value can be changed | |
by something beyond the control of the code section in which it appears, | |
such as a concurrently executing thread. | |
In the Arduino, the only place that this is likely to occur is in sections | |
of code associated with interrupts, called an interrupt service routine. | |
This is MY solution for the problem... | |
I am not a proffesional coder so other people can find other ways, maybe more elegant | |
for the same solution. | |
The code is self-explanatory but I will answer to your questions if you need so. | |
I am playing with the code and I am doing my own hardware. | |
Feel free to use this, but please mention the author and my webpage: | |
http://yo3hjv.blogger.com | |
Thank you and I hope we will drink a beer at some point in our life! | |
This is version 1.0. | |
January 2020 | |
*/ | |
// DRL will be powered ON automatic after the engine is started. | |
// This is done by reading the battery voltage via a resistive divider calculated | |
// to have max 5 V on ADC port when input 20 V | |
// Battery to A0 - 330 KOhm, from A0 to GND - 100 KOhm | |
// According to formula, we will have 4.61 V on A0 when battery voltage is 20 V. | |
// A suitable 5V Zenner diode is reccomended. | |
int readADC = 0; | |
int volts = 0; | |
#define led1 5 // Flash LED group 1 let's say "LEFT SIDE" | |
#define led2 6 // Flash LED group 2 " RIGHT SIDE" | |
const byte setPin = 2; // Change mode command. Button to the GND, internall pullup setup | |
volatile byte i; // The value of "i" can be changed from ISR | |
void setup() { | |
volatile byte i = 0; | |
Serial.begin(9600); | |
pinMode(led1, OUTPUT); | |
pinMode(led2, OUTPUT); | |
pinMode(setPin, INPUT_PULLUP); | |
attachInterrupt(digitalPinToInterrupt(setPin), increment, FALLING); | |
} | |
void loop() { | |
volts = readVolt(); | |
Serial.println(volts); | |
if (volts >= 200){ | |
//Serial.println(i); | |
if (i == 0){ | |
digitalWrite(led1, HIGH); | |
digitalWrite(led2, HIGH); | |
} | |
else if (i == 1) { | |
noLed(); | |
flash1(); | |
} | |
else if (i == 2) { | |
noLed(); | |
flash2(); | |
} | |
else if (i == 3) { | |
noLed(); | |
flash3(); | |
} | |
else if (i == 4) { | |
noLed(); | |
flash4(); | |
} | |
else if (i == 5) { | |
noLed(); | |
flash5(); | |
} | |
else if (i == 6) { | |
noLed(); | |
flash6(); | |
} | |
else { | |
digitalWrite(led1, HIGH); | |
digitalWrite(led2, HIGH); | |
} | |
if (i == 10) { | |
i = 0; // When i == 10 we reset the value to zero | |
} | |
} // end of voltage "IF" | |
else if (volts <= 195){ | |
// Different value to shutdown for some hysteresys. | |
noLed(); | |
} | |
} | |
// We gonna read the ADC for five times, make average | |
// and scale it to 8 bit for convenience | |
int readVolt(){ | |
int i; | |
int sval = 0; | |
for (i = 0; i < 5; i++){ | |
sval = sval + analogRead(0); // voltsor on analog pin 0 | |
} | |
sval = sval / 5; // average | |
sval = sval / 4; // scale to 8 bit (0 - 255) | |
sval = 255 - sval; // invert output | |
return sval; | |
} | |
// Here we increment the global variable i. | |
// Later we will use the incremented value to change the flashes | |
void increment() { | |
i++; | |
} | |
// Obvious, we need a "no LED" state | |
void noLed() { | |
digitalWrite(led1, LOW); | |
digitalWrite(led2, LOW); | |
} | |
// Some dancing lights from LEDs | |
void flash1() | |
{ | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay (100); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(100); | |
} | |
void flash2() | |
{ | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay (100); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(100); | |
} | |
void flash3() | |
{ | |
digitalWrite (led1, HIGH); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
digitalWrite (led2, LOW); | |
delay(700); | |
} | |
void flash4() | |
{ | |
digitalWrite (led1, HIGH); | |
digitalWrite (led2, HIGH); | |
delay(300); | |
digitalWrite (led1, LOW); | |
digitalWrite (led2, LOW); | |
delay(200); | |
digitalWrite (led1, HIGH); | |
digitalWrite (led2, HIGH); | |
delay(300); | |
digitalWrite (led1, LOW); | |
digitalWrite (led2, LOW); | |
delay(200); | |
digitalWrite (led1, HIGH); | |
digitalWrite (led2, HIGH); | |
delay(300); | |
digitalWrite (led1, LOW); | |
digitalWrite (led2, LOW); | |
delay(200); | |
} | |
void flash5() | |
{ | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(250); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(250); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(250); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(250); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(250); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay (250); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(250); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(250); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(250); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(250); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(250); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(250); | |
} | |
void flash6() | |
{ | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(50); | |
digitalWrite (led1, HIGH); | |
delay(50); | |
digitalWrite (led1, LOW); | |
delay(300); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(50); | |
digitalWrite (led2, HIGH); | |
delay(50); | |
digitalWrite (led2, LOW); | |
delay(300); | |
} |