135 lines
3.5 KiB
C++
135 lines
3.5 KiB
C++
#define SW1_PIN 8
|
|
#define LED1_PIN 10
|
|
#define LED2_PIN 11
|
|
#define QTR_SIG_PIN A3
|
|
#define QTR_5V_PIN A4
|
|
#define QTR_GND_PIN A5
|
|
#define MSEC_SAMPLE 1
|
|
|
|
enum {LED_OFF, BLINK_G, BLINK_R, BLINK_GR, BLINK_RATE};
|
|
|
|
boolean isSwPressed, prevIsSwPressed, isSwJustReleased, isSwJustPressed, isSwChange;
|
|
int state = LED_OFF, prevState = !state;
|
|
int stateTimer, adcQTR;
|
|
boolean isNewState;
|
|
|
|
void setup() {
|
|
pinMode(SW1_PIN, INPUT_PULLUP);// pinMode(SW1_PIN, INPUT); won't work
|
|
|
|
pinMode(LED1_PIN, OUTPUT); digitalWrite(LED1_PIN, LOW);
|
|
pinMode(LED2_PIN, OUTPUT); digitalWrite(LED2_PIN, LOW);
|
|
|
|
pinMode(QTR_SIG_PIN, INPUT);
|
|
pinMode(QTR_5V_PIN, OUTPUT); digitalWrite(QTR_5V_PIN, HIGH);
|
|
pinMode(QTR_GND_PIN, OUTPUT); digitalWrite(QTR_GND_PIN, LOW);
|
|
|
|
Serial.begin(9600);
|
|
Serial.println(F("Lab 2 Complex State Machine"));
|
|
} // setup()
|
|
|
|
// ADD loop() HERE - IT IS GIVEN ON THE NEXT PAGE
|
|
|
|
//****************************************************************************
|
|
void redOn(void) {
|
|
PORTB = PORTB |(1 << 0); // sets Uno dig_8, PORTB.0, pin to 1 (HIGH)
|
|
// physical pin 14 (28 pin DIP)
|
|
digitalWrite(LED1_PIN, HIGH); // alternative to PORTB setting
|
|
digitalWrite(LED2_PIN, LOW);
|
|
}
|
|
|
|
//****************************************************************************
|
|
void greenOn(void) {
|
|
digitalWrite(LED1_PIN, LOW);
|
|
digitalWrite(LED2_PIN, HIGH);
|
|
}
|
|
|
|
//****************************************************************************
|
|
void allOff(void) {
|
|
digitalWrite(LED1_PIN, LOW);
|
|
digitalWrite(LED2_PIN, LOW);
|
|
}
|
|
void loop() {
|
|
prevIsSwPressed = isSwPressed;
|
|
isSwPressed = !digitalRead(SW1_PIN);
|
|
isSwJustPressed = (isSwPressed && !prevIsSwPressed); // switch edge detection
|
|
isSwJustReleased = (!isSwPressed && prevIsSwPressed);
|
|
isSwChange = (isSwJustReleased || isSwJustPressed);
|
|
|
|
isNewState = (state != prevState);
|
|
prevState = state;
|
|
|
|
switch (state) {
|
|
|
|
case LED_OFF:
|
|
if (isNewState) Serial.println("LED_OFF");
|
|
allOff();
|
|
if (isSwJustReleased) state = BLINK_G;
|
|
break;
|
|
|
|
case BLINK_G:
|
|
if (isNewState) {
|
|
stateTimer = 0;
|
|
Serial.println("BLINK_G");
|
|
}
|
|
stateTimer++;
|
|
if (stateTimer < 250) greenOn();
|
|
else allOff();
|
|
if (stateTimer >= 1000) stateTimer = 0;
|
|
if (isSwJustReleased) {
|
|
allOff();
|
|
state = BLINK_R;
|
|
}
|
|
break;
|
|
|
|
// ADD BLINK_R STATE HERE. ************
|
|
case BLINK_R:
|
|
if (isNewState) {
|
|
stateTimer = 0;
|
|
Serial.println("BLINK_R");
|
|
}
|
|
stateTimer++;
|
|
if (stateTimer < 250) redOn();
|
|
else allOff();
|
|
if (stateTimer >= 1000) stateTimer = 0;
|
|
if (isSwJustReleased) {
|
|
allOff();
|
|
state = BLINK_GR;
|
|
}
|
|
break;
|
|
|
|
case BLINK_GR:
|
|
if (isNewState) {
|
|
stateTimer = 0;
|
|
Serial.println("BLINK_GR");
|
|
}
|
|
stateTimer++;
|
|
if (stateTimer < 500) redOn();
|
|
else greenOn();
|
|
if (stateTimer >= 1000) stateTimer = 0;
|
|
if (isSwJustReleased) {
|
|
allOff();
|
|
state = BLINK_RATE;
|
|
}
|
|
break;
|
|
|
|
case BLINK_RATE:
|
|
if (isNewState) {
|
|
stateTimer = 0;
|
|
Serial.println("BLINK_RATE");
|
|
}
|
|
stateTimer++;
|
|
adcQTR = analogRead(QTR_SIG_PIN);
|
|
if (stateTimer < adcQTR/2) redOn();
|
|
else greenOn();
|
|
if (stateTimer >= adcQTR) stateTimer = 0;
|
|
if (isSwJustReleased) {
|
|
allOff();
|
|
state = LED_OFF;
|
|
}
|
|
break;
|
|
|
|
default: state = LED_OFF;
|
|
} // switch (state)
|
|
|
|
delay(MSEC_SAMPLE);
|
|
} // loop()
|