
Гидропоника
6 постов
6 постов
2 поста
И так, настало время для последней перед паузой в какое то время между постами, частью моего рассказа. Расскажу немного про внешний вид, покажу систему в работе, затрону планы на будущее и раскрою некоторые будущие наработки и идеи, ну а так же опыт пользования)
А пока, можете посмотреть видео, в котором я добавил некоторые поясняющие субтитры. Автор не блогер, а только учится и весьма стеснителен в вопросе съемок, так что пока только субтитры, за что прошу простить)
Внешний вид, я описывал в прошлых статьях, но никак не затронул сенсорный экран который в моем случае резистивный мультитач от Nextion, линейки Intelligence. Оверкилл конечно для фермы, но пока больше мне он никуда не нужен.
Интерфейс собственно там максимально простой, это показания с датчиков и управление реле. Страница системы с кнопкой перезагрузки и статусами подключений к интернету\роутеру и IP адрес веб морды. Мне нужен был базовый интерфейс, поэтому в нём пока нет ключевых функций таких как регуляция PH/EC, температуры, таймеров и так далее. Это совсем не основная задача была и я сейчас в процессе рисования нового интерфейса, который бы удволетворял всем требованиям.
Я использую Lunacy для проектирования интерфейсов. Скриншоты чисто рабочие, тк я в процессе рисования и изучения данной сферы деятельности.
Ничего замысловатого тоже нет. Мне предстоит продумать систему добавления и редактирования конкретных таймеров на дисплее, посадок и регуляции PH/EC. Последнее кстати весьма не сложно как я думаю с точки зрения UX.
Про второй интерфейс взаимодействия, я уже так же рассказывал в прошлых статьях, это WEB интерфейс и MQTT / Apple Home. Там тоже много ньюансов и проблем, но все в процессе, как только я закончу полноценный новый интерфейс, обязательно поделюсь.
А вот сейчас самое интересное. В данный момент, я разрабатываю полностью свою плату для умной фермы, что бы не было вот такого:
И выглядит это пока вот так:
На ней я разместил 3 независимых блока питания, 3.3\5 и 12 вольт для питания датчиков, насосов и тд. Но это скорее всего не очень оптимизировано, тк мне думается можно сделать 2 блока, 3.3 вольта и 24 вольта, и через DC-DC на плате уже сформировать нужные мне напряжения для питания всего что необходимо, я в первый раз познаю исскуство проектирования плат, поэтому все может быть тяп ляп, но я в процессе)
На самой плате, уже размещен RTC модуль, коннекторы для экрана, ph/ec сенсоров с необходимыми делителями напряжения, разведена сеть 220V с реле. Возможно стоит предусмотреть возможность перекоммутации напряжений на реле, с 220V на любые другие напряжения которые мне необходимы. Пока не определился. Поэтому заказать плату мне довольно сложно, потому что проект в процессе и пока мне будут ехать платы версии 5.0, я обязательно что то модернизирую и сделаю и 5.1 и 5.2 а то и 6.0...
И вот сегодня, я наконец увидел в голове, как же я вижу уже финальный вид устройство. Как говорят в судостроении, четвертое преведение.. Тоесть по сути переход от эскизного проекта к техническому проекту.
Я понял, что в виде конечного устройства, бак, контейнер, блок с электроникой, все это с кучей кабелей и трубочек - это жуткий геморой для финального пользователя. Поэтому, новый дизайн имеет в себе одновременно и бак и баки для корректоров PH и для удобрений EC, никаких видимых трубочек и кабелей, самое главное, возможность использования различных систем гидропоники. Хотите DWC? пожалуйста. Хотите проточную? Тоже пожалуйста.Частичное затопление? Вас понял, сделано. Капельный полив?Это пока то, что лежит на поверхности и я точно смог бы это реализовать, но конечно впереди много времени проектирования не в блендере. Ну и конечно, аэропоника тут это основной метод, который я предпочитаю.
Дизайн я вижу как у техники SMEG или что то оттуда. Хочется навернуть стиля. Но прежде чем все это делать, я хочу отточить все технологии. Пока идеи и планы такие и я действительно не хочу забрасывать этот проект, так как мне самому очень интересно в этом разбираться.
Всё это, я хочу сделать уже в версиях 5.0 - 6.0 и там же где то, попробовать сунуться в OpenSource сообщество (но с простыми решенями, что бы каждый мог повторить)
Стоит ли писать и рассказывать уже о дальнейшем проектировании? Читали ли бы вы такие посты? С радостью отвечу на ваши вопросы или предложения, выслушаю критику, так как она наверняка должна быть, в этом деле я затрагиваю множество областей в многих из которых я ну совсем профан и могу ошибаться. Вдруг среди читателей есть прошаренные)
Очередной пост, про мою ферму, да про сенсоры важные. Начну издалека и постараюсь простыми словами.
Эти параметры показывают, насколько концентрирован наш раствор. А значит — хватает ли питания растениям или им через чур много и это не усвоится. Почему вообще на гидропонике все быстро растет? Потому что растениям не надо тратить силы и энергию на то, что бы искать все больше и больше ресурсов своей корневой системой и впитывать их из земли, а ещё кислород, его часто не хватает, именно поэтому часто советуют делать всякие подмесы в грунт для его "рыхлости", а в гидропонике мы выдаем все эти ресурсы сразу на блюдечке с голубой каемочкой и вот тут то главное правильно сервировать блюдо!
EC = Electrical Conductivity (Электрическая проводимость)
→ Показывает, насколько хорошо раствор проводит ток. Измеряется в миллисименсах на сантиметр (мСм/см).
Чем больше солей — тем выше проводимость.
Например:
Чистая вода: 0.0–0.05 мСм/см
Рассада салатов: 0.8–1.2 мСм/см
Клубника: 1.6–2.2 мСм/см
Помидоры: 2.0–3.5 мСм/см
Более того, на разных стадиях роста, растениям как правило нужна ещё и разная концентрация этих ваших удобрений. Вообщем то как и с любым организмом, в разные этапы жизни - жрут по разному, поэтому этот параметр важен и нужен.
EC - это стандарт индустрии, когда вы видите EC 1.0 или EC 1000, важно обратить на какое расстояние проводится измерение. Измеряют и в миллиметрах и в сантиметрах и в метрах. Это кому как удобнее и простыми арифметическими действиями переводится в нужное вам значение.
TDS = Total Dissolved Solids
→ Количество растворённых солей в ppm (мг/л). Это лишь приблизительный расчёт из EC:
TDS ≈ EC × коэффициент
В гидропонике чаще всего:
500 шкала — используется чаще всего (NaCl - шкала) в основном в США, Европе, Австралии, самая популярная.
700 шкала — другая, менее распространённая (KCl - шкала) в основном в Азиатских регионах, реже в Европе.
В основном используется NaCl шкала, но это нас и приводит к выводу, что в гидропонике эти шкалы нам в принципе не нужны, что то куда то переводить ещё, неудобно. Поэтому все используют одну стандартизированную единицу - EC.
Важно понимать, что оба параметра не показывают чего то конкретного. Они показывают сумму всех солей и удобрений в воде! А тоесть по этому значению мы не можем узнать, что конкретно в воде и в каком количестве. Это гораздо более сложная процедура.
Чем калибруются EC или TDS метры? Да все теми же буферными растворами. Для TDS это как правило 800 ppm, для EC метров - 1413 мк/см и другие (смотри на пределы измерений EC метра). Продаются так же как и для PH метров в порошках или готовом виде.
Температура в этом аспекте, крайне важна. Хотя про неё много кто и забывает. Нет, конечно она не губительна в разумных пределах, но весьма сильно влияет на процесс выращивания растений. Мы не говорим про отрицательные температуры или около нулевые, а так же не берем в расчет температуры в пустыне. Среднестатистические 15-30 градусов для примера нам хватит.
Температура раствора — важнейший фактор в гидропонике. Если раствор слишком холодный или слишком тёплый — корни начинают "забастовку": они просто перестают нормально усваивать питательные вещества. Это как если бы человек ел лёд вместо тёплого супа — вроде есть, но толку мало.
Оптимальная температура для корней большинства растений — 18–22 °C. В этом диапазоне:
Кислород хорошо растворён в воде
Клетки корней активны
Удобрения усваиваются эффективно
Если температура падает ниже 16 °C — корни замедляются, питание поступает плохо. А при 25–28 °C — начинаются проблемы: раствор теряет кислород, возможен корневой гниль, а соли могут вызывать ожоги. И вот тут есть главное преимущество как по мне аэропоники. Раствор разбиваясь на воздушно питательную смесь, вполне себе охлаждает и корни и при этом растения прекрасно усваивают кислород, поэтому фактор насыщения кислородом самого раствора мы можем упустить в моём случае.
Что делать при перегреве раствора? два способа. Снижать концентрацию или понижать его температуру чиллерами или другими способами. Или просто разбавить. Самый простой способ конечно разбавить водой.
Конечно, все вышеописанное идеально соблюдается только в лабораторных условиях, весьма сложно поддерживать температуру, особенно охлаждение, или стабильный EC до сотых долей на протяжении всего цикла. Но я хотя бы попробовал к этому приблизится и забегая вперед, у меня что то получилось. За это время не было потеряно ни одного растения из за ошибок или не правильных выводов или действий системы.
В моей системе в данный момент 2 сенсора TDS. Пока не отключал старый, поэтому расскажу и про него.
Вот такой TDS метр у меня стоит, но более не используется для измерений EC(на это значение опирается вся система) а просто выводит дублирующее показание в PPM, новому сенсору.
С ним всё ок и его даже реально откалибровать. Только один ньюанс. Для гидропоники он не подходит чисто технически. У него потолок измерений 1000 PPM (около 1.0 EC) и даже его он показывает с трудом. За то идеален в обратную сторону, там где надо мерить чистоту. Вот тут у него реально нет аналогов за его стоимость. Он конечно может и 5 EC вам показать, только это будут ненадежные данные, тк его невозможно откалибровать, свыше 1 EC у него уже нелинейная интерполяция, проще говоря он становится генератором рандомных чисел. В дальнейшем я его вытащу и сделаю из него прибор для умного проточного фильтра для питьевой воды. Что бы понимать когда менять кассеты и тд.
А поскольку он не подходил то я приобрел вот такой вот EC метр.
у него уже и питание "взрослое" (от 12 до 24 вольт) и калибровки все на борту имеются и измеряет он по правильному, EC а не PPM. PPM это в свою очередь производная от EC и считается программно. и даже крепление на DIN рейку на корпусе есть, подключать же надо строго через делитель напряжения к пину ESP, что впрочем тоже не сложно, подбирается он индивидуально под ваш контроллер.
Суть измерений ровна такая же как и в контроллерах PH. Мы считываем выдаваемое напряжение и приравниваем его к значениям EC. Подключается так же в любой аналоговый пин способный на АЦП.
Суть кода 1в1 с PH, только не нужна всякая калибровка, совсем сердитые усреднения и тд. Все сильно проще и ограничивается всего двумя функциями:
float readECVoltage_new() {
int newVal = analogRead(EC_PIN);
// Обновление кольцевого буфера
ecSum -= ecBuffer[ecIndex];
ecBuffer[ecIndex] = newVal;
ecSum += newVal;
ecIndex = (ecIndex + 1) % NUM_READ_EC;
if (ecIndex == 0) ecFilled = true;
// Вычисление среднего значения как float
int validCount = ecFilled ? NUM_READ_EC : ecIndex;
if (validCount == 0) validCount = 1; // защита от деления на 0
float average = static_cast<float>(ecSum) / validCount;
// Перевод в напряжение
float voltage = (average / ADC_RESOLUTION) * ADC_VREF;
return voltage;
}
float readEC_new() {
float voltage = readECVoltage_new();
float realVoltage = voltage * DIVIDER_RATIO;
float ecValue = (realVoltage / MAX_SENSOR_VOLTAGE) * EC_RANGE;
// EMA фильтрация
if (filteredEC == 0.0f) filteredEC = ecValue;
filteredEC = EC_SMOOTHING * ecValue + (1.0f - EC_SMOOTHING) * filteredEC;
// Перевод в mS/cm и округление до 0.1
float ecMilli = filteredEC / 1000.0f;
ecMilli = roundf(ecMilli * 10.0f) / 10.0f;
logf(LOG_DEBUG, "[EC_SENSOR] EC Voltage: %.3f V (real %.3f V) | EC: %.1f mS/cm",
voltage, realVoltage, ecMilli);
return ecMilli;
}
Считывает аналоговое значение с EC-датчика (analogRead) → от 0 до 4095
Обновляет кольцевой буфер последних измерений для сглаживания
Вычисляет среднее значение по буферу
Переводит среднее значение в напряжение (вольты) по формуле:
voltage = (среднее / ADC_RESOLUTION) × VREF
Возвращает полученное напряжение — это ещё не EC, а просто "что пришло с датчика"
Вызывает readECVoltage_new() → получает среднее напряжение
Компенсирует делитель напряжения, чтобы получить реальное напряжение на датчике
Переводит напряжение в значение EC по диапазону датчика
Сглаживает значение EC с помощью EMA-фильтра (плавное обновление)
Округляет EC до десятых (0.1) и переводит из μS в mS/cm
Логирует результат (напряжение и EC) для отладки
Возвращает EC (в мСм/см) — дальше это значение:
передаётся в WebSocket (SENSOR_UPDATE)
записывается в лог (tds_log.csv)
отображается в интерфейсе
В моем модуле, уже присутствует температурная компенсация,а в OEM китайском, такой функции нет, поэтому финальное значение надо компенсировать ещё и температурой.
TDS Компенсированный = TDS сырой/ (1 + α × (T - T₀))
формула выглядит вот так. И является довольно простой:
Где:
TDS сырой — необработанное (сырое) значение TDS
T — текущая температура раствора (в °C)
T₀ — опорная температура (обычно 25°C)
α — температурный коэффициент для солевого раствора (0.02 — то есть +2% на каждый градус)
Например:
Температура: 30°C
Сырой PPM = 1000 ppm
TDS Компенсированный = 1000 / (1 + 0.02 × (30 - 25))
= 1000 / (1 + 0.10)
= 1000 / 1.10
≈ 909 ppm
То есть фактически в растворе меньше солей, чем показывает прибор — из-за нагрева. Эта же формула подходит и к EC метрам без встроенной температурной компенсации.
Ну и соответственно, как вы понимаете уже, вместо текущей температуры, в ESP/Arduino и любых других системах, можно просто брать температуру с датчика DS18B20 например и подставлять напрямую в формулу и получать корректное значение EC/TDS.
В завершение. Естественно, вы можете вообще не парится, и заваривать раствор единожды с помощью ручного измерителя TDS\EC и будете правы. Это блажь и излишек. Но мне нравится такого рода автоматизации и упрощение своей жизни.
Спасибо за внимание!
По просьбам трудящихся, я постараюсь сделать это в виде некоего обучающего рассказа что ли. Но конечно не step by step инструкции. Краткие выдержки кода и описание алгоритмов и чего куда вообще совать что бы эти ваши показания получать. Сегодня поговорим о PH сенсорах и моем опыте. Я подразобью на более короткие посты для удобства чтения.
Я пробовал 2 сенсора PH. от DF-Robot и дешевый из синего маркетплейса.
Вот такие сенсоры
Ссылки на все я приведу в конце поста.
Сейчас я использую pH-датчик от DFRobot — он отлично подходит для непрерывного мониторинга 24/7. Показания стабильны, со временем не «плывут» (дрейф отсутствует — проверено на практике), а калибровка реализована удобно и просто. Чуть позже покажу, как она устроена на примерах кода.
А вот с дешёвым noname-датчиком всё гораздо веселее. На плате два подстроечных резистора: один, судя по всему, отвечает за калибровку нулевой точки (pH 7.0), второй — за чувствительность. Документации — минимум. Настроить этот модуль так, чтобы он давал стабильные показания, — почти как пройти Super Meat Boy на 100%… и не сломать ничего от сгоревшей пятой точки..
Стоит ли покупать дешёвый pH-сенсор? Нет и ещё раз нет. Даже если ваш код написан идеально, это не спасёт от нестабильной работы самого датчика. Через день-два показания могут начать «плавать» — pH то завышается, то занижается на 3–4 единицы без видимых причин. Сенсор просто начинает вести себя непредсказуемо.
И если у вас на такие данные завязана автоматика (например, дозаторы pH- или pH+), последствия будут неприятными: система начнёт вносить корректоры на основе ложных показаний. В итоге — испорченный раствор и потеря времени, так ещё и потраченные впустую корректоры PH.
Сенсоры от DFRobot мне показались гораздо стабильнее и надёжнее. Да, они стоят дороже, но по опыту — это оправданно. Поэтому далее всё что написано, относится к конкретно H-101 сенсору.
Подключение pH-сенсора — дело довольно простое. Информация по распиновке обычно указана прямо на сайте производителя или в описании товара (в том числе на AliExpress). Всё, что нужно — подключить выход сенсора к аналоговому входу вашей платы: будь то ESP32, Arduino или любая другая платформа.
Этот конкретный сенсор, судя по данным и практике, выдаёт сигнал до 3.3 В, так что его можно безопасно подключать напрямую к пинам ESP32 — без делителя напряжения. Я так и делаю, и всё работает стабильно. Делитель нужен, только если сенсор выдаёт до 5 В (что бывает у некоторых моделей), а ваша плата работает от 3.3 В. В случае с классической Arduino делитель не нужен, так как она спокойно воспринимает до 5 В на аналоговых входах.
Калибровка pH-сенсоров всегда выполняется с помощью буферных растворов — это жидкости с точно заданным значением pH. Калибровка может быть двух- или трёхточечной: чем больше точек, тем точнее можно подогнать датчик под реальный диапазон.
Буферные растворы бывают в виде порошков (которые нужно растворить) или уже готовые к использованию. Их подбирают так, чтобы они охватывали рабочий диапазон измерений.
В моём случае я использую двухточечную калибровку — по значениям pH 4.0 и pH 7.0, чего вполне достаточно для контроля большинства питательных растворов.
Сама калибровка проходит в два последовательных этапа. Сначала сенсор промывается в дистиллированной воде и аккуратно просушивается (я использую салфетку, не протирая стекло — просто промакиваю). После этого сенсор помещается в буферный раствор с pH 4.0. Ждём, пока значения напряжения стабилизируются, и нажимаем кнопку калибровки по pH 4.0 — первый этап завершён.
Далее — всё то же самое, но уже с раствором pH 7.0. После второго нажатия кнопки калибровки сенсор готов к работе.
А вот и фрагмент кода, который у меня отвечает за калибровку pH-сенсора. Он используется при нажатии кнопки калибровки (по pH 4.0 или 7.0):
void setCalPH(float& calValue, int eepromAddr, bool& flag, const char* label) {
bool stable = false;
float stddev = 0.0;
float voltage = readStablePHVoltage(stable, stddev);
String logMsg = String("[Калибровка] ") + label + ": " + String(voltage, 2) + " мВ, отклонение: " + String(stddev, 2);
logMsg += stable ? " — стабильно" : " — нестабильно";
logToWeb(logMsg);
logMessage(stable ? LOG_INFO : LOG_WARN, logMsg);
if (!stable) {
//logToWeb(String("[Калибровка] Напряжение нестабильно при ") + label + ". Попробуйте снова.");
logMessage(LOG_WARN, "[Калибровка] Калибровка прервана: нестабильное напряжение");
return;
}
calValue = voltage;
flag = true;
EEPROM.put(eepromAddr, calValue);
EEPROM.commit();
String confirm = String("[Калибровка] ") + label + " установлена: " + String(voltage, 2) + " мВ";
logToWeb(confirm);
logf(LOG_INFO, "[Калибровка] %s успешно установлена: %.2f мВ", label, voltage);
}
Считывает напряжение с pH-сенсора и проверяет, стабилизировалось ли оно (внутри readStablePHVoltage).
Если сигнал нестабилен, калибровка прерывается и выводится предупреждение в лог.
Если всё в порядке, сохраняет измеренное значение в EEPROM, устанавливает флаг flag = true, и выводит подтверждение об успешной калибровке.
Используется отдельно для pH 4.0 и pH 7.0, передавая соответствующую метку (label), адрес в EEPROM и переменную для сохранения значения.
Функции logToWeb/logF/logMessage - это обертки для логирования, вместо них вы можете использовать простые Serial.println и тд.
Функция считывания напряжения для калибровки, выглядит вот так:
float readStablePHVoltage(bool& stable, float& stddevOut) {
const int numSamples = 20;
float values[numSamples];
float sum = 0.0f;
float minV = VREF, maxV = 0.0f;
String rawValues = "[PH] Измерения мВ: ";
for (int i = 0; i < numSamples; i++) {
int raw = analogRead(PH_PIN);
float v = (raw / (float)ADC_MAX) * VREF;
values[i] = v;
sum += v;
minV = min(minV, v);
maxV = max(maxV, v);
rawValues += String(v, 2) + " ";
delay(10);
}
float avg = sum / numSamples;
float variance = 0.0f;
for (int i = 0; i < numSamples; i++) {
// выбрасываем выбросы >500 мВ
if (abs(values[i] - avg) > 500.0f) values[i] = avg;
variance += pow(values[i] - avg, 2);
}
float stddev = sqrt(variance / numSamples);
stddevOut = stddev;
stable = (stddev < 30.0f);
if (!stable) {
logf(LOG_WARN, "⚠️ pH-сенсор нестабилен: σ=%.2f mВ", stddev);
}
// Логи
logMessage(LOG_DEBUG, rawValues);
logf(LOG_DEBUG, "[PH] Среднее: %.2f мВ, Мин: %.2f, Макс: %.2f", avg, minV, maxV);
logf(LOG_DEBUG, "[PH] σ=%.2f мВ → %s", stddev, stable ? "Стабильно" : "Нестабильно");
return avg;
}
Функция readStablePHVoltage используется для получения надёжного и стабильного значения напряжения с pH-сенсора перед калибровкой.
Сначала она делает 20 аналоговых замеров с небольшими паузами между ними. Значения переводятся в милливольты и сохраняются в массив.
После этого вычисляется среднее напряжение, а слишком сильные выбросы (если разница с средним превышает 500 мВ) игнорируются — они заменяются на усреднённое значение.
Далее считается стандартное отклонение (σ) — если оно меньше 30 мВ, сигнал считается стабильным и пригодным для калибровки. В противном случае функция сообщает в лог о нестабильности и отменяет процесс.
Кроме самого результата, в лог отправляется подробная информация: все замеры, среднее, минимум, максимум и разброс значений. Это помогает при отладке и повышает надёжность всей системы.
При измерениях любых параметров жидкости необходимо учитывать её температуру, так как это напрямую влияет на точность показаний. Особенно это критично для pH — с повышением температуры активность ионов водорода возрастает, и даже идеально откалиброванный сенсор начнёт показывать отклонения. В модуле который использую я, по заявлениям уже учитывается этот фактор. Поэтому в моих функциях нет реализации температурной компенсации.
float readPH() {
static unsigned long lastLog = 0;
float voltage = readPHVoltage();
float phValue = calculatePH(voltage);
phValue = roundf(phValue * 10.0f) / 10.0f;
// Логируем не чаще, чем раз в 10 секунд
unsigned long now = millis();
if (now - lastLog > 10000) {
logf(LOG_DEBUG, "[PH] Напряжение: %.2f mВ, pH: %.2f",
voltage, phValue);
lastLog = now;
}
return phValue;
}
Собственно сама функция чтения PH. В ней мы уже обращаемся к другой функции считывания напряжения. Она гораздо больше фильтрует значения напряжения, и не мешает при этом калибровке. Именно поэтому их тут две.
float readPHVoltage() {
// 1) Усреднение по N замерам
const int numMeasurements = 30;
float sum = 0.0f;
for (int i = 0; i < numMeasurements; i++) {
int raw = analogRead(PH_PIN);
float v = (raw / (float)ADC_MAX) * VREF;
sum += v;
delay(5);
}
float avg = sum / numMeasurements;
lastRawVoltage = avg;
// 2) Медианный фильтр
medianBuf[medianIdx++] = avg;
if (medianIdx >= MEDIAN_SAMPLES) { medianIdx = 0; medianFull = true; }
int cntMed = medianFull ? MEDIAN_SAMPLES : medianIdx;
// копируем в tmp для сортировки
static float tmpMed[MEDIAN_SAMPLES];
memcpy(tmpMed, medianBuf, cntMed * sizeof(float));
// простой пузырьковый сорт для маленького массива
for (int i = 0; i < cntMed - 1; i++)
for (int j = i + 1; j < cntMed; j++)
if (tmpMed[j] < tmpMed[i]) {
float t = tmpMed[i];
tmpMed[i] = tmpMed[j];
tmpMed[j] = t;
}
float med = tmpMed[cntMed/2];
// 3) Скользящее среднее
movavgBuf[movavgIdx++] = med;
if (movavgIdx >= MOVAVG_SAMPLES) { movavgIdx = 0; movavgFull = true; }
int cntMov = movavgFull ? MOVAVG_SAMPLES : movavgIdx;
float sumMov = 0.0f;
for (int i = 0; i < cntMov; i++) sumMov += movavgBuf[i];
float mavg = sumMov / cntMov;
// 4) IIR‑фильтр
if (isnan(iirVoltage)) {
iirVoltage = mavg;
} else {
iirVoltage = iirVoltage * (1 - IIR_ALPHA) + mavg * IIR_ALPHA;
}
float filt = iirVoltage;
// Логи для отладки
logf(LOG_DEBUG,
"[PH] raw:%.2f mV → med:%.2f → movavg:%.2f → filt:%.2f",
avg, med, mavg, filt);
return filt;
}
Для получения чистого и стабильного сигнала с pH-сенсора я использую многоступенчатую фильтрацию.
Всё начинается с простого усреднения — берутся 30 замеров подряд, и по ним считается среднее напряжение.
Затем подключается медианный фильтр: он отсеивает выбросы, которые могли случайно попасть в серию замеров. После этого применяется скользящее среднее, чтобы ещё больше сгладить возможные резкие скачки.
И в конце — финальный этап: IIR-фильтр (экспоненциальное сглаживание), который делает сигнал максимально плавным, но при этом достаточно быстрым в реакции на изменения. Такой подход позволяет получать надёжные и устойчивые данные, на которые уже можно опираться при расчёте текущего уровня pH или при управлении системой.
Таким образом я измеряю PH своего раствора.
Вот обещанные ссылки на компоненты из этого поста:
https://aliexpress.ru/item/1005001317266554.html?spm=a2g2w.o...
https://aliexpress.ru/item/1005006366896348.html?sku_id=1200...
https://www.ozon.ru/product/komplekt-kalibrovochnyh-rastvoro...
Дальше останется только привязать это к вашим интерфейсам взаимодействия с пользователем и в целом готово. Не претендую на какую то 100% правильность, вы можете сделать это иначе, но сейчас у меня работает отлично всё, напомню, что я в первую очередь 3д художник, который открыл для себя мир программирования и контроллеров)
Спасибо за внимание! Надеюсь скоро выпущу про TDS/EC сенсор, температурный датчик.
Собственно продолжение поста про моё устройство для выращивания различных растений.
Первая часть тут - Действительно умная гидропоника. Часть 1.
Функция измерения веса. Покажу конструкцию в 3д, так как показывать её в реальности весьма затруднительно. Я использую 60мм горшочки для гидропоники, поэтому проектировал под себя и свои нужды.
Сама измеряющая платформа с тензодатчиком. Печатается на 3д принтере и вставляется в мой кейс с растениями вместо обычной платформы (одной из 3х)
Собственно на изображениях видно, по центру стоит тензодатчик и вокруг него равноудаленно 7 слотов под горшочки с субстратом. От тензодатчика провод идет в АЦП HX711, но тут было несколько ньюансов:
А) Обязательно заэкранировать кабель подключения от самого тензодатчика(я обернул экраном наполовину) и довести экран до АЦП.
Б) Провести провод так, что бы если по нему капилярным эффектом начнет подниматься вода, он не добрался до датчика. Я сделал простую петлю и разместил его выше чем сам тензодатчик. Таким образом вода точно никак не попадет на АЦП.
Сам же АЦП в герметичном корпусе. и вынесен отдельно от системы и подключается через TYPEC-TYPEC провод любой длины.
Это нужно для того, что бы провода от тензодатчика и до АЦП были как можно короче. а цифровой сигнал уже все равно на какое расстояние и с какими помехами передавать.
Корпус для АЦП.
Собственно сама функция измерения веса не замысловата и просто измеряет вес всего что стоит на ней. Тарирована вместе с платформой по умолчанию. Калибровка осуществляется по известному весу и выборкой в 50 измерений. Опять же, я встретил достаточно много проблем с этой фичей, но все удалось побороть.
1) Проблема влажного субстрата. Я знаю сколько весит горшочек с сухим субстратом и с мокрым. Но вода штука капающая. И эти самые капли, на начальных этапах роста дают не просто шум, а шумище. То есть когда растения весят 0.02 грамма, это начинает становится серьезной проблемой. Был введет флаг полива, и примерная интерполяция по времени, за сколько "худеет" горшочек от воды. + мы знали начальный и конечные веса. Это помогло уменьшить шум от измерений. Затем сверху накладывается алгоритм среднего, лимитации пиков (по сути фильтрация сигнала, если он превышает порог, то значит это значение либо шум, либо вода) и просто большая выборка на одно измерение, и вес стал стабильно учитываться.
2) Проблема контрафакта. Очень, ООЧЕНЬ много контрафакта на OZON. 2 штуки HX711 купленные мной, были с затертыми микрухами, неотмытым флюсом и шумели хуже чем пьяный сосед вася, периодически отваливались и отказывались измерять показания во всех режимах. (40\10), причинно следственной связи установить не удалось. В стерильном скетче и с идеальным подключением, вели себя неадекватно. Лишь на 3 раз удалось приобрести действительно хороший модуль, который ведет себя как заявляет производитель. На удивление он даже выглядел иначе.
Собственно, я упомянул, про распределение веса. у меня в системе 25 слотов на данный момент. (без весов 27). Так вот для каждого из слотов можно вычислить свой вес. Даже если растение не на весах, нужно что бы оно хотя бы раз там побывало единственное что.
Работает это по принципу "разумного распределения", у каждого слота в системе есть свой индекс и 1 или 0 является ли этот индекс весами или нет. Если мы знаем, что растение например в системе 15 дней и оно одно сидит на измерительной платформе, то формула следующая
вес платформы - вес горшка - вес субстрата = вес этого конкретного растения.
Если на платформе сидят условно 5 растений, то этот вес просто делится на 5, при соблюдении того факта что это та же партия выращеваемых растений. (помните в предыдущем посте мы задавали количество посаженных растений? вот вот, там же и формируется уникальный ID посадки)
А дальше магия. У нас для каждого поддерживаемого растения системой,базово прописан теоретический вес, который перезаписывается реальным во время использования. Ну то есть по большому счету, некое самообучение.
И логично предположить, что растение сидящее на весовой платформе в слоте с индексом 1, которому 5 дней примет массу A, а растения например в индексе 4,5,6 которым уже 25 дней, примет массу Общая масса растений - масса А / 3. Собственно как то так. А дальше, когда мы знаем уже реальную массу каждого растения, системе собственно не сложно предположить, что остальные растения из этой партии но в слотах не на весах, весят примерно столько же. И она присваивает массу уже этим растениям. Собственно как то так, это весьма сложно объяснить как оказалось. А дальше можно оставить на весах 7 уникальных растений например и с помощью этого алгоритма наблюдать за их поведением в зависимости от например различных факторов. (температуру поднять, чо будет? дать больше EC? и тд. ) все это пишется, запоминается и анализируется.
Ну и собственно график роста по CSV данным. Вот так салаты росли примерно с 25.04. (все что старше 30 дней улетает в долгосрочную память). Есть шумы и провалы, все таки я то трону весы, то сами растения на них, во время осмотра, все в норме.
Видно на графике, что сейчас салаты на платформе в стадии активного роста и прибавляют примерно по 0.1кг в сутки, что очень даже не плохо. Сейчас пару дней назад я снизил дозу EC до 1.2, до этого было 1.6, дальнейшие наблюдения покажут, осталась ли прежней скорость набора зеленой массы или замедлится.
Салат Мини Ромэн.
Внешне это выглядит вот так:
Ну что бы далеко не отходить уже от конструкции, чуть вильнем в эту сторону. Это тоже отдельный и большой этап.
Контейнер для выращивания у меня сделан из ПВХ пластика на фрезерном ЧПУ. Тоесть по сути это был конструктор для склеивания. Клеил специальным клеем и сверху проходился ещё герметиком, тк вода может стоять в процессе эксплуатации весьма большим объемом. (около 1.8 литров. Возможно это не доработка и я поправлю в следующей генерации этот момент, но пока все работает отлично. Спроектирован так, что бы на обычном принтере можно было напечатать 3 крышки для высаживания растений и что бы влез в обычный металический стеллаж. Как по высоте так и по ширине. Идеально входил в стеллаж 800*300, тк изначально собственно под него и проектировался.
Конструкция контейнера.
Расположение самих форсунок тоже важно. Разместить их надо таким образом, что бы будущая корневая система не загородила собой одну\две\три из форсунок и не отняла питание у остальных растений, так же надо учесть что бы струя не била напрямую в горшочки, а увлажняла воздух вокруг, ну и естественно что бы это не было так, что из щелей фигачит водяной туман и увлажняет все вокруг и вокруг системы лужи.
Я сделал около 4-5 вариантов в модели, примерно просчитал конусами ~55 градусов, что соответствует моему давлению и диаметру форсунок. И самый нормальный вариант как по мне, без лишнего изобретательства велосипеда, это разместить их на будущем уровне воды внизу под 35 градусов к поверхности. Так же они заполняют пробелы друг друга. По одному борту стоят 4, по другому тоже 4 но со смещением на около 50мм.
На дне имеются укрепления в виде полосок того же пластика, что необходимо для того что бы днище не прогибалось под весом жидкости и конструкция получилась легкой и жесткой и так же укреплены сами стенки ближе к крышке такими же полосами, что бы надежнее их скрепить между собой и дать опору для прямоугольника под печатные крышки уже.
Тут особо рассказывать нечего. Тут я не изобретал велосипед и сделал из контейнера удовлетворившего мои условия. Он должен закрываться плотно на защелки и быть не прозрачным, подходить по размеру. В принципе это всё. Дальше дело техники, я все монтировал на крышку, что бы при необходимости её поднять и вытащить сам бак и помыть\заполнить водой или что то ещё сделать, но честно я этого не делаю)) потому что заливаю воду просто в контейнер и она сама наполняет бак, но ситуации могут быть разные. Для обслуживания единственное что важно было, это не крепить ничего на сам контейнер, тк провода или шланги в дальнейшем будут мешать его обслуживанию.
Единственное что пришлось сделать, это закрепить на быстросъемном печатном креплении датчик наличия воды на безопасном для насосе уровне. Если вдруг я все таки не увижу отсутствие раствора, он отключит насос и не даст ему работать вхолостую.
Диспетчер задач. Да да, вы не ослышались. У меня есть свой диспетчер задач с блэкджеком и памятью. На самом деле вещь сугубо дебажная. Показывает она приоритет, ядро исполнения, сколько стека ест та или иная задача, за сколько выполняется и есть ли опасность краша системы по Watchdog, так же есть апи поинты для остановки или перезапуска задач, но пока в интерфейс не интегрировал ещё. Конечно это касается только задач FreeRTOS, задачи в Loop цикле при этом никак не отображаются.
Лог система, это отдельная вещь, тк в такой сложной системе надо логировать всё и ещё раз всё что можно. Но все же сталкивались с тем что в луп написал println и значение и больше в логах ты не хозяин. Да, конечно можно Усовершенствовать это делеями, а лучше миллисами или yield ами, но это разве гибкость? Когда логов становится много. Нет, не так. МНОГО, ОЧЕНЬ МНОГО, за пару секунд собирается 30-40 строк, пора что то с этим делать. А ведь так не хочется трогать уже сделанное полезное логирование, вдруг оно опять понадобится позже. Поэтому я уже известным путем и пошел. Сделал просто обертки для функций логирования, но уже с аргументами уровня логирования. DEBUG INFO WARNING ERROR. И собственно параметрами куда это самое логирование отслыать, в телегу на сд карту или в веб интерфейс. В тг просто по приколу, я хрен знает зачем, мне ни разу не пригодилось. А вот на SD очень даже, в связи с этим на фронте на самой ESP появилась даже кнопочка скачать лог. Пришлось ограничить правда размер до 4мб, как правило этого хватает для всех нужд. Но не было печали купила баба порося, это то я все сделал, но как отлавливать PANIC/WDT и прочие неприятности когда ты по ошибке вылез за предел массива или сожрал весь HEAP? Правильно, взять дешман ESP32Dev модуль и подцепить его TX\RX2 в RX\TX0 на Main ESP32S3 и заставить его читать вообще всё и отсылать по вебсокету на свой веб интерфейс. А ещё можно прикрутить кнопку принудительной перезагрузки контроллера, перепрошивки без необходимости лезть в корпус и подсоединять USB.
Логирование всей фермы SLAVE контроллером на ESP32. Все идет в Live режиме, без перезагрузок страницы и без задержек через WebSocket.
Тут же прикрутил и фильтрацию логов по системам которые определяются автоматически, прикрутил MQTT для удаленного перезапуска Main и самое главное, на SLAVE сохраняются все Backtrace c Master контроллера и коды ошибок для дальнейшей диагностики + лог за минуту до критической ошибки. И вот это уже настоящая имба. Ты буквально независим от ошибок и USB провода и можешь прочитать всё что тебе нужно независимо от того, что с Master контроллером. Так ещё и ладно, эту идею можно развить и дальше, Slave контроллер может быть и резервным контроллером. Например самые важные функции это полив и свет, вполне можно автоматически дублировать и управлять теми же самыми реле при отключении Master контроллера. Уведомлять пользователя и тд. В будущем такое обязательно будет, но количество лапши внутри корпуса уже заставляет дергаться оба глаза. Поэтому потом, когда нибудь.
Резюмируя систему логирования, она получилась мощная, быстрая, понятная и самое главное удобная для использования. А большего мне и не надо. Красивости в ней только мешают, поэтому тут дизайна как такового и нет.
Так же отдельный большой раздел.
Настройки подключения к MQTT. Все отображается в лайве, а так же есть подсказочки на какие топики подписаться если нужно это сделать вручную.
Обычно я не шел дальше ручной подписки на нужные топики, но тут что то захотелось ну прям автоматически все чтоб было. Итог таков. Если у вас дома есть Home Assistance и стоит расширение MQTT, вам больше ничего не надо делать. Все найдется и добавится в систему автоматически как надо и без танцев с конфигурациями, отдельным устройством, в котором усе уже сконфигурировано как нужно.
Конечно забавно, но виртуальные реле из HA добавляются снова в HA, можно исправить, но не вижу смысла)
Не знаю, тут особо рассказывать то больше и нечего, из HA можно прокинуть уже куда хотите, хоть в Apple Home, хоть в Алису. Задавать сценарии и тд. В будущем возможно я расширю возможности настроек MQTT, что бы можно было выбрать а что конкретно вообще по этому вашему MQTT передавать то, но пока это жестко захардкожено и он передает все сенсоры и все реле. А больше как будто и не нужно, разве что блокировку таймеров и их настройку ещё бы завести, но как будто ту мач.
Отсюда, можно забэкапить всё, что происходит в системе. конфигурацию реле, насосов, удобрений, бака, посадки и так далее и тому подобное. Всё качается в ZIP архиве и так же восстанавливается в одну кнопку на чистой системе. Это очень очень полезно, тк я за время тестирования и кучи форматирований флешек и Spifs просто устал заполнять всё руками. А так же помогает если вдруг вы сменили SD или отчистили SPIFS обновив прошивку. (Дада, кнопка файловой системы называется LittleFS так это потому что я всегда их путаю, но в данном проекте SPIFS)
Ну и возможность обновить систему через OTA .bin или обновить сам веб интерфейс, чего я делать больше не планирую.
Это последняя в этом посте система, телеграмм уведомления.
Во вторых, может уведомлять о том, что система засорена и насос не будет включен, или кончился раствор. (скриншоты из тестирования)
Конечно же она шлет ежедневные отчеты в 9 или во сколько вы выберете утра. С фотографией, параметрами и счетчиком незапланированных перезапусков за все время. (незапланированный перезапуск, это перезапуск даже от обновления прошивки, его можно скинуть)
Ну и конечно, система может выслать вам неприятные сообщения, которые вас уже изрядно бесят.
Каждый запуск системы, это куча проверок на работоспособность всех микросервисов системы. И их запуск. О чем телеграмм бот и сообщает. Тут немного дублируется логирование, тк STILL BETA. Но ничего)
Давайте на этом закончим вторую часть. В третей, я хотел бы рассказать уже о датчиках, их калибровке, температурных компенсациях, проблемах, шкалах NaCl и других. Австралийских аршинах в измерении EC. А в четвертой, если успею доделать 4.2, расскажу об интерфейсах взаимодействия с фермой. (Веб интерфейс, экран Nextion) вообщем очень много какой инфой могу поделится в этом цикле постов.
Вышла вторая часть про моё устройство: Действительно умная гидропоника. Часть 2
Всех приветствую. С момента последнего поста про мою гидропонику прошло весьма приличное время, но то не зря! Все это время, я не мытьем то катаньем, разрабатывал следующие, а потом ещё следующие и следующие итерации своей системы, и не могу остановится до сих пор. Постоянно изменял и игрался с центральными контроллерами, датчиками и обвязками и тд. В этом посте я очень поверхностно затрону все версии которые были и постараюсь рассказать о последней, текущей версии своей системы. Во всех тонкостях, с фотографиями и скриншотами и пояснениями.
Забудьте про адекватность в этом вопросе. За это время были и меги, и уны и esp32 и stm и малины(что борщ) и чего только не было. За потраченные деньги я мог бы купить фуру(или около того) салатов и других культур и обжираться ими долгими холодными месяцами. Но цель может и не оправдывает средства, за то это безумно интересное хобби. Кто то вливает тонны денег в сноуборд, я вливаю в контроллеры и всякое такое, даже если оно в итоге не пригодится, да и фиг с ним, когда нибудь будет нужно.
В итоге последняя версия сидит на ESP32S3-N16R8, чего и мне и системе хватает за глаза и за уши.
PH: DF Robot PH Sensor
TDS\EC: Самый бюджетный китайцкий TDS метр до 1000 ppm.
TDS\EC2: Уже профисиональный модуль для измерения EC имеющий собственную калибровку на борту отдельной платы, длинный кабель, компенсации температур и тд.
TEMP: Популярнейший ds18b20.
2 Бинарных некотнактных сенсора жидкости.
4 перестальтических насоса.
1 мембранный насос 5 вольт.
24V источник питания на 300W.
DC-DC преобразователи 4 штуки.
Полусамодельный блок реле на 4 реле OMRON G2RL1E5DC.
4 силовых ключа.
HX711 и тензодатчик до 1кг.
Насос 24 вольта, 10 бар. Форсунки 0.3мм 10 штук.
Первую версию ищи у меня в посте (если интересно) Гидропоника начало, вторая версия которая прослужила весьма долго была на том же железе, но с переписанным софтом и измененным подходом. Если раньше это был деревянный стеллаж, то сейчас это уже металический, стелажищще(шучу), маленький стеллажик, на 4 полки. К которому к задней стенке просто открытым монтажем все и крепилось.
Примерно вот так выглядел процесс сборки, задняя панель стеллажа и собственно сам результат (спойлер, все салаты вымахали, без каких либо проблем) А так же был экран управления, закрепленный и вынесенный отдельно, со всеми нужными параметрами(внизу)
У всей этой конструкции был один главный недостаток. Колхозность исполнения и проявлялась она в постоянных проблемах, то с протечками в соединениях шлангов(их в целом было слишком много), то мерцающие китайские лампы которые не давали даже нормально заснять процесс дешевыми способами(на iPhone конечно все шикарно, но вот на какую нибудь IP камеру, отвратительно, несмотря на все включенные галочки для борьбы с мерцанием и полосами) и конечно софтверные постоянные глюки, отвалы или например залипания реле, некорректные измерения PH из за нестабильного напряжения на датчиках и так далее, ну и самый главный пункт - громоздкость конструкции и не возможность переместить саму систему например в другой шкаф или стеллаж, тоесть сам стеллаж и был гидропоникой. Вообщем, дорастил я партию салатов из 40 штук, 3 черри томата на ней и понял, что это мучение а не умная ферма и вообщем то я мог бы обойтись ведром и воздушным аквариумным компрессором за две тыщи и результат возможно вышел бы лучше даже, пусть и в меньшем количестве. В итоге было решено не бросать все это дело, тк ну очень интересен оказался сам процесс. А сделать следующую генерацию и учесть все эти ошибки.
Версия 3.0
По моим планам, это должны быть вот такие модульные блоки, которые должны собираться в одну башенку. (Размер MAC-MIni) и содержать в себе все необходимые мне функции)
Тут я попробовал другой подход. Модульные блоки. В планах было 3 штуки:
Центральный блок: Блок отвечающий за раствор. Он же опрашивал все датчики, связывался во внешний мир, командовал мини насосами для корректировки раствора по PH / EC и тд. Вообщем все что связано с раствором, это к нему. Он мог получать питание как отдельно через вход питания непосредственно на нём, так и через соседние блоки.
Блок реле: В нём устанавливался блок реле на 8 штук, блок питания 24 вольта и блок комутации 220V. Тоесть по сути, подключалось все одним проводом, а дальше по сути получался умный удленитель на 8 розеток, в каждой из которых уже есть 220V. И в нём есть свой контроллер, который этим всем делом рулил. Мог отдельно, а мог впаре с основным (Master) контроллеров в центральном блоке.
Блок центрального насоса: В нём просто стоял насос на 24 вольта, 10 бар. для аэропоники. Этот блок даже не был смоделирован. Но потенциально мог нести в себе расходомеры\датчики давления и тд. Вообщем вся необходимая обвязка для защиты насоса и блоков.
Соединялось это между друг другом без каких либо проводов, путем использования магнитных разъемов POGO-PIN и I2C шины. По сути был Master контроллер и Slave. Которые просто при соединении начинали пинговать друг друга говоря я тут, а мастер уже понимал, что вот блок реле, значит теперь мы ещё и управляем реле. И так же мог бы детектить ошибки, перезагружать друг друга и так далее.Аналог CAN в машине, где блоки общаются друг с другом и все друг о друге знают. А на экране\веб интерфейсе открывался блок взаимодействия с этим блоком. Но все так же к ним можно было достучаться и по отдельности. Вообщем ультра сложная система, но имела свою гибкость. Но не суждено было даже дойти до момента работы. Собрал я только блок реле и главный блок, а потом начались праздники, упадок сил, осень и на балконе стало прохладно для гидропоники и предстоящий там же ремонт. Вообщем одним словом, энтузиазм закончился на проекте и половинной реализации. Возможно слишком уж переусложнил и неподъемным сделал концепт, не знаю.
Прошу прощения, за долгое вступление к теме поста. Но по моему у меня все посты вот такие вот.
Что тут скажешь. Теперь это действительно умная ферма. Имеющая на борту возможность автоматической корректировки EC и PH, да не просто по значениям, а вычисляющее нужное минимальное значение удобрений и PH для каждого из растений в системе или среднее, в зависимости от культур и их фазы роста и других параметров, вообщем есть интеллектуальный режим поддержания EC и\или PH, простой режим поддержания по заданным значениям. Предсказание роста (в граммах ко дню), даты предполагаемого сбора урожая, измерение веса, логирование PH/EC/Веса/Температуры. Интеллектуальное распределение веса для всех растений(хоть однажды измеренных на автоматических весах), управление реле\pwm\виртуальными реле(любыми умными розетками(Xiaomi\Tuya\Яндекс), APi с авторизацией и конечно же многократными защитами от некорректных действий самой же системы, и это только начало, функций ооочень много. Всех их я написал и многократно тестировал. Проект разросся до тысяч и тысяч строк кода и сейчас работа с системой приносит одно удовольствие, ну разве что роборука сама на сажает и не собирает урожай. Но то ли ещё будет. Не зря у меня бакалаврская степень по робототехнике. Авось и диплом пригодится. И всё это влезло в незамысловатых размеров коробченку которая была задана размерами печатной области моего принтера и свободным местом рядом с платформой выращивания.
Версия 4.0
Выше версия 4.0, сделана ещё 4.1 и 4.2, но с малозначительными отличиями. На цвет прошу не обращать внимания, печатал чем было, не хотел тратить хороший пластик на то, что возможно в будущем претерпит ещё некоторые изменения(а они будут).
Ну и собственно на видео версия уже 4.1. Блок реле был заменен из за проблем с залипанием при включении света. Скорее всего это скачок стартового тока, из за особенности драйверов светодиодных ламп. Но это как минимум странно, т.к. в пике потребления ток составлял около 400мА, что кратно меньше чем пиковый ток написанный на реле(10А),заменил на 6 модульный (из 6 твердотельных реле), что улучшило ситуацию, но добавило новых проблем, ежесекундная зарядка и разрядка конденсаторов в конечных потребителях и их кратковременный запуск(при выключенном реле, как я понял это можно решить Снаббером, но это что то уже совсем очень сложно). Замена на твердотельную схемотехнику, повлекло за собой и добавление силовых ключей для DC 12V на перильстатические насосы (раньше они коммутировались обычными механическими реле) и не требовали такого. Что в свою очередь затребовало изменение конструкции для того что бы освободить место для готовых модулей. В итоге не помогло ничего. Кроме как просто перепайка реле на нормальные механические от OMRON и так же на 10 ампер и всё заработало как часы. Думаю все популярные нынче модули на синих и желтых маркетплейсах зачастую с поддельными компонентами, тк не верю что на 8 реле модуль может стоить 400-500 рублей.
Версия 4.0 была на базе контроллера ESP32, а вот 4.2 уже переехала на ESP32S3, свою DEV плату с пинами и тд. Но все ещё имеет в обвязке кучу готовых китайских модулей, что естественно раздувает корпус до такого состояния. Сейчас у меня используется и тестируется активно (и так же все ещё в процессе разработки) версия 4.2 плавно перетекающая в уже 5.0 и причину этого я опишу в конце поста, там же где и расскажу о будущем этой системы, какие планируются функции и дальнейшие шаги. А сейчас хочу показать вам её поближе и начну структурировано с функций системы:
Напомню, у меня Аэропоника и цель - выращивание в основном салатов.
Ниже длиннющее описание всех(или почти всех) функций системы. Можете пролистать если не интересно.
Таймеры. Таймеров у меня есть 2 вида и их можно комбинировать при необходимости. Интервальные и Временные. Соответственно если надо включить любое из реле\силового ключа\виртуальной розетки, он включит либо в нужное время по RTC, либо по отсчету(например раз в 10 секунд на 2 секунды или раз в 5 минут на 10 секунд и тд).
Блок таймеров в веб интерфейсе. Всё обновляется в LIVE режиме, имеет уведомления или возможность блокировки от срабатывания.
Привязка устройств к реле. Каждое из реле в системе\силовой ключ\виртуальное реле можно привязать к насосу, свету. Это нужно что бы система поняла, чем она управляет. У перистальтических насосов есть так же тест и задание производительности. Очень простой механизм включающий насос на 1 минуту, и с помощью мерной емкости можно скорректировать производительность относительно той что пишет производитель.
Управление реле. Тут все банально, просто кнопочки. С подсветочкой во время работы и иконками соответствующие названию и\или типу если он задан в параметрах системы для какого то из переключателей.
Блок реле. Все синхронизировано и состояния отображаются в Live режиме, не зависимо от места переключения реле. (Apple Home/Экран/Таймер/веб реле/MQTT и тд) и имена конечно тоже синхронизированы. Их можно переименовывать в настройках реле.
Панель Сенсоров. Тут тоже все банально до жути. PH EC температура, остаток раствора и масса всех растений на платформе.
Система показаний. При желании можно изменять панель сенсоров. (у меня например 2 сенсора EC и можно вывести показания сразу с двух, или вес каждого из растений на платформе. Вообщем вещь кастомизируемая.
Графики pH/EC/Температуры/Веса. Логирование - это очень важно в подобного рода системах. Поэтому у меня регулярно прямо в системе пишется лог и строится график. Графики за последние сутки, а логи доступны за месяц. PH/TDS/Температура пишутся каждые 5 минут, а вес - каждый час. Ну и это доступно через веб интерфейс для просмотра. Я сделал себе не больше 100 строк на график из лога. Т.к. больше в веб интерфейсе локальном считаю не нужным. Самый интересный график тут, это конечно веса. Все остальное более менее всегда стабильно.
Любимые любим электронщиком графены. Можно посмотреть всё что нужно за последнее время. (больше мне не нужно, так как долгая инфа хранится в Grafana или HA).
Посадаки и культуры. Это очень большой функционал. Это используется в нескольких случаях. Анализ роста, журнала для себя, что б не забыть куда и что посадил, какая фаза у растения сейчас, когда посадил, когда собирать и так далее. Все просто и информативно.
На выбор пока моя система поддерживает такой вид культур. В дальнейшем думаю как расширить этот список. Ограничение к сожалению и физическое и биологическое. Тут подобрана в основном всякая зелень и тд. Тк в основном сосредоточился на этом.
Вся система посадок плотно завязана с датчиками, интелектуальным режимом поддержания EC и PH, что позволяет добиться полной автономности. Обладает различными защитами и ограничениями от дурака. Условно посадить какую нибудь голубику к салатам не получится. Система просто не откорректирует раствор под неё никаким образом. Она будет её игнорировать. Интелектуальный режим работает только на поддерживаемых растениях, системой. И тут мы плавно подходим к поддержанию PH и EC, одной из главных функций. умной системы:
Ручное и поддержание - это простые режимы. Если выпадает за 5% свыше или ниже диапазона, значит надо влить N удобрения AB и или PH+/- если выпал этот случай, перемешать и проверить снова через несколько минут. Вообщем чуть усложненное сравнение.
Интелектуальный режим, же обращается к списку посадок, культур, весу, какое удобрение(производитель) используется системой, датам и текущим параметрам с EC\PH, какие насосы есть в системе и тд.
Например, у меня нет в системе растений, но уже подготовлен раствор к примеру с EC 1.5 (1500), что просто дофига для маленьких старта растений. Но пока растений нет, система не сделает ничего. Но стоит посадить к примеру салат Ромэйн в системе, она сразу поймет, что это семечка, такая дозировка сейчас не нужна поскольку нет никаких растений и снизит её до правильной и нужной. Так же и с PH для каждого из посаженных растений. И дальше система просто наблюдает за посаженным растением. Условно спустя N дней, растение как правило переходит в фазу вегетации, что требует уже другой концентрации раствора, система и повышает концетрацию сама и автоматически. И так весь цикл роста. Как вычислить фазы? Примерно прикинув и погуглив и почитав, я расписал все фазы роста для поддерживаемых растений и самое главное примерно интерполировал вес в граммах для этой стадии. Условно вес активно набирается только в стадии Роста, а значит мы имея весы и зная дату посадки, можем вычислить её начало спустя пару тройку дней и подкорректировать EC и самое главное откорректировать этот параметр для дальнейшей эксплуатации. Вообщем это весьма не хитрая, но в то же время сложная система.
Прямой вопрос, что будет если у меня 10 салатов в стадии роста активной и я посадил ещё 5 проращиваться. окей, не проблема. Система возьмет максимум который можно дать семечкам и минимум который можно дать тем кто в стадии роста. Посмотрит сколько дней осталось до окончания фазы роста до финиша и сравнит сколько дней до фазы вегетации к примеру. И постепенно будет корректировать таким образом, что бы и удволетворить фазу роста и подготовить салаты к фазе промывки и при этом не убить семечку салата на этапе проростания, когда она ещё совсем слабая. В цифрах это значит что система снизит концетрацию например до EC ~ 1.2 мСм\см, чего хватит салатам в фазе роста, но много для салатов в стадии всхода многовато, но терпимо. В дальнейшем ближе к концу фазы роста, за 7 дней до конца, система сама будет снижать концентрацию для финиша. до 0.8-1 EC. После окончания этой фазы, вырасшие растения удаляются из расчетов. Но это только с салатами. А если я сделаю тоже самое, но добавлю ещё другую культуру и третью, система запутается? Нет. Она не запутается, а просто будет считать сильно проще. Она возьмет все стадии, вычислит количество преобладающих растений в высшей фазе и подстроит по её нижней границе необходимое значение EC. Тут банально логично предположить,что больше удачно выращенных растений = лучше.
Ну и собственно в самой системе можно выбрать текущее удобрение, увидеть инструкцию по применению и интерактивную таблицу которая покажет в какой стадии большее количество растений в системе и нормальны ли показания для этой стадии сейчас.
Что то вышло ОООЧЕнь длиннопост. Поэтому вскоре я оформлю вторую часть. Где покажу остальные функции, интерфейсы, MQTT и каким образом я прокинул все в Apple Home устройством, расскажу о ежедневных отчетах в телеграмм ботом с фотографией и других возможностях. А пока, как вы могли заметить скриншоты по интерфейсу слегка отличаются по дизайну. Это все по тому, что я в данный момент, переделываю пользовательский интерфейс на React JS и взаимодействие с APi системы. Отказываюсь от SPIFS для веб страниц и переношу фронт на отдельный уже сервер с авторизацией и внешним доступом(хоть он не особо и нужен, но хочется). А так же возможно в следующем посте, уже будет готов проект полностью кастомной печатной платы со всей необходимой переферией, для работы системы. Пока покажу набросок, который я сейчас проектирую и одновременно учусь, я первый раз проектирую свою плату, и в первый раз открыл Easy IDE. Но обо всем, в следующем посте.
А, ну и че вообще, растет что то или нахрен вообще нужны эти салаты?)
Конечно растет. Стахановскими темпами)
Те же самые салаты что в первом видео, но спустя время)
Спасибо за внимание, согласен, это было ту мач)
И так, второй пост из серии про светильники. В нём я покажу актуальную версию своей умной базы, новые плафоны и новые анимации. Расскажу о дальнейших планах.
В этом посте будет очень много фотографий, GIF изображений и рассуждений.
Для затравки
Начну с конструкции и изменений, а так же что послужило причиной этих изменений:
Причины:
DC-DC преобразователь на 2 Ампера(3 Ампера в пике и с радиатором) не подходил. Он жутко грелся, а лента в пике по расчетам могла потреблять до 5 ампер, поэтому предыдущая конструкция была жутко доколхожена вторым DC-DC модулем в параллель для хоть какого то запаса по амперажу, но это тоже особо не помогло. Поэтому два дешевых модуля были заменены на XL4016E 9A. Так как они полностью удовлетворяют моим требованиям по размеру, мощности и цене.
Добавления акселерометра для одной очень замысловатой анимации.
Перенос порта питания на другое место и соответственно изменения модели под это дело.
И вот какую внутрянку я получил, после некоторых мытарств.
Собственно сам стакан, поверх как и в прошлой версии одевается цилиндр с намотанной лентой. При необходимости, все можно разобрать и легко извлечь тот или иной компонент. Все на винтах и впаиваемых бонках.
Вот так. На этом цилиндре намотана уже сама лента. (не промоделивал, так как не видел в этом смысла для себя, а занятие гнуть компоненты во фьюжене, это мега мучительно)
Поверх собственно ленты, на следующий выступ, одевается рассеиватель, а сверху скрепляется все крышкой.
В разрезе это выглядит примерно вот так. Собирается это на клей, либо плотной посадкой, которой достаточно для того что бы изделие стало монолитным и надежным. В дальнейшем, есть мысль сделать резьбовые соединения везде где это нужно, но пока обхожусь этим
В реальности цилиндр с LED лентой выглядит вот так:
Пайка такого количества перемычек, изрядно умотала, но это того стоило, так как я получил полноценную матрицу свернутую на цилиндр и мог гораздо удобнее с ней работать, чем с намотанной по спирали лентой.
Это что касается конструкции и железа. Что касается софтверной части, ох и много же там было проблем. Ниже опишу и проблемы и все
Проект был сделан в скетче, что со временем усложнило его модификацию, отладку и работу с ним в целом. Работа в Arduino IDE мягко скажем, не была столь удобной. Поэтому проект был перенесен на VS Code в связке с PIO, где произошел рефакторинг и разделение всех функций на отдельные файлы прям как по ООП. (эх, если б я был профи и знал заранее, я бы не потратил столько времени на этот этап)
Интерфейс был допатопным, морально устаревшим, а так как его прям делать снова с 0 не хотелось, поэтому он был доработан, добавлены красивости и тд. Но мне кажется, я ещё не удволетворил все свои хотелки. и впереди меня ждет очень много интересных визуальных изменений.
Отсутствие серверной части. Я хочу видеть подключенные лампы к сети интернет, на какой прошивке они сейчас, какой аптайм у них, какой город у пользователя и какая анимация включена. Иметь возможность перепрошивки удаленно на выбранную прошивку и возможность смены анимации так же удаленно. Удаленно в этом контексте, это через интернет, без открытия портов, знания IP адреса и тд и тп. Вообщем, статистическая и прочая информация для технической поддержки в будущем. Она может каким то образом изменятся, в дальнейшем, но фундамент необходимо сделать.
Отстутствие сервера для поддержки "интернета-вещей", тоесть лампой можно управлять только находясь в одной локальной сети, то это категорически не устраивало меня, все таки в современных реалиях, хочется видеть статус той же лампы онлайн и 24\7. А так же, это стесняло меня в некоторых анимациях, о которых я расскажу позже.
Как оказалось, фаза луны отображалась не в реальном времени, а расчитывалась по расчетам. Что в целом не плохо, но зная реальное время, эти расчеты не нужны. Тоже надо было пофиксить.
Так же, из за того что вся прошивка и все анимации были написаны под накрученную спиралью ленту, новая лампа с новой конструкцией естественно отображала все анимации неверно и не корректно, это затронуло все анимации и полностью изменение логики их работы.
Вообщем, описывать все проблемы дословно, я не вижу смысла и так понятно, что багов лагов и проблем, там было ООЧЕНь много. Прям сверхдошиша. Не долго думая, приступил к исправлению.
По итогу интерфейс теперь выглядит уже более прилично, а количество настроек и каких то маленьких штучек увеличилось и работает гораздо быстрее и коректнее.
И да, как можно заметить, в веб интерфейсе все ещё как то не сгрупировано нормально и выглядит не сказать что вау круто. Но над этим я ещё в будущем поработаю. Теперь у меня есть возможность, обновлять интерфейс отдельно от прошивки и все это с поддержкой версионности и автоматических обновлений. При этом для пользователя, ничего не изменится, всегда будет одна кнопка для обновлений, но обновится только нужная часть устройства)
И вот так выглядит если доступно обновление.
Так же, сделал приятную мелочь и бонус, в процессе обновления естественно у нас появляется прогресс-бар с процентным заполнением и текущим статусом процесса (качается прошивка, распаковывается, обновляется и тд) и сама лампа в этот момент начинает плавно переливаться голубым цветом, что дополнительно уведомляет пользователя об обновлениях.
Рассказывать можно долго, об абсолютно всех изменениях, но пожалуй это и 2 новые анимации заняли у меня больше всего времени.
1 анимация, это связь ламп или постучись в мою дверь)
В интерфейсе это выглядит вот так и суть её работы в следующем:
Первое что надо сделать, это отправить второму обладателю, свой ID что бы он вставил его в соответствующее поле и всё. Настройка завершена и лампы связаны.
Теперь, когда вы трогаете свою лампу (бьете по ней, просто трогаете, гладите и тд) ровно с такой же силой, на абсолютно любом расстоянии(лишь бы был интернет) у второго пользователя его лампа загорится тем цветом, который он выбрал у себя в настройках. Получается некие парные лампы можно сказать для отношений на расстоянии или для общения морзянкой если хочется)
И вот видео работы:
Я засимулировал работу второй лампы, так как сейчас второй собранной у меня нет в наличии, но уже проверял. работает и работает весьма быстро)
Устроено все весьма просто и стандартными методами. Протокол MQTT, свой сервер и базовая аутентификация, которая зашифрована и хранится уже в памяти ESP. + уникальный ID формируется из MAC адреса для каждого устройства, который не изменяется при перепрошивках или перезагрузках, возможно в будущем я упрощу этот механизм, но пока сам прототип работает и это радует. Это потребовало от меня множества усилий, но это одна из самых главных фич которые мне нравятся самому. Естественно для этого режима(как и для всех) работают настройки и установки такие как: якрость, высота подсветки, чувствительность и цвет) реализовано это всё с помощью акселерометра и вполне стандартных алгоритмов фильтрации шумов(спасибо универу, за специальность в области сигналов и фильтрации шумов и тд, наконец то пригодилось). Грубо говоря, ничего сложного.
Куда сложнее, это была следующая анимация. Симуляция режима погоды.
В интерфейсе это выглядит очень просто. Нет никаких настроек (в этом и смысл).
Тут, вы задаете ваш город, поселок или область, или даже известное место(например торговый центр) и дальше происходит магия. Светильник начинает получать погоду почти ровно из этого места. (самое ближайшее к нему где есть метеостанция отдающая данные в интернет)
А дальше, я эту погоду уже превращаю в соответствующие анимации. Облачно - лампа будет плавно мигать тусклым белым светом, если пойдет снег или дождь - то по лампе будут стекать синие или белые капли, если туман, то просто будет гореть тусклым белым светом, а если солнечно то будет светить ярко и желтым цветом, во время грозы и ливня, будет смешиваться режимы дождя и грозы) Бывает и такое, что лампа не знает такого состояния погоды, тогда она будет пульсировать синим цветом ровно как во время перепрошивки, сейчас это нужно мне для отладки, и регулярно записывается в логи которые отправляются мне на сервер и постепенно я фикшу все недостающие статусы)
Вот например, погода для Санкт-Петербурга и для Сочи. (1 и 2 видео соответственно). В СПБ- Облачно, а в Сочи шел небольшой дождь. (и да, я показываю на примере Марса)
Как обычно, на камере плоховато видно, но в живую результат гораздо лучше. Но либо тут уж я криворученька и снимать не умею. Автор не оператор)
Конечно же, смена погоды происходит автоматически и без участия пользователя. Лампа сама обновляет статус погоды раз в N времени, и если погода изменилась, то и отображение на лампе поменяется.
И да, может быть кто то справедливо заметит, что некоторые анимации не сказать что прям выглядят как то информативно, но пока я сделал так. В дальнейшем естественно это все будет изменятся и не один раз переработается. Сейчас я стараюсь придерживаться принципа, что плафоны это отдельный продукт, а умная база отдельный. И из за этого принципа, не всегда получается в том числе, сделать анимации информативными, так как плафон рассеивает свет и получается что диоды смешиваются. С этим я борюсь отчаенно и неоднократно модифицировал сами плафоны.
Так же, есть Температурный режим этой анимации. Он просто показывает цветом свечения, текущую температуру на улице. Диапазон можно задать самому, от -20 до + 30 градусов по умолчанию, где -20 это максимально синий цвет, а +30, максимально красный. Эти цвета так же можно изменить в настройках. И так же естественно все в Live режиме меняется.
У меня остался бракованный плафон, так как принтер почему то решил что он допечатал. (да, я бракодел) и на нём я тестирую всякое.
Вот как выглядит секторность и фазы луны.
У анимации луны есть ряд настроек:
Режим работы:
Реалистичное время. (не думаю что стоит пояснять, что на небе - то на лампе)
Ускоренное время. (можно задать какое то количество минут, за которое луна сменится от полностью темной, до полной луны)
Ручной режим. ( на видео выше, мы можем изменить фазу вручную, от 0 до 12)
Интерпретация:
Реалистичная (Всегда горит строго 180 градусов луны) как и в реальной жизни, у луны всегда есть темная сторона)
Артистичная (В процессе того как луна меняет фазы, она как бы заполняется от 0 до 360 градусов и в итоге будет гореть вся сфера)
Минималистичная (всегда горит 1 из 12 столбцов, он перемещается как месяц) (на видео)
Ну и конечно остальные настройки, такие как цвет, яркость и тд. Кому что по душе.
Ну и админку грех не показать. Очень быстро написал её, буквально за один два дня.
Собственно моя удаленная админка. Тут я вижу некоторые статистические данные, которые могут мне помочь в решении каких то вопросов удаленно. А так же то, что я описывал в начале поста.
В планах дальше, это:
Ещё раз переработать интерфейс, сделать его уже с анимациями, желательно на React или чем то подобным, с меню и настройками. С базовой аунтентификацией пользователей и в целом как то поприятнее.
Доработать некоторые баги, например сейчас смена цветов не всегда происходит в Live режиме, это связано с JS и миллиардами запросов, к устройству.
Собрать полноценное Android приложение, зачатки уже есть, я могу с приложения изменять анимации и их параметры, но показывать пока не буду, так как это совсем ранний прототип и я только изучаю этот вопрос. Но у меня по сути дела, есть почти полноценный API для работы с устройством, так что вопрос написания приложения не кажется мне уж очень сложной задачей.
Интеграция в Apple Home и Алису. В Apple Home, тестово уже прокидывал, но крайне упрощенную версию лампы. С полноценной лампой пока не вышло, но работаю в этом направлении. В Алису, слышал что можно через MQTT, но на стадии изучения этого вопроса.
Интеграция с Home Assistance - можно считать сделана, так как будет через MQTT, а MQTT в устройстве уже есть, осталось написать пару функций и готово, возможно для самого HA надо будет написать своё дополнение, что бы пользователь не парился с добавлением кода в Configuration.yaml и тд. Вообщем как то надо это придумать попроще чем уже протоптанная неоднократно мною дорожка.
Многое многое другое.
Если вам интересна реализация этих планов, подписывайтесь тут или на мой тг. Там я буду чаще постить какие то отрывки которые не требуют оформления и выделения времени на написание поста)
https://t.me/magic_lamps
Всем мир)
Попался мне как то раз, на просторах сайта для 3д печатников прикольная пачка светильников, ну я не долго думая и сделал в подарок своему другу программисту подобный светильник, да только не простой, а умный.
В чём умность спросите вы? По сути, ни в чем. Это такая же маркетинговая уловка, как и все умные светильники сейчас на рынке. По сути, это очень сильно настраиваемый и кастомизируемый светильник под конкретного человека. Так же впоследствии сделал и простую версию под E27. С лампой от Xiaomi, что дало почти во всех аспектах тот же вау-эффект, но с гораздо меньшими трудозатратами. Вот фото.
Для ЛЛ - Там вообщем то внизу, описание процесса создания своего велосипеда, с фоточками, результатами и так далее)
Но поскольку, писать постик на пикабу, о том, как я распечатал все и вкрутил лампочку - это весьма скучное занятие, да и в этом нет ничего особо похвального, сказ я буду вести о том, как я все таки делал свой светильник, со своей конструкцией, электроникой и софтом.
После увиденного на сайте, у меня сразу в голове появилась идея, а почему бы мне, не взять вот этот светильник Луны, модифицировать корпус под то как мне надо и сделать свою начинку, не брать E27, а на адресной LED ленте и микроконтроллере, да что бы ещё и в умный дом интегрировалось и в алису и без костылей и с нормальным user-friendly интерфейсом и туда уже прикрутить своих анимаций, каких только вздумается. Сказано - сделано. Засел во Fusion 360 и сделал первую итерацию корпуса.
Конструкция была не замысловата и состояла всего из нескольких компонентов:
Сама ESP32-Dev
DC-DC модуль, который питал ленту, а так же саму ESP32 5 вольтами.
Горстка бонок М3
Стандартный порт питания 2.5 мм.
Лента на чипах WS2812B.
Пошарил по запасам и то чего хватило, то и использовал для старта, что бы не терять время пока с известных маркетплейсов идут остальные деталюхи. Фото прикладываю, но оно не совсем в хронологическом порядке, чисто для понимания как это выглядело во время разработки.
Какие были задачи в целом? Что должен уметь делать мой светильник, чего не умеют обычные умные лампы от известных брендов? Чем мой продукт, может отличаться? Вот такие вопросы я позадавал себе и нашел на них ответы:
Необходимо, что бы моя умная лампа, без проблем подходила на замену к обычной базе с цоколем Е27.
Добавить различные забавные, а так же удобные анимации, такие как: Огонь, Градиент, Температура свечения,Радуга, Статичный цвет, отображение фаз луны (в реалтайме) и ещё пару очень интересных анимаций, о которых я расскажу далее.
Веб интерфейс + приложение под Android/IOS в перспективе.
Интеграция в Home Assistance и\или интеграция в Apple Home/Алису.
Автообновление для ESP32 по воздуху. То-есть что бы с сервера подтягивался бинарник, сравнивалась версия и при необходимости она(ESP) сама перепрошивалась на актуальную версию.
Регулируемые анимации, каждая со своими параметрами и так далее. Вообщем опять же, настройки.
Каким то образом реализовать это все самому и без особых знаний в программировании, ну тоесть они есть, да, но я не программист со стажем, а 3д дизайнер и инженер.
Ну и собственно, вот такой веб интерфейс получился за пару дней кодинга:
Самое сложное, это было в целом предусмотреть кучу мини моментов. Таких как удобное подключение к Wi-Fi для пользователя, сохранение всех настроек, удобный поиск в веб браузере своего устройства и тд. В дальнейшем, это все ещё много раз изменилось, но для истории, вот как это выглядело в ранней альфе)
А вот с плафоном, вышло не очень. Из наличия филамента, был серый, и я подумал, что серая луна - будет выглядеть отлично и замечательно(ага ага). И как обычно это бывает, 31 декабря, у меня почти на финале, растягивается, а затем рвется ремень на 3д принтере из за чего получили вот такой дефект печати:
Но для тестирования, я все таки передал товарищу полный комплект со стримом с камеры, где печатается новый плафон, который и передал уже через 2 дня. Красивый, белый и полностью функциональный. Никто не в обиде)
По итогу, секторная анимация заработала хорошо и отображала текущую фазу луны, а так же и остальные анимации.
Прошу прощение за фото, но вот так выглядит анимация самой малой фазы луны. Лучше фото из архива не нашлось.
Вообщем, подарок подарен, отдан и вроде как дело сделано, но надо допиливать прошивку и улучшать своё творение. От чего, я решился на вторую такую же лампу, но для себя и с некоторыми изменениями.
Как я делал версию 2.0 для себя, я расскажу в следующем посте серии про светильники который выйдет уже очень скоро)
Там ждет и изменение конструкции, и добавление датчиков, новых модулей, и решение проблем перегрева, и проблем питания, а так же, новый красивый веб интерфейс, приложение для Android, обновление серверной части, админка и многое многое другое. Вообщем много много интересного.
А пока он не вышел, вы можете подписаться на мой тг, в скором времени (в данный момент у меня случился небольшой переезд) я начну поститить туда ещё и фотографии и видео процесса создания умного светильника.
https://t.me/magic_lamps
Как и говорил кто то в комментариях к предыдущему моему посту.
-"начало гидропоники..."
И да. Реально. Начало было положено похоже с этого комментария. Долго пытался себя убедить, что это мне не нужно, достаточно моей минифермы, но идею не победить и не сломить. Я решился опять на самую сложную наверное из реализуемых систем - Аэропонику.
Аэропоника это система, где раствор подается в виде распыления на корни. Так же в ней вроде бы как есть корреляция между размером капли и скоростью и качеством роста растений. Об этом есть подробнейшая статья на хабре, которую если интересно можно с упоением прочесть. А я на этот раз без долгих вступлений перейду сразу к делу.
Не менее 15 растений (в основном салаты)
Что бы влезла в имеющийся стеллаж из говна и палок леруа. (тот который деревянный, как в IKEA)
Форсунки низкого или среднего давления до 6 бар.
Умная и автономная система, корректирование раствора по показателям PH, PPM(EC) в автоматическом режиме, для выбранных растений.
Освещенность по заданному времени.
Интеграция с Home Assistance.
Интеграция в существующую систему. (1 насос, 2 бака, разные растения и разные типы полива)
Основное питание всех систем отвечающих за самые необходимые функции должно быть 12 вольт.
Резерв управляющих программ непосредственно в самом контроллере (время полива, периоды)
Резерв самого контроллера путем добавления второй UNO общающийся по шине I2C с основной, которая "бэкапит" заданные параметры в себя, и если произойдет отключение мастера по той или иной причине - она уже управляла реле(клапана и насос) и осуществляла полив.
Возможность добавления UPS, для резервации питания.
Отображение на экране оффлайн всех параметров.
И так, цели были обозначены, в моей голове тогда это было возможно не так подробно и структурированно, но примерно были такие мысли. Что было закуплено:
Arduino Mega в связке с ESP8266 от RobotDyn.
Ещё 2 соленоида 12 вольт с выходами на 1\2.
Дождеватели\Туманообразователи на трубку 8\11мм
Контейнер
Трубка 8\11мм
Блок реле на 6 штук.
Датчик уровня влажности (для расширения показаний в моей почвенной ферме)
Термопара
Бак на 10 литров
2 контейнера для еды.
Субстрат пеностекло
Горшочки для выращивания в гидропонике 55мм.
Удобрения A+B двухкомпонентные
PH Up PH Down
TDS метр.
2 перистальтических насоса.
PH модуль для Arduino
TDS модуль для Arduino
Разъемы 3\4\5 пин, по типу авиационных с контровкой(какие были)
Стойки для плат, либо нашел в загашнике либо на барахолке купил по дешевке.
Болтики, и прочую муть либо была найдена, либо докуплена по необходимости в зеленом магазе.
Экраны ( но об этом чуть позже и почему так много.) (OLED, TFT LCD и наконец таки Nextion Intelligent 800*480 с емкостным сенсором)
Врезки, шланги, переходники.
Началось всё с прототипирования. Пару вечеров кодинга скетчей для Arduino и ESP. Что то взял из старого кода, что то пришлось запилить с нуля. И в итоге получил вот такую картину.
Состояние подключения на экране. Т.к. экран обновляется с определенной частотой, к сожалению на фото попал именно момент обновления.
Кружочки сверху - состояние реле, температура с термопары, датчики влажности почвы от S1 до S3 ( на тот момент ещё не было функционала отображения отключения датчика, а 100% это именно отключенный датчик). Скорость потока и уровень воды в емкости.
Все это весело переключалось раз в 10 секунд между "экранами" и отображало мне необходимую статистику. Я хотел сделать управление кнопочным или через энкодер, но что то в какой то момент, мне показалось это не столь удобным и я порывшись на озоне, нашел достаточно большую для моего проекта панель LCD TFT с резистивным сенсором, которая была по скидке. Ну и пошло поехало. Перепиливаем интерфейс, перепиливаем половину кода. Разбираемся с тем, как вообще работает это китайское чудо
Ну и собственно пока что, я остановился на этом дисплее. В данный момент времени, мне едет дисплей Nextion Intelligent, который я планирую вынести как отдельный модуль в удобное место, т.к. он подключается по 4 контактам и позволяет это сделать, тогда как текущая панель вообще является шилдом и контактов там ну проще сказать дохера.
Причина по которой я решил сменить экран проста: медленное обновление(ооочень) и крайне тупой тач. И как бы одно дело, если бы я всегда обновлял при изменениях весь экран, но нет. Я обновляю и перерисовываю только то - что действительно изменилось. Тач я откалибровал и нажатия успешно считываются как ногтем, так и стилусом, но происходит это через раз, и выглядит как будто я попал в 2005 год все манипуляции. Вообщем мне такой вариант не понравился. Скоро будет обновление.
Как я и говорил в прошлом посте, связь с Home Assistance установлена посредством MQTT, да и остальная логика почти не изменилась. Добавился лишь небольшой функционал. Поэтому описывать принцип работы смысла особого не вижу.
Небольшой видеообзор. (автор не блогер и не видеооператор, да и оратор так себе из меня, постарался вырезать эк бэк меки, но не везде)
В основном, вся автоматика работает хорошо, осталось только следить за раствором, температурой, как чусвствуют себя растения и мониторить обстановку.
В теме аеропоники я не сильно спец, если тут есть такие - жду ваших советов, комментариев.