From cc123773b5e4747e362e0579a0cf4f44cf6d02e7 Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Sun, 18 Sep 2022 16:09:21 -0600 Subject: [PATCH] Integrate relays, improve logging --- firmware/main/hardware.cpp | 20 +++++---- firmware/main/hardware.h | 11 ++++- firmware/main/main.ino | 83 ++++++++++++++++++++++++++------------ 3 files changed, 80 insertions(+), 34 deletions(-) diff --git a/firmware/main/hardware.cpp b/firmware/main/hardware.cpp index 2a2a9c7..4c3a4bc 100644 --- a/firmware/main/hardware.cpp +++ b/firmware/main/hardware.cpp @@ -30,31 +30,28 @@ void tickSimulation() { simulatedPressure += pressureDelta; lastTick = millis(); - - Serial.print("Simulated pressure: "); - Serial.println(simulatedPressure); } } -void measurePressure(float &pressureValue, int pin) { +void measurePressure(float &pressureValue) { if (simulating) { float adjusted = simulatedPressure + (random(-100, 100) / 100.0); adjusted *= offsetMultiplier; pressureValue = 0.99 * pressureValue + 0.01 * adjusted; } else { - int sensorValue = analogRead(pin); + int sensorValue = analogRead(PRESSURE_SENSOR_PIN); float adjusted = 0.098 * sensorValue - 16.56 + 3.58; pressureValue = 0.99 * pressureValue + 0.01 * adjusted; } } -void resamplePressure(float &pressureValue, int pin) { +void resamplePressure(float &pressureValue) { if (simulating) { float adjusted = simulatedPressure + (random(-100, 100) / 100.0); adjusted *= offsetMultiplier; pressureValue = adjusted; } else { - int sensorValue = analogRead(pin); + int sensorValue = analogRead(PRESSURE_SENSOR_PIN); float adjusted = 0.098 * sensorValue - 16.56 + 3.58; pressureValue = adjusted; } @@ -64,11 +61,20 @@ void setSoleniod(int solenoidState) { if (solenoidState == SOLENOID_STOP) { pressureChangeRate = 0.0; offsetMultiplier = 1.0; + + digitalWrite(RELAY1_PIN, HIGH); + digitalWrite(RELAY2_PIN, HIGH); } else if (solenoidState == SOLENOID_INFLATE) { pressureChangeRate = inflatePSIPerSecond; offsetMultiplier = inflateOffsetMultiplier; + + digitalWrite(RELAY1_PIN, LOW); + digitalWrite(RELAY2_PIN, HIGH); } else if (solenoidState == SOLENOID_DEFLATE) { pressureChangeRate = -deflatePSIPerSecond; offsetMultiplier = deflatePSIPerSecond; + + digitalWrite(RELAY1_PIN, HIGH); + digitalWrite(RELAY2_PIN, LOW); } } diff --git a/firmware/main/hardware.h b/firmware/main/hardware.h index 2da6853..bdfbaa7 100644 --- a/firmware/main/hardware.h +++ b/firmware/main/hardware.h @@ -7,10 +7,17 @@ #define SOLENOID_INFLATE 1 #define SOLENOID_DEFLATE 2 +#define RELAY1_PIN 11 +#define RELAY2_PIN 7 + +#define PRESSURE_SENSOR_PIN A0 + +extern float simulatedPressure; + void initSimulation(); void tickSimulation(); -void measurePressure(float &pressureValue, int pin); -void resamplePressure(float &pressureValue, int pin); +void measurePressure(float &pressureValue); +void resamplePressure(float &pressureValue); void setSoleniod(int solenoidState); #endif diff --git a/firmware/main/main.ino b/firmware/main/main.ino index 2b2743f..d05c41d 100644 --- a/firmware/main/main.ino +++ b/firmware/main/main.ino @@ -16,16 +16,14 @@ #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}; +//static const unsigned char PROGMEM arrow[] = +//{ B10000000, +// B11000000, +// B11100000, +// B11000000, +// B10000000}; //oled.drawBitmap(0, 1, arrow, 8, 5, 1); @@ -51,14 +49,34 @@ enum screenStates { SAY_HOLD, SAY_TIMEOUT, SETTINGS, - NUM_SCREENSTATES }; +static const char* stateLabels[] = { + "BOOT_UP", + "PRESSURE", + "SET_POINT", + "INIT_RUN", + "BEGIN_RUN", + "MEASURING", + "RUNNING", + "SAY_DONE", + "SAY_CANCEL", + "SAY_HOLD", + "SAY_TIMEOUT", + "SETTINGS", +}; + + enum buttonStates upButton = OPEN; enum buttonStates enterButton = OPEN; enum buttonStates downButton = OPEN; +enum screenStates screenState = BOOT_UP; float pressureValue = 0.0; +int pressureSetPoint = 0; +//float initialPressure = 0.0; +//float runningPressure = 0.0; +float sampledPressure = 0.0; int debounceValue(float value) { static int prevValue = (int) value; @@ -82,34 +100,57 @@ void setup() pinMode(ENTER_BUTTON, INPUT); // Has external pullup pinMode(DOWN_BUTTON, INPUT_PULLUP); + pinMode(RELAY1_PIN, OUTPUT); + pinMode(RELAY2_PIN, OUTPUT); + digitalWrite(RELAY1_PIN, HIGH); + digitalWrite(RELAY2_PIN, HIGH); + #ifdef SIMULATE initSimulation(); #endif - resamplePressure(pressureValue, PRESSURE_SENSOR_PIN); + resamplePressure(pressureValue); } void loop() { - measurePressure(pressureValue, PRESSURE_SENSOR_PIN); + measurePressure(pressureValue); pollButtons(); runUI(); + logData(); #ifdef SIMULATE tickSimulation(); #endif } +void logData() { + static unsigned long lastLogTime = millis(); + + if (millis() > lastLogTime + 100) { + Serial.print("pressure: "); + Serial.print(pressureValue); +#ifdef SIMULATE + Serial.print(", simulated: "); + Serial.print(simulatedPressure); +#endif + Serial.print(", sampled: "); + Serial.print(sampledPressure); + Serial.print(", setpoint: "); + Serial.print(pressureSetPoint); + Serial.print(", state: "); + Serial.print(stateLabels[screenState]); + Serial.println(""); + + lastLogTime = millis(); + } +} + void runUI() { - static enum screenStates screenState = BOOT_UP; static enum screenStates nextState = BOOT_UP; static unsigned long timer = millis(); - static int pressureSetPoint = 0; static unsigned long startTime = millis(); - //static float initialPressure = 0.0; - //static float runningPressure = 0.0; - static float sampledPressure = 0.0; static bool isInflating = false; static bool isDeflating = false; @@ -118,14 +159,6 @@ void runUI() { oled.clearDisplay(); - Serial.print("pressure: "); - Serial.print(pressureValue); - Serial.print(", sampled: "); - Serial.print(sampledPressure); - Serial.print(", setpoint: "); - Serial.print(pressureSetPoint); - Serial.println(""); - switch (screenState) { case BOOT_UP: if (millis() >= timer + 2000) { @@ -274,7 +307,7 @@ void runUI() { if (millis() < timer + 500) { // wait for solenoids to settle before averaging - resamplePressure(pressureValue, PRESSURE_SENSOR_PIN); + resamplePressure(pressureValue); } setSoleniod(SOLENOID_STOP);