I have written a state machine for a vessel pressure testing device. When I run it recognizes the button I have wired and changes currentState to 1 but just stays in the main loop and never enters the case 1.
#include <HX711.h>
#include <genieArduino.h>
#include <Wire.h>
#include "MeanFilterLib.h"
#include "closedState.h"
#include "pressurizeState.h"
#include "maxpressureState.h"
#include "ventingState.h"
#include <SoftwareSerial.h>
#define DOUT 6
#define CLK 5 // loadcell input pins
HX711 scale;
int pressureread1 = A0;
int pressureread2 = A1;
int pressureswitch = A2;
const int goSwitch = 10;
const int DoorSwitch = 9;
const int valve_1_Pin = 8;
const int valve_2_Pin = 7;
float inputVoltage1; // transducer tank side
float outputPressure1;
float inputVoltage2; // transducer vessel side
float outputPressure2;
float calibration_factor = 710;
enum State { closed,
pressurize,
maxpressure,
venting
};
State currentState = 0; // current state of the system
Genie genie;
SoftwareSerial genieSerial(2, 3);
MeanFilter<float> meanFilter(50);
#define RESETLINE 4
void setup() {
Serial.begin(115200);
genieSerial.begin(115200);
genie.Begin(genieSerial);
//genie.AttachEventHandler(myGenieEventHandler);
pinMode(RESETLINE, OUTPUT); // Set D4 on Arduino to Output (4D Arduino Adaptor V2 - Display Reset)
digitalWrite(RESETLINE, 1); // Reset the Display via D4
delay(100);
digitalWrite(RESETLINE, 0); // unReset the Display via D4
// Let the display start up after the reset (This is important)
// Increase to 4500 or 5000 if you have sync problems as your project gets larger. Can depent on microSD init speed.
delay(5000);
// Set the brightness/Contrast of the Display - (Not needed but illustrates how)
// Most Displays use 0-15 for Brightness Control, where 0 = Display OFF, though to 15 = Max Brightness ON.
// Some displays are more basic, 1 (or higher) = Display ON, 0 = Display OFF.
genie.WriteContrast(14);
scale.begin(DOUT, CLK);
scale.tare();
long zero_factor = scale.read_average();
pinMode(valve_1_Pin, OUTPUT); // set valves and start with closed.
pinMode(valve_2_Pin, OUTPUT);
digitalWrite(valve_1_Pin, LOW);
digitalWrite(valve_2_Pin, LOW);
pinMode(12, INPUT_PULLUP); // TEST BUTTON
}
void loop() {
int buttonState = !digitalRead(12);
if (!digitalRead(12)) {
Serial.println("Button is HIGH");
} else {
Serial.println("Button is LOW");
}
//Serial.print("Button state");
//Serial.println(buttonState);
scale.set_scale(calibration_factor);
float weight = scale.get_units();
static unsigned long waitPeriod = millis();
float mean1 = meanFilter.AddValue(analogRead(pressureread1));
inputVoltage1 = mean1 * (5.0 / 1023);
outputPressure1 = (((inputVoltage1 / 661) - .004) * (10000 / .016) - 47); //-68
outputPressure1 = outputPressure1 < 0 ? 0 : outputPressure1;
float mean2 = meanFilter.AddValue(pressureread2);
inputVoltage2 = mean2 * (5.0 / 1023);
outputPressure2 = ((inputVoltage2 / 661) - .004) * (10000 / .016);
outputPressure2 = outputPressure2 < 0 ? 0 : outputPressure2;
genie.DoEvents();
// Serial.print (outputPressure1);
//Serial.print (" PSI");
//Serial.println (" ");
static unsigned long lastDisplayUpdate = 0;
if (millis() - lastDisplayUpdate >= 50) { // Write the values to each object on the Visi Genie display
genie.WriteObject(GENIE_OBJ_LED_DIGITS, 0x01, outputPressure2);
genie.WriteObject(GENIE_OBJ_LED_DIGITS, 0x02, outputPressure1);
genie.WriteObject(GENIE_OBJ_LED_DIGITS, 0x00, weight);
lastDisplayUpdate = millis();
}
Serial.println(currentState);
// State machine loop
bool valve_1_Open = false; // setting valve flags closed
valve_2_Open = false;
Serial.println("hey guys");
switch (currentState) {
case closed: // Closed state
Serial.println("closed");
static unsigned long closedstartTime = 0; // variable to store closed state start time
static bool timerStarted = false; // flag indicates timer has started
if (!timerStarted) {
closedstartTime = millis(); // start timer
timerStarted = true;
}
unsigned long elapsedTime = ((unsigned long)(millis() - closedstartTime) / 1000);
genie.WriteObject(GENIE_OBJ_LED_DIGITS, 0x03, elapsedTime); // display elapsed time
if (ClosedState::checkConditions(outputPressure1, outputPressure2, goSwitch, DoorSwitch, weight) || buttonState == 1) {
currentState = 1;
Serial.println(currentState);
Serial.println("transitioning to pressurize");
timerStarted = false; // reset closed timer
// transition to pressurize state
}
valve_1_Open = false;
valve_2_Open = false;
delay(1000);
break;
case 1: // Pressurize state
Serial.println("pressurize");
static unsigned long pressurizestartTime = 0; // variable to store pressurized state start time
static bool press_timerStarted = false; // flag indicates timer has started
if (!press_timerStarted) {
pressurizestartTime = millis(); // start timer
press_timerStarted = true;
}
elapsedTime = ((millis() - pressurizestartTime) / 1000);
genie.WriteObject(GENIE_OBJ_LED_DIGITS, 0x03, elapsedTime); // display elapsed time
if (PressurizeState::checkConditions(outputPressure1, outputPressure2, goSwitch, DoorSwitch, weight) || buttonState == HIGH) {
currentState = maxpressure;
Serial.println(currentState); // transition to maxpressure state
press_timerStarted = false; // reset timer
}
valve_1_Open = true;
valve_2_Open = false;
delay(1000);
break;
case maxpressure: // Maxpressure state
Serial.println("maxpressure");
static unsigned long maxstartTime = 0; // variable to store pressurized state start time
static bool max_timerStarted = false; // flag indicates timer has started
if (!max_timerStarted) {
maxstartTime = millis(); // start timer
max_timerStarted = true;
}
elapsedTime = ((millis() - maxstartTime) / 1000);
genie.WriteObject(GENIE_OBJ_LED_DIGITS, 0x03, elapsedTime); // display elapsed time
if (MaxpressureState::checkConditions(outputPressure1, outputPressure2, goSwitch, DoorSwitch, weight) || buttonState == HIGH) {
currentState = venting;
Serial.println(currentState); // transition to maxpressure state
max_timerStarted = false; // reset timer
}
valve_1_Open = false;
valve_2_Open = false;
delay(1000);
break;
case venting: // Venting state
Serial.println("venting");
static unsigned long ventingstartTime = 0; // variable to store pressurized state start time
static bool vent_timerStarted = false; // flag indicates timer has started
if (!vent_timerStarted) {
ventingstartTime = millis(); // start timer
vent_timerStarted = true;
}
elapsedTime = ((millis() - ventingstartTime) / 1000);
genie.WriteObject(GENIE_OBJ_LED_DIGITS, 0x03, elapsedTime); // display elapsed time
if (VentingState::checkConditions(outputPressure1, outputPressure2, goSwitch, DoorSwitch, weight) || buttonState == HIGH) {
currentState = closed;
Serial.println(currentState); // transition to maxpressure state
vent_timerStarted = false; // reset timer
}
valve_1_Open = false;
valve_2_Open = true;
delay(1000);
break;
default:
Serial.println(currentState);
Serial.println("default");
// add code for error handling here
valve_1_Open = true;
valve_2_Open = true;
delay(1000);
break;
}
// check the valve_1 flag and set the valve pin accordingly
if (valve_1_Open) {
digitalWrite(valve_1_Pin, HIGH); // open the valve
} else {
digitalWrite(valve_1_Pin, LOW); // close the valve
}
// check the valve_2 flag and set the valve pin accordingly
if (valve_2_Open) {
digitalWrite(valve_2_Pin, HIGH); // open the valve
} else {
digitalWrite(valve_2_Pin, LOW); // close the valve
}
delay(100);
}
```any help would be much appreciated.
Thanks