// inputs
// aux1 light brake turnl turnr horn key
int inputs[] = {44, 43, 39, 38, 37, 36, 35};
// outputs
// aux2 aux1 lbeam hbeam brake turnl turnr horn
int outputs[] = {15, 16, 17, 18, 23, 24, 25, 26};
// signals
// aux2 aux1 lbeam hbeam brake turnl turnr horn
int signals[] = {97, 96, 95, 94, 93, 92, 91, 90};
void setup() {
Serial.begin(9600);
//analogReference(external);
// inputs
for(int i=0; i<7; i++){
pinMode(inputs[i], INPUT);
}
// outputs
for(int i=0; i<8, i++){
pinMode(outputs[i], OUTPUT);
digitalWrite(outputs[i], LOW);
}
// signals
for(int i=0; i<8, i++){
pinMode(signals[i], INPUT);
}
// aux2, aux1, lbeam, hbeam, brake, turnl, turnr, horn
int outputs_on[8] = {0,0,0,0,0,0,0,0};
int errors_outputs[] = {0,0,0,0,0,0,0,0};
double batteryvoltage;
unsigned long timer_turnl = 0;
unsigned long timer_turnr = 0;
char turnl_type = "default";
char turnr_type = "fade";
int brightness_turnl = 0;
int brigtness_turnr = 0;
int fadeamount = 5;
int fadespeed = 100;
}
void loop() {
if(digitalRead(inputs[6]) == LOW && key_on == false){
errors_outputs = new int[]{};
key_on = true;
}else if(digitalRead(inputs[6] == LOW) && key_on = true){
// run as normal
}else if (digitalRead(inputs[6] == HIGH) && key_on == true){
key_on = false;
}else{
// limited features like alarm
}
// over voltage
batteryvoltage = analogRead(84);
if(batteryvoltage > 546){// 16V-5V, (819/16V-3.3V)
digitalWrite(outputs[7], HIGH);
outputs_on[7] = 1;
}else if(batteryvoltage < 546 && outputs_on[7] == 1 && digitalRead(inputs[5]) == HIGH){
digitalWrite(outputs[7], LOW);
outputs_on[7] = 0;
}
// overcurrent
for(int x=0; x<8; x++){
if(outputs_on[x] == 1){
// check if current is too high
if(analogRead(signals[x]) > 307){ // 7.5A-5V
// turn off output
digitalWrite(outputs[x], LOW);
outputs_on[x] = 0;
errors_outputs[x] = 1;
}
}
}
// licht aan
if(digitalRead(inputs[1]) == LOW && outputs_on[2] == 0 && errors_output[2] == 0 && errors_output[3] == 0){
digitalWrite(outputs[2]) = HIGH;
outputs_on[2] = 1;
}else if(digitalRead(inputs[1]) == HIGH && outputs_on[2] == 1){
digitalWrite(outputs[2], LOW);
outputs_on[2] = 0;
}
// remlicht aan
if(digitalRead(inputs[2]) == LOW && outputs_on[4] == 0 && errors_outputs[4] == 0){
digitalWrite(outputs[4]) = HIGH;
}else if(digitalRead(inputs[2]) == HIGH && outputs_on[4] == 1){
digitalWrite(outputs[4], LOW);
outputs_on[4] = 0;
}
// toeter aan
if(digitalRead(inputs[5]) == LOW && outputs_on[7] == 0 && errors_outputs[7] == 0){
digitalWrite(outputs[7]) = HIGH;
}else if(digitalRead(inputs[5]) == HIGH && outputs_on[7] == 1){
digitalWrite(outputs[7], LOW);
outputs_on[7] = 0;
}
// rechter knipperlicht aan
switch(turnr_type){
case "fade":
if(digitalRead(inputs[4]) == LOW && errors_outputs[6] == 0){
timer_turnl = millis();
brightness = brightness + fadeamount;
analogWrite(outputs[6], brightness);
outputs_on[6] = 1;
}else if(digitalRead(inputs[4]) == HIGH && outputs_on[6] == 1){
digitalWrite(outputs[6], LOW);
outputs_on[6] = 0;
brightness = 0;
}
break;
case "default":
if(digitalRead(inputs[4]) == LOW && errors_outputs[6] == 0){
if(outputs_on[6] == 0 || timer_turnr == 0){ // aan als je klikt
timer_turnr = millis();
digitalWrite(outputs[6], HIGH);
outputs_on[6] = 1;
}else if(outputs_on[6] == 1 || timer_turnr - millis() > 1000){ // uit na een seconde
timer_turnr = millis();
digitalWrite(outputs[6], LOW);
outputs_on[6] = 0;
}else if(outputs_on[6] == 0 || timer_turnr - millis() > 1000){ // aan na een seconde
timer_turnr = millis();
digitalWrite(outputs[6], HIGH);
outputs_on[6] = 1;
}
}else if(digitalRead(inputs[4]) == HIGH && outputs_on[6] == 1){
digitalWrite(outputs[6], LOW);
outputs_on[6] = 0;
timer_turnr = 0;
}else if(digitalRead(inputs[4]) == HIGH && timer_turnr =!0){
timer_turnr = 0;
}
break;
}
// linker knipperlicht aan
switch(turnl_type){
case "fade":
if(digitalRead(inputs[3]) == LOW && errors_outputs[5] == 0){
timer_turnl = millis();
brightness = brightness + fadeamount;
analogWrite(outputs[5], brightness);
outputs_on[5] = 1;
}else if(digitalRead(inputs[3]) == HIGH && outputs_on[5] == 1){
digitalWrite(outputs[5], LOW);
outputs_on[5] = 0;
brightness = 0;
}
break;
case "default":
if(digitalRead(inputs[3]) == LOW && errors_outputs[5] == 0){
if(outputs_on[5] == 0 || timer_turnl == 0){ // aan als je klikt
timer_turnl = millis();
digitalWrite(outputs[5], HIGH);
outputs_on[5] = 1;
}else if(outputs_on[5] == 1 || timer_turnl - millis() > 1000){ // uit na een seconde
timer_turnl = millis();
digitalWrite(outputs[5], LOW);
outputs_on[5] = 0;
}else if(outputs_on[5] == 0 || timer_turnl - millis() > 1000){ // aan na een seconde
timer_turnl = millis();
digitalWrite(outputs[5], HIGH);
outputs_on[5] = 1;
}
}else if(digitalRead(inputs[3]) == HIGH && outputs_on[5] == 1){
digitalWrite(outputs[5], LOW);
outputs_on[5] = 0;
timer_turn1 = 0;
}else if(digitalRead(inputs[3]) == HIGH && timer_turnl =!0){
timer_turnl = 0;
}
break;
}