Skip to content

Commit

Permalink
v1.1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
SeryiBaran committed Dec 10, 2023
1 parent b91893d commit 8b0227a
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 61 deletions.
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# История версий

## v1.1.0

- Объединение режимов Ошибка и Сообщение
- Убран бесконечный показ ошибки
- Символы режимов вынесены в конфиг
- Инклюды вынесены в main.h
- Добавлен `#pragma once` во всех хедерах
- Добавлен [макрос `F()`](https://alexgyver.ru/lessons/code-optimisation/) во всех статичных строках
- Увеличено количество комментариев к коду

## v1.0.1

- Переход на PlatformIO

## v1.0

- Первая версия ¯\_(ツ)_
12 changes: 8 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -28,7 +28,11 @@ Flash: [=== ] 28.9% (used 8888 bytes from 30720 bytes)
- Резистор, лучше равный сопротивлению термистора
- Дисплей TM1637

## [Руководство пользователя - в виде .Docx документа (для печати)](./USER_MANUAL.docx)
## Руководство пользователя

В формате .Docx - в нем удобнее делать дизайн для печати.

Приложено к Github релизу и [лежит тут](./USER_MANUAL.docx)

## А как прошить, а как собрать

Expand Down
Binary file modified USER_MANUAL.docx
Binary file not shown.
18 changes: 14 additions & 4 deletions src/config.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#pragma once

// Раскомментируй для отладки по UART
// #define ENABLE_DEBUG

Expand Down Expand Up @@ -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 для создания делителя напряжения
Expand Down
92 changes: 39 additions & 53 deletions src/main.cpp
Original file line number Diff line number Diff line change
@@ -1,24 +1,12 @@
#include <Arduino.h>

// Настройки (обязательно зайди)
#include "config.h"

// Библиотеки
#include <EEManager.h>
#include <EncButton.h>
#include <GyverSegment.h>
#include <GyverNTC.h>
#include <TimerMs.h>
#include <PinChangeInterrupt.h>
#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;
Expand All @@ -36,47 +24,43 @@ 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;

message_close_timer.start();

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)
Expand All @@ -85,6 +69,7 @@ void update_relay()
digitalWrite(PIN_RELAY, LOW);
}

// Меняем режим
void change_mode()
{
mode++;
Expand All @@ -94,55 +79,61 @@ void change_mode()
need_redraw_display = true;
}

// Печатаем число в конце экрана (но не обновляем дисплей!)
void put_num_at_end(int32_t num)
{
int num_len = sseg::intLen(num);
display.setCursor(TM1637_DIGITS_NUM - num_len);
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)
Expand All @@ -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();
Expand All @@ -185,10 +170,11 @@ void setup()

void loop()
{
// Если настройки были записаны в EEPROM - ставим радостное сообщение
if (memory.tick())
{
message_code = MESSAGE_SAVED;
show_message();
add_message();
}

enc.tick();
Expand All @@ -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();

Expand Down
14 changes: 14 additions & 0 deletions src/main.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#pragma once

#include <Arduino.h>

// Настройки (обязательно зайди)
#include "config.h"

// Библиотеки
#include <EEManager.h>
#include <EncButton.h>
#include <GyverSegment.h>
#include <GyverNTC.h>
#include <TimerMs.h>
#include <PinChangeInterrupt.h>

0 comments on commit 8b0227a

Please sign in to comment.