Найти в Дзене
DGO шпаргалка

Контроллер досветки растений на ESP8266 из того, что было. Часть 1.

Всем привет! Это снова я, но и на этот раз без своих семисегментных индикаторов. Понадобилось мне расширить возможности подсветки для комнатных растений, которые уже не умещались на подоконнике. Старый контроллер я делал достаточно давно... и для зеркала с сенсорной кнопкой. Все в нем хорошо - контроллер с вайфаем, выход под сенсорную кнопку и три симмистора на выходе для управления мощной нагрузкой переменного тока. Разводка платы оставляет желать лучшего, но это первое, что я делал лет восемь назад просто для себя. Сейчас бы я многое поправил. Например питание в низковольтной части -блокировочные конденсаторы стоят где попало, а не по пути прохождения тока, да и вообще можно было просто использовать блок питания сразу на 3,3 вольта. Нет даже намека на заземление. Элементы стоят криво, подписи непонятно где... Но есть и плюсы! Высоковольтная часть не плохо изолирована, антенну не блокируется земляным полигоном, да и сам полигон присутствует. Не устраивает сейчас меня в этой пла
Оглавление

Всем привет! Это снова я, но и на этот раз без своих семисегментных индикаторов.

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

Вот они. Стоят, ждут обновлений.
Вот они. Стоят, ждут обновлений.

Внимание! Высокое напряжение, применяемое в схеме, представляет реальную опасность для жизни и здоровья в случае несоблюдения техники безопасности при работе с электроприборами. Симмисторное управление не обеспечивает физического разрыва питания исполнительного устройства. Применять это следует исключительно осторожно и в связке с УЗО.

Cхема линии на симмисторе с обвязкой.
Cхема линии на симмисторе с обвязкой.

Сейчас бы я многое поправил. Например питание в низковольтной части -блокировочные конденсаторы стоят где попало, а не по пути прохождения тока, да и вообще можно было просто использовать блок питания сразу на 3,3 вольта. Нет даже намека на заземление. Элементы стоят криво, подписи непонятно где...

Но есть и плюсы! Высоковольтная часть не плохо изолирована, антенну не блокируется земляным полигоном, да и сам полигон присутствует.

Не устраивает сейчас меня в этой плате наличие всего трех каналов. Но из хороших новостей то, что с завода мне пришло целых 10 таких плат, а в зеркале стоит только одна. И сделать досветку сейчас можно из того, что есть и не дожидаться новых плат для обеспечения бесперебойного "дежурства" за растениями и со спокойной душой поехать в отпуск на дачу в феврале.

Сейчас я бы сделал как-то так.
Сейчас я бы сделал как-то так.
На плате выше практически всё то же самое, но я чуть изменил трассировку и добавил два канала, которых мне бы хватило на всё, что сейчас нужно. Возможно закажу такую плату, если найду куда ее применить.

Чтобы сделать так, чтобы каналов было больше можно просто объединить две таких платы самодельным цифровым протоколом. Звучит громко, но наделе это просто два провода, объединяющих пару свободных GPIO на платах. На одной - вывод, на второй - ввод. И разработать управляющую последовательность всего из двух бит. Тут есть как минимум два варианта.

1. Использовать наши биты "как есть" для передачи четырех состояний. Два во второй степени - как раз четыре. Например:

0 0 - выключены все симмисторы,
0 1 - включен только средний,
1 0 - включены только крайние,
1 1 - включены все.

2. Использовать 1 вывод как чипселект (CS) в SPI шине, а по второму передавать последовательность для включения нагрузок (data). Возможных вариантов для трех симмисторов - два в третьей степени, а это 8. Например:

1- CS 1010101010101010(8 импульсов data) 0-CS - выключены(закрыты) все симмисторы,
1- CS 10101010101010(7 импульсов...) 0-CS - выключен только первый,
...
1- CS 10 0-CS - включены все,

Так же можно использовать готовые протоколы , реализованные в периферии микроконтроллера. Такие как i2c, UART, SPI. Или же подключиться к общей сети при помощи WiFi. Но в данном случае я обойдусь первым вариантом.

Использую свободные GPIO пины для коммуникации между платами. В моем случае это GPIO12 и GPIO14.

получился вот такой франкенштейн.
получился вот такой франкенштейн.

Соединил всё проводами, закрепил на напечатанном шасси и можно прошивать.

Прошивка.

Максимально быстро всё можно сделать во фреймворке arduino и очень удобной среде PlatformIO. Лучше было бы, конечно, использовать FreeRTOS и выжать из esp8266 всё, на что она способна, но это слишком не рационально с точки зрения временных затрат.

Самое первое, что нужно понять - это как составить расписание включений. Часов реального времени на платах нет, а полагаться на встроенный таймер - та ещё авантюра.

Повезло, что на плате есть вайфай и можно просто спрашивать сколько времени у интернета.

Воспользуюсь одной из библиотек ардуинщика всея рунета Алекса Гайвера, а именно GyverNTP. По ссылке есть примеры ее использования.

#include <GyverNTP.h>// подключаем

#define L1 13 // прорписываем куда и что подключено
#define L2 5
#define L3 4
#define AP1 12
#define AP2 14

WiFi.begin("WIFI_SSID", "WIFI_PASS"); // подключаемся к сети в блоке void setup()
while (WiFi.status() != WL_CONNECTED) delay(100);
Serial.println("Connected");
NTP.begin(3); и запускаем синхронизацию

NTP.tick();// запускаем обработчик в блоке void loop()
if(NTP == DaySeconds(12, 35, 0)){}// и сравниваем текущее время с установленным, в данном случае 12:35:00

Библиотека подключается к сети вайфай и запрашивает время по умолчанию с "pool.ntp.org". Есть специальные функции для периода опроса и смены сервера по умолчанию.

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

void intence(byte temp){ //примем как входной параметр интенсивность(темп) освещенности
bool state[5] = {0,0,0,0,0}; //массив для дальнейших операций с каждым каналом.
if (temp==0){ //выключено всё
bool state_new[5] = {0,0,0,0,0}; // пишем в новом массиве что выключить
memcpy(state, state_new,5); // копируем новый в старый
}
if(temp==1){ // освещенность минимальная
bool state_new[5] = {0,0,0,0,1}; // включаем один канал в доп линии
...
}
digitalWrite(L1,state[0]); // "активируем" лампочки
digitalWrite(L2,state[1]);
digitalWrite(L3,state[2]);
digitalWrite(AP1,state[3]);
digitalWrite(AP2,state[4]);
}

Осталось дописать совсем немного, прикрутить телеграм бота для внешнего управления, всё прошить и повесить. Сейчас этим и займусь. Цветочки заждались! Опишу продолжение в следующей статье, когда всё будет готово. Всем спасибо за внимание и как обычно буду рад комментариям!

Ссылка на вторую часть.

P.S. Обсудить или задать какие-то вопросы, а так же получить файлы проекта можно в телеграм чате канала.