Integrate relays, improve logging

This commit is contained in:
Tanner Collin 2022-09-18 16:09:21 -06:00
parent 1833ecf607
commit cc123773b5
3 changed files with 80 additions and 34 deletions

View File

@ -30,31 +30,28 @@ void tickSimulation() {
simulatedPressure += pressureDelta; simulatedPressure += pressureDelta;
lastTick = millis(); lastTick = millis();
Serial.print("Simulated pressure: ");
Serial.println(simulatedPressure);
} }
} }
void measurePressure(float &pressureValue, int pin) { void measurePressure(float &pressureValue) {
if (simulating) { if (simulating) {
float adjusted = simulatedPressure + (random(-100, 100) / 100.0); float adjusted = simulatedPressure + (random(-100, 100) / 100.0);
adjusted *= offsetMultiplier; adjusted *= offsetMultiplier;
pressureValue = 0.99 * pressureValue + 0.01 * adjusted; pressureValue = 0.99 * pressureValue + 0.01 * adjusted;
} else { } else {
int sensorValue = analogRead(pin); int sensorValue = analogRead(PRESSURE_SENSOR_PIN);
float adjusted = 0.098 * sensorValue - 16.56 + 3.58; float adjusted = 0.098 * sensorValue - 16.56 + 3.58;
pressureValue = 0.99 * pressureValue + 0.01 * adjusted; pressureValue = 0.99 * pressureValue + 0.01 * adjusted;
} }
} }
void resamplePressure(float &pressureValue, int pin) { void resamplePressure(float &pressureValue) {
if (simulating) { if (simulating) {
float adjusted = simulatedPressure + (random(-100, 100) / 100.0); float adjusted = simulatedPressure + (random(-100, 100) / 100.0);
adjusted *= offsetMultiplier; adjusted *= offsetMultiplier;
pressureValue = adjusted; pressureValue = adjusted;
} else { } else {
int sensorValue = analogRead(pin); int sensorValue = analogRead(PRESSURE_SENSOR_PIN);
float adjusted = 0.098 * sensorValue - 16.56 + 3.58; float adjusted = 0.098 * sensorValue - 16.56 + 3.58;
pressureValue = adjusted; pressureValue = adjusted;
} }
@ -64,11 +61,20 @@ void setSoleniod(int solenoidState) {
if (solenoidState == SOLENOID_STOP) { if (solenoidState == SOLENOID_STOP) {
pressureChangeRate = 0.0; pressureChangeRate = 0.0;
offsetMultiplier = 1.0; offsetMultiplier = 1.0;
digitalWrite(RELAY1_PIN, HIGH);
digitalWrite(RELAY2_PIN, HIGH);
} else if (solenoidState == SOLENOID_INFLATE) { } else if (solenoidState == SOLENOID_INFLATE) {
pressureChangeRate = inflatePSIPerSecond; pressureChangeRate = inflatePSIPerSecond;
offsetMultiplier = inflateOffsetMultiplier; offsetMultiplier = inflateOffsetMultiplier;
digitalWrite(RELAY1_PIN, LOW);
digitalWrite(RELAY2_PIN, HIGH);
} else if (solenoidState == SOLENOID_DEFLATE) { } else if (solenoidState == SOLENOID_DEFLATE) {
pressureChangeRate = -deflatePSIPerSecond; pressureChangeRate = -deflatePSIPerSecond;
offsetMultiplier = deflatePSIPerSecond; offsetMultiplier = deflatePSIPerSecond;
digitalWrite(RELAY1_PIN, HIGH);
digitalWrite(RELAY2_PIN, LOW);
} }
} }

View File

@ -7,10 +7,17 @@
#define SOLENOID_INFLATE 1 #define SOLENOID_INFLATE 1
#define SOLENOID_DEFLATE 2 #define SOLENOID_DEFLATE 2
#define RELAY1_PIN 11
#define RELAY2_PIN 7
#define PRESSURE_SENSOR_PIN A0
extern float simulatedPressure;
void initSimulation(); void initSimulation();
void tickSimulation(); void tickSimulation();
void measurePressure(float &pressureValue, int pin); void measurePressure(float &pressureValue);
void resamplePressure(float &pressureValue, int pin); void resamplePressure(float &pressureValue);
void setSoleniod(int solenoidState); void setSoleniod(int solenoidState);
#endif #endif

View File

@ -16,16 +16,14 @@
#define ENTER_BUTTON 30 #define ENTER_BUTTON 30
#define DOWN_BUTTON 27 #define DOWN_BUTTON 27
#define PRESSURE_SENSOR_PIN A0
Adafruit_FeatherOLED oled = Adafruit_FeatherOLED(); Adafruit_FeatherOLED oled = Adafruit_FeatherOLED();
static const unsigned char PROGMEM arrow[] = //static const unsigned char PROGMEM arrow[] =
{ B10000000, //{ B10000000,
B11000000, // B11000000,
B11100000, // B11100000,
B11000000, // B11000000,
B10000000}; // B10000000};
//oled.drawBitmap(0, 1, arrow, 8, 5, 1); //oled.drawBitmap(0, 1, arrow, 8, 5, 1);
@ -51,14 +49,34 @@ enum screenStates {
SAY_HOLD, SAY_HOLD,
SAY_TIMEOUT, SAY_TIMEOUT,
SETTINGS, 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 upButton = OPEN;
enum buttonStates enterButton = OPEN; enum buttonStates enterButton = OPEN;
enum buttonStates downButton = OPEN; enum buttonStates downButton = OPEN;
enum screenStates screenState = BOOT_UP;
float pressureValue = 0.0; float pressureValue = 0.0;
int pressureSetPoint = 0;
//float initialPressure = 0.0;
//float runningPressure = 0.0;
float sampledPressure = 0.0;
int debounceValue(float value) { int debounceValue(float value) {
static int prevValue = (int) value; static int prevValue = (int) value;
@ -82,34 +100,57 @@ void setup()
pinMode(ENTER_BUTTON, INPUT); // Has external pullup pinMode(ENTER_BUTTON, INPUT); // Has external pullup
pinMode(DOWN_BUTTON, INPUT_PULLUP); pinMode(DOWN_BUTTON, INPUT_PULLUP);
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
digitalWrite(RELAY1_PIN, HIGH);
digitalWrite(RELAY2_PIN, HIGH);
#ifdef SIMULATE #ifdef SIMULATE
initSimulation(); initSimulation();
#endif #endif
resamplePressure(pressureValue, PRESSURE_SENSOR_PIN); resamplePressure(pressureValue);
} }
void loop() { void loop() {
measurePressure(pressureValue, PRESSURE_SENSOR_PIN); measurePressure(pressureValue);
pollButtons(); pollButtons();
runUI(); runUI();
logData();
#ifdef SIMULATE #ifdef SIMULATE
tickSimulation(); tickSimulation();
#endif #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() { void runUI() {
static enum screenStates screenState = BOOT_UP;
static enum screenStates nextState = BOOT_UP; static enum screenStates nextState = BOOT_UP;
static unsigned long timer = millis(); static unsigned long timer = millis();
static int pressureSetPoint = 0;
static unsigned long startTime = millis(); 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 isInflating = false;
static bool isDeflating = false; static bool isDeflating = false;
@ -118,14 +159,6 @@ void runUI() {
oled.clearDisplay(); oled.clearDisplay();
Serial.print("pressure: ");
Serial.print(pressureValue);
Serial.print(", sampled: ");
Serial.print(sampledPressure);
Serial.print(", setpoint: ");
Serial.print(pressureSetPoint);
Serial.println("");
switch (screenState) { switch (screenState) {
case BOOT_UP: case BOOT_UP:
if (millis() >= timer + 2000) { if (millis() >= timer + 2000) {
@ -274,7 +307,7 @@ void runUI() {
if (millis() < timer + 500) { if (millis() < timer + 500) {
// wait for solenoids to settle before averaging // wait for solenoids to settle before averaging
resamplePressure(pressureValue, PRESSURE_SENSOR_PIN); resamplePressure(pressureValue);
} }
setSoleniod(SOLENOID_STOP); setSoleniod(SOLENOID_STOP);