diff --git a/README.md b/README.md index 2ada060..9d7c999 100644 --- a/README.md +++ b/README.md @@ -13,18 +13,11 @@ Занятые ресурсы МК по мнению Platformio: ``` -RAM: [= ] 10.6% (used 218 bytes from 2048 bytes) -Flash: [=== ] 28.7% (used 8814 bytes from 30720 bytes) +RAM: [= ] 10.4% (used 213 bytes from 2048 bytes) +Flash: [=== ] 28.9% (used 8888 bytes from 30720 bytes) ``` -## Зависимости (устанавливаются через Platformio) - -- EncButton -- GyverNTC -- GyverSegment - - GyverIO -- PinChangeInterrupt -- TimerMs +## Зависимости - в [platformio.ini](./platformio.ini) ## Электронные компоненты diff --git a/platformio.ini b/platformio.ini index 85d85ef..1ff2f5c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -18,3 +18,4 @@ lib_deps = gyverlibs/GyverSegment@^1.4 nicohood/PinChangeInterrupt@^1.2.9 gyverlibs/TimerMs@^1.2 + gyverlibs/EEManager@^2.0 diff --git a/src/config.h b/src/config.h index 244e707..6a39a81 100644 --- a/src/config.h +++ b/src/config.h @@ -37,11 +37,8 @@ #define TM1637_DIGITS_NUM 4 // Количество разрядов на дисплее // Настройки EEPROM -#define EEPROM_INIT_MARKER_ADDR 1023 // Адрес в EEPROM по которому устройство будет понимать что уже включалось и в нем что-то сохранено -#define EEPROM_INIT_MARKER_VALUE 10 // Значение флага выше (взято от балды) -// Настройки EEPROM адресов с настройками -#define EEPROM_SETTED_TEMP_ADDR 0 // Адрес в EEPROM с заданной температурой -#define EEPROM_HYSTERESIS_ADDR 1 // Адрес в EEPROM с заданным гистерезисом +#define EEPROM_INIT_MARKER_VALUE 10 // Флаг по которому устройство будет понимать что уже включалось и в нем что-то сохранено (взято от балды) +#define EEPROM_SETTINGS_ADDR 0 // Начальный адрес в EEPROM с настройками // Режимы дисплея #define MODE_SETTED_TEMP 0 diff --git a/src/main.cpp b/src/main.cpp index d87dcb8..a5979e2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,7 +4,7 @@ #include "config.h" // Библиотеки -#include +#include #include #include #include @@ -12,22 +12,28 @@ #include // Переменные -int8_t setted_temp = DEFAULT_SETTED_TEMP; + int8_t readed_temp = DEFAULT_READED_TEMP; -int8_t hysteresis = DEFAULT_HYSTERESIS; bool need_redraw_display = false; uint8_t mode = MODE_DEFAULT; -bool need_save_settings = false; uint8_t error_code = NO_ERROR; uint8_t message_code; +struct Settings +{ + int8_t setted_temp = DEFAULT_SETTED_TEMP; + int8_t hysteresis = DEFAULT_HYSTERESIS; +}; + +Settings settings; + // Инициализация объектов +EEManager memory(settings, SETTINGS_SAVE_TIME); EncButton enc(PIN_ENC_A, PIN_ENC_B, PIN_ENC_BUTT); Disp1637Colon display(PIN_TM1637_DIO, PIN_TM1637_CLK); GyverNTC ntc(PIN_NTC, NTC_RESISTOR, NTC_BETA_COEF, NTC_BASE_TEMP, NTC_BASE_RESISTANCE, NTC_RESOLUTION); TimerMs temp_read_timer(TEMP_READ_TIME, 1, 0); TimerMs relay_update_timer(RELAY_UPDATE_TIME, 1, 0); -TimerMs save_settings_timer(SETTINGS_SAVE_TIME, 0, 1); TimerMs message_close_timer(MESSAGE_TIME, 0, 1); void show_error() @@ -57,42 +63,6 @@ void close_message() DEBUGLN("close_message: closed"); } -void save_settings() -{ - DEBUG("save_settings: "); - DEBUG("setted_temp is "); - DEBUG(setted_temp); - DEBUGLN(""); - - DEBUG("save_settings: "); - DEBUG("hysteresis is "); - DEBUG(hysteresis); - DEBUGLN(""); - - EEPROM.put(EEPROM_SETTED_TEMP_ADDR, setted_temp); - EEPROM.put(EEPROM_HYSTERESIS_ADDR, hysteresis); - - message_code = MESSAGE_SAVED; - show_message(); - - need_save_settings = false; -} - -void load_settings() -{ - // Если запустили первый раз - if (EEPROM.read(EEPROM_INIT_MARKER_ADDR) != EEPROM_INIT_MARKER_VALUE) - { - EEPROM.write(EEPROM_INIT_MARKER_ADDR, EEPROM_INIT_MARKER_VALUE); // Пометили что запустили - - EEPROM.put(EEPROM_SETTED_TEMP_ADDR, setted_temp); - EEPROM.put(EEPROM_HYSTERESIS_ADDR, hysteresis); - } - - EEPROM.get(EEPROM_SETTED_TEMP_ADDR, setted_temp); - EEPROM.get(EEPROM_HYSTERESIS_ADDR, hysteresis); -} - void read_and_show_temp() { int8_t previous_readed_temp = readed_temp; @@ -109,9 +79,9 @@ void read_and_show_temp() void update_relay() { - if (readed_temp < setted_temp - hysteresis) + if (readed_temp < settings.setted_temp - settings.hysteresis) digitalWrite(PIN_RELAY, HIGH); - else if (readed_temp > setted_temp + hysteresis) + else if (readed_temp > settings.setted_temp + settings.hysteresis) digitalWrite(PIN_RELAY, LOW); } @@ -147,11 +117,11 @@ void redraw_display() display.clear(); if (mode == MODE_SETTED_TEMP) - print_mode("S", setted_temp); + print_mode("S", settings.setted_temp); else if (mode == MODE_READED_TEMP) print_mode("C", readed_temp); else if (mode == MODE_HYSTERESIS) - print_mode("H", hysteresis); + print_mode("H", settings.hysteresis); else if (mode == MODE_ERROR) print_mode("E", error_code); else if (mode == MODE_MESSAGE) @@ -170,17 +140,15 @@ void enc_handle() change_mode(); if (enc.turn()) { - int8_t previous_setted_temp = setted_temp; - int8_t previous_hysteresis = hysteresis; if (mode == MODE_SETTED_TEMP) { - setted_temp += TEMP_SET_STEP * ENCODER_CHANGE_DIR * enc.dir(); - setted_temp = constrain(setted_temp, MIN_SETTED_TEMP, MAX_SETTED_TEMP); + settings.setted_temp += TEMP_SET_STEP * ENCODER_CHANGE_DIR * enc.dir(); + settings.setted_temp = constrain(settings.setted_temp, MIN_SETTED_TEMP, MAX_SETTED_TEMP); } else if (mode == MODE_HYSTERESIS) { - hysteresis += HYSTERESIS_SET_STEP * ENCODER_CHANGE_DIR * enc.dir(); - hysteresis = constrain(hysteresis, MIN_HYSTERESIS, MAX_HYSTERESIS); + settings.hysteresis += HYSTERESIS_SET_STEP * ENCODER_CHANGE_DIR * enc.dir(); + settings.hysteresis = constrain(settings.hysteresis, MIN_HYSTERESIS, MAX_HYSTERESIS); } DEBUG("enc_handle: "); @@ -190,12 +158,8 @@ void enc_handle() DEBUG(hysteresis); DEBUGLN(""); - if (previous_setted_temp != setted_temp || previous_hysteresis != hysteresis) - { - need_save_settings = true; - need_redraw_display = true; - save_settings_timer.start(); - } + memory.update(); + need_redraw_display = true; } } @@ -214,16 +178,20 @@ void setup() attachPCINT(digitalPinToPCINT(PIN_ENC_B), enc_isr, CHANGE); attachPCINT(digitalPinToPCINT(PIN_ENC_BUTT), enc_isr, CHANGE); - load_settings(); + memory.begin(EEPROM_SETTINGS_ADDR, EEPROM_INIT_MARKER_VALUE); need_redraw_display = true; } void loop() { - enc.tick(); + if (memory.tick()) + { + message_code = MESSAGE_SAVED; + show_message(); + } - enc_handle(); + enc.tick(); if (temp_read_timer.tick()) read_and_show_temp(); @@ -231,14 +199,13 @@ void loop() if (relay_update_timer.tick()) update_relay(); - if (save_settings_timer.tick() && need_save_settings) - save_settings(); + if (message_close_timer.tick()) + close_message(); if (error_code && mode != MODE_ERROR) show_error(); - if (message_close_timer.tick()) - close_message(); + enc_handle(); if (need_redraw_display) redraw_display(); diff --git a/wokwi/libraries.txt b/wokwi/libraries.txt index d9bb345..d347821 100644 --- a/wokwi/libraries.txt +++ b/wokwi/libraries.txt @@ -6,3 +6,4 @@ GyverSegment TimerMs PinChangeInterrupt GyverNTC +EEManager