Помогите пожалуйста реализовать в С++ или блоках

hallozin1
Рядовой
Сообщения: 35
Зарегистрирован: 02.08.2021{, 12:43}
Репутация: 5
Имя: Алексей

Помогите пожалуйста реализовать в С++ или блоках

#21

Сообщение hallozin1 » 05.05.2024{, 09:48}

AlexGrash писал(а):
05.05.2024{, 09:26}
hallozin1 писал(а):
05.05.2024{, 07:51}
нужно 2 строки в коде изменить #define NUM_TENS 4 и int tens[NUM_TENS] = {2, 3, 4, 5}; // Пины, к которым подключены тэны
Вот здесь я не совсем понял, тэнов у меня 6, а выходов 4. Тэны должны включаться по одному, по мере понижения температуры в пределах дифференциала.
что бы управлять 4 выходами 6 нагрузками нужен дешифратор
хотя можно использовать 3 выхода используя метод Чарлиплексинг
#define NUM_TENS 6
#define T_SET 24
#define DIFF 2
#define T_MIN (T_SET - DIFF)

int pins[3] = {2, 3, 4}; // Пины, к которым подключены тэны
float lastTemperature = T_SET; // Последняя измеренная температура
unsigned long lastTime = millis(); // Время последнего измерения температуры

void setup() {
// Начальная настройка пинов
for (int i = 0; i < 3; i++) {
pinMode(pins, INPUT);
}
}

void loop() {
float Tdch = readTemperature(); // Функция для чтения температуры с датчика
float diff = DIFF;

// Если температура быстро падает, увеличиваем дифференциал
if ((Tdch - lastTemperature) / ((millis() - lastTime) / 60000.0) < -1) {
diff += 1;
}

int numActiveTens = (T_SET - Tdch) / diff;
if (numActiveTens < 0) numActiveTens = 0;
if (numActiveTens > NUM_TENS) numActiveTens = NUM_TENS;

for (int i = 0; i < NUM_TENS; i++) {
if (i < numActiveTens) {
setTen(i);
delay(1000); // Задержка между переключением тэнов
}
}

lastTemperature = Tdch; // Обновляем последнюю измеренную температуру
lastTime = millis(); // Обновляем время последнего измерения температуры
}

void setTen(int ten) {
// Сначала устанавливаем все пины в состояние INPUT
for (int i = 0; i < 3; i++) {
pinMode(pins, INPUT);
}

// Затем устанавливаем нужные пины в состояние HIGH и LOW
pinMode(pins[ten / 2], OUTPUT);
digitalWrite(pins[ten / 2], ten % 2 == 0 ? HIGH : LOW);
pinMode(pins[(ten / 2 + 1) % 3], OUTPUT);
digitalWrite(pins[(ten / 2 + 1) % 3], ten % 2 == 0 ? LOW : HIGH);
}

float readTemperature() {
// Здесь должен быть код для чтения температуры с датчика
// Возвращаемое значение должно быть в градусах Цельсия
}
Последний раз редактировалось hallozin1 05.05.2024{, 10:14}, всего редактировалось 1 раз.

MihailK
Сержант
Сообщения: 107
Зарегистрирован: 05.12.2020{, 23:42}
Репутация: 11
Имя: Михаил

Помогите пожалуйста реализовать в С++ или блоках

#22

Сообщение MihailK » 05.05.2024{, 10:02}

AlexGrash писал(а):
04.05.2024{, 11:41}
1 ст.= 1 тэн, соответственно выход №1
2 ст.= 2 тэна, соответственно выход №2
3 ст.= 1 тэн, соответственно выход №3
4 ст.= 2 тэна, соответственно выход №4
Предположу, что у Вас трехфазное питание, поэтому:
1. Такая игра с ТЭН-ами будет вызывать существенный перекос фаз.
2. Мне непонятна сама идея Вашего алгоритма управления. Объем воды постоянен и его проще нагревать всеми ТЭН-ами. Экономии электричества не получается.
2. Одни ТЭН-ы будут работать постоянно, другие включаться периодически. В таких устройствах ставят счетчик часов работы и нагрузку чередуют, чтобы происходил равномерный износ.
AlexGrash писал(а):
05.05.2024{, 01:55}
Включение выключение тэнов-ступеней осуществлено с помощью однополюсных контакторов через симмисторное управление,
спорное решение. Обычно достаточно промежуточного реле.

Аватара пользователя
montirovka
Сержант
Сообщения: 261
Зарегистрирован: 15.02.2021{, 16:16}
Репутация: 52
Откуда: Геленджик
Имя: Сергей

Помогите пожалуйста реализовать в С++ или блоках

#23

Сообщение montirovka » 05.05.2024{, 11:05}

AlexGrash писал(а):
05.05.2024{, 07:07}
грубовато но всё же 12*24=288кВт/сутки.
Пользователь уже предполагает что тэны будут во включенном состоянии все время.
Это думаю не с проста.

Отправлено спустя 10 минут 4 секунды:
MihailK писал(а):
05.05.2024{, 10:02}
1 ст.= 1 тэн, соответственно выход №1
2 ст.= 2 тэна, соответственно выход №2
3 ст.= 1 тэн, соответственно выход №3
4 ст.= 2 тэна, соответственно выход №4
4 ступени думаю достаточно будет. Два тэна на одной фазе в одном бойлере, два тэна на другой фазе в другом бойлере и два одиночных тэна на третьей фазе в разных бойлерах. Перекос не будет большим.
Люблю учиться на чужих ошибках.

AlexGrash
Рядовой
Сообщения: 13
Зарегистрирован: 30.12.2021{, 08:10}
Репутация: 2
Имя: Александр

Помогите пожалуйста реализовать в С++ или блоках

#24

Сообщение AlexGrash » 05.05.2024{, 11:22}

hallozin1 писал(а):
05.05.2024{, 09:48}
что бы управлять 4 выходами 6 нагрузками нужен дешифратор
хотя можно использовать 3 выхода используя метод Чарлиплексинг
Кстати да, я с Вами целиком и полностью согласен, принцип понял. Осталось только Ваш язык С++, переделать на мой язык не для ардуино, а для NEXTION :smile469:. Интересно как я сам до этого раньше не додумался :smile390:

Аватара пользователя
montirovka
Сержант
Сообщения: 261
Зарегистрирован: 15.02.2021{, 16:16}
Репутация: 52
Откуда: Геленджик
Имя: Сергей

Помогите пожалуйста реализовать в С++ или блоках

#25

Сообщение montirovka » 05.05.2024{, 11:26}

AlexGrash, не указал мощность установленных батарей. Может получиться так , что теплоноситель вот вот закипит, а в доме холодно.
При проектировании своего дома я мощность батарей в 1,5 раза увеличил, тем самым уменьшил возможность закипания воды в системе. Батареи на 35 кВт, а котел 25 кВт. Котел на дровах.
Люблю учиться на чужих ошибках.

AlexGrash
Рядовой
Сообщения: 13
Зарегистрирован: 30.12.2021{, 08:10}
Репутация: 2
Имя: Александр

Помогите пожалуйста реализовать в С++ или блоках

#26

Сообщение AlexGrash » 05.05.2024{, 11:31}

MihailK писал(а):
05.05.2024{, 10:02}
Мне непонятна сама идея Вашего алгоритма управления. Объем воды постоянен и его проще нагревать всеми ТЭН-ами. Экономии электричества не получается.
Допустим: мы греемся от бойлеров, но в определённый момент температура за окном понижается и наши бойлера уже не справляются. Мы затапливаем твёрдотопливный котёл (как правило вечером) и по мере его нагревания (нагревания теплоносителя), постепенно отключаются тэны по одному.
По мере прогорания топлива в котле (рано утром) становится прохладно в доме, мы это чувствуем сквозь сон, а вставать ну уж очень не охота, а в это время у нас подключаются тэны, опять же по одному. И мы встаём не в 5 часов, а в 8 :D .

Аватара пользователя
montirovka
Сержант
Сообщения: 261
Зарегистрирован: 15.02.2021{, 16:16}
Репутация: 52
Откуда: Геленджик
Имя: Сергей

Помогите пожалуйста реализовать в С++ или блоках

#27

Сообщение montirovka » 05.05.2024{, 11:32}

hallozin1 писал(а):
05.05.2024{, 09:48}
хотя можно использовать 3 выхода используя метод Чарлиплексинг
Нарисуйте для тэнов такую схему. Мне даже стало интересно.
Люблю учиться на чужих ошибках.

AlexGrash
Рядовой
Сообщения: 13
Зарегистрирован: 30.12.2021{, 08:10}
Репутация: 2
Имя: Александр

Помогите пожалуйста реализовать в С++ или блоках

#28

Сообщение AlexGrash » 05.05.2024{, 11:41}

montirovka писал(а):
05.05.2024{, 11:26}
AlexGrash, не указал мощность установленных батарей. Может получиться так , что теплоноситель вот вот закипит, а в доме холодно.
При проектировании своего дома я мощность батарей в 1,5 раза увеличил, тем самым уменьшил возможность закипания воды в системе. Батареи на 35 кВт, а котел 25 кВт. Котел на дровах.
Нет, на этот случай предусмотрена авария по высокой температуре теплоносителя. На видео всё показано, и датчики на подаче и обратке стоят. Ещё раз повторюсь система уже работает больше или около 3-х лет, проект для контролёра Мега рабочий, работает в это время прекрасно. Вся переделка начата из-за приобретения более мощного и большего по диагонали экрана (всяких плюшечек туда побольше напихал).

AlexGrash
Рядовой
Сообщения: 13
Зарегистрирован: 30.12.2021{, 08:10}
Репутация: 2
Имя: Александр

Помогите пожалуйста реализовать в С++ или блоках

#29

Сообщение AlexGrash » 05.05.2024{, 11:47}

Блин, ребята, я понимаю Вашу любопытность, но пожалуйста не надо учить что куда ставить и что к чему подцеплять, просто можно советы по существу? Вот если бы кто ни будь метод Чарлиплексинга реализовал в событии таймера экрана - было бы существеннее. Без обид!!! :smile198:

Аватара пользователя
montirovka
Сержант
Сообщения: 261
Зарегистрирован: 15.02.2021{, 16:16}
Репутация: 52
Откуда: Геленджик
Имя: Сергей

Помогите пожалуйста реализовать в С++ или блоках

#30

Сообщение montirovka » 05.05.2024{, 13:03}

AlexGrash писал(а):
05.05.2024{, 11:47}
но пожалуйста не надо учить что куда ставить
Чтобы что то подсказывать, надо полное понимание того , что у вас сделано и как работает. На форуме люди разные. Кому то тема тоже интересна, кто то более силен в электронике, кто то в теплотехнике. Только лишь вместе можно добиться успехов.
За три года вы сами должны были понять, что нужно изменить.
Люблю учиться на чужих ошибках.

Ander
Рядовой
Сообщения: 70
Зарегистрирован: 31.10.2023{, 12:50}
Репутация: 12
Имя: Андрей

Помогите пожалуйста реализовать в С++ или блоках

#31

Сообщение Ander » 05.05.2024{, 13:27}

Если подключить так:
Реле1(Р1) = Тен1(Т1)
Р2 = Т2+Т3
Р3=Т3+Т5+Т6

Итого
Сос11 = Р1
Сост2 = Р2
Сост3 = р3
Сост4 = Р3+Р1
Сост5 = Р3+Р2
Сост6 = Р1+Р2+Р3.

Аватара пользователя
montirovka
Сержант
Сообщения: 261
Зарегистрирован: 15.02.2021{, 16:16}
Репутация: 52
Откуда: Геленджик
Имя: Сергей

Помогите пожалуйста реализовать в С++ или блоках

#32

Сообщение montirovka » 05.05.2024{, 13:53}

Ander писал(а):
05.05.2024{, 13:27}
Если подключить так:
Реле1(Р1) = Тен1(Т1)
Р2 = Т2+Т3
Р3=Т3+Т5+Т6

Итого
Сос11 = Р1
Сост2 = Р2
Сост3 = р3
Сост4 = Р3+Р1
Сост5 = Р3+Р2
Сост6 = Р1+Р2+Р3.
Программист думает по-одному, электрик по- другому. Здесь перекос фаз обеспечен. Не выходя с любой комнаты вы будете замечать включения третьего реле. А контактор на какой ток? Ну да не лезьте.
Для общей информации. В счетчиках эл. энергии Матрица однофазный стоит 100 амперный контактор фирмы Gruner.
P.S. При работе бойлеров вы напряжения по фазам замеряли? При включении нагрузки на одной фазе, что с напряжением на другой фазе происходит знаете?
Люблю учиться на чужих ошибках.

AlexGrash
Рядовой
Сообщения: 13
Зарегистрирован: 30.12.2021{, 08:10}
Репутация: 2
Имя: Александр

Помогите пожалуйста реализовать в С++ или блоках

#33

Сообщение AlexGrash » 05.05.2024{, 15:05}

Ander писал(а):
05.05.2024{, 13:27}
Если подключить так:
Реле1(Р1) = Тен1(Т1)
Р2 = Т2+Т3
Р3=Т3+Т5+Т6

Итого
Сос11 = Р1
Сост2 = Р2
Сост3 = р3
Сост4 = Р3+Р1
Сост5 = Р3+Р2
Сост6 = Р1+Р2+Р3.
Я думаю в моём случае это тоже самое, что предлагаете вы. При более детальном просмотре своего же метода включения тэнов и сравнение со схемой метода Чарлиплексинга, обнаружил одно и тоже.
Следовательно теперь вопрос можно задать по другому:

AlexGrash
Рядовой
Сообщения: 13
Зарегистрирован: 30.12.2021{, 08:10}
Репутация: 2
Имя: Александр

Помогите пожалуйста реализовать в С++ или блоках

#34

Сообщение AlexGrash » 05.05.2024{, 15:15}

hallozin1 писал(а):
05.05.2024{, 09:48}
AlexGrash писал(а):
05.05.2024{, 09:26}
hallozin1 писал(а):
05.05.2024{, 07:51}
нужно 2 строки в коде изменить #define NUM_TENS 4 и int tens[NUM_TENS] = {2, 3, 4, 5}; // Пины, к которым подключены тэны
Вот здесь я не совсем понял, тэнов у меня 6, а выходов 4. Тэны должны включаться по одному, по мере понижения температуры в пределах дифференциала.
что бы управлять 4 выходами 6 нагрузками нужен дешифратор
хотя можно использовать 3 выхода используя метод Чарлиплексинг
#define NUM_TENS 6
#define T_SET 24
#define DIFF 2
#define T_MIN (T_SET - DIFF)

int pins[3] = {2, 3, 4}; // Пины, к которым подключены тэны
float lastTemperature = T_SET; // Последняя измеренная температура
unsigned long lastTime = millis(); // Время последнего измерения температуры

void setup() {
// Начальная настройка пинов
for (int i = 0; i < 3; i++) {
pinMode(pins, INPUT);
}
}

void loop() {
float Tdch = readTemperature(); // Функция для чтения температуры с датчика
float diff = DIFF;

// Если температура быстро падает, увеличиваем дифференциал
if ((Tdch - lastTemperature) / ((millis() - lastTime) / 60000.0) < -1) {
diff += 1;
}

int numActiveTens = (T_SET - Tdch) / diff;
if (numActiveTens < 0) numActiveTens = 0;
if (numActiveTens > NUM_TENS) numActiveTens = NUM_TENS;

for (int i = 0; i < NUM_TENS; i++) {
if (i < numActiveTens) {
setTen(i);
delay(1000); // Задержка между переключением тэнов
}
}

lastTemperature = Tdch; // Обновляем последнюю измеренную температуру
lastTime = millis(); // Обновляем время последнего измерения температуры
}

void setTen(int ten) {
// Сначала устанавливаем все пины в состояние INPUT
for (int i = 0; i < 3; i++) {
pinMode(pins, INPUT);
}

// Затем устанавливаем нужные пины в состояние HIGH и LOW
pinMode(pins[ten / 2], OUTPUT);
digitalWrite(pins[ten / 2], ten % 2 == 0 ? HIGH : LOW);
pinMode(pins[(ten / 2 + 1) % 3], OUTPUT);
digitalWrite(pins[(ten / 2 + 1) % 3], ten % 2 == 0 ? LOW : HIGH);
}

float readTemperature() {
// Здесь должен быть код для чтения температуры с датчика
// Возвращаемое значение должно быть в градусах Цельсия
}

Мне для начала нужно время чтобы понять как этот код работает, т.е. подробно раскоментировать для себя, и затем переложить на экранный язык. Прошу прощения с телефона печатаю.

AlexGrash
Рядовой
Сообщения: 13
Зарегистрирован: 30.12.2021{, 08:10}
Репутация: 2
Имя: Александр

Помогите пожалуйста реализовать в С++ или блоках

#35

Сообщение AlexGrash » 07.05.2024{, 22:38}

Всем доброго времени суток.
После долгих мучений и скитаний на просторах интернета, в поисках экранного кода с массивами, так я и не смог переложить код предоставленный hallozin1 с дуиновского С++ на экранный. Толи у меня тяму не хватает, то ли не там искал.
Вопрос так и остался в подвешенном состоянии. :smile453:

Ответить

Вернуться в «Помогите, а то я "нимагу"»