Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
На этот раз мы собираемся построить термостат на базе Arduino, датчика температуры и реле. Вы можете найти его на github.
Шаг 1. Конфигурация
Вся конфигурация хранится в Config.h. Вы можете изменить PIN-коды, управляющие реле, считывание температуры, пороговые значения или время.
Шаг 2: Настройка реле
Предположим, мы хотели бы иметь 3 реле:
- ID: 0, PIN: 1, Уставка температуры: 20
- ID: 1, PIN: 10, Уставка температуры: 30
- ID: 2, PIN: 11, Уставка температуры: 40
Сначала вы должны убедиться, что выбранный вами PIN-код еще не введен. Все выводы можно найти в Config.h, они определяются переменными, начинающимися с DIG_PIN.
Вам необходимо отредактировать Config.h и настроить PIN-коды, пороги и количество реле. Очевидно, что некоторые свойства уже существуют, поэтому вам нужно просто отредактировать их.
const static uint8_t DIG_PIN_RELAY_0 = 1; const static uint8_t DIG_PIN_RELAY_1 = 10; const static uint8_t DIG_PIN_RELAY_2 = 11;
const static uint8_t RELAYS_AMOUNT = 3;
const static int16_t RELAY_TEMP_SET_POINT_0 = 20;
const static int16_t RELAY_TEMP_SET_POINT_1 = 30; const static int16_t RELAY_TEMP_SET_POINT_2 = 40;
Теперь нам нужно настроить реле и контроллер, это происходит в RelayDriver.cpp.
initRelayHysteresisController (0, DIG_PIN_RELAY_0, RELAY_TEMP_SET_POINT_0); initRelayHysteresisController (1, DIG_PIN_RELAY_1, RELAY_TEMP_SET_POINT_1); initRelayHysteresisController (2, DIG_PIN_RELAY_2, RELAY_TEMP_SET_POINT_2);
ххх
Шаг 3: Контроллер гистерезиса
Это тот, который выбран в примере выше, у него есть несколько дополнительных конфигураций:
const static uint32_t RELAY_DELAY_AFTER_SWITCH_MS = 300000; // 5 минут статический статический uint32_t RHC_RELAY_MIN_SWITCH_MS = 3600000;
RELAY_DELAY_AFTER_SWITCH_MS дает время ожидания для переключения следующего реле. Представьте, что конфигурация из нашего примера начнет работать при температуре 40 градусов. Это приведет к включению всех трех реле одновременно. В конечном итоге это может привести к высокому энергопотреблению - например, в зависимости от того, что вы контролируете, электродвигатель потребляет больше энергии при запуске. В нашем случае переключающие реле имеют следующий поток: первое реле срабатывает, ждёт 5 минут, второе горит, ждёт 5 минут, третье горит.
RHC_RELAY_MIN_SWITCH_MS определяет гистерезис, это минимальная частота для конкретного реле, чтобы изменить его состояние. После включения он будет оставаться включенным хотя бы в течение этого периода времени, игнорируя изменения температуры. Это очень полезно, если вы управляете электродвигателями, поскольку каждый переключатель отрицательно влияет на время работы.
Шаг 4: ПИД-регулятор
Это сложная тема. Реализовать такой контроллер - простая задача, другое дело - найти правильные настройки амплитуды.
Чтобы использовать ПИД-регулятор, вы должны изменить initRelayHysteresisController (…..) на initRelayPiDController (….), И вам нужно найти для него правильные настройки. Как обычно, вы найдете их в Config.h
Я реализовал простой симулятор на Java, чтобы можно было визуализировать результаты. Его можно найти в папке: pidsimulator. Ниже вы можете увидеть симуляции для двух контроллеров PID, P. PID не совсем стабильный, потому что я не применял какой-либо сложный алгоритм для поиска правильных значений.
На обоих графиках заданная температура установлена на 30 (синий цвет). Текущая температура указывает на строку чтения. Реле имеет два состояния ВКЛ и ВЫКЛ. При включении температура падает на 1,5, при отключении повышается на 0,5.
Шаг 5: шина сообщений
Разные программные модули должны взаимодействовать друг с другом, надеюсь, не в обоих направлениях;)
Например:
- модуль статистики должен знать, когда конкретное реле включается и выключается,
- нажатие кнопки должно изменить отображаемое содержимое, а также приостановить работу служб, которые потребляют много циклов ЦП, например, считывание температуры с датчика,
- через некоторое время необходимо восстановить показания температуры,
- и так далее….
Каждый модуль подключен к шине сообщений и может регистрироваться для определенных событий и может создавать любые события (первая диаграмма).
На второй диаграмме мы видим поток событий при нажатии кнопки.
У некоторых компонентов есть задачи, которые необходимо периодически выполнять. Мы могли бы вызывать их соответствующие методы из основного цикла, поскольку у нас есть шина сообщений, необходимо распространять только правильное событие (третья диаграмма)
Шаг 6: Библиотеки
- https://github.com/maciejmiklas/Thermostat
- https://github.com/milesburton/Arduino-Temperature…
- https://github.com/maciejmiklas/ArdLog.git