diff --git a/firmware/main/hardware.cpp b/firmware/main/hardware.cpp index 4c3a4bc..0dfed2a 100644 --- a/firmware/main/hardware.cpp +++ b/firmware/main/hardware.cpp @@ -4,21 +4,21 @@ #include "hardware.h" bool simulating = false; -float simulatedPressure = 0.0; -float inflatePSIPerSecond = 0.0; -float deflatePSIPerSecond = 0.0; -float pressureChangeRate = 0.0; -float deflateOffsetMultiplier = 0.0; -float inflateOffsetMultiplier = 0.0; -float offsetMultiplier = 0.0; +double simulatedPressure = 0.0; +double inflatePSIPerSecond = 0.0; +double deflatePSIPerSecond = 0.0; +double pressureChangeRate = 0.0; +double deflateOffsetMultiplier = 0.0; +double inflateOffsetMultiplier = 0.0; +double offsetMultiplier = 0.0; void initSimulation() { simulating = true; - simulatedPressure = (float) random(10, 30); + simulatedPressure = (double) random(10, 30); inflatePSIPerSecond = 0.0303; deflatePSIPerSecond = 0.0958; deflateOffsetMultiplier = random(3, 10) / 100.0; - inflateOffsetMultiplier = 1.0 - deflateOffsetMultiplier; + inflateOffsetMultiplier = random(103, 160) / 100.0; offsetMultiplier = 1.0; } @@ -26,33 +26,33 @@ void tickSimulation() { static unsigned long lastTick = millis(); if (millis() > lastTick + 100) { - float pressureDelta = (millis() - lastTick) / 1000.0 * pressureChangeRate; + double pressureDelta = (millis() - lastTick) / 1000.0 * pressureChangeRate; simulatedPressure += pressureDelta; lastTick = millis(); } } -void measurePressure(float &pressureValue) { +void measurePressure(double &pressureValue) { if (simulating) { - float adjusted = simulatedPressure + (random(-100, 100) / 100.0); + double adjusted = simulatedPressure + (random(-100, 100) / 100.0); adjusted *= offsetMultiplier; pressureValue = 0.99 * pressureValue + 0.01 * adjusted; } else { int sensorValue = analogRead(PRESSURE_SENSOR_PIN); - float adjusted = 0.098 * sensorValue - 16.56 + 3.58; + double adjusted = 0.098 * sensorValue - 16.56 + 3.58; pressureValue = 0.99 * pressureValue + 0.01 * adjusted; } } -void resamplePressure(float &pressureValue) { +void resamplePressure(double &pressureValue) { if (simulating) { - float adjusted = simulatedPressure + (random(-100, 100) / 100.0); + double adjusted = simulatedPressure + (random(-100, 100) / 100.0); adjusted *= offsetMultiplier; pressureValue = adjusted; } else { int sensorValue = analogRead(PRESSURE_SENSOR_PIN); - float adjusted = 0.098 * sensorValue - 16.56 + 3.58; + double adjusted = 0.098 * sensorValue - 16.56 + 3.58; pressureValue = adjusted; } } diff --git a/firmware/main/hardware.h b/firmware/main/hardware.h index bdfbaa7..b19ead5 100644 --- a/firmware/main/hardware.h +++ b/firmware/main/hardware.h @@ -7,17 +7,17 @@ #define SOLENOID_INFLATE 1 #define SOLENOID_DEFLATE 2 -#define RELAY1_PIN 11 -#define RELAY2_PIN 7 +#define RELAY1_PIN 7 +#define RELAY2_PIN 11 #define PRESSURE_SENSOR_PIN A0 -extern float simulatedPressure; +extern double simulatedPressure; void initSimulation(); void tickSimulation(); -void measurePressure(float &pressureValue); -void resamplePressure(float &pressureValue); +void measurePressure(double &pressureValue); +void resamplePressure(double &pressureValue); void setSoleniod(int solenoidState); #endif diff --git a/firmware/main/main.ino b/firmware/main/main.ino index d05c41d..da394fd 100644 --- a/firmware/main/main.ino +++ b/firmware/main/main.ino @@ -72,13 +72,14 @@ enum buttonStates enterButton = OPEN; enum buttonStates downButton = OPEN; enum screenStates screenState = BOOT_UP; -float pressureValue = 0.0; +double pressureValue = 0.0; int pressureSetPoint = 0; -//float initialPressure = 0.0; -//float runningPressure = 0.0; -float sampledPressure = 0.0; +double initialPressure = 0.0; +//double runningPressure = 0.0; +double sampledPressure = 0.0; +double runningRateInv = 0.0; -int debounceValue(float value) { +int debounceValue(double value) { static int prevValue = (int) value; if (abs(prevValue - value) > 0.4) { @@ -135,6 +136,8 @@ void logData() { #endif Serial.print(", sampled: "); Serial.print(sampledPressure); + Serial.print(", rate (inv): "); + Serial.print(runningRateInv); Serial.print(", setpoint: "); Serial.print(pressureSetPoint); Serial.print(", state: "); @@ -151,6 +154,7 @@ void runUI() { static unsigned long timer = millis(); static unsigned long startTime = millis(); + static unsigned long stopTime = millis(); static bool isInflating = false; static bool isDeflating = false; @@ -249,7 +253,7 @@ void runUI() { break; case INIT_RUN: - //initialPressure = pressureValue; + initialPressure = pressureValue; startTime = millis(); timer = millis(); screenState = BEGIN_RUN; @@ -284,6 +288,7 @@ void runUI() { setSoleniod(SOLENOID_STOP); screenState = MEASURING; timer = millis(); + stopTime = millis(); } break; @@ -292,6 +297,22 @@ void runUI() { if (millis() >= timer + 3000) { sampledPressure = pressureValue; + runningRateInv = (stopTime - startTime) / (sampledPressure - initialPressure); + + Serial.print("stopTime: "); + Serial.print(stopTime); + Serial.print(", startTime: "); + Serial.print(startTime); + Serial.print(", sampledPressure: "); + Serial.print(sampledPressure); + Serial.print(", initialPressure: "); + Serial.print(initialPressure); + Serial.print(", rate: "); + Serial.print(runningRateInv); + Serial.println(""); + + initialPressure = sampledPressure; + if (isInflating && (int) sampledPressure >= pressureSetPoint) { screenState = SAY_DONE; nextState = PRESSURE; @@ -303,6 +324,7 @@ void runUI() { } timer = millis(); + startTime = millis(); } if (millis() < timer + 500) { @@ -323,14 +345,17 @@ void runUI() { case RUNNING: if (enterButton == PRESSED) { + setSoleniod(SOLENOID_STOP); screenState = SAY_CANCEL; nextState = PRESSURE; timer = millis(); } else if (upButton == PRESSED) { + setSoleniod(SOLENOID_STOP); screenState = SAY_CANCEL; nextState = PRESSURE; timer = millis(); } else if (downButton == PRESSED) { + setSoleniod(SOLENOID_STOP); screenState = SAY_CANCEL; nextState = PRESSURE; timer = millis(); @@ -339,9 +364,11 @@ void runUI() { if (isInflating && millis() >= timer + 20000) { screenState = MEASURING; timer = millis(); + stopTime = millis(); } else if (isDeflating && millis() >= timer + 10000) { screenState = MEASURING; timer = millis(); + stopTime = millis(); } if (isInflating) {