Как закодировать датчик расхода воды и электромагнитный клапан?

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

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

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

, 👍-1

Обсуждение

Фрагмент кода пожалуйста.. И объяснение, @kaisar Great

Время, в течение которого ваш соленоид открыт, также может указывать на количество пропущенной воды., @Paul

Вы спрашивали производителя датчика расхода воды, как он работает? Что вы пробовали сами? Какие номера моделей имеют эти датчики/приводы? Вы вообще что-то пробовали? Мы никоим образом не можем/будем предоставлять код для проекта, о котором мы не знаем деталей или проблем..., @Paul

Я пробую некоторые коды, которые я нахожу в Интернете здесь http://www.bc-robotics.com/tutorials/using-a-flow-sensor-with-arduino/, и марка и модель моего датчика расхода воды - морская модель yf s201 .. я понятия не имею, как этого добиться или установить предел., @kaisar Great


2 ответа


1

Используя YF201, вы не можете измерять менее 1 литра в минуту или более 30 л/м. (ссылка http://www.bc-robotics.com/tutorials/using -a-датчик-потока-с-arduino/)

Устройство посылает импульс каждые 2,25 мл жидкости, протекающей через него. Все, что вам нужно сделать, это взять количество, которое вы хотите пропустить (400 мл), и разделить его на 2,25 мл, и вы получите 177,8 пульса. Таким образом, как только ваш Arduino сосчитает 178 импульсов, вы закроете клапан.

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

,

2

привет @kaisar Отлично, вы не упомянули, какой датчик потока вы используете. Я предполагаю, что вы используете датчик расхода YF-S201 или YF-S401 (эффект Холла). Вам нужно сделать небольшой расчет для измерения расхода воды. Для измерения количества воды, прошедшей за определенное время через датчик расхода воды, ее сначала пропускали через датчик расхода воды, который был принят в качестве входного интерфейса в потоке. Формулы применяются для измерения количества оборотов/импульсов в минуту вращения.

Здесь я определил расход по изменению скорости воды. Скорость зависит от давления, которое форсирует сквозные трубопроводы. Поскольку площадь поперечного сечения трубы известна и остается постоянной, средняя скорость является показателем скорости потока. Базовое соотношение для определения расхода жидкости в таких случаях:

Q=VxA, где Q — расход/общий расход воды через трубу, V — средняя скорость потока и A — площадь поперечного сечения трубы

Коэффициент калибровки = Датчик на эффекте Холла выдает количество импульсов в секунду на литр/минуту расхода (проверьте свое техническое описание), здесь я взял 4,5.

Скорость потока (литров/минуту) = ((1000,0 / общее время) x количество импульсов) / коэффициент калибровки

Скорость потока (миллилитров в секунду) = (Скорость потока / 60) x 1000

Там вам нужно рассчитать общий расход воды за заданное время, добавляя скорость потока за каждую секунду. Там, после того, как вы проверите заданное значение (400 мл). Если условия вас устраивают, вы можете выключить электромагнитный клапан.

и код

int sensorInterrupt = 0;  // прерывание 0
int sensorPin       = 2; //Цифровой контакт 2
int solenoidValve = 5; // Цифровой контакт 5
unsigned int SetPoint = 400; //400 миль

/*The hall-effect flow sensor outputs pulses per second per litre/minute of flow.*/
float calibrationFactor = 4.5; //Вы можете изменить в соответствии с вашей таблицей данных

volatile byte pulseCount =0;  

float flowRate = 0.0;
unsigned int flowMilliLitres =0;
unsigned long totalMilliLitres = 0;

unsigned long oldTime = 0;

void setup()
{
  
  // Инициализировать последовательное соединение для передачи значений хосту
  Serial.begin(9600);
  pinMode(solenoidValve , OUTPUT);
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  /*The Hall-effect sensor is connected to pin 2 which uses interrupt 0. Configured to trigger on a FALLING state change (transition from HIGH
  (state to LOW state)*/
  attachInterrupt(sensorInterrupt, pulseCounter, FALLING); //вы можете использовать Rising или Falling
}

void loop()
{
   
   if((millis() - oldTime) > 1000)    // Обрабатывать счетчики только один раз в секунду
  { 
    // Отключаем прерывание при расчете расхода и отправке значения хосту
    detachInterrupt(sensorInterrupt);
        
    // Поскольку этот цикл может не завершиться ровно через 1 секунду, мы вычисляем количество миллисекунд, прошедших с момента последнего выполнения, и используем его для масштабирования вывода. Мы также применяем коэффициент калибровки для масштабирования выходных данных на основе количества импульсов в секунду на единицу измерения (в данном случае литров в минуту), поступающих от датчика.
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    
    // Обратите внимание на время выполнения этого прохода обработки. Обратите внимание, что поскольку мы
    // отключенные прерывания, функция millis() на самом деле не будет правильно увеличиваться
    // в этот момент, но он все равно вернет значение, которое было установлено непосредственно перед
    // прерывания исчезли.
    oldTime = millis();
    
    // Разделите скорость потока в литрах/минуту на 60, чтобы определить, сколько литров было
    // прошел через датчик за этот 1-секундный интервал, затем умножить на 1000, чтобы
    // конвертировать в миллилитры.
    flowMilliLitres = (flowRate / 60) * 1000;
    
    // Добавляем миллилитры, пройденные за эту секунду, к общему итогу
    totalMilliLitres += flowMilliLitres;
      
    unsigned int frac;
    
    // Вывести скорость потока за эту секунду в литрах/минуту
    Serial.print("Flow rate: ");
    Serial.print(flowMilliLitres, DEC);  // Выводим целую часть переменной
    Serial.print("mL/Second");
    Serial.print("\t");           

    // Вывести общее количество литров, пролитых с момента запуска
    Serial.print("Output Liquid Quantity: ");        
    Serial.print(totalMilliLitres,DEC);
    Serial.println("mL"); 
    Serial.print("\t");         
    If (totalMilliLitres =< 400)
    {
      SetSolinoidValveON();
    }
    else{ 
      SetSolinoidValveOFF();
        }


// Сброс счетчика импульсов, чтобы мы могли снова начать приращение
    pulseCount = 0;
    
    // Разрешить прерывание снова теперь, когда мы закончили отправку вывода
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  }
}

//Прерывание процедуры обслуживания

void pulseCounter()
{
  // Увеличиваем счетчик импульсов
  pulseCount++;
}

void SetSolinoidValveON()
{
  digitalWrite(solenoidValve, HIGH);
}
void SetSolinoidValveOFF()
{
  digitalWrite(solenoidValve, LOW);
}
,

В чем разница между RISING и FALLING в этой строке кода attachInterrupt(sensorInterrupt, pulseCounter, FALLING);, @kaisar Great

На самом деле принцип работы этого датчика расхода заключается в том, что он генерирует импульсы (прямоугольные волны), пропорциональные расходу жидкости. Когда цепь запускается нарастающим фронтом, она становится активной, когда ее тактовый сигнал переходит от низкого уровня к высокому, и игнорирует переход с высокого на низкий. Спадающий фронт — это переход от высокого к низкому уровню., @Prayuktibid

Я пробую этот код, и он не работает, totalMilliLitres хранит общее количество литров, протекших с момента запуска, и он закроет соленоид один раз., @kaisar Great

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