cpet-252/1-January/lab2g/lab2g.ino

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()