adjustments to calib procedure, now with PID used

This commit is contained in:
2023-04-20 00:35:39 +02:00
parent 991802b894
commit d9f09c8ccb
8 changed files with 94 additions and 27 deletions
+3 -2
View File
@@ -13,6 +13,7 @@
#include "ufb/framebuffer.h"
#include "ufb/fb_text.h"
#include "app_safety.h"
#include "app_heater.h"
struct State s_app = {};
@@ -134,10 +135,10 @@ void switch_screen(screen_t pScreen, bool init) {
/** Draw GUI common to all screens */
static void draw_common_overlay() {
SPRINTF(stmp, "%5.1f°C →%3d°C", s_app.oven_temp, s_app.set_temp);
SPRINTF(stmp, "%5.1f°C →%3d°C", app_temp_read_oven(), (int) app_heater_get_target());
fb_text(3, 3, stmp, FONT_3X5, 1);
if (s_app.heater_enabled) {
if (app_heater_get_state()) {
fb_frame(0, 0, FBW, 11, 1, 1);
}
}
+43 -23
View File
@@ -30,6 +30,17 @@ enum Phase {
PH_DONE,
};
static void stop_heater() {
app_heater_set_target(0);
app_heater_enable(false);
}
static void calib_abort() {
app_temp_restore_calib();
stop_heater();
switch_screen(screen_home, true);
}
static void next_phase() {
PUTS("Phase++\r\n");
s_calib.phase++;
@@ -47,11 +58,12 @@ static void hello_menu_cb(int opt) {
// Continue
next_phase();
request_paint();
app_heater_manual_override(100);
app_heater_set_target(100);
app_heater_enable(true);
break;
case 1:
switch_screen(screen_home, true);
calib_abort();
break;
}
}
@@ -70,12 +82,11 @@ static void sample1_menu_cb(int opt) {
next_phase();
request_paint();
s_calib.sample1 = app_temp_read_oven_raw();
app_heater_manual_override(0);
app_heater_enable(false);
break;
case 1:
app_heater_manual_override(-1);
switch_screen(screen_home, true);
calib_abort();
break;
}
}
@@ -94,12 +105,11 @@ static void sample2_menu_cb(int opt) {
next_phase();
request_paint();
s_calib.sample2 = app_temp_read_oven_raw();
app_heater_manual_override(0);
app_heater_enable(false);
break;
case 1:
app_heater_manual_override(-1);
switch_screen(screen_home, true);
calib_abort();
break;
}
}
@@ -107,6 +117,8 @@ static void sample2_menu_cb(int opt) {
void screen_calibration(GuiEvent event)
{
if (event == GUI_EVENT_SCREEN_INIT) {
app_temp_backup_calib();
app_temp_set_calib_temporary(1, 0);
memset(&s_calib, 0, sizeof(s_calib));
// continue to the rest - so the menu can be inited
}
@@ -121,17 +133,20 @@ void screen_calibration(GuiEvent event)
screen_menu_offset(event, hello_menu_opts, hello_menu_cb, 30);
break;
case PH_SAMPLE1: // Heater is active, waiting for mark
case PH_SAMPLE1:
if (event == GUI_EVENT_PAINT) {
fb_text(FBW/2, 16, "Vyčkej", TEXT_CENTER, 1);
fb_text(FBW/2, 26, "ustálení", TEXT_CENTER, 1);
}
screen_menu_offset(event, sample1_menu_opts, sample1_menu_cb, 30);
break;
case PH_SAMPLE2:
if (event == GUI_EVENT_PAINT) {
fb_text(FBW/2, 16, "Zapiš", TEXT_CENTER, 1);
fb_text(FBW/2, 26, "teplotu", TEXT_CENTER, 1);
}
if (s_calib.phase == PH_SAMPLE1) {
screen_menu_offset(event, sample1_menu_opts, sample1_menu_cb, 30);
} else {
screen_menu_offset(event, sample2_menu_opts, sample2_menu_cb, 30);
fb_text(FBW/2, 16, "Vyčkej", TEXT_CENTER, 1);
fb_text(FBW/2, 26, "ustálení", TEXT_CENTER, 1);
}
screen_menu_offset(event, sample2_menu_opts, sample2_menu_cb, 30);
break;
case PH_TEMP1:
@@ -144,8 +159,7 @@ void screen_calibration(GuiEvent event)
if (push_time() > pdMS_TO_TICKS(500)) {
input_sound_effect();
app_heater_manual_override_clear();
switch_screen(screen_home, true);
calib_abort();
return;
}
@@ -184,7 +198,9 @@ void screen_calibration(GuiEvent event)
request_paint();
if (s_calib.phase == PH_DONE) {
app_heater_manual_override(-1);
app_heater_set_target(0);
app_heater_enable(false);
// TODO do the math
PRINTF("Sample 1 %f, T1 %d\r\n", s_calib.sample1, s_calib.temp1);
PRINTF("Sample 2 %f, T2 %d\r\n", s_calib.sample2, s_calib.temp2);
@@ -195,10 +211,13 @@ void screen_calibration(GuiEvent event)
float a = (corrected1 - corrected2) / (s_calib.sample1 - s_calib.sample2);
float b = corrected1 - a * s_calib.sample1;
app_temp_set_calib(a, b);
} else {
// for the next phase
app_heater_manual_override(100);
app_temp_set_persistent_calib(a, b);
} else if (s_calib.phase == PH_SAMPLE1) {
app_heater_set_target(100);
app_heater_enable(true);
} else if (s_calib.phase == PH_SAMPLE2) {
app_heater_set_target(200);
app_heater_enable(true);
}
break;
}
@@ -211,6 +230,7 @@ void screen_calibration(GuiEvent event)
fb_text(FBW/2, 36, "→Hlavní menu", TEXT_CENTER, 1);
}
if (event == GUI_EVENT_KNOB_RELEASE) {
stop_heater();
switch_screen(screen_home, 1);
}
break;