Форум самогонщиков Сайт Барахолка Магазин Помощь солдатам

Автоматика Самовар

Форум самогонщиков Вопросы по электр(он)ике
1 ... 144 145 146 147 148 147
Kuban Доктор наук Краснодар 540 399
Отв.2920  23 Февр. 25, 11:48
Все-таки проблемы какие то с уведомлением в телеграмм наблюдается, возможно это на их сторонеlogvinov, 23 Февр. 25, 11:33
Бывает такое. Потом через полчасика - бзынь, поприходило....
Knyazskill Бакалавр Emva 65 1
Отв.2921  24 Февр. 25, 14:38
Здравствуйте! Может есть ссылки на правильные esp32 ? Желательно ВБ или озон .
wOOlf Новичок Ростов-на-Дону 2
Отв.2922  01 Марта 25, 16:31
Добрый день! Не пойму, что делать вот такая ошибка.
Скетч использует 1377340 байт (105%) памяти устройства. Всего доступно 1310720 байт.
Глобальные переменные используют 61020 байт (18%) динамической памяти, оставляя 266660 байт для локальных переменных. Максимум: 327680 байт.
Скетч слишком большой; прочитайте
секция текста превышает доступное пространство на плате

Compilation error: секция текста превышает доступное пространство на плате

Нашел в этой теме такие же проблемы были, но их совет не помогает или я что то не правильно делаю.
Мо ж кто сжалится, поможет))
lkosoj Куратор Видное 540 575
Отв.2923  01 Марта 25, 20:07
Добрый день!
Вот тут [сообщение #14091094]
И где то ещё раньше было на форуме подробнее
wOOlf Новичок Ростов-на-Дону 2
Отв.2924  02 Марта 25, 16:29
Добрый день!
Вот тут [сообщение #14091094]
И где то ещё раньше было на форуме подробнееlkosoj, 01 Марта 25, 20:07

Спасибо!! Снес все и заново поставил по инструкции. Заработало!
dranek Кандидат наук Минск 412 365
Отв.2925  04 Марта 25, 15:48
Стабилизатор на ESP12E/F и PZEM-004T.
Альфа версия, решил выложить, может у кого интересные идеи будут.
Пока успешно управляет SSR-40DA аналогично STAB AVR, но вместо привязки к напряжению используется измерение мощности от PZEM и последовательное приближение к заданию. Я здесь не новатор, просто решил собрать всё в удобное устройство для Самовара.
Таким образом без разницы какой мощности ТЭН подключен. В конфиге эта мощность есть, но не обязательна. Нужна для быстрейшего выполнения нового задания, если она будет слишком малой просто в первый раз выполнение задания будет дольше обычного. Стаб сам определяет номинал тэна как максимальное значение. Для этого можно в веб интерфейсе нажать кнопку Прогрузить ТЭН на 5 сек. В процессе будет запомнена мощность тэна. Как бонус есть свой счетчик электроэнергии. Имеет отключаемые: вебинтерфейс, дисплей I2C 128*64 + одна кнопка, uart связь с Самоваром, OTA.
Требует ручного изготовления датчика zerocross [сообщение #12242568] .
Подключать его по питанию на 3.3В, два резистора 220 кОм из соображений безопасности лучше взять хотя бы по 1/2Вт и положить их, чтоб снизить вероятность пробоя по 220 В, оптопару и транзистор можно взять другие, у меня pc817 и bc547.
Код частично позаимствован чтоб не изобретать велосипедов.
В планах: Научить фазовому регулированию симистором через оптопару и, возможно, SSR-40LA. MQTT управление.
Из проблем: Самовар по uart иногда путается в ответах на свои запросы. Веб интерфейс сыроват, зато асинхронен. Кнопка только одна из-за дефицита ног: длительное нажатие изменяет задатчик мощности с нарастающей скоростью. Двойной клик изменяет направление. Тройной - включить/выключить разгон. На дисплее при этом появляются подсказки:"<",">","B".
PZEM-004T подключается через повторитель логических уровней. В принципе можно и через резистивный делитель наверно, но у меня валялся повторитель.
Питается pzem от 5В, esp от ams1117 3.3В. Ну и конденсаторы конечно там и там.
Номера пинов расписаны в Stab_config.h. Два пина выделены на общее включение ТЭН-ов и разгон через твердотельное двойное реле и контакторы, считаю это необходимым на случай пробития симистора. Разгон ИМХО нужен чтоб делить спирали мощных ТЭНов.
Можно использовать 2 набора: SSID и пароль для WI-FI, стабилизатор сначала пытается подключиться к тому, что сохранен в веб интерфейсе, в случае его отсутствия либо неуспеха - к тому, что в конфиге, если нет поднимает свою точку доступа.
В первый раз прошить надо через переходник на usb, в последствии - OTA.
Удобная плата с переходником и встроенным стабилизатором 3.3В
PZEM-004T

IMG_20250228_123637.jpg
IMG_20250228_123637. Автоматика Самовар. Вопросы по электр(он)ике.

stab_v18_modules.zip

P.S. Из-за особенности схемы PZEM-004T контакты её измерения напряжения подключать не в цепь симистора, т.е. на неискаженное напряжение. Иначе сгорит.
lkosoj Куратор Видное 540 575
Отв.2926  04 Марта 25, 16:26 (через 39 мин)
Кнопка только одна из-за дефицита ногdranek, 04 Марта 25, 15:48
Можно подключить через аналоговый делитель несколько кнопок или даже энкодер.
Самовар по uart иногда путается в ответах на свои запросыdranek, 04 Марта 25, 15:48
А тут можно подробнее?
dranek Кандидат наук Минск 412 365
Отв.2927  04 Марта 25, 16:37 (через 11 мин)
Можно подключить через аналоговый делитель несколько кнопок или даже энкодер.
Самовар по uart иногда путается в ответах на свои запросы
dranek, Сегодня, 15:48lkosoj, 04 Марта 25, 16:26
в esp8266 такой А0, что лучше не надо.
А тут можно подробнее?lkosoj, 04 Марта 25, 16:26
С этим пытаюсь разобраться, ввел даже спец задержку перед отправкой ответа. Контролирую порт через третий hc-12 на PC. Если ставлю задержку то на запросы AT+.. от меня бывает мусор летит, причину не могу определить. Если задержка 0 мусора нет, но Самовар его где то находит, особенно 3 параметр (режим). Мусор состоит из отладочных кусков текста ранее бывших выдаче.
lkosoj Куратор Видное 540 575
Отв.2928  04 Марта 25, 17:41
в esp8266 такой А0, что лучше не надо.dranek, 04 Марта 25, 16:37
Тогда расширитель портов по I2C, займёт один дополнительный порт на прерывание (можно вообще без него) даст 8 или 16

Если переделать управление не по мощности, а по напряжению, можно использовать протокол kvic, мусор будет откидываться
dranek Кандидат наук Минск 412 365
Отв.2929  04 Марта 25, 18:37 (через 56 мин)
Тогда расширитель портов по I2C, займёт один дополнительный порт на прерывание (можно вообще без него) даст 8 или 16lkosoj, 04 Марта 25, 17:41
Красота в простоте. Управляется всё и 1 кнопкой, вполне сносно. И это скорей доп. возможность. Если уж очень надо можно перейти на ESP32-C6, там пинов хватит на энкодер, или даже для универсальности на devkit v1.
Если переделать управление не по мощности, а по напряжению, можно использовать протокол kvic, мусор будет откидыватьсяlkosoj, 04 Марта 25, 17:41
Замысел именно в регулировке конкретно по мощности, мы ведь её стабилизируем. Эмулируем человека, видим мощность - крутим ручку. Насчет протоколов у kvic, я хоть в отрочестве на МАСМ и пописывал уже блаженно это всё забыл.
То что Самовар периодически получает некорректные ответы особой погоды не делает, снимаем галку в его настройках и всё. И потом это пока только альфа, может и решу как то.
Kuban Доктор наук Краснодар 540 399
Отв.2930  04 Марта 25, 19:36 (через 60 мин)
То что Самовар периодически получает некорректные ответы особой погоды не делает, снимаем галку в его настройках и всё.dranek, 04 Марта 25, 18:37
Имеется ввиду , в настройках Самовара, чекбокс "Проверять подключение регулятора"?
dranek Кандидат наук Минск 412 365
Отв.2931  04 Марта 25, 19:43 (через 7 мин)
Kuban, Да, он.
Kuban Доктор наук Краснодар 540 399
Отв.2932  04 Марта 25, 19:50 (через 7 мин)
Не есть хорошо. Даже более чем. На режиме "Предзахлеб" и "Брожение" Самовар, все равно, будет использовать некорректные ответы если они будут относиться к значению мощности. А на броженнии вообще может закипятить бродильник. Это не предположение. Это факт.
dranek Кандидат наук Минск 412 365
Отв.2933  04 Марта 25, 20:50
Насколько помню у меня на Stab AVR всегда эта галка была снята, потому что час работает, а потом аварийное отключение по потере подключения, без видимых причин. Возможно оно всегда не шибко правильно работало.
Сейчас попробовал с любимой грелкой вместо ТЭНа, мусор появляется редко видел всего раз (может была и ликвидировалась утечка или неверная адресация памяти, навожу сейчас порядок в переменных), но Самовар путает ответы в режиме Работа.
Вот разгон с отправкой без задержки
01.png
01. Автоматика Самовар. Вопросы по электр(он)ике.
не путает, в логе всё правильно.
Вот работа с отправкой без задержки
02.png
02. Автоматика Самовар. Вопросы по электр(он)ике.
путает, а в логе всё правильно.
Вот разгон с задержкой отправки 55 миллисекунд.
2boost.png
2boost. Автоматика Самовар. Вопросы по электр(он)ике.
не путает, в логе всё правильно, иногда не дожидается.
Вот работа сразу после этого. Видно, что ответы идут правильные, но Самовар путает.
2norm.png
2norm. Автоматика Самовар. Вопросы по электр(он)ике.

Ранее подбирал задержку такую, что более менее работало, это как раз 55, теперь вот не особо. Правда тогда мусор в ответ на AT+SS? периодически отправлял. Надо разбираться.

Модуль usart_samovar.cpp#include "usart_samovar.h"
#include <Arduino.h>
#include "Stab_config.h"
#ifdef ENABLE_USART_SAMOVAR
#include "oled_display.h"

extern uint16_t power;
extern int16_t powerSetpoint;
extern volatile bool boostMode;
extern bool heatEnabled;
// Глобальные переменные для управления задержкой ответа
unsigned long responseDelay = 0; // Задержка ответа Самовару в миллисекундах
unsigned long lastRequestTime = 0; // Время получения последнего запроса
String pendingResponse = ""; // Ответ, который нужно отправить с задержкой
extern int16_t PowerLevelT;
// Шлем с задержкой отчеты Самовару
void USART_SendReport(){
if (pendingResponse != "" && millis() - lastRequestTime >= responseDelay) {
Serial.print(pendingResponse+"
"); // Отправляем ответ
//Serial.flush();
LD.printString_6x8(pendingResponse.c_str(), 0, 7);
pendingResponse = ""; // Сбрасываем ожидающий ответ
}
}
//Принимаем по UART запросы от Самовара
void USART_GetRequests() {
static String inoutString;
static byte index = 0;

while (Serial.available() > 0) { // Используем аппаратный Serial
char inChar = (char)Serial.read(); // Чтение очередного байта

if (!index) {
if ((inChar == 'A') || (byte(inChar) == 0xD0)) { // Ждём первый символ посылки "A" или первый байт UTF-кириллицы
inoutString = inChar;
index = 1;
}
} else if (index++ < 13) { // Пока посылка не длиннее 13 символов, считаем её корректной
if (inChar == 0x0D) { // Ждем последнего символа посылки <CR>
index = 0;

// Разбираем строку
if (inoutString == "АТ+VO?") { // Запрос текущей мощности
pendingResponse = String((uint16_t)power);// + char(0x0D); // Формируем ответ
lastRequestTime = millis(); // Запоминаем время получения запроса
} else if (inoutString == "АТ+VS?") { // Запрос уставки текущей мощности
pendingResponse = String((uint16_t)powerSetpoint);// + char(0x0D); // Формируем ответ
lastRequestTime = millis(); // Запоминаем время получения запроса
} else if (inoutString == "AT+SS?" || inoutString == "АТ+SS?") { // Запрос режима

if (boostMode) {
pendingResponse = "1";// + char(0x0D); // Режим разгона
} else if (!heatEnabled) {
pendingResponse = "2";// + char(0x0D); // Режим стоп
} else {
pendingResponse = "0";// + char(0x0D); // Рабочий режим
}
lastRequestTime = millis(); // Запоминаем время получения запроса
} else if (inoutString == "AT+ON=0" || inoutString == "АТ+ON=0") { // Запрос на выключение нагрева
heatEnabled = false;
digitalWrite(heatPin, LOW);
boostMode = false;
digitalWrite(boostPin, LOW);
inoutString = "";
PowerLevel = 0; powerSetpoint =0;
} else if (inoutString == "AT+ON=1" || inoutString == "АТ+ON=1") { // Запрос на включение режима "Разгон"
if (!boostMode) {
boostMode = true;
digitalWrite(boostPin, HIGH);
digitalWrite(heatPin, HIGH);
heatEnabled = true;
PowerLevelT = PowerLevel;
PowerLevel = MaxPowerLevel;
}
inoutString = "";
} else if (inoutString.substring(0, Крутой == "АТ+VS=") { // Запрос на изменение уставки мощности
uint16_t newPower = inoutString.substring(8).toInt();
if (newPower > 0) {
digitalWrite(heatPin, HIGH);
heatEnabled = true;
digitalWrite(boostPin, LOW);
boostMode = false;
powerSetpoint =(uint16_t)newPower;
}
if (newPower == 0) {
digitalWrite(heatPin, LOW);
heatEnabled = false;
powerSetpoint = 0;
}
inoutString = "";
}
} else { // Еще не конец
inoutString += inChar; // Добавляем символ в строку
}
} else { // Посылка слишком длинная, начинаем сначала
index = 0;
}
}
}
#endif //ENABLE_USART_SAMOVAR
LOOP//Основной цикл
void loop() {
#ifdef ENABLE_OTA // Обработка ОТА
MDNS.update(); ArduinoOTA.handle();
#endif
#ifdef ENABLE_USART_SAMOVAR
USART_GetRequests(); //Принимаем по UART запросы от Самовара
USART_SendReport(); // Отправляем ответ Самовару по UART с необходимой задержкой

#endif //ENABLE_USART_SAMOVAR
#ifdef ENABLE_MQTT
loopMQTT(); // Обработка MQTT
#endif //ENABLE_MQTT
ButtonsLoop(); // Обработка кнопок

static unsigned long timeout = millis(); //остальное раз в секунду
if (millis() - timeout >= 1000) {
#ifdef ENABLE_WEB_SERVER
if (boostLoadActive) TEN_Boost(); // если надо прогружаем ТЭН
//установка флага невозможности выполнить задачу по мощности
insufficientVoltage = (powerSetpoint > maxPower && PowerLevel == MaxPowerLevel);
#endif // ENABLE_WEB_SERVER
PZEMLoop(); //Читаем параметры электросети
triakLoop(); // Обработка симистора
#ifdef ENABLE_OLED_DISPLAY
updateOLEDDisplay(); //Выводим инфу на дисплей
#endif
timeout = millis(); //перезапуск секундного таймера
}
}
Автоматика Самовар
Автоматика Самовар. Вопросы по электр(он)ике.

З.Ы. Вспомнил, вот эти + char(0x0D); и были причиной мусора при отправке, заменил перед отправкой на + " / r" , мусор пропал.(пробелы чтоб форум отображал)
lkosoj Куратор Видное 540 575
Отв.2934  04 Марта 25, 22:09
Проблема та же, что и у Stab AVR. Он периодически не успевает ответить за заданное время Самовару, и Самовар начинает не верно отображать информацию.
Со StabAvr разобраться практически не реально, всё в кучу свалено, проще переписать с нуля (что, похоже в этом регуляторе и сделано Улыбающийся )
Можно поднять отдельный таск, который будет мониторить com порт и отвечать на запрос. Тогда проблем не должно быть.
dranek Кандидат наук Минск 412 365
Отв.2935  04 Марта 25, 22:10 (через 1 мин)
Вообще странный протокол. У команд префикс есть. У ответов нету. Зачем эта синхронность? Был бы префикс у ответа, не было б таких проблем, допустим AT-P1200/ r значит текщая мощность 1200Вт. И т.д. Ну и раз такая частота опроса, тоже неясно зачем кстати ?, можно фильтровать ответы от явно неправильных.
lkosoj Куратор Видное 540 575
Отв.2936  04 Марта 25, 22:31 (через 22 мин)
Протокол взят от Рмвк, там он работает нормально. Тут я пытался за счёт задержек на стороне Самовара решить проблему, но с переменным успехом.
Можно пересмотреть протокол, добавив признак к ответу. Это должно повысить стабильность.
dranek Кандидат наук Минск 412 365
Отв.2937  04 Марта 25, 23:25 (через 54 мин)
Можно поднять отдельный таск, который будет мониторить com порт и отвечать наило запрос.lkosoj, 04 Марта 25, 22:09
здесь не как в esp32. Есть только прерывания и они нужны для обработки полуволн. И только одно ядро. Если я повешу обработку Serial на прерывание это потенциально будет мешать регулированию. Если буду только флаги в прерывании ставить - ничего не изменит. Может чего и не знаю, пока вижу так.
Можно пересмотреть протокол, добавив признак к ответу. Это должно повысить стабильность.lkosoj, 04 Марта 25, 22:31
Вот это имхо правильно, но не изменить, а дополнить, плюс еще и уйти в таких ответах от синхронности. Чтоб Самовар обрабатывал запросы с префиксом по мере получения, а без префикса по прежнему считал это ответом на последний запрос. Тогда можно будет и в прошивку Stab AVR изменения внести (моя функция это упрощенная от Stab AVR) и она наконец у всех правильно заработает. Но и старая прошивка работать тоже будет должна как прежде.

Добавлено через 13мин.:

В принципе можете эту же функцию парсинга чуть в ожидаемых посылках подправить и себе в Самовар встроить для приема асинхронных ответов.
lkosoj Куратор Видное 540 575
Отв.2938  05 Марта 25, 00:06 (через 41 мин)
здесь не как в esp32dranek, 04 Марта 25, 23:25
Почти так же.
dranek Кандидат наук Минск 412 365
Отв.2939  05 Марта 25, 08:49
lkosoj, речь идет о чём то подобном?

void USART_Task(void *arg) {
while (true) {
USART_GetRequests(); // Обработка запросов
USART_SendReport(); // Отправка ответов
delay(1);
}
}

void setup() {
// Создание задачи с высоким приоритетом
ets_task(USART_Task, ETS_TASK_PRIO_HIGH, nullptr, 0);
...
}

void loop() {
...
}

А правильно ли отдавать высший приоритет выполнению второстепенной задачи?