Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Открой для себя волшебный мир реальной рыбалки. Лови реальную рыбу на реальных водоемах! Исследуй новые рыболовные места и заполучи заветный трофей.

Реальная Рыбалка

Симуляторы, Мультиплеер, Спорт

Играть

Топ прошлой недели

  • Oskanov Oskanov 8 постов
  • alekseyJHL alekseyJHL 6 постов
  • XpyMy XpyMy 1 пост
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Новости Пикабу Помощь Кодекс Пикабу Реклама О компании
Команда Пикабу Награды Контакты О проекте Зал славы
Промокоды Скидки Работа Курсы Блоги
Купоны Biggeek Купоны AliExpress Купоны М.Видео Купоны YandexTravel Купоны Lamoda
Мобильное приложение

Arduino это просто

995 постов сначала свежее
45
feeld
feeld
1 месяц назад
Arduino & Pi
Серия Гидропоника

Действительно умная ферма. Часть 3.2. TDS/EC сенсор. Питание растений⁠⁠

Очередной пост, про мою ферму, да про сенсоры важные. Начну издалека и постараюсь простыми словами.


Зачем вообще мерить EC\TDS и температуру в питательном растворе?

Эти параметры показывают, насколько концентрирован наш раствор. А значит — хватает ли питания растениям или им через чур много и это не усвоится. Почему вообще на гидропонике все быстро растет? Потому что растениям не надо тратить силы и энергию на то, что бы искать все больше и больше ресурсов своей корневой системой и впитывать их из земли, а ещё кислород, его часто не хватает, именно поэтому часто советуют делать всякие подмесы в грунт для его "рыхлости", а в гидропонике мы выдаем все эти ресурсы сразу на блюдечке с голубой каемочкой и вот тут то главное правильно сервировать блюдо!

Действительно умная ферма. Часть 3.2. TDS/EC сенсор. Питание растений Arduino, Электроника, Гидропоника, Растения, Питание, Цветы, Инженер, Гаджеты, Растениеводство, Ботаника, Садоводство, Длиннопост

Нейроарт как вообще в гидропонике то все устроено.


Параметр EC.

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.

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. Пока не отключал старый, поэтому расскажу и про него.

Действительно умная ферма. Часть 3.2. TDS/EC сенсор. Питание растений Arduino, Электроника, Гидропоника, Растения, Питание, Цветы, Инженер, Гаджеты, Растениеводство, Ботаника, Садоводство, Длиннопост

Вот такой TDS метр у меня стоит, но более не используется для измерений EC(на это значение опирается вся система) а просто выводит дублирующее показание в PPM, новому сенсору.

С ним всё ок и его даже реально откалибровать. Только один ньюанс. Для гидропоники он не подходит чисто технически. У него потолок измерений 1000 PPM (около 1.0 EC) и даже его он показывает с трудом. За то идеален в обратную сторону, там где надо мерить чистоту. Вот тут у него реально нет аналогов за его стоимость. Он конечно может и 5 EC вам показать, только это будут ненадежные данные, тк его невозможно откалибровать, свыше 1 EC у него уже нелинейная интерполяция, проще говоря он становится генератором рандомных чисел. В дальнейшем я его вытащу и сделаю из него прибор для умного проточного фильтра для питьевой воды. Что бы понимать когда менять кассеты и тд.
А поскольку он не подходил то я приобрел вот такой вот EC метр.

Действительно умная ферма. Часть 3.2. TDS/EC сенсор. Питание растений Arduino, Электроника, Гидропоника, Растения, Питание, Цветы, Инженер, Гаджеты, Растениеводство, Ботаника, Садоводство, Длиннопост

Оверкилл для этой системы. Но работает отлично.

у него уже и питание "взрослое" (от 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;

}

eadECVoltage_new() — измерение напряжения:

  1. Считывает аналоговое значение с EC-датчика (analogRead) → от 0 до 4095

  2. Обновляет кольцевой буфер последних измерений для сглаживания

  3. Вычисляет среднее значение по буферу

  4. Переводит среднее значение в напряжение (вольты) по формуле:
    voltage = (среднее / ADC_RESOLUTION) × VREF

  5. Возвращает полученное напряжение — это ещё не EC, а просто "что пришло с датчика"

readEC_new() — шаги:

  1. Вызывает readECVoltage_new() → получает среднее напряжение

  2. Компенсирует делитель напряжения, чтобы получить реальное напряжение на датчике

  3. Переводит напряжение в значение EC по диапазону датчика

  4. Сглаживает значение EC с помощью EMA-фильтра (плавное обновление)

  5. Округляет EC до десятых (0.1) и переводит из μS в mS/cm

  6. Логирует результат (напряжение и EC) для отладки

  7. Возвращает EC (в мСм/см) — дальше это значение:

    • передаётся в WebSocket (SENSOR_UPDATE)

    • записывается в лог (tds_log.csv)

    • отображается в интерфейсе

Компенсация температуры для TDS метра.

В моем модуле, уже присутствует температурная компенсация,а в 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 и будете правы. Это блажь и излишек. Но мне нравится такого рода автоматизации и упрощение своей жизни.

Спасибо за внимание!

Показать полностью 3
[моё] Arduino Электроника Гидропоника Растения Питание Цветы Инженер Гаджеты Растениеводство Ботаника Садоводство Длиннопост
1
5
ardublock
ardublock
1 месяц назад
ArduBlock

Обновление ArduBlock от 05.05.2025 (замена архива ArduBlock3) Поддержка плат - Arduino, ESP, STM, MIK, BIT⁠⁠

[моё] Видео ВК Arduino YouTube Вертикальное видео Ardublock Новинки Видео
0
20
MaksSim33
MaksSim33
1 месяц назад
Arduino & Pi

Управление 8–16 реле с сенсорного дисплея в Easy HMI и Arduino, ESP32⁠⁠

Ранее я уже создавал проекты по управлению реле с использованием сенсорных дисплеев DWIN и Nextion. Реализация этих проектов не представляет большой сложности. Для этого требуется отрисовывать графику, правильно её нарезать и предварительно изучить недружелюбную документацию, в случае DWIN. С помощью программы Easy HMI это можно сделать гораздо быстрее. Создать проект можно минут за 20–30.

Уроки Easy HMI.

Показать полностью
[моё] Arduino Программа Гайд Инженер Дисплей Реле Программирование Видео ВК Видео
0
37
feeld
feeld
1 месяц назад
Arduino & Pi
Серия Гидропоника

Действительно умная гидропоника. Часть 3.1 Датчики и сенсоры. PH сенсор⁠⁠

По просьбам трудящихся, я постараюсь сделать это в виде некоего обучающего рассказа что ли. Но конечно не step by step инструкции. Краткие выдержки кода и описание алгоритмов и чего куда вообще совать что бы эти ваши показания получать. Сегодня поговорим о PH сенсорах и моем опыте. Я подразобью на более короткие посты для удобства чтения.

PH Sensor

Я пробовал 2 сенсора PH. от DF-Robot и дешевый из синего маркетплейса.

1/2

Вот такие сенсоры

Ссылки на все я приведу в конце поста.

Сейчас я использую pH-датчик от DFRobot — он отлично подходит для непрерывного мониторинга 24/7. Показания стабильны, со временем не «плывут» (дрейф отсутствует — проверено на практике), а калибровка реализована удобно и просто. Чуть позже покажу, как она устроена на примерах кода.

А вот с дешёвым noname-датчиком всё гораздо веселее. На плате два подстроечных резистора: один, судя по всему, отвечает за калибровку нулевой точки (pH 7.0), второй — за чувствительность. Документации — минимум. Настроить этот модуль так, чтобы он давал стабильные показания, — почти как пройти Super Meat Boy на 100%… и не сломать ничего от сгоревшей пятой точки..

Действительно умная гидропоника. Часть 3.1 Датчики и сенсоры. PH сенсор Инженер, Arduino, Электроника, Гаджеты, Тестирование, pH-фактор, Гидропоника, Аэропоника, Растения, Длиннопост

Небольшая сравнительная таблица, информации мало для сравнения.

Стоит ли покупать дешёвый pH-сенсор? Нет и ещё раз нет. Даже если ваш код написан идеально, это не спасёт от нестабильной работы самого датчика. Через день-два показания могут начать «плавать» — pH то завышается, то занижается на 3–4 единицы без видимых причин. Сенсор просто начинает вести себя непредсказуемо.

И если у вас на такие данные завязана автоматика (например, дозаторы pH- или pH+), последствия будут неприятными: система начнёт вносить корректоры на основе ложных показаний. В итоге — испорченный раствор и потеря времени, так ещё и потраченные впустую корректоры PH.

Сенсоры от DFRobot мне показались гораздо стабильнее и надёжнее. Да, они стоят дороже, но по опыту — это оправданно. Поэтому далее всё что написано, относится к конкретно H-101 сенсору.

Подключение РH.

Подключение pH-сенсора — дело довольно простое. Информация по распиновке обычно указана прямо на сайте производителя или в описании товара (в том числе на AliExpress). Всё, что нужно — подключить выход сенсора к аналоговому входу вашей платы: будь то ESP32, Arduino или любая другая платформа.

Этот конкретный сенсор, судя по данным и практике, выдаёт сигнал до 3.3 В, так что его можно безопасно подключать напрямую к пинам ESP32 — без делителя напряжения. Я так и делаю, и всё работает стабильно. Делитель нужен, только если сенсор выдаёт до 5 В (что бывает у некоторых моделей), а ваша плата работает от 3.3 В. В случае с классической Arduino делитель не нужен, так как она спокойно воспринимает до 5 В на аналоговых входах.

Действительно умная гидропоника. Часть 3.1 Датчики и сенсоры. PH сенсор Инженер, Arduino, Электроника, Гаджеты, Тестирование, pH-фактор, Гидропоника, Аэропоника, Растения, Длиннопост

Подключение.

Калибровка PH.

Калибровка pH-сенсоров всегда выполняется с помощью буферных растворов — это жидкости с точно заданным значением pH. Калибровка может быть двух- или трёхточечной: чем больше точек, тем точнее можно подогнать датчик под реальный диапазон.

Буферные растворы бывают в виде порошков (которые нужно растворить) или уже готовые к использованию. Их подбирают так, чтобы они охватывали рабочий диапазон измерений.

В моём случае я использую двухточечную калибровку — по значениям pH 4.0 и pH 7.0, чего вполне достаточно для контроля большинства питательных растворов.

Действительно умная гидропоника. Часть 3.1 Датчики и сенсоры. PH сенсор Инженер, Arduino, Электроника, Гаджеты, Тестирование, pH-фактор, Гидропоника, Аэропоника, Растения, Длиннопост

Буферные растворы для калибровки PH.

Сама калибровка проходит в два последовательных этапа. Сначала сенсор промывается в дистиллированной воде и аккуратно просушивается (я использую салфетку, не протирая стекло — просто промакиваю). После этого сенсор помещается в буферный раствор с 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);

}

Что делает эта функция:

  1. Считывает напряжение с pH-сенсора и проверяет, стабилизировалось ли оно (внутри readStablePHVoltage).

  2. Если сигнал нестабилен, калибровка прерывается и выводится предупреждение в лог.

  3. Если всё в порядке, сохраняет измеренное значение в EEPROM, устанавливает флаг flag = true, и выводит подтверждение об успешной калибровке.

  4. Используется отдельно для pH 4.0 и pH 7.0, передавая соответствующую метку (label), адрес в EEPROM и переменную для сохранения значения.

  5. Функции 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

При измерениях любых параметров жидкости необходимо учитывать её температуру, так как это напрямую влияет на точность показаний. Особенно это критично для 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 сенсор, температурный датчик.

Показать полностью 5
[моё] Инженер Arduino Электроника Гаджеты Тестирование pH-фактор Гидропоника Аэропоника Растения Длиннопост
0
57
feeld
feeld
1 месяц назад
Arduino & Pi
Серия Гидропоника

Действительно умная гидропоника. Часть 2⁠⁠

Собственно продолжение поста про моё устройство для выращивания различных растений.

Первая часть тут - Действительно умная гидропоника. Часть 1.

  • Функция измерения веса. Покажу конструкцию в 3д, так как показывать её в реальности весьма затруднительно. Я использую 60мм горшочки для гидропоники, поэтому проектировал под себя и свои нужды.

1/5

Сама измеряющая платформа с тензодатчиком. Печатается на 3д принтере и вставляется в мой кейс с растениями вместо обычной платформы (одной из 3х)

Собственно на изображениях видно, по центру стоит тензодатчик и вокруг него равноудаленно 7 слотов под горшочки с субстратом. От тензодатчика провод идет в АЦП HX711, но тут было несколько ньюансов:
А) Обязательно заэкранировать кабель подключения от самого тензодатчика(я обернул экраном наполовину) и довести экран до АЦП.
Б) Провести провод так, что бы если по нему капилярным эффектом начнет подниматься вода, он не добрался до датчика. Я сделал простую петлю и разместил его выше чем сам тензодатчик. Таким образом вода точно никак не попадет на АЦП.
Сам же АЦП в герметичном корпусе. и вынесен отдельно от системы и подключается через TYPEC-TYPEC провод любой длины.

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

1/2

Корпус для АЦП.

Собственно сама функция измерения веса не замысловата и просто измеряет вес всего что стоит на ней. Тарирована вместе с платформой по умолчанию. Калибровка осуществляется по известному весу и выборкой в 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? и тд. ) все это пишется, запоминается и анализируется.

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Ну и собственно график роста по CSV данным. Вот так салаты росли примерно с 25.04. (все что старше 30 дней улетает в долгосрочную память). Есть шумы и провалы, все таки я то трону весы, то сами растения на них, во время осмотра, все в норме.

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

Внешне это выглядит вот так:

Контейнер

Ну что бы далеко не отходить уже от конструкции, чуть вильнем в эту сторону. Это тоже отдельный и большой этап.

Контейнер для выращивания у меня сделан из ПВХ пластика на фрезерном ЧПУ. Тоесть по сути это был конструктор для склеивания. Клеил специальным клеем и сверху проходился ещё герметиком, тк вода может стоять в процессе эксплуатации весьма большим объемом. (около 1.8 литров. Возможно это не доработка и я поправлю в следующей генерации этот момент, но пока все работает отлично. Спроектирован так, что бы на обычном принтере можно было напечатать 3 крышки для высаживания растений и что бы влез в обычный металический стеллаж. Как по высоте так и по ширине. Идеально входил в стеллаж 800*300, тк изначально собственно под него и проектировался.

1/2

Конструкция контейнера.

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

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Вариант 1, форсунки в верхней части направлены вниз.

Я сделал около 4-5 вариантов в модели, примерно просчитал конусами ~55 градусов, что соответствует моему давлению и диаметру форсунок. И самый нормальный вариант как по мне, без лишнего изобретательства велосипеда, это разместить их на будущем уровне воды внизу под 35 градусов к поверхности. Так же они заполняют пробелы друг друга. По одному борту стоят 4, по другому тоже 4 но со смещением на около 50мм.

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

В итоге финальный вариант выглядит уже вот так.

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

Конструкция бака

Тут особо рассказывать нечего. Тут я не изобретал велосипед и сделал из контейнера удовлетворившего мои условия. Он должен закрываться плотно на защелки и быть не прозрачным, подходить по размеру. В принципе это всё. Дальше дело техники, я все монтировал на крышку, что бы при необходимости её поднять и вытащить сам бак и помыть\заполнить водой или что то ещё сделать, но честно я этого не делаю)) потому что заливаю воду просто в контейнер и она сама наполняет бак, но ситуации могут быть разные. Для обслуживания единственное что важно было, это не крепить ничего на сам контейнер, тк провода или шланги в дальнейшем будут мешать его обслуживанию.
Единственное что пришлось сделать, это закрепить на быстросъемном печатном креплении датчик наличия воды на безопасном для насосе уровне. Если вдруг я все таки не увижу отсутствие раствора, он отключит насос и не даст ему работать вхолостую.

Продолжаем по функциям (системные функции)

  • Диспетчер задач. Да да, вы не ослышались. У меня есть свой диспетчер задач с блэкджеком и памятью. На самом деле вещь сугубо дебажная. Показывает она приоритет, ядро исполнения, сколько стека ест та или иная задача, за сколько выполняется и есть ли опасность краша системы по Watchdog, так же есть апи поинты для остановки или перезапуска задач, но пока в интерфейс не интегрировал ещё. Конечно это касается только задач FreeRTOS, задачи в Loop цикле при этом никак не отображаются.

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Диспетчер задач

Лог система

  • Лог система, это отдельная вещь, тк в такой сложной системе надо логировать всё и ещё раз всё что можно. Но все же сталкивались с тем что в луп написал println и значение и больше в логах ты не хозяин. Да, конечно можно Усовершенствовать это делеями, а лучше миллисами или yield ами, но это разве гибкость? Когда логов становится много. Нет, не так. МНОГО, ОЧЕНЬ МНОГО, за пару секунд собирается 30-40 строк, пора что то с этим делать. А ведь так не хочется трогать уже сделанное полезное логирование, вдруг оно опять понадобится позже. Поэтому я уже известным путем и пошел. Сделал просто обертки для функций логирования, но уже с аргументами уровня логирования. DEBUG INFO WARNING ERROR. И собственно параметрами куда это самое логирование отслыать, в телегу на сд карту или в веб интерфейс. В тг просто по приколу, я хрен знает зачем, мне ни разу не пригодилось. А вот на SD очень даже, в связи с этим на фронте на самой ESP появилась даже кнопочка скачать лог. Пришлось ограничить правда размер до 4мб, как правило этого хватает для всех нужд. Но не было печали купила баба порося, это то я все сделал, но как отлавливать PANIC/WDT и прочие неприятности когда ты по ошибке вылез за предел массива или сожрал весь HEAP? Правильно, взять дешман ESP32Dev модуль и подцепить его TX\RX2 в RX\TX0 на Main ESP32S3 и заставить его читать вообще всё и отсылать по вебсокету на свой веб интерфейс. А ещё можно прикрутить кнопку принудительной перезагрузки контроллера, перепрошивки без необходимости лезть в корпус и подсоединять USB.

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Возможность задать уровень настроек логирования.

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Логирование всей фермы SLAVE контроллером на ESP32. Все идет в Live режиме, без перезагрузок страницы и без задержек через WebSocket.

Тут же прикрутил и фильтрацию логов по системам которые определяются автоматически, прикрутил MQTT для удаленного перезапуска Main и самое главное, на SLAVE сохраняются все Backtrace c Master контроллера и коды ошибок для дальнейшей диагностики + лог за минуту до критической ошибки. И вот это уже настоящая имба. Ты буквально независим от ошибок и USB провода и можешь прочитать всё что тебе нужно независимо от того, что с Master контроллером. Так ещё и ладно, эту идею можно развить и дальше, Slave контроллер может быть и резервным контроллером. Например самые важные функции это полив и свет, вполне можно автоматически дублировать и управлять теми же самыми реле при отключении Master контроллера. Уведомлять пользователя и тд. В будущем такое обязательно будет, но количество лапши внутри корпуса уже заставляет дергаться оба глаза. Поэтому потом, когда нибудь.

Резюмируя систему логирования, она получилась мощная, быстрая, понятная и самое главное удобная для использования. А большего мне и не надо. Красивости в ней только мешают, поэтому тут дизайна как такового и нет.

MQTT и умный дом.

Так же отдельный большой раздел.

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Настройки подключения к MQTT. Все отображается в лайве, а так же есть подсказочки на какие топики подписаться если нужно это сделать вручную.

Обычно я не шел дальше ручной подписки на нужные топики, но тут что то захотелось ну прям автоматически все чтоб было. Итог таков. Если у вас дома есть Home Assistance и стоит расширение MQTT, вам больше ничего не надо делать. Все найдется и добавится в систему автоматически как надо и без танцев с конфигурациями, отдельным устройством, в котором усе уже сконфигурировано как нужно.

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Мелочь, а указание авторства доставляет удовольствие.

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Сама страничка сенсоров и релюшек.

Конечно забавно, но виртуальные реле из HA добавляются снова в HA, можно исправить, но не вижу смысла)

Не знаю, тут особо рассказывать то больше и нечего, из HA можно прокинуть уже куда хотите, хоть в Apple Home, хоть в Алису. Задавать сценарии и тд. В будущем возможно я расширю возможности настроек MQTT, что бы можно было выбрать а что конкретно вообще по этому вашему MQTT передавать то, но пока это жестко захардкожено и он передает все сенсоры и все реле. А больше как будто и не нужно, разве что блокировку таймеров и их настройку ещё бы завести, но как будто ту мач.

Система

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Системный раздел умной фермы

Отсюда, можно забэкапить всё, что происходит в системе. конфигурацию реле, насосов, удобрений, бака, посадки и так далее и тому подобное. Всё качается в ZIP архиве и так же восстанавливается в одну кнопку на чистой системе. Это очень очень полезно, тк я за время тестирования и кучи форматирований флешек и Spifs просто устал заполнять всё руками. А так же помогает если вдруг вы сменили SD или отчистили SPIFS обновив прошивку. (Дада, кнопка файловой системы называется LittleFS так это потому что я всегда их путаю, но в данном проекте SPIFS)

Ну и возможность обновить систему через OTA .bin или обновить сам веб интерфейс, чего я делать больше не планирую.

Telegramm

Это последняя в этом посте система, телеграмм уведомления.

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Ну во первых, она может срать вам в личку постоянными уведомлениями о срабатывании таймеров.

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Во вторых, может уведомлять о том, что система засорена и насос не будет включен, или кончился раствор. (скриншоты из тестирования)

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Конечно же она шлет ежедневные отчеты в 9 или во сколько вы выберете утра. С фотографией, параметрами и счетчиком незапланированных перезапусков за все время. (незапланированный перезапуск, это перезапуск даже от обновления прошивки, его можно скинуть)

Ну и конечно, система может выслать вам неприятные сообщения, которые вас уже изрядно бесят.

Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост
Действительно умная гидропоника. Часть 2 Инженер, Приложение, Esp32, Arduino, Гаджеты, Электроника, Своими руками, Пайка, Гидропоника, Аэропоника, Салат, Сад, Выращивание, Перец, Помидоры, Изготовление, Видео, Без звука, Короткие видео, Длиннопост

Ну и последнее

Каждый запуск системы, это куча проверок на работоспособность всех микросервисов системы. И их запуск. О чем телеграмм бот и сообщает. Тут немного дублируется логирование, тк STILL BETA. Но ничего)

Давайте на этом закончим вторую часть. В третей, я хотел бы рассказать уже о датчиках, их калибровке, температурных компенсациях, проблемах, шкалах NaCl и других. Австралийских аршинах в измерении EC. А в четвертой, если успею доделать 4.2, расскажу об интерфейсах взаимодействия с фермой. (Веб интерфейс, экран Nextion) вообщем очень много какой инфой могу поделится в этом цикле постов.

Показать полностью 24 1
[моё] Инженер Приложение Esp32 Arduino Гаджеты Электроника Своими руками Пайка Гидропоника Аэропоника Салат Сад Выращивание Перец Помидоры Изготовление Видео Без звука Короткие видео Длиннопост
8
14
ardublock
ardublock
1 месяц назад
ArduBlock

ArduBlock Mini - DHT11 и Дисплей 1602⁠⁠

[моё] Видео ВК Arduino YouTube Вертикальное видео Ardublock Видео
1
10
ardublock
ardublock
1 месяц назад
ArduBlock

ArduBlock Mini - Потенциометр и Servo SG90⁠⁠

[моё] Видео ВК Arduino YouTube Вертикальное видео Ardublock Видео
0
7
ardublock
ardublock
1 месяц назад
ArduBlock

ArduBlock Mini - Светодиод Цифра или PWM⁠⁠

[моё] Видео ВК Arduino YouTube Вертикальное видео Ardublock Видео
1
Посты не найдены
О Нас
О Пикабу
Контакты
Реклама
Сообщить об ошибке
Сообщить о нарушении законодательства
Отзывы и предложения
Новости Пикабу
RSS
Информация
Помощь
Кодекс Пикабу
Награды
Команда Пикабу
Бан-лист
Конфиденциальность
Правила соцсети
О рекомендациях
Наши проекты
Блоги
Работа
Промокоды
Игры
Скидки
Курсы
Зал славы
Mobile
Мобильное приложение
Партнёры
Промокоды Biggeek
Промокоды Маркет Деливери
Промокоды Яндекс Путешествия
Промокоды М.Видео
Промокоды в Ленте Онлайн
Промокоды Тефаль
Промокоды Сбермаркет
Промокоды Спортмастер
Постила
Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии