This was a response to an online request for help with code. A single pushbutton cycles through three hydraulic damper valve settings. The code was too long to post on the site, so I’m showing it here.
As of today, I don’t know if it will work, but it explains the concept. I will get it working as time permits
// Digital output definitions
#define RED_OUTPUT 0
#define BLUE_OUTPUT 1
#define GREEN_OUTPUT 2
// Digital input definitions
#define SWITCH_INPUT 3
// Define states
#define RED 800
#define BLUE 801
#define GREEN 802
// Define message types
#define NONE 901
#define CLICK 902
#define PRESS 903
// Global state
int _state = GREEN;
// One-time call to initialize system
void setup()
{
pinMode(SWITCH_INPUT, INPUT_PULLUP);
pinMode(RED_OUTPUT, OUTPUT);
pinMode(BLUE_OUTPUT, OUTPUT);
pinMode(GREEN_OUTPUT, OUTPUT);
// Enable GREEN state
digitalWrite(GREEN_OUTPUT, HIGH);
}
// Continuously called by Arduino runtime
void loop()
{
// Read pushbutton
int message = readSwitch();
// Update LEDs and hydraulic valve if state changed
if (processState(message))
{
activateOutput(_state);
}
}
// Read pushbutton and return the result
int readSwitch()
{
const int CLICK_UPPER_LIMIT = 200;
const int CLICK_LOWER_LIMIT = 25;
const int PRESS_LOWER_LIMIT = 1000;
const int PRESS_UPPER_LIMIT = 2000;
int switchMessage = NONE;
unsigned long start = micros();
while (digitalRead(SWITCH_INPUT) == LOW);
unsigned long duration = micros() - start;
if (duration < CLICK_UPPER_LIMIT && duration > CLICK_LOWER_LIMIT)
{
switchMessage = CLICK;
}
else if (duration > PRESS_LOWER_LIMIT && duration < PRESS_UPPER_LIMIT)
{
switchMessage = PRESS;
}
return switchMessage;
}
bool processState(int message)
{
static int lastState = GREEN;
int retVal = 0;
// PRESS overrides CLICK in all states
if (message == PRESS)
{
_state = GREEN;
}
else
{
// Process states
switch (_state)
{
case RED:
if (message == CLICK)
{
_state = BLUE;
}
break;
case BLUE:
if (message == CLICK)
{
_state = RED;
}
break;
case GREEN:
if (message == CLICK)
{
_state = RED;
}
break;
default:
break;
}
}
// Did state change?
retVal = (lastState == _state);
// Remember this state
lastState = _state;
// Return state changed information
return retVal;
}
void activateOutput(int thisState)
{
// Since this is only called on state change, OK to turn everything off first
digitalWrite(RED_OUTPUT, LOW);
digitalWrite(GREEN_OUTPUT, LOW);
digitalWrite(BLUE_OUTPUT, LOW);
// Turn on only the output corresponding to the state
switch (thisState)
{
case RED:
digitalWrite(RED_OUTPUT, HIGH);
break;
case BLUE:
digitalWrite(BLUE_OUTPUT, HIGH);
break;
case GREEN:
digitalWrite(GREEN_OUTPUT, HIGH);
break;
default:
break;
}
}
If you’d like to subscribe to this blog, please click here.