Code for "Front Controller" (Rear and TC will eventually be functionally similar but are not built/coded yet):
//Setup Software Serial
#include <SoftwareSerial.h>
SoftwareSerial serialPort(12,11); // RX, TX
//Customizables
bool combineInputs = true; //Make Halo/Grl/Lwr inputs all the same
int serWait = 50; //Wait for serial comms
int dlyTime = 85; //Speed of flash seq
//Pin Define
//INPUTS
int LTurn = A0;
int RTurn = A1;
int Halo = A2;
int Grille = A3;
int Flash = A4;
int Lower = A5;
//OUTPUTS
int RingL = 2;
int RingR = 3;
int RingYL = 4;
int RingYR = 13;
int LowerL = 5;
int LowerR = 6;
int GrilleL = 7;
int GrilleR = 8;
int Extra1 = 9;
int Extra2 = 10;
//Globals
int LTurnState;
int RTurnState;
int HaloState;
int GrilleState;
int FlashState;
int LowerState;
bool serFlashState;
char CurrentStatus;
char serialData;
bool sendData;
void setup()
{
//Begin Serial
serialPort.begin(19200);
//Set Pin Modes
//Input
pinMode(LTurn, INPUT);
pinMode(RTurn, INPUT);
pinMode(Halo, INPUT);
pinMode(Grille, INPUT);
pinMode(Flash, INPUT);
pinMode(Lower, INPUT);
//Output
pinMode(LowerL, OUTPUT);
pinMode(LowerR, OUTPUT);
pinMode(RingL, OUTPUT);
pinMode(RingR, OUTPUT);
pinMode(RingYL, OUTPUT);
pinMode(RingYR, OUTPUT);
pinMode(GrilleL, OUTPUT);
pinMode(GrilleR, OUTPUT);
}
void loop()
{
checkSerial();
processSerial();
readInputs();
configureStatus();
sendSerial();
checkMode();
//Either flashMode(); or normalMode(); initiated from above
};
void checkSerial()
{
serialPort.listen();
serialPort.println('?');
delay(serWait);
if (serialPort.available() > 0)
{
serialData = serialPort.read();
}
};
void processSerial()
{
switch (serialData)
{
case '0':
serFlashState = false;
break;
case '1':
serFlashState = true;
break;
case '?':
sendData = true;
break;
}
};
void readInputs()
{
LTurnState = digitalRead(LTurn);
RTurnState = digitalRead(RTurn);
HaloState = digitalRead(Halo);
GrilleState = digitalRead(Grille);
FlashState = digitalRead(Flash);
LowerState = digitalRead(Lower);
//Combine?
if (combineInputs == true)
{
if (HaloState == HIGH || GrilleState == HIGH || LowerState == HIGH)
{
HaloState = HIGH;
GrilleState = HIGH;
LowerState = HIGH;
}
}
};
void configureStatus()
{
if (serFlashState == true)
{
CurrentStatus = 'F';
}
else if (LTurnState == LOW && RTurnState == LOW && HaloState == LOW && GrilleState == LOW && FlashState == LOW && LowerState == LOW)
{
CurrentStatus = 'O';
}
else if (FlashState == HIGH)
{
CurrentStatus = 'F';
}
else if (LTurnState == HIGH && RTurnState == LOW)
{
CurrentStatus = 'L';
}
else if (RTurnState == HIGH && LTurnState == LOW)
{
CurrentStatus = 'R';
}
else if (GrilleState == HIGH && HaloState == LOW && LowerState == LOW)
{
CurrentStatus = 'G';
}
else if (GrilleState == LOW && HaloState == HIGH && LowerState == LOW)
{
CurrentStatus = 'H';
}
else if (GrilleState == LOW && HaloState == LOW && LowerState == HIGH)
{
CurrentStatus = 'B';
}
else if (GrilleState == HIGH || HaloState == HIGH || LowerState == HIGH)
{
CurrentStatus = 'D';
}
else
{
CurrentStatus = 'E';
}
};
void sendSerial()
{
if (sendData == true)
{
serialPort.println(CurrentStatus);
sendData = false;
}
};
void checkMode()
{
//Check for Flash or Normal Mode
if (CurrentStatus == 'F')
{
flashMode();
}
else
{
normalMode();
}
};
void flashMode()
{
//First All Outputs LOW
digitalWrite(RingL, LOW);
digitalWrite(RingR, LOW);
digitalWrite(RingYL, LOW);
digitalWrite(RingYR, LOW);
digitalWrite(GrilleL, LOW);
digitalWrite(GrilleR, LOW);
digitalWrite(LowerL, LOW);
digitalWrite(LowerR, LOW);
digitalWrite(Extra1, LOW);
digitalWrite(Extra2, LOW);
delay(dlyTime);
//Flash Cycle 1 - Stage 1
digitalWrite(RingL, HIGH);
digitalWrite(RingYR, HIGH);
digitalWrite(RingR, HIGH);
digitalWrite(GrilleR, HIGH);
digitalWrite(LowerL, HIGH);
delay(dlyTime);
digitalWrite(RingL, LOW);
digitalWrite(RingYR, LOW);
digitalWrite(RingR, LOW);
digitalWrite(GrilleR, LOW);
digitalWrite(LowerL, LOW);
delay(dlyTime);
//Flash Cycle 1 - Stage 2
digitalWrite(RingL, HIGH);
digitalWrite(RingYR, HIGH);
digitalWrite(RingR, HIGH);
digitalWrite(GrilleR, HIGH);
digitalWrite(LowerL, HIGH);
delay(dlyTime);
digitalWrite(RingL, LOW);
digitalWrite(RingYR, LOW);
digitalWrite(RingR, LOW);
digitalWrite(GrilleR, LOW);
digitalWrite(LowerL, LOW);
delay(dlyTime);
//Flash Cycle 1 - Stage 3
digitalWrite(RingL, HIGH);
digitalWrite(RingYR, HIGH);
digitalWrite(RingR, HIGH);
digitalWrite(GrilleR, HIGH);
digitalWrite(LowerL, HIGH);
delay(dlyTime);
digitalWrite(RingL, LOW);
digitalWrite(RingYR, LOW);
digitalWrite(RingR, LOW);
digitalWrite(GrilleR, LOW);
digitalWrite(LowerL, LOW);
delay(dlyTime);
//Flash Cycle 2 - Stage 1
digitalWrite(RingR, HIGH);
digitalWrite(RingYL, HIGH);
digitalWrite(RingL, HIGH);
digitalWrite(GrilleL, HIGH);
digitalWrite(LowerR, HIGH);
delay(dlyTime);
digitalWrite(RingR, LOW);
digitalWrite(RingYL, LOW);
digitalWrite(RingL, LOW);
digitalWrite(GrilleL, LOW);
digitalWrite(LowerR, LOW);
delay(dlyTime);
//Flash Cycle 2 - Stage 2
digitalWrite(RingR, HIGH);
digitalWrite(RingYL, HIGH);
digitalWrite(RingL, HIGH);
digitalWrite(GrilleL, HIGH);
digitalWrite(LowerR, HIGH);
delay(dlyTime);
digitalWrite(RingR, LOW);
digitalWrite(RingYL, LOW);
digitalWrite(RingL, LOW);
digitalWrite(GrilleL, LOW);
digitalWrite(LowerR, LOW);
delay(dlyTime);
//Flash Cycle 2 - Stage 3
digitalWrite(RingR, HIGH);
digitalWrite(RingYL, HIGH);
digitalWrite(RingL, HIGH);
digitalWrite(GrilleL, HIGH);
digitalWrite(LowerR, HIGH);
delay(dlyTime);
digitalWrite(RingR, LOW);
digitalWrite(RingYL, LOW);
digitalWrite(RingL, LOW);
digitalWrite(GrilleL, LOW);
digitalWrite(LowerR, LOW);
//End of Flash Code
};
void normalMode()
{
switch (CurrentStatus)
{
case 'L':
digitalWrite(RingYL, HIGH);
digitalWrite(RingL, HIGH);
digitalWrite(RingYR, LOW);
digitalWrite(RingR, LOW);
break;
case 'R':
digitalWrite(RingYR, HIGH);
digitalWrite(RingR, HIGH);
digitalWrite(RingYL, LOW);
digitalWrite(RingL, LOW);
break;
case 'D':
digitalWrite(RingL, HIGH);
digitalWrite(RingR, HIGH);
digitalWrite(RingYL, LOW);
digitalWrite(RingYR, LOW);
digitalWrite(GrilleL, HIGH);
digitalWrite(GrilleR, HIGH);
digitalWrite(LowerL, HIGH);
digitalWrite(LowerR, HIGH);
digitalWrite(Extra1, HIGH);
digitalWrite(Extra2, HIGH);
break;
case 'H':
digitalWrite(RingL, HIGH);
digitalWrite(RingR, HIGH);
digitalWrite(RingYL, LOW);
digitalWrite(RingYR, LOW);
digitalWrite(GrilleL, LOW);
digitalWrite(GrilleR, LOW);
digitalWrite(LowerL, LOW);
digitalWrite(LowerR, LOW);
digitalWrite(Extra1, LOW);
digitalWrite(Extra2, LOW);
break;
case 'B':
digitalWrite(RingL, LOW);
digitalWrite(RingR, LOW);
digitalWrite(RingYL, LOW);
digitalWrite(RingYR, LOW);
digitalWrite(GrilleL, LOW);
digitalWrite(GrilleR, LOW);
digitalWrite(LowerL, HIGH);
digitalWrite(LowerR, HIGH);
digitalWrite(Extra1, LOW);
digitalWrite(Extra2, LOW);
break;
case 'G':
digitalWrite(RingL, LOW);
digitalWrite(RingR, LOW);
digitalWrite(RingYL, LOW);
digitalWrite(RingYR, LOW);
digitalWrite(GrilleL, HIGH);
digitalWrite(GrilleR, HIGH);
digitalWrite(LowerL, LOW);
digitalWrite(LowerR, LOW);
digitalWrite(LowerL, LOW);
digitalWrite(LowerR, LOW);
digitalWrite(Extra1, LOW);
digitalWrite(Extra2, LOW);
break;
case 'O':
digitalWrite(RingL, LOW);
digitalWrite(RingR, LOW);
digitalWrite(RingYL, LOW);
digitalWrite(RingYR, LOW);
digitalWrite(GrilleL, LOW);
digitalWrite(GrilleR, LOW);
digitalWrite(LowerL, LOW);
digitalWrite(LowerR, LOW);
digitalWrite(LowerL, LOW);
digitalWrite(LowerR, LOW);
digitalWrite(Extra1, LOW);
digitalWrite(Extra2, LOW);
break;
default:
digitalWrite(RingL, LOW);
digitalWrite(RingR, LOW);
digitalWrite(RingYL, LOW);
digitalWrite(RingYR, LOW);
digitalWrite(GrilleL, LOW);
digitalWrite(GrilleR, LOW);
digitalWrite(LowerL, LOW);
digitalWrite(LowerR, LOW);
digitalWrite(LowerL, LOW);
digitalWrite(LowerR, LOW);
digitalWrite(Extra1, LOW);
digitalWrite(Extra2, LOW);
break;
}
//End of normal mode
};