Skip to content

Instantly share code, notes, and snippets.

@yo3hjv
Created January 5, 2020 21:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yo3hjv/914a23d73353bbb75368adff0d451ffd to your computer and use it in GitHub Desktop.
Save yo3hjv/914a23d73353bbb75368adff0d451ffd to your computer and use it in GitHub Desktop.
Automatic DRL with chasing lights
// 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