Автоподача воды в кофемашину

ac1d
Offline
Зарегистрирован: 05.02.2017

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

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

 

Вода подается из накопительного бака обратного осмоса, под давлением,

далее электромагнитный клапан вот такой (питание 12в):

Так же куплен бесконтактный датчик жидкости xkc y25:

Так же есть Arduino uno и два esp12

Как планирую реализовывать:

Сигнал с концевика кофемашины пробуждает Ардуину, которая в свою очередь подает питание на клапан, и одновременно слушает датчик XKC Y25, который находится на верхнем уровне бака. Как только появился сигнал от датчика XKC, питание на клапан выключается, ардуина уходит в сон. 

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

Если уже есть какие-то реализованные подобные проекты, пожалуйста поделитесь ссылками. Буду благодарен за любую полезную информацию !

 

ac1d
Offline
Зарегистрирован: 05.02.2017

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

Если у кого-то есть идеи по улучшению кода или схемы, пожалуйста напишите !

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

ac1d пишет:
Если у кого-то есть идеи по улучшению кода или схемы, пожалуйста напишите !

Можно попроще записать -

// Назначаем пины
#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();
  }
}

Возможно, у вас не дребезг, а колебания уровня. Попробуйте увеличить таймаут.

ЗЫ. Если из-за колебаний уровня, то надёжнее будет "физический" гистерезис - по двум датчикам (предельного нижнего и предельного верхнего уровня). По нижнему начинаем заполнение, по верхнему - отключаем.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Поделитесь плз ссылкой на клапан

сигнал с концевика взводит триггер, который активирует реле. Сигнал с емкостного датчика этот триггер сбрасывает. Зачем ардуино?

ac1d
Offline
Зарегистрирован: 05.02.2017

inspiritus пишет:

Поделитесь плз ссылкой на клапан

сигнал с концевика взводит триггер, который активирует реле. Сигнал с емкостного датчика этот триггер сбрасывает. Зачем ардуино?

Вот клапан

https://ru.aliexpress.com/item/Free-shipping-Plastic-solenoid-valve-12VD...

 

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

ac1d
Offline
Зарегистрирован: 05.02.2017

Изучая тему пришел к выводу, что arduino тут как из пушки по воробьям. Попытался собрать схему по совету inspiritus, с управлением триггером. Вот что получилось:

 

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

Однако я столкнулся с гораздо более серьезной проблемой - не понятно, как считывать сигнал с концевика, т.к. там скорее всего переменный ток. 

Посему скорее всего для моей задачи идеально подойдет вот такая плата :

dachnik
Offline
Зарегистрирован: 26.07.2013

А бывает ещё залипает реле, зависает ардуина с открытым клапаном =)) должна быть еще защита от переполнения, а то зальёте соседей... Если позволяют размеры емкости поставьте обычный поплавковый клапан =)))