From ace6c671a687a681de099c5e1727d93d8f6d65b6 Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Fri, 16 Sep 2022 20:23:13 -0600 Subject: [PATCH] Add basic hardware simulation --- firmware/main/hardware.cpp | 57 ++++++++++++++++++++++++++++++++++++++ firmware/main/hardware.h | 15 ++++++++++ firmware/main/main.ino | 20 ++++++++----- 3 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 firmware/main/hardware.cpp create mode 100644 firmware/main/hardware.h diff --git a/firmware/main/hardware.cpp b/firmware/main/hardware.cpp new file mode 100644 index 0000000..45cc8ed --- /dev/null +++ b/firmware/main/hardware.cpp @@ -0,0 +1,57 @@ +// Library for managing hardware + +#include +#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; + +void initSimulation() { + simulating = true; + simulatedPressure = (float) random(10, 30); + inflatePSIPerSecond = random(8, 12) / 100.0; + deflatePSIPerSecond = random(35, 45) / 100.0; + deflateOffsetMultiplier = random(3, 10) / 100.0; + inflateOffsetMultiplier = 1.0 - deflateOffsetMultiplier; + offsetMultiplier = 1.0; +} + +void tickSimulation() { + static unsigned long lastTick = millis(); + + float pressureDelta = (millis() - lastTick) / 1000.0 * pressureChangeRate; + + simulatedPressure += pressureDelta; + lastTick = millis(); +} + +void measurePressure(float &pressureValue, int pin) { + if (simulating) { + float adjusted = simulatedPressure + (random(-100, 100) / 100.0); + adjusted *= offsetMultiplier; + pressureValue = 0.99 * pressureValue + 0.01 * adjusted; + } else { + int sensorValue = analogRead(pin); + float adjusted = 0.098 * sensorValue - 16.56 + 3.58; + pressureValue = 0.99 * pressureValue + 0.01 * adjusted; + } +} + +void setSoleniod(int solenoidState) { + if (solenoidState == SOLENOID_STOP) { + pressureChangeRate = 0.0; + offsetMultiplier = 1.0; + } else if (solenoidState == SOLENOID_INFLATE) { + pressureChangeRate = inflatePSIPerSecond; + offsetMultiplier = inflateOffsetMultiplier; + } else if (solenoidState == SOLENOID_DEFLATE) { + pressureChangeRate = -deflatePSIPerSecond; + offsetMultiplier = deflatePSIPerSecond; + } +} diff --git a/firmware/main/hardware.h b/firmware/main/hardware.h new file mode 100644 index 0000000..8c9f0cc --- /dev/null +++ b/firmware/main/hardware.h @@ -0,0 +1,15 @@ +// Library for managing hardware + +#ifndef _hardware_H_ +#define _hardware_H_ + +#define SOLENOID_STOP 0 +#define SOLENOID_INFLATE 1 +#define SOLENOID_DEFLATE 2 + +void initSimulation(); +void tickSimulation(); +void measurePressure(float &pressureValue, int pin); +void setSoleniod(int solenoidState); + +#endif diff --git a/firmware/main/main.ino b/firmware/main/main.ino index 88ec329..31ba962 100644 --- a/firmware/main/main.ino +++ b/firmware/main/main.ino @@ -3,7 +3,9 @@ #include #include +#include "hardware.h" +#define SIMULATE 1 #define DEBUG 0 #define TIMEOUT_TIME 7000 @@ -58,6 +60,8 @@ int pressureSetPoint = 69; void setup() { + randomSeed(analogRead(A1)); + Serial.begin(115200); oled.init(); @@ -65,18 +69,20 @@ void setup() pinMode(UP_BUTTON, INPUT_PULLUP); pinMode(ENTER_BUTTON, INPUT); // Has external pullup pinMode(DOWN_BUTTON, INPUT_PULLUP); + +#ifdef SIMULATE + initSimulation(); +#endif } void loop() { - measurePressure(); + measurePressure(pressureValue, PRESSURE_SENSOR_PIN); 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; +#ifdef SIMULATE + tickSimulation(); +#endif } void runUI() { @@ -114,7 +120,7 @@ void runUI() { nextState = PRESSURE; timer = millis(); } else if (enterButton == HELD) { - ; + setSoleniod(SOLENOID_DEFLATE); } else if (upButton == PRESSED) { screenState = SET_POINT; pressureSetPoint = (int) pressureValue;