Добрый день!
Необходимо в данном проекте заменить насосы на два шаговых мотора (на один драйвер или к каждом мотору драйвер, не принципиально). Возможно перестроить на arduino nano скажем, тоже не принципиально.
Суть: При достижении определённого pH два мотора одновременно включались на заданное время, один откачивает старый раствор, другой доливает новый, затем пауза и цикл повторяется, если pH завышен.
Насколько трудозатратна и возможна данная операция и сколько будет стоить?
Схему и скетч прикладываю
В скетче коррекция как вверх, так и вниз. Мне нужно только занижать pH, так как он только растёт постоянно.
#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);
}