diff --git a/firmware/main/main.ino b/firmware/main/main.ino index 01fc79f..88ec329 100644 --- a/firmware/main/main.ino +++ b/firmware/main/main.ino @@ -6,6 +6,7 @@ #define DEBUG 0 +#define TIMEOUT_TIME 7000 #define BUTTON_HOLD_TIME 500 #define BUTTON_PRESS_TIME 20 @@ -13,14 +14,16 @@ #define ENTER_BUTTON 30 #define DOWN_BUTTON 27 +#define PRESSURE_SENSOR_PIN A0 + Adafruit_FeatherOLED oled = Adafruit_FeatherOLED(); static const unsigned char PROGMEM arrow[] = { B10000000, - B11000000, - B11100000, - B11000000, - B10000000}; + B11000000, + B11100000, + B11000000, + B10000000}; //oled.drawBitmap(0, 1, arrow, 8, 5, 1); @@ -34,7 +37,14 @@ enum buttonStates { }; enum screenStates { + BOOT_UP, PRESSURE, + SET_POINT, + BEGIN_RUN, + RUNNING, + SAY_CANCEL, + SAY_HOLD, + SAY_TIMEOUT, SETTINGS, NUM_SCREENSTATES }; @@ -43,49 +53,230 @@ enum buttonStates upButton = OPEN; enum buttonStates enterButton = OPEN; enum buttonStates downButton = OPEN; +float pressureValue = 0.0; int pressureSetPoint = 69; void setup() { - Serial.begin(115200); + Serial.begin(115200); - oled.init(); + oled.init(); - pinMode(UP_BUTTON, INPUT_PULLUP); - pinMode(ENTER_BUTTON, INPUT); // Has external pullup - pinMode(DOWN_BUTTON, INPUT_PULLUP); + pinMode(UP_BUTTON, INPUT_PULLUP); + pinMode(ENTER_BUTTON, INPUT); // Has external pullup + pinMode(DOWN_BUTTON, INPUT_PULLUP); } void loop() { + measurePressure(); pollButtons(); runUI(); } +void measurePressure() { + int sensorValue = analogRead(PRESSURE_SENSOR_PIN); + float adjusted = 0.098 * sensorValue - 16.56 + 3.58; + pressureValue = 0.99 * pressureValue + 0.01 * adjusted; +} + void runUI() { - static enum screenStates screenState = PRESSURE; + static enum screenStates screenState = BOOT_UP; + static enum screenStates nextState = BOOT_UP; + + static unsigned long timer = millis(); + + static unsigned long runTime = millis(); + + int num_dots = 0; oled.clearDisplay(); switch (screenState) { + case BOOT_UP: + if (millis() >= timer + 2000) { + screenState = PRESSURE; + } + + oled.setCursor(0,0); + oled.setTextSize(2); + oled.println("STC TECH"); + + oled.setTextSize(1); + oled.println(""); + oled.print(" INITIALIZING"); + + oled.display(); + break; + case PRESSURE: - if (enterButton == HELD) screenState = SETTINGS; + if (enterButton == PRESSED) { + screenState = SAY_HOLD; + nextState = PRESSURE; + timer = millis(); + } else if (enterButton == HELD) { + ; + } else if (upButton == PRESSED) { + screenState = SET_POINT; + pressureSetPoint = (int) pressureValue; + timer = millis(); + } else if (downButton == PRESSED) { + screenState = SET_POINT; + pressureSetPoint = (int) pressureValue; + timer = millis(); + } else if (upButton == HELD) { + screenState = SET_POINT; + pressureSetPoint = (int) pressureValue; + timer = millis(); + } else if (downButton == HELD) { + screenState = SET_POINT; + pressureSetPoint = (int) pressureValue; + timer = millis(); + } + + oled.setCursor(0,0); + oled.setTextSize(3); + oled.print((int) pressureValue); + oled.print(" PSI"); + + oled.display(); + break; - if (upButton == PRESSED) { + case SET_POINT: + if (enterButton == PRESSED) { + screenState = SAY_HOLD; + nextState = SET_POINT; + timer = millis(); + } else if (enterButton == HELD) { + screenState = BEGIN_RUN; + timer = millis(); + } else if (upButton == PRESSED) { + timer = millis(); pressureSetPoint++; } else if (downButton == PRESSED) { + timer = millis(); pressureSetPoint--; } else if (upButton == HELD) { + timer = millis(); pressureSetPoint++; delay(75); } else if (downButton == HELD) { + timer = millis(); pressureSetPoint--; delay(75); + } else if (millis() >= timer + TIMEOUT_TIME) { + screenState = SAY_TIMEOUT; + nextState = PRESSURE; + timer = millis(); } - oled.setCursor(0,0); oled.setTextSize(3); oled.print(pressureSetPoint); + oled.println(" PSI"); + oled.setTextSize(1); + oled.println("TARGET"); + + oled.display(); + + break; + + case BEGIN_RUN: + if (millis() >= timer + 2000) { + screenState = RUNNING; + runTime = millis(); + } + + oled.setCursor(0,0); + oled.setTextSize(1); + oled.println(""); + oled.setTextSize(2); + if (pressureSetPoint > (int) pressureValue) { + oled.print("INFLATING"); + } else if (pressureSetPoint < (int) pressureValue) { + oled.print("DEFLATING"); + } else { + oled.print("DONE"); + } + + oled.display(); + + break; + + case RUNNING: + if (enterButton == PRESSED) { + screenState = SAY_CANCEL; + nextState = PRESSURE; + timer = millis(); + } else if (upButton == PRESSED) { + screenState = SAY_CANCEL; + nextState = PRESSURE; + timer = millis(); + } else if (downButton == PRESSED) { + screenState = SAY_CANCEL; + nextState = PRESSURE; + timer = millis(); + } + + oled.setCursor(0,0); + oled.setTextSize(3); + oled.print((int) pressureValue); + oled.println(" PSI"); + + oled.setTextSize(1); + if (pressureSetPoint > (int) pressureValue) { + oled.print("INFLATING"); + } else if (pressureSetPoint < (int) pressureValue) { + oled.print("DEFLATING"); + } else { + oled.print("DONE"); + } + + num_dots = (int) ((millis() - runTime) / 400) % 4; + for (int i = 0; i < num_dots; i++) { + oled.print("."); + } + + oled.display(); + + break; + + case SAY_CANCEL: + if (millis() >= timer + 1000) { + screenState = nextState; + timer = millis(); + } + + oled.setCursor(0,0); + oled.setTextSize(3); + oled.print("CANCEL"); + + oled.display(); + + break; + + case SAY_HOLD: + if (millis() >= timer + 500) { + screenState = nextState; + timer = millis(); + } + + oled.setCursor(0,0); + oled.setTextSize(3); + oled.print("HOLD"); + + oled.display(); + + break; + + case SAY_TIMEOUT: + if (millis() >= timer + 1000) { + screenState = nextState; + timer = millis(); + } + + oled.setCursor(0,0); + oled.setTextSize(3); + oled.print("TIMEOUT"); oled.display(); @@ -108,13 +299,13 @@ void pollButtons() { } else if (upButton == HELD) { Serial.println("up button held"); } - + if (enterButton == PRESSED) { Serial.println("enter button pressed"); } else if (enterButton == HELD) { Serial.println("enter button held"); } - + if (downButton == PRESSED) { Serial.println("down button pressed"); } else if (downButton == HELD) {