@@ -25,12 +25,13 @@ uint32_t packet_receive=1;
enum state {
STATE_IDLE = 0,
STATE_SETP,
STATE_SETI,
STATE_SETD,
STATE_SETWINDUP,
STATE_PREHEAT_BREW,
STATE_MAINTAIN_BREW,
STATE_PREHEAT_STEAM,
STATE_MAINTAIN_STEAM,
};
@@ -199,14 +200,15 @@ uint32_t ticks = 0;
uint32_t last_ssr_on = 0;
uint32_t last_led = 0;
int32_t setpoint = 0;
uint16_t k_p = 1;
uint16_t k_i = 1;
uint16_t k_d = 1;
uint16_t windup_guard = 1;
int16_t ssr_output = 0; // Duty cycle of ssr, 0 to SSR_PERIOD
uint8_t pid_enabled = 0;
// Process things
void process()
{
update_temp(); // Read MAX31855
@@ -218,16 +220,23 @@ void process()
last_led = ticks;
}
// Every 200ms, set the SSR on unless output is 0
if((ticks - last_ssr_on > SSR_PERIOD))
// Get ssr output for next time
int16_t power_percent = update_pid(k_p, k_i, k_d, temp, temp_frac, setpoint);
//power-percent is 0-1000
ssr_output = power_percent; //(((uint32_t)SSR_PERIOD * (uint32_t)10 * (uint32_t)100) * power_percent) / (uint32_t)1000000;
if(pid_enabled)
else
ssr_output = 0;
// Only support heating (ssr_output > 0) right now
if(ssr_output > 0) {
char tempstr[6];
itoa(ssr_output, tempstr);
@@ -289,35 +298,36 @@ void machine()
// Idle state
case STATE_IDLE:
// Write text to OLED
// [ therm :: idle ]
ssd1306_DrawString("therm :: idle ", 0, 40);
pid_enabled = 0;
itoa_fp(temp, temp_frac, tempstr);
ssd1306_DrawString("Temp: ", 3, 40);
ssd1306_DrawString(" ", 3, 70);
ssd1306_DrawString(" ", 3, 72);
ssd1306_DrawString(tempstr, 3, 72);
ssd1306_drawlogo();
switch(goto_mode) {
case 2:
ssd1306_DrawString("-> brew ", 1, 40);
} break;
case 1:
ssd1306_DrawString("-> set P/I/D", 1, 40);
ssd1306_DrawString("-> setup ", 1, 40);
case 0:
ssd1306_DrawString("-> reset ", 1, 40);
// Button handler
if(SW_BTN_PRESSED) {
@@ -325,13 +335,13 @@ void machine()
state = STATE_PREHEAT_BREW;
break;
state = STATE_SETP;
state = STATE_IDLE;
default:
else if(SW_UP_PRESSED && goto_mode < 2) {
@@ -427,13 +437,13 @@ void machine()
ssd1306_DrawString(tempstr, 1, 57);
ssd1306_DrawString("Press to accept", 3, 40);
state = STATE_SETWINDUP;
else if(!GPIO_ReadInputDataBit(SW_UP)) {
k_d++;
else if(!GPIO_ReadInputDataBit(SW_DOWN) && k_d > 0) {
k_d--;
@@ -441,20 +451,56 @@ void machine()
// Event Handler
// N/A
case STATE_SETWINDUP:
// [ therm :: set windup ]
// [ g = 12 ]
ssd1306_DrawString("Windup Guard", 0, 40);
itoa(windup_guard, tempstr);
ssd1306_DrawString("G=", 1, 45);
ssd1306_DrawString(" ", 1, 57);
windup_guard++;
else if(!GPIO_ReadInputDataBit(SW_DOWN) && windup_guard > 0) {
windup_guard--;
case STATE_PREHEAT_BREW:
// [ therm : preheating brew ]
// [ 30 => 120 C ]
ssd1306_DrawString("Preheating...", 0, 40);
draw_setpoint();
pid_enabled = 1;
@@ -477,12 +523,13 @@ void machine()
// [ therm : ready to brew ]
ssd1306_DrawString("Ready to Brew!", 0, 40);
@@ -503,12 +550,13 @@ void machine()
// [ therm : preheating steam ]
@@ -531,12 +579,13 @@ void machine()
// [ therm : ready to steam ]
ssd1306_DrawString("Ready to Steam!", 0, 40);
@@ -553,12 +602,13 @@ void machine()
// Something is terribly wrong
if(last_state != state) {
Status change: