@@ -26,12 +26,22 @@ uint8_t boottobrew = 0;
#define WINDUP_GUARD_GAIN 100
uint16_t windup_guard = WINDUP_GUARD_GAIN;
uint16_t k_p = 1;
uint16_t k_i = 1;
uint16_t k_d = 1;
// ISR ticks var TODO: Double check functionality after volatilazation... needed on ARM?
volatile uint32_t ticks = 0;
// Increase on each press, and increase at a fast rate after duration elapsed of continuously holding down... somehow...
uint32_t change_time_reset = 0;
#define CHANGE_PERIOD_MS 100
#define CHANGE_ELAPSED (ticks - change_time_reset) > CHANGE_PERIOD_MS
#define CHANGE_RESET change_time_reset = ticks
int16_t setpoint_brew = 0;
int16_t setpoint_steam = 0;
// State definition
enum state {
STATE_IDLE = 0,
@@ -212,13 +222,12 @@ int16_t update_pid(uint16_t k_p, uint16_
return result;
}
uint32_t ticks = 0;
uint32_t last_ssr_on = 0;
uint32_t last_led = 0;
int32_t setpoint = 0;
int16_t ssr_output = 0; // Duty cycle of ssr, 0 to SSR_PERIOD
uint8_t pid_enabled = 0;
@@ -362,12 +371,30 @@ void restore_settings()
while(FLASH_GetStatus()==FLASH_BUSY);
setpoint_steam = (*(__IO uint32_t*)EEPROM_ADDR_STEAMTEMP);
DATA_EEPROM_Lock();
void user_input(uint16_t* to_modify)
{
if(CHANGE_ELAPSED) {
// TODO: Make function that takes reference to a var and increase/decreases it based on buttonpress
if(!GPIO_ReadInputDataBit(SW_UP) ) {
CHANGE_RESET;
(*to_modify)++;
else if(!GPIO_ReadInputDataBit(SW_DOWN) && (*to_modify) > 0) {
(*to_modify)--;
void machine()
uint8_t last_state = state;
uint8_t sw_btn = !GPIO_ReadInputDataBit(SW_BTN);
uint8_t sw_up = !GPIO_ReadInputDataBit(SW_UP);
@@ -456,17 +483,14 @@ void machine()
ssd1306_DrawString("Press to accept", 3, 40);
// Button handler
if(SW_BTN_PRESSED) {
state = STATE_SETI;
else if(!GPIO_ReadInputDataBit(SW_UP)) {
k_p++;
else if(!GPIO_ReadInputDataBit(SW_DOWN) && k_p > 0) {
k_p--;
else {
user_input(&k_p);
// Event Handler
// N/A
} break;
@@ -488,19 +512,15 @@ void machine()
state = STATE_SETD;
k_i++;
user_input(&k_i);
else if(!GPIO_ReadInputDataBit(SW_DOWN) && k_i > 0) {
k_i--;
@@ -521,17 +541,14 @@ void machine()
state = STATE_SETWINDUP;
k_d++;
else if(!GPIO_ReadInputDataBit(SW_DOWN) && k_d > 0) {
k_d--;
user_input(&k_d);
@@ -553,17 +570,14 @@ void machine()
state = STATE_SETBOOTTOBREW;
windup_guard++;
else if(!GPIO_ReadInputDataBit(SW_DOWN) && windup_guard > 0) {
windup_guard--;
user_input(&windup_guard);
@@ -599,15 +613,12 @@ void machine()
case STATE_PREHEAT_BREW:
// Write text to OLED
// [ therm : preheating brew ]
// [ 30 => 120 C ]
ssd1306_DrawString("Preheating...", 0, 40);
@@ -618,19 +629,15 @@ void machine()
save_setpoints(); // TODO: Check for mod
state = STATE_IDLE;
setpoint_brew++;
user_input(&setpoint_brew);
else if(!GPIO_ReadInputDataBit(SW_DOWN) && setpoint_brew > 0) {
setpoint_brew--;
if(temp >= setpoint) {
state = STATE_MAINTAIN_BREW;
@@ -649,19 +656,15 @@ void machine()
@@ -678,17 +681,14 @@ void machine()
setpoint_steam++;
else if(!GPIO_ReadInputDataBit(SW_DOWN) && setpoint_steam > 0) {
setpoint_steam--;
user_input(&setpoint_steam);
state = STATE_MAINTAIN_STEAM;
@@ -708,19 +708,15 @@ void machine()
Status change: