Общие сведения
Сегодня мы сделаем устройство, которое будет автоматически регулировать кислотность раствора, тем самым поддерживая её на одном уровне. Такую систему можно применять, например, при выращивании растений: когда необходимо готовить раствор удобрений заданной кислотности. В частности, в гидропонике — для поддержания постоянного уровня кислотности, который может меняться со временем. Давайте сегодня реализуем такую систему.
Кстати, мы у нас также есть проект по созданию нормализатора концентрации (TDS). О нём можно почитать в этой статье.
Видео
Нам понадобится
- 1х датчик pH;
- 1х четырёхразрядный индикатор;
- 2х перистальтический насос;
- 2х силовой ключ: p-канал или n-канал. Можно использовать и обычные реле.
- 1х контроллер Piranha Trema;*
- 1х USB – UART преобразователь;**
- 1х понижающий DC-DC преобразователь на 5В;
- 1х блок питания на 12В;
- 1x Гнездо питания на корпус 5.5x2.1 мм;
- ёмкости с концентратами и шланги для соединения;
- в качестве корпуса можно использовать ПВХ-конструктор.
* Можно использовать любой контроллер серии Piranha, Arduino, или ESP-32.
** Необходим для программирования контроллера Piranha Trema. Однако, можно обойтись без него: контроллер можно запрограммировать при помощи другого контроллера.
Некоторые модули можно не использовать, например, если вам не нужно отображение значения кислотности, можно убрать индикатор.
Схема
(картинка кликабельна)

Обратите внимание на установку джамперов на силовых ключах и DC-DC преобразователе.
Если насосы не перекачивают жидкость, поменяйте полярность их подключения: от неё зависит направление подачи раствора.
Скетч проекта
Установите библиотеку для работы с pH-метром и индикатором. Если необходима помощь в её установке, читайте статью. Если вы впервые работаете с контроллерами, вам поможет статья.
Загрузите код к контроллер при помощи USB-UART преобразователя. В пункте выбора контроллера Arduino IDE необходимо указать контроллер Arduino Mini.
#include <Wire.h> // Подключаем библиотеку для работы с шиной I2C #include <iarduino_I2C_pH.h> // Подключаем библиотеку для работы с pH-метром I2C-flash. #include <iarduino_4LED.h> // Подключаем библиотеку для работы с индикатором iarduino_4LED dispLED(4,5); // Объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO ) iarduino_I2C_pH pHsens; // Создаём объект pH-метра (адрес на шине I2C не указываем поскольку устройство на шине одно) #define pinPomp1 2 // Первый насос подключен к выводу 2 #define pinPomp2 3 // Второй насос подключен к выводу 3 /////////НАСТРОЙКИ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// const float dpH = 0.1; // Значение отклонения pH, при котором показания будут считаться не изменившимися (искусственная погрешность для устранения мерцания сотых значений на дисплее) const uint32_t portion = 400; // Время подачи порции концентрата, мс const uint32_t timeWait = 10000; // Время ожидания между подачами порции (время на размешивание раствора) const float phUp = 6.5; // Верхний уровень pH, после которого начнётся долив концентрата const float phDown = 5.5; // Нижний уровень pH, после которого начнётся долив концентрата //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// float midPh = 0.0; // Установившееся показание кислотности uint32_t timeLastPortion = 0; // Время последнего долива порции void setup() { pinMode (pinPomp1, OUTPUT); // Пин насоса - выход pinMode (pinPomp2, OUTPUT); // Пин насоса - выход Serial.begin(9600); // Открываем последовательный порт передачи данных if (!pHsens.begin()) Serial.println("pH-метр не инициализирован. Проверьте подключение и I2C-адрес модуля"); // Иниируем работу с pH-метром, и, в случае, если не удалось выполнить подключение, выводим сообщение об ошибке dispLED.begin(); // Инициируем работу с дисплеем dispLED.point(2, true); // Включаем точку } void loop() { float pH = pHsens.getPH(); // Измерение pH Serial.println("pH: "+ (String)pH); // Вывод значения pH в монитор порта if ((midPh < pH-dpH) || (midPh > pH+dpH)){ // Устранение малых колебаний значений midPh = pH; dispLED.print(midPh, 2); // Выводим показания pH на дисплей } if ((midPh > phUp) && (timeLastPortion + timeWait <= millis())) correctPh("down"); // pH завышен, нужно снизить else if ((midPh < phDown) && (timeLastPortion + timeWait <= millis())) correctPh("up"); // pH занижен, нужно повысить if (timeLastPortion + portion <= millis()) { // Если прошло время подачи порции, выключаем все насосы digitalWrite(pinPomp1,LOW); digitalWrite(pinPomp2,LOW); } } void correctPh (String target){ // Функция включения насосов timeLastPortion = millis(); // Фиксируем время начала работы насоса if (target == "down") digitalWrite(pinPomp1,HIGH); // Включаем нужный насос в зависимости от переданной в функцию строки if (target == "up") digitalWrite(pinPomp2,HIGH); }
Ссылки
- Автоматический нормализатор концентрации (TDS/EC)
- Библиотека для работы с pH-метром;
- Библиотека для работы с четырёхразрядным индикатором;
- Инструкция по установке библиотек;
- Инструкция по установке и настройке Arduino IDE;
- Полностью автоматизированная гидропоника с управлением через WiFi.
Обсуждение