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 82d5348..cb06c58 100644 Binary files a/USER_MANUAL.docx and b/USER_MANUAL.docx differ diff --git a/src/config.h b/src/config.h index 6a39a81..b35e62a 100644 --- a/src/config.h +++ b/src/config.h @@ -1,3 +1,5 @@ +#pragma once + // Раскомментируй для отладки по UART // #define ENABLE_DEBUG @@ -44,18 +46,26 @@ #define MODE_SETTED_TEMP 0 #define MODE_READED_TEMP 1 #define MODE_HYSTERESIS 2 -#define MODE_ERROR 100 #define MODE_MESSAGE 101 #define MODE_SWITCH_MIN 0 // "Индекс" первого режима доступного для переключения #define MODE_SWITCH_MAX 2 // "Индекс" последнего #define MODE_DEFAULT MODE_SETTED_TEMP // Стандартный режим -// Коды ошибок -#define NO_ERROR 0 -#define DISPLAY_ERROR 1 +// Символы режимов +#define MODE_SYMBOL_SETTED_TEMP F("S") +#define MODE_SYMBOL_READED_TEMP F("C") +#define MODE_SYMBOL_HYSTERESIS F("H") +#define MODE_SYMBOL_ERROR F("E") +#define MODE_SYMBOL_MESSAGE F("I") // Коды сообщений +#define MESSAGE_NO 0 #define MESSAGE_SAVED 1 +#define MESSAGE_ERROR_DISPLAY 101 +#define MESSAGE_FIRST 1 +#define MESSAGE_LAST 99 +#define MESSAGE_ERROR_FIRST 100 +#define MESSAGE_ERROR_LAST 199 // NTC (термистор) (https://kit.alexgyver.ru/tutorials/thermistor/) #define NTC_RESISTOR 10000 // Сопротивление резистора подключенного с NTC для создания делителя напряжения diff --git a/src/main.cpp b/src/main.cpp index a5979e2..954b096 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,24 +1,12 @@ -#include - -// Настройки (обязательно зайди) -#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