|
@@ -1,7 +1,10 @@
|
|
|
+#include <math.h>
|
|
|
#include "ch.h"
|
|
|
#include "hal.h"
|
|
|
+#include "chprintf.h"
|
|
|
#include "stab_param.h"
|
|
|
-//#include "usart.h"
|
|
|
+//#include "stab_usart.h"
|
|
|
+#include "st7735.h"
|
|
|
|
|
|
/* Версия скетча и длина версии скетча в символах для правильного вывода на дисплей */
|
|
|
#define VERSION "v0.100"
|
|
@@ -24,6 +27,7 @@ static volatile uint16_t PDMust = 0; // PDM, соответствующий у
|
|
|
static volatile uint32_t U_sum = 0; // Среднеквадратичное в сети за секунду, умноженное на 10
|
|
|
static uint16_t U_real = U_LINE; // Среднеквадратичное за секунду (целая часть)
|
|
|
static uint8_t U_real_dec = 0; // Среднеквадратичное за секунду (дробная часть)
|
|
|
+static char buf[24]; // common string buffer for chsnprintf()
|
|
|
|
|
|
static volatile uint8_t PID_ust = LINE_FREQ; // Данные для установки регистра сравнения таймера2
|
|
|
|
|
@@ -47,7 +51,9 @@ static volatile struct flags { // Флаги
|
|
|
unsigned razg_off : 1; // Флаг останова режима "разгон"
|
|
|
unsigned stab_off : 1; // Флаг аварийного останова стабилизатора
|
|
|
unsigned butt : 1; // Флаг опроса кнопок
|
|
|
+#ifdef USE_EEPROM
|
|
|
unsigned writable : 1; // Флаг записи уставок в EEPROM
|
|
|
+#endif
|
|
|
#ifdef USE_USART
|
|
|
unsigned uartUnhold : 1; // Флаг разрешения передачи данных по USART
|
|
|
unsigned uartReport : 1; // Флаг разрешения отправки данных внешнему контроллеру
|
|
@@ -74,11 +80,9 @@ static uint8_t cnt_PDMcount; // Счетчик для перебора уст
|
|
|
static uint8_t cnt_menuWDT; // Счетчик секунд для организации отсчета ожидания выхода из меню
|
|
|
static uint8_t cnt_dspMenu; // Индикатор режима меню
|
|
|
|
|
|
-static uint8_t X_position (const uint8_t x, const uint16_t arg = 0, const uint8_t pix = 6); // Функция возвращает начальную позицию по Х для десятичного числа, в зависимости от количества знаков в нём.
|
|
|
-static uint8_t X_centred (const uint8_t len); // Функция возвращает начальную позицию по Х для текста длинной len знаков, для размещения оного по центру дисплея.
|
|
|
-static uint8_t A_to_HEX (const char a); // Функция переводит символ ASCII в шестнадцатиричную цифру
|
|
|
-static char HEX_to_A (const uint8_t x); // Функция переводит шестнадцатиричную цифру в символ ASCII
|
|
|
-static uint16_t calc_proportion(const uint16_t multiplier1, const uint16_t multiplier2 = Pnom, const uint32_t divider = CICLE);
|
|
|
+static uint8_t X_position(const uint8_t x, const uint16_t arg, const uint8_t pix); // Функция возвращает начальную позицию по Х для десятичного числа, в зависимости от количества знаков в нём.
|
|
|
+static uint8_t X_centred(const uint8_t len); // Функция возвращает начальную позицию по Х для текста длинной len знаков, для размещения оного по центру дисплея.
|
|
|
+static uint16_t calc_proportion(const uint16_t multiplier1, const uint16_t multiplier2, const uint32_t divider);
|
|
|
|
|
|
/*
|
|
|
* ПРОЦЕДУРЫ И ФУНКЦИИ
|
|
@@ -91,8 +95,7 @@ static uint16_t calc_proportion(const uint16_t multiplier1, const uint16_t multi
|
|
|
* @param х позиция для arg, если бы оно было однозначно;
|
|
|
* @param pix ширина шрифта в пикселях.
|
|
|
*/
|
|
|
-static uint8_t X_position (const uint8_t x, const uint16_t arg, const uint8_t pix) {
|
|
|
- //uint8_t pix = 6; // Ширина шрифта в пикселях
|
|
|
+static uint8_t X_position(const uint8_t x, const uint16_t arg, const uint8_t pix) {
|
|
|
if (arg < 10) {
|
|
|
return pix * x;
|
|
|
} else if (arg < 100) {
|
|
@@ -109,9 +112,9 @@ static uint8_t X_position (const uint8_t x, const uint16_t arg, const uint8_t pi
|
|
|
* для размещения оного по центру дисплея.
|
|
|
* @param len Количество знакомест в тексте
|
|
|
*/
|
|
|
-static uint8_t X_centred (const uint8_t len) {
|
|
|
- uint8_t wdt = 128; // Ширина дисплея в пикселях
|
|
|
- uint8_t pix = 6; // Ширина шрифта в пикселях
|
|
|
+static uint8_t X_centred(const uint8_t len) {
|
|
|
+ uint8_t wdt = ST7735_WIDTH; // Ширина дисплея в пикселях
|
|
|
+ uint8_t pix = 7; // Ширина шрифта в пикселях
|
|
|
if (len > wdt/pix) {
|
|
|
return 0;
|
|
|
} else {
|
|
@@ -119,6 +122,7 @@ static uint8_t X_centred (const uint8_t len) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#ifdef USE_EEPROM
|
|
|
/**
|
|
|
* @brief Функция переводит символ ASCII в шестнадцатиричную цифру,
|
|
|
* @return при ошибке возвращает 255
|
|
@@ -150,6 +154,7 @@ static char HEX_to_A (const uint8_t x) {
|
|
|
return 'X';
|
|
|
}
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
/**
|
|
|
* @brief Подпрограммка остановки режима "Разгон"
|
|
@@ -163,7 +168,7 @@ static void stop_razgon(void) {
|
|
|
* @brief Подпрограммка подсчета Pust
|
|
|
*/
|
|
|
static void set_Pust(void) {
|
|
|
- Pust = calc_proportion(PDMust);
|
|
|
+ Pust = calc_proportion(PDMust, Pnom, CICLE);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -223,6 +228,7 @@ static void remember_last_power_setting(void) { // Запомним послед
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#ifdef USE_EEPROM
|
|
|
/**
|
|
|
* @brief Подпрограмма обмена двух ячеек массива
|
|
|
* @param arr массив,
|
|
@@ -235,6 +241,7 @@ static void change_arr_cell(uint16_t arr[2][ARRAY_SIZE], const uint8_t index, co
|
|
|
arr[index][index1] = arr[index][index2];// Обмениваемся
|
|
|
arr[index][index2] = k;
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
/**
|
|
|
* @brief Инициализация АЦП
|
|
@@ -355,16 +362,20 @@ static void Buttons_(void) {
|
|
|
unsigned butt_3 : 1; // текущее состояние кнопки
|
|
|
unsigned butt_4 : 1; // текущее состояние кнопки
|
|
|
unsigned no_select : 1; // вспомогательный флажок для начального меню
|
|
|
+#ifdef USE_EEPROM
|
|
|
unsigned writePnom : 1; // вспомогательный флажок записи нового Pnom в EEPROM
|
|
|
unsigned clear_old : 1; // вспомогательный флажок стирания старой уставки из EEPROM
|
|
|
+#endif
|
|
|
} bt = {}; // Инициализируем структуру с нулевыми членами
|
|
|
static uint8_t butt_count = 0; // счетчик для устранения дребезга
|
|
|
static uint8_t butt_force_count = 0; // счетчик для форсирования инкремента/декремента
|
|
|
|
|
|
+#ifdef USE_EEPROM
|
|
|
if (bt.clear_old) { // Стираем старую уставку, если нужно
|
|
|
eeprom_update_word((uint16_t*)clear_old_addr,EMPTY_CELL_VALUE); // Стираем самую старую уставку
|
|
|
bt.clear_old = 0; // Снимаем флажок стирания
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
bt.butt_1 = pin_butt_1_STATE;
|
|
|
bt.butt_2 = pin_butt_2_STATE;
|
|
@@ -395,9 +406,11 @@ static void Buttons_(void) {
|
|
|
if (PDMset[0][0] != 0xffff) { // и есть записанное значение, уходим
|
|
|
cnt_Pnom_number = 0;
|
|
|
Pnom = PDMset[0][0]; // По умолчанию установим номинальную мощность из нулевой ячейки
|
|
|
+#ifdef USE_EEPROM
|
|
|
fl.writable = 1; // Уставки пишутся в EERPOM
|
|
|
- //EEPROM_read_PDMs(); // Читаем уставки
|
|
|
-#ifdef USE_USART
|
|
|
+ EEPROM_read_PDMs(); // Читаем уставки
|
|
|
+#endif
|
|
|
+#ifdef USE_USART
|
|
|
fl.uartUnhold = 1; // Разрешим обращение к USART
|
|
|
#endif
|
|
|
cnt_dspMenu = 0; // Выйдем из менюшки
|
|
@@ -455,7 +468,9 @@ static void Buttons_(void) {
|
|
|
}
|
|
|
case 4: { //-----Кнопкой "Стоп" пишем значение в память и выходим из менюшки
|
|
|
bt.writePnom = 1; // Ставим флаг записи нового значения Pnom в EEPROM
|
|
|
+#ifdef USE_EEPROM
|
|
|
fl.writable = 1; // Ставим флаг записи уставок в EEPROM
|
|
|
+#endif
|
|
|
}
|
|
|
case 8: { //-----Кнопкой "Разгон" выходим из менюшки
|
|
|
if (Pnom < 10000) { // Если значение реальное...
|
|
@@ -465,22 +480,29 @@ static void Buttons_(void) {
|
|
|
if (Pnom == PDMset[0][x]) { // Если такое значение уже есть в EEPROM...
|
|
|
cnt_Pnom_number = x; // Запомним порядковый номер совпавшего Pnom
|
|
|
bt.writePnom = 0; // Снимем флаг записи нового значения Pnom в EEPROM
|
|
|
+#ifdef USE_EEPROM
|
|
|
fl.writable = 1; // Ставим флаг записи уставок в EEPROM
|
|
|
+#endif
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
} else { // Если значение выбрано из записанных в EEPROM...
|
|
|
bt.writePnom = 0; // Снимем флаг записи нового значения Pnom в EEPROM
|
|
|
+#ifdef USE_EEPROM
|
|
|
fl.writable = 1; // Ставим флаг записи уставок в EEPROM
|
|
|
+#endif
|
|
|
}
|
|
|
- //
|
|
|
+
|
|
|
cnt_PDMcount=0; //Сбрасываем счетчик
|
|
|
- //
|
|
|
+#ifdef USE_EEPROM
|
|
|
if (fl.writable) { // Если уставки пишутся в EERPOM, то
|
|
|
- //EEPROM_read_PDMs(); // читаем ранее записанное
|
|
|
+ EEPROM_read_PDMs(); // читаем ранее записанное
|
|
|
}
|
|
|
+#endif
|
|
|
if (bt.writePnom) { // Запишем новое значение Pnom, если необходимо
|
|
|
- //eeprom_update_word((uint16_t*)(cnt_Pnom_number * 2),Pnom);
|
|
|
+#ifdef USE_EEPROM
|
|
|
+ eeprom_update_word((uint16_t*)(cnt_Pnom_number * 2),Pnom);
|
|
|
+#endif
|
|
|
bt.writePnom = 0; // и сбросим флаг записи нового значения Pnom
|
|
|
}
|
|
|
cnt_dspMenu = 0; // Снимаем флаг перехода в меню
|
|
@@ -522,6 +544,7 @@ static void Buttons_(void) {
|
|
|
}
|
|
|
case 4: { //По кнопке "стоп" записываем уставку, если нужно, принимаем и выходим
|
|
|
PDMust = PDMset[0][cnt_PDMcount]; //Устанавливаем выбранную мощность ТЭНа
|
|
|
+#ifdef USE_EEPROM
|
|
|
if (fl.writable) { // Если уставки запоминаются...
|
|
|
if (!PDMset[1][cnt_PDMcount]) { // Если просят записать НЕ уже записанное...
|
|
|
//eeprom_update_word((uint16_t*)new_addr,PDMset[0][cnt_PDMcount]); // Пишем новую уставку
|
|
@@ -566,6 +589,7 @@ static void Buttons_(void) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+#endif /* USE_EEPROM */
|
|
|
cnt_dspMenu = 0; //Снимаем флаг перехода в меню
|
|
|
fl.dspRefresh = 1; //Ставим флаг обновления экрана
|
|
|
fl.butt = 0; //После нажатия должна быть пауза
|
|
@@ -660,7 +684,7 @@ ISR(TIMER2_COMPA_vect) {
|
|
|
}
|
|
|
|
|
|
fl.PP_tm = !fl.PP_tm; // Инвертируем флаг полуволны
|
|
|
- OCR2A = PID_ust; // Грузим новое значение в регистр сравнения
|
|
|
+ OCR2A = PID_ust; // Грузим новое значение в регистр сравнения
|
|
|
|
|
|
fl.Tout ? TURN_SSR_ON : TURN_SSR_OFF ; // Включаем или выключаем ТЭН (твердотельное реле)
|
|
|
fl.TRelay ? TURN_RELAY_ON : TURN_RELAY_OFF ; // Включаем или выключаем ТЭН (контактное реле)
|
|
@@ -791,46 +815,48 @@ ISR(ADC_vect) {
|
|
|
* @brief Подпрограмма обновления меню
|
|
|
*/
|
|
|
static void RefreshMenu (void) {
|
|
|
- ASOled.clearDisplay();
|
|
|
- ASOled.printString_6x8(F("Ст Принять и записать"), 0, 6);
|
|
|
- ASOled.printString_6x8(F("Рз Принять без записи"), 0, 7);
|
|
|
- ASOled.printString_6x8(F("Управление:"), X_position (1), 3);
|
|
|
- ASOled.printString_6x8(F("P- Выбор"), 0, 4);
|
|
|
+ ST7735_FillScreen(ST7735_BLACK);
|
|
|
+ ST7735_WriteString(0, 6, "Ст Принять и записать", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(0, 7, "Рз Принять без записи", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(X_position(1, 0, 7), 3, "Управление:", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(0, 4, "P- Выбор", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#ifdef INTERFACE_ALT
|
|
|
|
|
|
#else
|
|
|
- ASOled.printString_6x8(F("Выберите"), 0, 0);
|
|
|
+ ST7735_WriteString(0, 0, "Выберите", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#endif
|
|
|
//
|
|
|
switch (cnt_dspMenu) { //Проверяем режимы меню
|
|
|
case 2: { //Если мы в начальном меню, то...
|
|
|
#ifdef INTERFACE_ALT
|
|
|
- ASOled.printString_6x8(F("В"), X_position (20), 0);
|
|
|
- ASOled.printNumber((long)U_LINE, X_position (16), 0);
|
|
|
- ASOled.printString_6x8(F("Рном= Вт"), 0, 1);
|
|
|
+ chsnprintf(buf, 24, "%3u V", U_LINE);
|
|
|
+ ST7735_WriteString(X_position(16, 0, 7), 0, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(0, 1, "Рном= Вт", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#else
|
|
|
- ASOled.printString_6x8(F("/введите Рном"), X_position (8), 0);
|
|
|
- ASOled.printString_6x8(F("Рном= Вт, ( В)"), 0, 1);
|
|
|
- ASOled.printNumber((long)U_LINE, X_position (16), 1);
|
|
|
+ ST7735_WriteString(X_position(8, 0, 7), 0, "/введите Рном", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ chsnprintf(buf, 24, "Рном= Вт, (%3u V)", U_LINE);
|
|
|
+ ST7735_WriteString(0, 1, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#endif
|
|
|
- ASOled.printString_6x8(F("==Мощность нагрузки=="), 0, 2);
|
|
|
- ASOled.printString_6x8(F("/уменьшение"), X_position (8), 4);
|
|
|
- ASOled.printString_6x8(F("P+ Увеличение"), 0, 5);
|
|
|
+ ST7735_WriteString(0, 2, "==Мощность нагрузки==", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(X_position(8, 0, 7), 4, "/уменьшение", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(0, 5, "P+ Увеличение", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case 1: { //Если мы в меню выбора уставки, то...
|
|
|
#ifdef INTERFACE_ALT
|
|
|
- ASOled.printString_6x8(F("Руст= Вт"), 0, 1);
|
|
|
+ ST7735_WriteString(0, 1, "Руст= Вт", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#else
|
|
|
- ASOled.printString_6x8(F("уставку"), X_position (9), 0);
|
|
|
- ASOled.printString_6x8(F("Руст= Вт"), 0, 1);
|
|
|
+ ST7735_WriteString(X_position(9, 0, 7), 0, "уставку", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(0, 1, "Руст= Вт", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#endif
|
|
|
- ASOled.printString_6x8(F("=======Уставка======="), 0, 2);
|
|
|
- ASOled.printString_6x8(F("P+ Выбор"), 0, 5);
|
|
|
+ ST7735_WriteString(0, 2, "=======Уставка=======", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(0, 5, "P+ Выбор", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+#ifdef USE_EEPROM
|
|
|
if (!fl.writable) { // Если уставки не пишутся в EEPROM, то...
|
|
|
- ASOled.printString_6x8(F("Ст Принять без записи"), 0, 6);
|
|
|
+ ST7735_WriteString(0, 6, "Ст Принять без записи", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
}
|
|
|
+#endif
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -843,8 +869,8 @@ static void RefreshMenu (void) {
|
|
|
* @brief Подпрограмма печати строки минусов
|
|
|
* @param str - номер строки, куда печатать минуса
|
|
|
*/
|
|
|
-static void Asoled_printstring_6x8_minus (const uint8_t str) {
|
|
|
- ASOled.printString_6x8(F("---------------------"), 0, str);
|
|
|
+static void menu_print_minus(const uint8_t str) {
|
|
|
+ ST7735_WriteString(0, str, "----------------------", Font_7x10, ST7735_RED, ST7735_BLACK);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -865,22 +891,21 @@ void Stab_Init(void) {
|
|
|
|
|
|
pp_Delay(10); // Подождем 10 полупериодов для гарантированного разрешения
|
|
|
|
|
|
- ASOled.init(); // Инициализируем OLED дисплей
|
|
|
- //ASOled.SetTurnedOrientation(); // Переворачиваем OLED дисплей
|
|
|
- ASOled.clearDisplay(); // Очищаем, иначе некорректно работает для дисплеев на SH1106 (косяк библиотеки)
|
|
|
- ASOled.printString_6x8(F("Стабилизатор мощности"), X_centred (21), 0);
|
|
|
- ASOled.printString_6x8(F("ТЭНа"), X_centred (4), 1);
|
|
|
+ //ST7735_Init(); // done in main()
|
|
|
+ ST7735_FillScreenFast(ST7735_BLACK);
|
|
|
+ ST7735_WriteString(X_centred(21), 0, "Стабилизатор мощности", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(X_centred(4), 1, "ТЭНа", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#ifdef INTERFACE_ALT
|
|
|
- ASOled.printString_12x16(F("STAB-AVR"), X_centred (16), 2);
|
|
|
+ ST7735_WriteString(X_centred(16), 2, "STAB-AVR", Font_11x18, ST7735_BLUE, ST7735_BLACK);
|
|
|
#else
|
|
|
- ASOled.printString_6x8(F("STAB-AVR"), X_centred (8), 2);
|
|
|
+ ST7735_WriteString(X_centred(8), 2, "STAB-AVR", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+#endif
|
|
|
+ ST7735_WriteString(X_centred(VERSION_LEN), 4, VERSION, Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(X_centred(10), 6, "JohnJohnov", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(X_centred(17), 7, "alcodistillers.ru", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+#ifdef USE_EEPROM
|
|
|
+ EEPROM_read_Pnoms(); // Прочитаем из EEPROM записанные номиналы ТЭНов
|
|
|
#endif
|
|
|
- ASOled.printString_6x8(F(VERSION), X_centred (VERSION_LEN), 4);
|
|
|
- ASOled.printString_6x8(F("JohnJohnov"), X_centred (10), 6);
|
|
|
- ASOled.printString_6x8(F("alcodistillers.ru"), X_centred (17), 7);
|
|
|
-
|
|
|
- //EEPROM_read_Pnoms(); // Прочитаем из EEPROM записанные номиналы ТЭНов
|
|
|
-
|
|
|
pp_Delay(800); // Подождем 600 полупериодов, пережидаем переходные процессы и любуемся заставкой
|
|
|
|
|
|
fl.dspRefresh = 1;
|
|
@@ -966,18 +991,17 @@ void Stab_WorkCycle(void) {
|
|
|
if (!Pnom || Pnom > 9999) {
|
|
|
Pnomold = Pnom;
|
|
|
#ifdef INTERFACE_ALT
|
|
|
- ASOled.printString_12x16(F("****"), X_position(3,0,12), 0);
|
|
|
+ ST7735_WriteString(X_position(3, 0, 11), 0, "****", Font_11x18, ST7735_BLUE, ST7735_BLACK);
|
|
|
#else
|
|
|
- ASOled.printString_6x8(F("****"), X_position(6), 1);
|
|
|
+ ST7735_WriteString(X_position(6, 0, 7), 1, "****", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#endif
|
|
|
} else if ((Pnomold != Pnom) || fl.dspRefresh) {
|
|
|
Pnomold = Pnom;
|
|
|
+ chsnprintf(buf, 24, "%u", Pnom);
|
|
|
#ifdef INTERFACE_ALT
|
|
|
- ASOled.printString_12x16(F(" "), X_position(3,0,12), 0);
|
|
|
- ASOled.printNumber((long)Pnom, X_position(6,Pnom,12), 0);
|
|
|
+ ST7735_WriteString(X_position(6, Pnom, 11), 0, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
|
|
|
#else
|
|
|
- ASOled.printString_6x8(F(" "), X_position(6), 1);
|
|
|
- ASOled.printNumber((long)Pnom, X_position(9,Pnom), 1);
|
|
|
+ ST7735_WriteString(X_position(9, Pnom, 7), 1, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#endif
|
|
|
}
|
|
|
fl.dspRefresh = 0;
|
|
@@ -987,19 +1011,20 @@ void Stab_WorkCycle(void) {
|
|
|
static uint16_t PDMold = 0;
|
|
|
if ((PDMold != PDMset[0][cnt_PDMcount]) || fl.dspRefresh) {
|
|
|
PDMold = PDMset[0][cnt_PDMcount];
|
|
|
- uint16_t p = calc_proportion(PDMold); // Считаем уставку с округлением
|
|
|
+ uint16_t p = calc_proportion(PDMold, Pnom, CICLE); // Считаем уставку с округлением
|
|
|
+ chsnprintf(buf, 24, "%u", p);
|
|
|
#ifdef INTERFACE_ALT
|
|
|
- ASOled.printString_12x16(F(" "), X_position (3,0,12), 0);
|
|
|
- ASOled.printNumber((long)p, X_position (6,p,12), 0);
|
|
|
+ ST7735_WriteString(X_position(6, p, 11), 0, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
|
|
|
#else
|
|
|
- ASOled.printString_6x8(F(" "), X_position (6), 1);
|
|
|
- ASOled.printNumber((long)p, X_position (9,p), 1);
|
|
|
+ ST7735_WriteString(X_position(9, p, 7), 1, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#endif
|
|
|
+#ifdef USE_EEPROM
|
|
|
if (PDMset[1][cnt_PDMcount]) { // Если значение записано в EEPROM
|
|
|
- ASOled.printString_6x8(F("R"), X_position (20), 1); // поставим значок
|
|
|
+ ST7735_WriteString(X_position(20, 0, 7), 1, "R", Font_7x10, ST7735_BLUE, ST7735_BLACK); // поставим значок
|
|
|
} else {
|
|
|
- ASOled.printString_6x8(F(" "), X_position (20), 1); // а если не записано - уберем
|
|
|
+ ST7735_WriteString(X_position(20, 0, 7), 1, " ", Font_7x10, ST7735_BLUE, ST7735_BLACK); // а если не записано - уберем
|
|
|
}
|
|
|
+#endif
|
|
|
}
|
|
|
fl.dspRefresh = 0;
|
|
|
break;
|
|
@@ -1024,49 +1049,47 @@ void Stab_WorkCycle(void) {
|
|
|
#endif
|
|
|
|
|
|
if (fl.dspRefresh) { //Обновляем дисплей
|
|
|
- ASOled.clearDisplay();
|
|
|
+ ST7735_FillScreen(ST7735_BLACK);
|
|
|
#ifdef INTERFACE_ALT
|
|
|
- ASOled.printString_6x8(F("Вт , %"), X_position (8), str_ust);
|
|
|
+ ST7735_WriteString(X_position(8, 0, 7), str_ust, "Вт , %", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#else
|
|
|
- ASOled.printString_6x8(F("Руст Вт; , %"), 0, str_ust);
|
|
|
+ ST7735_WriteString(0, str_ust, "Руст Вт; , %", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#endif
|
|
|
- ASOled.printString_6x8(F("Напр.сети , В"), 0, str_Ureal);
|
|
|
- ASOled.printString_6x8(F("Ном. мощность Вт"), 0, str_Pnom);
|
|
|
- ASOled.printNumber((long)Pnom, X_position (17,Pnom), str_Pnom);
|
|
|
- //ASOled.printString_6x8(F("Реле "), X_position (0), str_Relay);
|
|
|
+ ST7735_WriteString(0, str_Ureal, "Напр.сети , В", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ chsnprintf(buf, 24, "Ном. мощность %u Вт", Pnom);
|
|
|
+ ST7735_WriteString(0, str_Pnom, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ //ST7735_WriteString(X_position(0, 0, 7), str_Relay, "Реле ", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
}
|
|
|
|
|
|
static uint16_t U_real_old = 0;
|
|
|
if ((U_real_old != U_real) || fl.dspRefresh) {
|
|
|
U_real_old = U_real;
|
|
|
+ chsnprintf(buf, 24, "%u", U_real_old);
|
|
|
#ifdef INTERFACE_ALT
|
|
|
- ASOled.printString_12x16(F(" "), X_position (7,100,12) + 5, str_Ureal_big);
|
|
|
- ASOled.printNumber((long)U_real_old, X_position (7,U_real_old,12) + 5, str_Ureal_big);
|
|
|
+ ST7735_WriteString(X_position(7, U_real_old, 11) + 5, str_Ureal_big, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
|
|
|
#else
|
|
|
- ASOled.printString_6x8(F(" "), X_position (13), str_Ureal);
|
|
|
- ASOled.printNumber((long)U_real_old, X_position (16,U_real_old), str_Ureal);
|
|
|
+ ST7735_WriteString(X_position(16, U_real_old, 7), str_Ureal, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#endif
|
|
|
}
|
|
|
static uint8_t U_real_dec_old = 0;
|
|
|
if ((U_real_dec_old != U_real_dec) || fl.dspRefresh) {
|
|
|
U_real_dec_old = U_real_dec;
|
|
|
+ chsnprintf(buf, 24, "%u", U_real_dec);
|
|
|
#ifdef INTERFACE_ALT
|
|
|
- ASOled.printString_12x16(F(" "), X_position (9,0,12), str_Ureal_big);
|
|
|
- ASOled.printNumber((long)U_real_dec_old, X_position (9,0,12), str_Ureal_big);
|
|
|
+ ST7735_WriteString(X_position(9, 0, 11), str_Ureal_big, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
|
|
|
#else
|
|
|
- ASOled.printNumber((long)U_real_dec_old, X_position (18), str_Ureal);
|
|
|
+ ST7735_WriteString(X_position(18, 0, 7), str_Ureal_big, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
static uint16_t Pust_old = 0;
|
|
|
if ((Pust_old != Pust) || fl.dspRefresh) {
|
|
|
Pust_old = Pust;
|
|
|
+ chsnprintf(buf, 24, "%u", Pust_old);
|
|
|
#ifdef INTERFACE_ALT
|
|
|
- ASOled.printString_12x16(F(" "), 0, str_ust_big);
|
|
|
- ASOled.printNumber((long)Pust_old, X_position (3,Pust_old,12), str_ust_big);
|
|
|
+ ST7735_WriteString(X_position(3,Pust_old,11), str_ust_big, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
|
|
|
#else
|
|
|
- ASOled.printString_6x8(F(" "), X_position (5), str_ust);
|
|
|
- ASOled.printNumber((long)Pust_old, X_position (8,Pust_old), str_ust);
|
|
|
+ ST7735_WriteString(X_position(8,Pust_old,7), str_ust, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#endif
|
|
|
}
|
|
|
|
|
@@ -1077,52 +1100,49 @@ void Stab_WorkCycle(void) {
|
|
|
x /= CICLE;
|
|
|
uint8_t percent = x / 10; // посчитаем процент
|
|
|
uint8_t percent_dec = x % 10; // посчитаем десятые процента
|
|
|
+ chsnprintf(buf, 24, "%u.%u", percent, percent_dec);
|
|
|
#ifdef INTERFACE_ALT
|
|
|
- ASOled.printString_12x16(F(" "), X_position (7,100,12) + 5, str_ust_big);
|
|
|
- ASOled.printNumber((long)(percent), X_position (7,percent,12) + 5, str_ust_big);
|
|
|
- ASOled.printNumber((long)(percent_dec), X_position (9,0,12), str_ust_big);
|
|
|
+ ST7735_WriteString(X_position(7,100,11) + 5, str_ust_big, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
|
|
|
#else
|
|
|
- ASOled.printString_6x8(F(" "), X_position (13), str_ust);
|
|
|
- ASOled.printNumber((long)(percent), X_position (16,percent), str_ust);
|
|
|
- ASOled.printNumber((long)(percent_dec), X_position (18), str_ust);
|
|
|
+ ST7735_WriteString(X_position(13, 0, 7), str_ust, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
if (fl.Udown || fl.NotZero) {
|
|
|
- ASOled.printString_6x8(F("-----Авария сети-----"), 0, str_Ustat);
|
|
|
+ ST7735_WriteString(0, str_Ustat, "-----Авария сети-----", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
} else if (fl.Ulow) {
|
|
|
- ASOled.printString_6x8(F("--Недост.напр. сети--"), 0, str_Ustat);
|
|
|
+ ST7735_WriteString(0, str_Ustat, "--Недост.напр. сети--", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
} else {
|
|
|
- Asoled_printstring_6x8_minus(str_Ustat);
|
|
|
+ menu_print_minus(str_Ustat);
|
|
|
}
|
|
|
|
|
|
if (fl.razg_on) {
|
|
|
static uint8_t count_1 = 0;
|
|
|
uint8_t x1 = 5 - count_1;
|
|
|
uint8_t x2 = 20 - x1;
|
|
|
- ASOled.printString_6x8(F("------<Разгон!>------"), 0, str_Razgon);
|
|
|
- ASOled.printString_6x8(F("<"), X_position (x1), str_Razgon);
|
|
|
- ASOled.printString_6x8(F(">"), X_position (x2), str_Razgon);
|
|
|
+ ST7735_WriteString(0, str_Razgon, "------<Разгон!>------", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(X_position(x1, 0, 7), str_Razgon, "<", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
+ ST7735_WriteString(X_position(x2, 0, 7), str_Razgon, ">", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
if (++count_1 > 5) count_1 = 0;
|
|
|
} else {
|
|
|
- Asoled_printstring_6x8_minus(str_Razgon);
|
|
|
+ menu_print_minus(str_Razgon);
|
|
|
}
|
|
|
|
|
|
{
|
|
|
static uint8_t trigger = 1;
|
|
|
if (trigger && fl.stab_off) {
|
|
|
- ASOled.printString_6x8(F("!!АВАРИЙНЫЙ ОСТАНОВ!!"), 0, str_Relay);
|
|
|
+ ST7735_WriteString(0, str_Relay, "!!АВАРИЙНЫЙ ОСТАНОВ!!", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
trigger = 0;
|
|
|
} else {
|
|
|
- Asoled_printstring_6x8_minus(str_Relay);
|
|
|
+ menu_print_minus(str_Relay);
|
|
|
trigger = 1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//if (fl.TRelay) {
|
|
|
- // ASOled.printString_6x8(F("включено"), X_position (5), str_Relay);
|
|
|
+ // ST7735_WriteString(X_position(5, 0, 7), str_Relay, "включено", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
//} else {
|
|
|
- // ASOled.printString_6x8(F(" "), X_position (5), str_Relay);
|
|
|
+ // ST7735_WriteString(X_position(5, 0, 7), str_Relay, " ", Font_7x10, ST7735_BLUE, ST7735_BLACK);
|
|
|
//}
|
|
|
fl.dspRefresh = 0;
|
|
|
}
|