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;
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);
}
}

View File

@ -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

View File

@ -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);