/*
Code for simulating the shift lights of the BMW screen
*/
const uint8_t LedRed = 5;
const uint8_t LedGreen = 3;
const uint8_t LedBlue = 6;
const uint8_t LDR = A3;
uint16_t LdrValue = 0;
float lightLevel = 0.2;
uint8_t amountRed = 0;
uint8_t amountGreen = 0;
uint8_t amountBlue = 0;
// Speed point where action takes place: nDownShift, nUpShift, nRedline
const uint16_t nTicks[]{
3000, 6000, 6500
};
uint16_t nEngine = 0;
void setup() {
}
void loop() {
// Use the LDR as speed input.
LdrValue = analogRead(LDR);
nEngine = map(LdrValue, 0, 1023, 800, nTicks[2]);
// green, yellow, orange, red
if (nEngine > nTicks[0]*0.9 && nEngine<= nTicks[0]){ // blue
amountRed = 0;
amountGreen = 0;
amountBlue = 255;
} else if (nEngine > nTicks[1]*0.85 && nEngine<= nTicks[1]*0.9){ // green
amountRed = 0;
amountGreen = 255;
amountBlue = 0;
} else if (nEngine > nTicks[1]*0.9 && nEngine<= nTicks[1]*0.95){ // yellow
amountRed = 230;
amountGreen = 255;
amountBlue = 0;
} else if (nEngine > nTicks[1]*0.95 && nEngine<= nTicks[1]){ // orange
amountRed = 255;
amountGreen = 50;
amountBlue = 0;
} else if (nEngine > nTicks[1] && nEngine<= nTicks[1]*1.025){ // red
amountRed = 255;
amountGreen = 0;
amountBlue = 0;
} else if (nEngine > nTicks[1]*1.025){ // pink
amountRed = 255;
amountGreen = 0;
amountBlue = 50;
} else { // pink
amountRed = 0;
amountGreen = 0;
amountBlue = 0;
}
analogWrite(LedRed, amountRed);
analogWrite(LedGreen, amountGreen);
analogWrite(LedBlue, amountBlue);
}