Вступление
Термины и сокращения, используемые в статье:
- МК — микроконтроллер.
- ЦАП — цифро-аналоговый преобразователь.
- ШИМ — широтно-импульсная модуляция.
- Актуатор — тождественно "исполнительное устройство". Например свет, полив.
В Интернете можно найти множество самописных прошивок для автоматизации растениеводства. Все они разрабатывались под нужды авторов, и настройки алгоритмов зашиты непосредственно в прошивку, что делает невозможным их перенастройку "налету", без перепрограммирования.
В моей версии исходного кода алгоритмы настраиваются без перепрограммирования МК. Исходный код разделён на независимые модули. Аппаратная часть тоже разделена на независимые модули. При этом все программные модули допустимо собрать в одну программу и "зашить" в один МК.
Это удобно, если хотите собрать автоматику из имеющихся у вас МК и с функционалом, который необходим вам. Не обязательно ждать доставки или тратить время на поход в магазин.
Преимущества разделения
Не только растениеводство: модули применимы везде, где необходимо контролировать параметры или выполнять действия по расписанию. Например: птичий инкубатор, созревание сыра, выращивание рыб или грибов.
Ускоряется и упрощается отладка отдельных модулей, т. к. для их запуска достаточно МК с малым объёмом памяти, процесс компиляции и перепрограммирования для которых очень быстр.
Исходный код написан на C++ и не привязан к Arduino, что делает возможным компиляцию и запуск на МК разных архитектур и практически любом компьютере с Linux, WASI и WASM.
Несложно вынести модуль актуаторов на отдельный МК или разбить код по процессорным ядрам, чтобы применить ШИМ или диммирование для плавного включения/выключения нагрузки. Так плавный пуск не будет влиять на выполнение расписания.
Ядро
Исходный код: Github
Ядро - это модуль, выполняющий 4 вида расписания:
- цикл с резким переключением
- цикл с плавным переключением
- климат-контроль
- таймер
Ядро устанавливает нужное значение на нужном актуаторе в нужное время. Ядро не знает ничего о датчиках и актуаторах, кроме их номера и значения.
- 2. Принимает на вход настройки расписания (часов и автоматики).
- 4. При изменении состояния актуаторов сообщает об этом во вне
- 5. Считывание настройек происходит с общей памяти, поэтому внешние устройства не отвлекают ядро от выполнения программы.
Аппаратный модуль Ядро связан с аппаратными модулями Датчики и Актуаторы через I2C в большинстве случаев.
Время
Модуль времени даёт количество секунд, прошедших от начала дня. На основании чего Ядро расчитывает расписание.
Пока доступен один источник времени - время, прошедшее с момента включения МК.
Датчики
Исходный код: Github
У некоторых датчиков считывать показания разрешено каждые 2 секунды, в то время как автоматика требует считывания ежесекундно. Модуль датчиков буферизует у себя показания, согласно ограничениям разных датчиков, позволяя ядру запрашивать показания с любой периодичностью.
Актуаторы (Исполнительные устройства)
Исходный код: Github
Модуль актуатора хранит установленное на актуаторе значение, позволяя избегать фактической установки того же значения.
Варианты исполнения:
Прослойка меж ядром и ключом:
Устройство | Соединение с ядром |
---|---|
Расширитель HC595 | shift |
Микроконтроллер | I2C |
Расширитель HC595 + МК | I2C |
LoRaWan | I2C. С ключами соединяется через радиоканал |
Ключи:
Устройство | Коммутация | Примечание |
---|---|---|
Симистр | Переменные 220V | Можно диммировать, если в качестве прослойки - МК. Либо попробовать встроенный/внешний ЦАП (не ШИМ). |
Транзистор полевой/биполярный | Постоянные 12V или 5V | Плавная регулировка через ШИМ, если в качестве прослойки - микроконтроллер, иначе - внутренний/внешний ЦАП |
Реле | Переменные 220V | Только вкл/выкл. Плавная регулировка невозможноа |
Дисплей
Исходный код: Github
G-код
Исходный код: Github
Модуль открывает связь с устройством из внешнего мира через команды. Это позволяет конфигурировать устройство, вводя G-команды, например через всем знакомый UART. Скоро появятся модули для связи через Интернет.
Сам модуль взят из проекта Marlin - прошивки для 3D-принтера. Внесены небольшие изменения, позволяющие пользователям добавлять собственные коды без изменения модуля.
Вспомогательные модули
Исходный код: Github