Created
January 5, 2020 21:16
-
-
Save yo3hjv/914a23d73353bbb75368adff0d451ffd to your computer and use it in GitHub Desktop.
Automatic DRL with chasing lights
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); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment