Автоподача воды в кофемашину
- Войдите на сайт для отправки комментариев
Добрый день, есть кофемашина VBM junior db, в нее довольно неудобно наливать воду, хочу сделать автоподачу на базе ардуино, но нуждаюсь в компетентной помощи в построении схемы и её возможного упрощения.
В самой машине предусмотрен контроль за количеством воды в баке: под площадкой с емкостью для воды находиться обычный концевик, если вес бака недостаточный, чтобы нажимать на кнопку концевика, система отключается:

Вода подается из накопительного бака обратного осмоса, под давлением,
далее электромагнитный клапан вот такой (питание 12в):
Так же куплен бесконтактный датчик жидкости xkc y25:
Так же есть Arduino uno и два esp12
Как планирую реализовывать:
Сигнал с концевика кофемашины пробуждает Ардуину, которая в свою очередь подает питание на клапан, и одновременно слушает датчик XKC Y25, который находится на верхнем уровне бака. Как только появился сигнал от датчика XKC, питание на клапан выключается, ардуина уходит в сон.
Вме довольно просто должно быть с реализацией, но хотелось бы добиться надежности и безотказности системы, т.к. неверная обработка сигнала с датчика может потенциально привести к потопу.
Если уже есть какие-то реализованные подобные проекты, пожалуйста поделитесь ссылками. Буду благодарен за любую полезную информацию !


Решил все же использовать arduino uno, тк у него есть выводы 5v, => не нужно отдельное питание для датчика. Клапан тоже реагирует на подачу 5v, но у него потребление около 500mA, насколько я понимаю UNO столько не потянет.
С кодом у меня проблемы, т.к. это едва ли не первый опыт написания. бОльший кусок взят из статьи по датчику XKC y25, изменены только назначения пинов и совсем немного логика действий.
// Назначаем пины int COFFEE_PIN = 2; // входящий сигнал от концевика int RELAY_PIN = 3; // сигнал на реле, управляющее клапаном int SENS_PIN = 4; // сигнал от датчика XKC Y25 int LED_PIN = 13; // // Текущее состояние сенсора bool SensorState = false; // Время начала смены unsigned long SensorStartChange = 0; // Защитный интервал между сменами состояния unsigned long TIMEOUT = 2000; // Текущее время unsigned long CurrentTime = 0; void setup() { // Светодиод это выход pinMode(LED_PIN, OUTPUT); // Вначале не светим digitalWrite(LED_PIN, LOW); // Реле в положении выключить. digitalWrite(RELAY_PIN, LOW); // Сенсор это вход pinMode(SENS_PIN, INPUT); // Реле это выход pinMode(RELAY_PIN, OUTPUT); } void loop() { // Устанавливаем текущее время CurrentTime = millis(); // считываем сенсор boolean CurrentState = digitalRead(SENS_PIN); // если текущее состояние сенсора отличается считанного if (CurrentState != SensorState) { // если отсчет таймера смены состояния не начат, начинаем if (SensorStartChange == 0) SensorStartChange = CurrentTime; // если новое состояние приняло свое значение за время большее чем время таймаута if (CurrentTime - SensorStartChange > TIMEOUT) { // меняем состояние сенсора SensorState=!SensorState; // сбрасываем время начала смены состояния SensorStartChange = 0; // если текущее состояние сенсора 1, то включаем светодиод if(SensorState){ digitalWrite(LED_PIN, LOW); digitalWrite(RELAY_PIN, HIGH); // если текущее состояние сенсора 0, то выключаем светодиод }else{ digitalWrite(LED_PIN, HIGH); digitalWrite(RELAY_PIN, LOW); } } // смена состояния не состоялась, сбрасываем таймер }else{ SensorStartChange = 0; } }Условная схема (условная, потому что в circuit.io нет именно тех компонентов, что я использую)
Впринципе схема работает корректно, но при подключении клапана к реле начинаются проблемы: реле замыкается и размыкается каждые 2 секунды. Я думаю это связано с дребезгом контактов, попробую использовать триггер шмитта, чтобы избежать данной проблемы.
Если у кого-то есть идеи по улучшению кода или схемы, пожалуйста напишите !
Можно попроще записать -
// Назначаем пины #define COFFEE_PIN = 2; // входящий сигнал от концевика #define RELAY_PIN = 3; // сигнал на реле, управляющее клапаном #define SENS_PIN = 4; // сигнал от датчика XKC Y25 #define LED_PIN = 13; // // Защитный интервал между сменами состояния const unsigned long TIMEOUT = 2000; void setup() { // Светодиод это выход pinMode(LED_PIN, OUTPUT); // Вначале не светим digitalWrite(LED_PIN, LOW); // Реле в положении выключить. digitalWrite(RELAY_PIN, LOW); // Сенсор это вход pinMode(SENS_PIN, INPUT); // Подтяжка входа сенсора digitalWrite(SENS_PIN, HIGH); // Реле это выход pinMode(RELAY_PIN, OUTPUT); } void loop() { // Считываем состояние датчика раз в 2 сек static uint32_t prevSmillis = millis(); if (millis() - prevSmillis > TIMEOUT) { static boolean SensorState = digitalRead(SENS_PIN); //Соответственно сост. датчика выставляем уровни на пинах digitalWrite(LED_PIN, !SensorState); digitalWrite(RELAY_PIN, SensorState); prevSmillis = millis(); } }Возможно, у вас не дребезг, а колебания уровня. Попробуйте увеличить таймаут.
ЗЫ. Если из-за колебаний уровня, то надёжнее будет "физический" гистерезис - по двум датчикам (предельного нижнего и предельного верхнего уровня). По нижнему начинаем заполнение, по верхнему - отключаем.
Поделитесь плз ссылкой на клапан
сигнал с концевика взводит триггер, который активирует реле. Сигнал с емкостного датчика этот триггер сбрасывает. Зачем ардуино?
Поделитесь плз ссылкой на клапан
сигнал с концевика взводит триггер, который активирует реле. Сигнал с емкостного датчика этот триггер сбрасывает. Зачем ардуино?
Вот клапан
https://ru.aliexpress.com/item/Free-shipping-Plastic-solenoid-valve-12VD...
Идею вашу обдумаю, к сожалению я гумманитарий и только начинаю постигать азы электросхем :)
Изучая тему пришел к выводу, что arduino тут как из пушки по воробьям. Попытался собрать схему по совету inspiritus, с управлением триггером. Вот что получилось:
К сожалению в реальности добиться работы электромагнитного клапана через мосфет не удалось, но его легко можно заменить на реле.
Однако я столкнулся с гораздо более серьезной проблемой - не понятно, как считывать сигнал с концевика, т.к. там скорее всего переменный ток.
Посему скорее всего для моей задачи идеально подойдет вот такая плата :
А бывает ещё залипает реле, зависает ардуина с открытым клапаном =)) должна быть еще защита от переполнения, а то зальёте соседей... Если позволяют размеры емкости поставьте обычный поплавковый клапан =)))