Оглавление:

Термостат на базе Arduino: 6 шагов
Термостат на базе Arduino: 6 шагов

Видео: Термостат на базе Arduino: 6 шагов

Видео: Термостат на базе Arduino: 6 шагов
Видео: Термостат для инкубатора или PID регулятор на arduino 2024, Июль
Anonim
Термостат на базе Arduino
Термостат на базе Arduino
Термостат на базе Arduino
Термостат на базе Arduino
Термостат на базе Arduino
Термостат на базе Arduino

На этот раз мы собираемся построить термостат на базе 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

Рекомендуемые: