Add setpoint and run screens

master
Tanner Collin 2 years ago
parent 8e0aa533e9
commit d9c3b6acaa
  1. 221
      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) {

Loading…
Cancel
Save