From 8b0227aa8266fe0e65d671d154e65d149eb1108c Mon Sep 17 00:00:00 2001 From: SeryiBaran Date: Sun, 10 Dec 2023 13:50:05 +0300 Subject: [PATCH] v1.1.0 --- CHANGELOG.md | 19 ++++++++++ README.md | 12 ++++--- USER_MANUAL.docx | Bin 18161 -> 18397 bytes src/config.h | 18 +++++++--- src/main.cpp | 92 ++++++++++++++++++++--------------------------- src/main.h | 14 ++++++++ 6 files changed, 94 insertions(+), 61 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 src/main.h diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..cb1bad7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,19 @@ +# История версий + +## v1.1.0 + +- Объединение режимов Ошибка и Сообщение +- Убран бесконечный показ ошибки +- Символы режимов вынесены в конфиг +- Инклюды вынесены в main.h +- Добавлен `#pragma once` во всех хедерах +- Добавлен [макрос `F()`](https://alexgyver.ru/lessons/code-optimisation/) во всех статичных строках +- Увеличено количество комментариев к коду + +## v1.0.1 + +- Переход на PlatformIO + +## v1.0 + +- Первая версия ¯\_(ツ)_/¯ diff --git a/README.md b/README.md index 1817cb5..e34da30 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,11 @@ Настройки сохраняются в EEPROM. Беспокоиться не стоит, используется библиотека EEManager с удобной логикой. -Занятые ресурсы МК по мнению Platformio: +Занятые ресурсы МК по мнению PlatformIO: ``` -RAM: [= ] 10.4% (used 213 bytes from 2048 bytes) -Flash: [=== ] 28.9% (used 8888 bytes from 30720 bytes) +RAM: [= ] 9.9% (used 202 bytes from 2048 bytes) +Flash: [=== ] 29.0% (used 8920 bytes from 30720 bytes) ``` ## Зависимости - в [platformio.ini](./platformio.ini) @@ -28,7 +28,11 @@ Flash: [=== ] 28.9% (used 8888 bytes from 30720 bytes) - Резистор, лучше равный сопротивлению термистора - Дисплей TM1637 -## [Руководство пользователя - в виде .Docx документа (для печати)](./USER_MANUAL.docx) +## Руководство пользователя + +В формате .Docx - в нем удобнее делать дизайн для печати. + +Приложено к Github релизу и [лежит тут](./USER_MANUAL.docx) ## А как прошить, а как собрать diff --git a/USER_MANUAL.docx b/USER_MANUAL.docx index 82d53488c4cc02a8ee52c0621c6cc1ea3325370d..cb06c588c16970450a63606e64023d5959b91a1a 100644 GIT binary patch delta 7099 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 delta 6835 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 Os8nXhk(c|=^#1^ - -// Настройки (обязательно зайди) -#include "config.h" - -// Библиотеки -#include -#include -#include -#include -#include -#include +#include "main.h" // Переменные - int8_t readed_temp = DEFAULT_READED_TEMP; bool need_redraw_display = false; uint8_t mode = MODE_DEFAULT; -uint8_t error_code = NO_ERROR; -uint8_t message_code; +uint8_t message_code = MESSAGE_NO; +// Изменяемые настройки struct Settings { int8_t setted_temp = DEFAULT_SETTED_TEMP; @@ -36,14 +24,8 @@ TimerMs temp_read_timer(TEMP_READ_TIME, 1, 0); TimerMs relay_update_timer(RELAY_UPDATE_TIME, 1, 0); TimerMs message_close_timer(MESSAGE_TIME, 0, 1); -void show_error() -{ - mode = MODE_ERROR; - - need_redraw_display = true; -} - -void show_message() +// Планируем отобразить сообщение при следующей отрисовке дисплея +void add_message() { mode = MODE_MESSAGE; @@ -51,32 +33,34 @@ void show_message() need_redraw_display = true; - DEBUGLN("show_message: showed"); + DEBUGLN(F("add_message: showed")); } -void close_message() +// Планируем убрать сообщение при следующей отрисовке дисплея +void remove_message() { mode = MODE_DEFAULT; need_redraw_display = true; - DEBUGLN("close_message: closed"); + DEBUGLN(F("remove_message: closed")); } +// Читаем температуру и планируем отобразить при следующей отрисовке дисплея void read_and_show_temp() { int8_t previous_readed_temp = readed_temp; readed_temp = ntc.getTempAverage(); - DEBUG("read_and_show_temp: "); - DEBUG("readed_temp is "); - DEBUG(readed_temp); - DEBUGLN(""); + DEBUG(F("read_and_show_temp: ")); + DEBUG(F("readed_temp is ")); + DEBUGLN(readed_temp); if (previous_readed_temp != readed_temp && mode == MODE_READED_TEMP) need_redraw_display = true; } +// Обновляем состояние реле void update_relay() { if (readed_temp < settings.setted_temp - settings.hysteresis) @@ -85,6 +69,7 @@ void update_relay() digitalWrite(PIN_RELAY, LOW); } +// Меняем режим void change_mode() { mode++; @@ -94,6 +79,7 @@ void change_mode() need_redraw_display = true; } +// Печатаем число в конце экрана (но не обновляем дисплей!) void put_num_at_end(int32_t num) { int num_len = sseg::intLen(num); @@ -101,48 +87,53 @@ void put_num_at_end(int32_t num) display.print(num); } +// Печатаем режим (его символ и число) (но не обновляем дисплей!) void print_mode(String mode_name, int32_t num) { display.print(mode_name); put_num_at_end(num); } +// Обновление дисплея void redraw_display() { - DEBUG("redraw_display: "); - DEBUG("redraw"); - DEBUGLN(""); + DEBUGLN(F("redraw_display: redraw")); display.setCursor(0); display.clear(); if (mode == MODE_SETTED_TEMP) - print_mode("S", settings.setted_temp); + print_mode(MODE_SYMBOL_SETTED_TEMP, settings.setted_temp); else if (mode == MODE_READED_TEMP) - print_mode("C", readed_temp); + print_mode(MODE_SYMBOL_READED_TEMP, readed_temp); else if (mode == MODE_HYSTERESIS) - print_mode("H", settings.hysteresis); - else if (mode == MODE_ERROR) - print_mode("E", error_code); + print_mode(MODE_SYMBOL_HYSTERESIS, settings.hysteresis); else if (mode == MODE_MESSAGE) - print_mode("I", message_code); + print_mode(message_code >= MESSAGE_ERROR_FIRST + ? MODE_SYMBOL_ERROR + : MODE_SYMBOL_MESSAGE, + message_code); // Если сообщение имеет ID ошибки, выводим символ ошибки. Иначе символ сообщения else - error_code = DISPLAY_ERROR; + message_code = MESSAGE_ERROR_DISPLAY; // Если ID режима не подходит, ставим ошибку. При следующем рендере она покажется display.update(); need_redraw_display = false; + + // TODO: перенести в IF + message_code = MESSAGE_NO; // Вывели сообщение - очищаем код сообщения чтобы заново не показалось } void enc_handle() { if (enc.click()) change_mode(); + if (enc.turn()) { if (mode == MODE_SETTED_TEMP) { - settings.setted_temp += TEMP_SET_STEP * ENCODER_CHANGE_DIR * enc.dir(); + settings.setted_temp += TEMP_SET_STEP * ENCODER_CHANGE_DIR * enc.dir(); // Немножко несложной магии. Читайте https://github.com/GyverLibs/EncButton settings.setted_temp = constrain(settings.setted_temp, MIN_SETTED_TEMP, MAX_SETTED_TEMP); } else if (mode == MODE_HYSTERESIS) @@ -151,18 +142,12 @@ void enc_handle() settings.hysteresis = constrain(settings.hysteresis, MIN_HYSTERESIS, MAX_HYSTERESIS); } - DEBUG("enc_handle: "); - DEBUG("setted_temp is "); - DEBUG(setted_temp); - DEBUG(", hysteresis is "); - DEBUG(hysteresis); - DEBUGLN(""); - memory.update(); need_redraw_display = true; } } +// Функция обработки программного прерывания для энкодера. Читайте https://github.com/GyverLibs/EncButton void enc_isr() { enc.tickISR(); @@ -185,10 +170,11 @@ void setup() void loop() { + // Если настройки были записаны в EEPROM - ставим радостное сообщение if (memory.tick()) { message_code = MESSAGE_SAVED; - show_message(); + add_message(); } enc.tick(); @@ -199,11 +185,11 @@ void loop() if (relay_update_timer.tick()) update_relay(); - if (message_close_timer.tick()) - close_message(); + if (message_code) + add_message(); - if (error_code && mode != MODE_ERROR) - show_error(); + if (message_close_timer.tick()) + remove_message(); enc_handle(); diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..608171e --- /dev/null +++ b/src/main.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +// Настройки (обязательно зайди) +#include "config.h" + +// Библиотеки +#include +#include +#include +#include +#include +#include