Датчик протока воды: принцип работы, устройство и монтаж прибора

Датчик протока воды: принцип работы, устройство и монтаж прибора Анемометр

Датчик пыли sds011. ставим три разных датчика в одно устройство.

Сравним три популярных датчика пыли. Стоит ли переплачивать за более дорогой? Какие наиболее распространенные ошибки допускают при работе с бюджетными датчиками? Ответы под катом.

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

SDS011
Первый датчик лазерный, фирмы Nova Fitness. Он предназначен для определения количества пыли размером от 0,3 до 10 мкм в воздухе. Датчик разделяет пыль на две категории — размером от 0,3 до 2,5 мкм и от 2,5 до 10 мкм. Это общепринятая классификация, и наиболее опасна для здоровья пыль от 0,3 до 2,5 мкм.

Датчик протока воды: принцип работы, устройство и монтаж прибора

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

Датчик протока воды: принцип работы, устройство и монтаж прибора

Прочие сведения:
диапазон измерений: 0 — 999 мкг/м3
напряжение питания: 5 вольт
потребляемый ток: 100 мА
ток в режиме энергосбережения: 2 мА
температура окружающей среды: -20-50°С
время отклика: 1 сек
частота отправки сообщений в компорт: 1 раз в секунду.
минимальный определяемый размер частиц пыли: менее 0,3мкм.
размеры: 71х70х23 мм

Датчик протока воды: принцип работы, устройство и монтаж прибора

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

Датчик протока воды: принцип работы, устройство и монтаж прибора

Датчик протока воды: принцип работы, устройство и монтаж прибора

Тут pdf на с подробной информацией по датчику: https://inovafitness.de/downloads/

А тут описание протокола обмена по UART интерфейсу. https://nettigo.eu/attachments/415

GP2Y1014AU0F
Второй датчик производства фирмы Sharp. Он дешевле, компактнее и проще первого. Определяет пыль по принципу фотометрии. Краткие характеристики:

Датчик протока воды: принцип работы, устройство и монтаж прибора

потребляемый ток: 20 мА
напряжение питания: 5 вольт
чувствительность: 0,5 вольт/100мкг/м3
размеры: 46х30×17,6мм
диапазон измерений: 0 — 500 мкг/м3

Датчик протока воды: принцип работы, устройство и монтаж прибора

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

Вот описание датчика: http://www.sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y1010au_appl_e.pdf

Samyoung DSM501a
Третий датчик для определения пыли он использует тот же метод, что и Шарп, но в отличие от него, данные выдает по двум калибрам пыли — до 2,5мкм и от 2,5 и выше. Для связи передачи данных используется широтно-импульсная модуляция, что немного сложнее обработке, но намного надежнее с точки зрения помехозащищенности, чем аналоговый сигнал.
Его краткая характеристика:
напряжение питания: 4,5-5,5 вольт
потребляемый ток: 90ма
минимальный размер обнаруживаемой пыли: 1мкм
диапазон измерений: 0-1400 мкг/м3

Датчик протока воды: принцип работы, устройство и монтаж прибора
У этого датчика есть выход, который используется для регулировки чувствительности второго канала. Таким образом, мы можем менять границу разделения пыли на две фракции. Для улучшения циркуляции воздуха используется микро-печка из резистора, которая нагревает воздух и за счет конвекции он быстрее обновляется у сенсора.

Датчик протока воды: принцип работы, устройство и монтаж прибора

Описание: http://www.platan.ru/pdf/datasheets/samyoung/DSM501.pdf

Разумеется, фаворитом соревнований является лазерный датчик. Он и дороже и современнее своих конкурентов. Мне его прислали бесплатно, на обзор, и, как многие думают, я его должен хвалить уже из-за этого. Это не так, но сказать пару хороших слов можно сразу, едва вынув датчик из упаковки. Его легко подключить к компьютеру через прилагаемый переходник, скачать программу снятия данных и вуаля! График пыли строится на вашем экране.

Датчик протока воды: принцип работы, устройство и монтаж прибора

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

Теперь, когда с соперниками разобрались, кратко остановимся на тех деталях, которые будут использованы для изготовления стенда.
Экран 128х160 с интерфейсом SPI, размером 1,8 дюйма.
Часы реального времени DS3231, соединение по шине I2C
«Черный ящик» OpenLog — будет висеть на компорте и записывать на флешку все, что контроллер отправляет в порт.

Датчик протока воды: принцип работы, устройство и монтаж прибора

И конечно же Arduino Pro Mini — мозг и память всего проекта.
В качестве переходного звена, объединяющего все элементы, будет макетная платка. В основном на ней разъемы для подключения датчиков, но еще имеются резистор и электролитик — они требуются для нормального функционирования датчика Sharp.

Датчик протока воды: принцип работы, устройство и монтаж прибора

Два резистора с джамперами — они служат для переключения порога чувствительности второго канала датчика DSM501, разъем микро-usb для питания в отсутствии компьютера и линейка резисторов для безопасного подключения экрана.

Датчик протока воды: принцип работы, устройство и монтаж прибора

Вот что у меня получилось в результате.

Датчик протока воды: принцип работы, устройство и монтаж прибора

Датчик протока воды: принцип работы, устройство и монтаж прибора

Первым делом я решил протестировать датчик фирмы Sharp. Аналоговый выход обещал легкое подключение и обработку данных. Но все оказалось не совсем так. бОльшую часть времени датчик простаивает. Один раз в 10 мс на датчик нужно подать короткий импульс длительностью 320 мкс, который включит светодиод подсветки пыли. Потом, через 280 мкс, когда на выходе датчика окажется ответный сигнал, нужно успеть его снять и определить его амплитуду. Она-то и характеризует количество пыли в воздухе. Как только сигнал оцифрован, напряжение с подсветки снимается и все отключается до следующего импульса. Конечно, такой алгоритм снижает износ датчика и еще, как упомянуто в мануале, позволяет отличить пыль от дыма. Жаль, там не развивается эта мысль и остается только догадываться, как их отличить на практике.
Простым вольтметром сигнал с датчика не померить и пришлось снимать осциллограмму.

Датчик протока воды: принцип работы, устройство и монтаж прибора

Желтый график — управление светодиодом подсветки пыли. Отрицательный сигнал включает диод.
Голубой — ответ датчика.
Фиолетовый я ввел для наглядности, он включается непосредственно перед тем, как контроллер приступает к измерению напряжения сигнала и выключается после того, как напряжение измерено. Что интересно, мы видим, что сигнал от датчика начинает спадать не после отключения диода подсветки, а еще при его работе. Так что в измерениях важно не промахнуться по времени и все точно выполнять по инструкции.
Второй важный момент — грамотно перевести полученные вольты в микрограммы на кубометр. Для этого надо вычесть из сигнала постоянную полку и по графику вычислить концентрацию пыли. Постоянная составляющая сигнала у каждого датчика своя. Все требует настройки.

Итак. Что же мы имеем с гуся? А с гуся мы имеем почти ничего. Показания скачут вокруг нулевых значений. В принципе, это и не удивительно, я пылесошу каждый день. Но хотелось бы меньшего разброса показаний. Если поступить по-варварски и ввести в отверстие датчика какой-то предмет, то показания сразу взлетают на максимум, так что датчик рабочий. Просто для относительно чистой комнаты не очень чувствительный.

Датчик протока воды: принцип работы, устройство и монтаж прибора

Второй датчик тоже заработал не сразу. Халява не прошла, и первый попавшийся в интернете код не заработал. Датчик показывал погоду на Марсе, и пришлось разбираться детально. Для начала я решил исключить плохое питание. Может оно и хорошее, но на всякий случай я припаял между и — электролитик. Затем, в соответствии с мануалом, надо учитывать только импульсы от 10 до 90 мс. Да, импульсы у этого датчика следуют не с постоянной частотой и скважностью, а хаотично. И программно нужно их суммировать и вычислять процент присутствия импульсов относительно общего времени наблюдения. Так вот, в эту сумму не попадают импульсы менее 10 и более 90 мс. Третье: надо научиться пользоваться настройками датчика. При замыкании провода управления на землю через резистор 18,2КОм первый выход датчика становится столь же чувствительным, как и второй. Что не имеет практического смысла. При замыкании на землю через резистор 47 КОм первый выход начинает видеть пыль только крупнее 1,75 мкм. Таким образом, если в датчик залетит пылинка 1,5 мкм, то на втором выходе будет сигнал, а на первом — нет. При полном отключении управляющего провода от земли первый выход начинает замечать только пыль крупнее 2,5 мкм. Что нам и нужно. Мы снимаем показания со второго выхода, вычитаем их них показания с первого и получаем, таким образом, количество пыли в диапазоне от 1 до 2,5 мкм.

Датчик протока воды: принцип работы, устройство и монтаж прибора

Но это еще не все. Остается перевести длительность присутствия сигнала на выходах датчика в количество пыли. А для этого в нашем распоряжении лишь график. График в программу не засунешь, я нашел онлайн сервис по оцифровке графиков и подбору полиномов для их более-менее точного моделирования. До меня это сделал какой-то парень из Штатов, но там у них свой стандарт, они меряют пыль в пылинках на одну сотую кубического фута. А у нас микрограммы на кубометр. Так что формула из готовых скриптов мне решительно не подходила.

После всех этих плясок с бубном ничего сильно хорошего не получилось: датчик показывал то чистейший горный воздух, то тяжелую атмосферу шлифовального цеха.
Удивительно, но если вернуться к старой формуле из примеров использования датчика, той, с штуками пылинок на сотую кубофута, то выдаваемые датчиком значения численно более-менее правдоподобны, для чистой комнаты. Но как только поднимается пыль, они начинают отставать.

Датчик протока воды: принцип работы, устройство и монтаж прибора

А вот лазерный датчик хлопот не доставил. Байты из порта прочитались сразу. Сигнал с ШИМ — выходов тоже равномерный и красивый.

Датчик протока воды: принцип работы, устройство и монтаж прибора

Показания очень хорошо соотносятся с происходящими вокруг датчика событиями. Это было заметно еще по первому включению, с выводом графика на десктоп. Пики в левой части графика — пайка. Датчик лежал на столе, где я паял стенд. По ощущениям, дыма особого не было, но график решительно полз вверх каждый раз, когда я включал паяльник. Короткий всплеск справа — расстилание кровати. Оказывается, даже чистая постель — источник огромного количества пыли.

Датчик протока воды: принцип работы, устройство и монтаж прибора

Еще один неочевидный вывод — хороший пылесос совсем не гоняет пыль по комнате, а действительно ее всасывает. Включение пылесоса совершенно не отражалось на графике. А вот строительный пылесос — совсем другое дело. Мне нужно было просверлить пару небольших отверстий в ванной комнате. Там вытяжка, там маленькие отверстия, но все-таки я подогнал строительный пылесос, чтобы пылью от сверления не портить эксперимент с датчиками пыли. Эффект получился совсем не такой, как я ожидал.

Датчик протока воды: принцип работы, устройство и монтаж прибора

Концентрация пыли мгновенно выросла в 20 раз и спадала потом еще полчаса. Кстати, проветривание резко снижает количество пыли в воздухе. Наверное, не во всех областях это так, но мне вот повезло.

Код скрипта


/////////////////// © Tykhon, 2021 ////////////////////////////////////
#include "Wire.h"
#include <SoftwareSerial.h>
#include <TFT.h> 

/////////////////// for DSM501 sensor ////////////////////////////////////

int pinV2 = 6;
int pinV1 = 5;
unsigned long durationV1;
unsigned long durationV2;
unsigned long starttimeV1;
unsigned long starttimeV2;
unsigned long lowpulseoccupancyV1 = 0;
unsigned long lowpulseoccupancyV2 = 0;
float one_to_two_point_five;
float ratioV1 = 0;
float ratioV2 = 0;
boolean flagV1 = true;
boolean flagV2 = true;
boolean V1 = false;
boolean V2 = false;
float concentrationV1 = 0;
float concentrationV2 = 0;
int allV1, allV2, goodV1, goodV2;


/////////////////// for Sharp sensor ////////////////////////////////////

unsigned long LastCheckSharp;
const int sharpLEDPin = 4;   // Arduino digital pin 2 connect to sensor LED.
const int sharpVoPin = A6;   // Arduino analog pin A6 connect to sensor Vo.
static unsigned long VoRawTotal = 0;
int VoRawCount = 0;
static float Voc = 0.45;
float dustDensity = 0.0;
float Vo = 0.0;
float Dust = 0.0;


/////////////////// for general purposes ////////////////////////////////

unsigned long starttime;
unsigned long endtime;
unsigned long sampletime_ms = 30000;
unsigned long now;
unsigned long loops;
#define DS1307_ADDR 0x68                     // RTC address


/////////////////// for LCD ////////////////////////////////////////////


#define TFT_CS     10
#define TFT_RST    9  
#define TFT_DC     8
int line_25[85] = {};  
int line_10[85] = {};  
byte lineIndex;
TFT TFTscreen = TFT(TFT_CS, TFT_DC, TFT_RST);
char one_to_two_point_fivec[5], Dustc[5], Pm25fc[5], Pm10fc[5];


////////////////// for SDS 011 sensor //////////////////////////////////

int rxPin = 3;
int txPin = 2;
SoftwareSerial mySerial(3, 2); //RX, TX
unsigned int Pm25 = 0;
unsigned int Pm10 = 0;
float Pm25f = 0.0;
float Pm10f = 0.0;
int sdspoll = 0;
unsigned int Pm25sum = 0;
unsigned int Pm10sum = 0;
unsigned long lastsds;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(pinV1,INPUT);
  pinMode(pinV2,INPUT);
  pinMode(sharpLEDPin, OUTPUT);
  starttime = millis(); 
  Wire.begin();

  TFTscreen.begin(); 
  TFTscreen.setRotation(2); 
  TFTscreen.background(20,0,0); 
  TFTscreen.stroke(200,200,200);
  TFTscreen.setTextSize(2);
  TFTscreen.text("DSM", 2, 5);  
  TFTscreen.text("Sharp", 2, 35);  
  TFTscreen.stroke(0,250,250);
  TFTscreen.text("Pm10", 2, 65); 
  TFTscreen.stroke(180,10,250);
  TFTscreen.text("Pm2.5", 2, 95);  

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


/////////////////// for date and time //////////////////////////////////

byte bcdToDec(byte val)  {
  return ( (val/16*10)   (val) );
}

/////////////////// returns date and time //////////////////////////////////

String getdate(){
  Wire.beginTransmission(DS1307_ADDR);
  byte zero = 0x00;
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDR, 7);
  int secondint = bcdToDec(Wire.read());
  int minuteint = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());
  String second = String(secondint); if (secondint < 10) {second ="0" second;};
  String minute = String(minuteint); if (minuteint < 10) {minute ="0" minute;};
  return String(hour) ":" minute ":" second "  " String(monthDay) "/" String(month) "/" String(year);  /// 
}

//////////////////// draws graph  ////////////////////////////////////////

void tft_graph(){

  byte k = 30;
  TFTscreen.stroke(20,0,0);
  TFTscreen.fill(20,0,0);
  TFTscreen.rect(0, TFTscreen.height()-45, TFTscreen.width(), 45);
  TFTscreen.stroke(250,180,10);
  
  TFTscreen.line(5, 90 k, 5, 121 k);
  TFTscreen.line(5, 121 k, 90, 121 k);

  int maxvalue = 0;
  for (int i = 0; i < (sizeof(line_10)/sizeof(int)); i  ){
    maxvalue = max(maxvalue, line_10[i]);
    maxvalue = max(maxvalue, line_25[i]);
  };
  int g = 5 (sizeof(line_10)/sizeof(int));
  for (int i = lineIndex-1; i >= 0; i--){ 
    int x1 = g;
    g--;
    int y1 = map(line_10[i],maxvalue,0,90 k,120 k);
    int y2 = map(line_25[i],maxvalue,0,90 k,120 k);
        
    TFTscreen.stroke(10,180,250);
    TFTscreen.point(x1, y1); 
    TFTscreen.stroke(180,10,250);
    TFTscreen.point(x1, y2); 
  };
  for (int i = (sizeof(line_10)/sizeof(int))-1; i >= lineIndex; i--){ 
    int x1 = g;
    g--;
    int y1 = map(line_10[i],maxvalue,0,90 k,120 k);
    int y2 = map(line_25[i],maxvalue,0,90 k,120 k);

    TFTscreen.stroke(10,180,250);
    TFTscreen.point(x1, y1); 
    TFTscreen.stroke(180,10,250);
    TFTscreen.point(x1, y2); 
  };  
}

///////////////////// prints data on screen ///////////////////////////

void tft_output(){

  TFTscreen.stroke(20,0,0);
  TFTscreen.text(one_to_two_point_fivec, 70, 5);  
  TFTscreen.text(Dustc, 70, 35);  
  TFTscreen.text(Pm10fc, 70, 65);  
  TFTscreen.text(Pm25fc, 70, 95);  

  String one_to_two_point_fives = String(one_to_two_point_five);
  String Dusts = String(Dust);
  String Pm10fs = String(Pm10f);
  String Pm25fs = String(Pm25f);

  one_to_two_point_fives.toCharArray(one_to_two_point_fivec,5);
  Dusts.toCharArray(Dustc,5);
  Pm10fs.toCharArray(Pm10fc,5);
  Pm25fs.toCharArray(Pm25fc,5);

  TFTscreen.stroke(255,255,255);
  TFTscreen.text(one_to_two_point_fivec, 70, 5);  
  TFTscreen.text(Dustc, 70, 35);  
  TFTscreen.text(Pm10fc, 70, 65);  
  TFTscreen.text(Pm25fc, 70, 95);  
}


//////////////////  reads serial port and decodes data //////////////////////


void ProcessSerialData()
{
  uint8_t mData = 0;
  uint8_t i = 0;
  uint8_t mPkt[10] = {0};
  uint8_t mCheck = 0;
  while (mySerial.available() > 0)
  {
    // from www.inovafitness.com
    // packet format: AA C0 PM25_Low PM25_High PM10_Low PM10_High 0 0 CRC AB
    mData = mySerial.read();     delay(2);//wait until packet is received
    if (mData == 0xAA) //head1 ok
    {
      mPkt[0] =  mData;
      mData = mySerial.read();
      if (mData == 0xc0) //head2 ok
      {
        mPkt[1] =  mData;
        mCheck = 0;
        for (i = 0; i < 6; i  ) //data recv and crc calc
        {
          mPkt[i   2] = mySerial.read();
          delay(2);
          mCheck  = mPkt[i   2];
        }
        mPkt[8] = mySerial.read();
        delay(1);
        mPkt[9] = mySerial.read();
        if (mCheck == mPkt[8]) //crc ok
        {
          mySerial.flush();
          Pm25 = (uint16_t)mPkt[2] | (uint16_t)(mPkt[3] << 8);
          Pm10 = (uint16_t)mPkt[4] | (uint16_t)(mPkt[5] << 8);
          if (Pm25 > 9999)
            Pm25 = 9999;
          if (Pm10 > 9999)
            Pm10 = 9999;
          return;
        }
      }
    }
  }
}



//////////////////  sends SLEEP command to SDS011  //////////////////////

void SDS011sleep()
{
  while (mySerial.available() > 0)
  {
    uint8_t sleep_command[] = {0xAA, 0xB4, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x05, 0xAB};
    for (uint8_t i = 0; i < 19; i  ) {
      mySerial.write(sleep_command[i]);
    }
    mySerial.flush();
  }
}

//////////////////  sends WAKEUP command to SDS011  //////////////////////

void SDS011wakeup()
{
  while (mySerial.available() > 0)
  {
    uint8_t wakeup_command[] = {0xAA, 0xB4, 0x06, 0x01, 0x01, 0xC5};
    for (uint8_t i = 0; i < 6; i  ) {
        mySerial.write(wakeup_command[i]);
    }
  }
}  

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void loop()
{
  loops  =1;
  now = millis();

//////////////  Sharp  ////////////////////////
  
  if ((now - LastCheckSharp) >= 10) {
    LastCheckSharp = now;
    digitalWrite(sharpLEDPin, LOW);
    delayMicroseconds(200);  // was 280, but real 320mks at 200 setting
    int VoRaw = analogRead(sharpVoPin);
    digitalWrite(sharpLEDPin, HIGH);
    VoRawTotal  = VoRaw;
    VoRawCount  ;
  };

////////////  DSM 501 ////////////////////////

  V1 = digitalRead(pinV1);
  if ((flagV1)&&!(V1)) {         // start period of low V1
      starttimeV1 = millis();
      flagV1 = false;
  };
  if (!(flagV1)&&(V1)) {         // stop period of low V1
      durationV1 = millis() - starttimeV1;
      flagV1 = true;
      allV1 =1;
 
    if ((durationV1 <= 90)&&(durationV1 >= 10)) {
      lowpulseoccupancyV1  = durationV1;
      goodV1 =1;
    };
  };

  V2 = digitalRead(pinV2);
  if ((flagV2)&&!(V2)) {         // start period of low V2
      starttimeV2 = millis();
      flagV2 = false;
  };
  if (!(flagV2)&&(V2)) {         // stop period of low V2
      durationV2 = millis() - starttimeV2;
      flagV2 = true;
      allV2 =1;
 
  if ((durationV2 <= 90)&&(durationV2 >= 10)) {
    lowpulseoccupancyV2  = durationV2;
    goodV2 =1;
  };
 };

//////////// SDS 011  ////////////////////////

    if ((now - lastsds)> 1000) {
      lastsds = now;
      sdspoll   ;
      ProcessSerialData();
      Pm25sum  =  Pm25;
      Pm10sum  = Pm10;
    };

////////////  output ///////////////////////////////
 
  endtime = millis();
  if ((endtime-starttime) > sampletime_ms)
  {
    Serial.print(getdate());

//////////////////////////

    Vo = 1.0 * VoRawTotal / VoRawCount;
    Vo = Vo / 1024.0 * 5.0;
    float dV = Vo - Voc;
    if (dV < 0 ) {dV = 0; Voc = Vo;};
    Dust = 172.0*dV;
    Serial.print("  Sharp: ");
    Serial.print(Dust);
    VoRawCount = 0;
    VoRawTotal = 0;

//////////////////////////
    
  ratioV1 = (lowpulseoccupancyV1*100.0)/(endtime-starttime);  // Integer percentage 0=>100
  ratioV2 = (lowpulseoccupancyV2*100.0)/(endtime-starttime);  // Integer percentage 0=>100
//    concentrationV1 = 1.1*pow(ratioV1,3)-3.8*pow(ratioV1,2) 520*ratioV1 0.62; // using spec sheet curve in pcs in 1/100 ft3
//    concentrationV2 = 1.1*pow(ratioV2,3)-3.8*pow(ratioV2,2) 520*ratioV2 0.62; // using spec sheet curve in pcs in 1/100 ft3

  concentrationV1 = -0.0885*pow(ratioV1,4) - 2.55055*pow(ratioV1,3)- 21.920538*pow(ratioV1,2)   172.171285*ratioV1 - 90.112;
  concentrationV2 = -0.0885*pow(ratioV2,4) - 2.55055*pow(ratioV2,3)- 21.920538*pow(ratioV2,2)   172.171285*ratioV2 - 90.112;

  if (concentrationV1 < 0) {concentrationV1 = 0.0;};
  if (concentrationV2 < 0) {concentrationV2 = 0.0;};
  one_to_two_point_five = concentrationV2 - concentrationV1;
  if (one_to_two_point_five < 0) {one_to_two_point_five = 0;};

  Serial.print("  DSM501_>2.5: ");
  Serial.print(concentrationV1);

  Serial.print("  DSM501_>1.0: ");
  Serial.print(concentrationV2);
    
  Serial.print("  DSM501_1-2.5: ");
  Serial.print(one_to_two_point_five);
 
  lowpulseoccupancyV1 = 0;
  lowpulseoccupancyV2 = 0;
  loops = 0;
  allV1 = 0;
  goodV1 = 0;
  allV2 = 0;
  goodV2 = 0;


///////////// SDS011 /////////////////

  Pm25f = Pm25sum/(sdspoll*10.0);
  Pm10f = Pm10sum/(sdspoll*10.0);
  Serial.print("  Pm2.5 ");
  Serial.print(Pm25f,2);
  Serial.print("  Pm10 ");
  Serial.print(Pm10f,2);

  sdspoll = 0;
  Pm25sum = 0;
  Pm10sum = 0;

  line_25[lineIndex] = int(Pm25f*100.0);
  line_10[lineIndex] = int(Pm10f*100.0);
  lineIndex  ;
  if (lineIndex >= 85) {lineIndex = 0;};


//////////// finish ///////////////
  
  tft_output();
  Serial.println();
  tft_graph();
  starttime = millis();

  }             // if 30 sec passed
 
}   // loop


Выводы
Я пару дней гонял стенд с тремя датчиками в разных условиях. В области малых концентраций пыли для измерений годится только лазерный датчик. Он же и самый быстрый на отклик. У меня нет возможностей проверить показания этого датчика. Но мне достаточно того, что в его измерениях отражались все события в комнате, которые так или иначе должны были влиять на пыль. Расстилание кровати, проветривание, пайка, работа пылесоса, ремонтные работы — все это тут же сказывалось на графике. Что до шума от вентилятора, то он не очень большой. И у датчика есть режим энергосбережения, при котором вентилятор не работает. Два других датчика скорее подойдут для контроля относительно грязной атмосферы. Если выбирать из них, то Samyoung DSM 501 выглядит предпочтительнее. Его преимущества — разделение пыли по фракциям, лучшая помехозащищенность, большой диапазон и улучшенная циркуляция воздуха.

Про анемометры:  Как скачать крякнутый ВПН Windscribe, получить 10 Гб трафика и премиум PRO бесплатно для компьютера

Плюсы датчика SDS011
высокая корреляция показаний прибора и обстановки с пылью вокруг
стабильность показаний
скорость реакции
невысокая (для лазерных датчиков) стоимость.

Минусы датчика SDS011
— шум от вентилятора
— относительно высокое энергопотребление

Обновление от 24.05.19
В итоге, для постоянной работы я оставил один только датчик пыли — разумеется SDS011. У него обнаружилась полезная особенность. Для экономии электричества и ресурса он может работать в перывистом режиме — заданный период он ожидает, потом включается на 30 секунд, измеряет концентрацию пыли и выдает ее в порт. Потом снова засыпает. Еще одна полезная настройка — датчик может самостоятельно посылать данные в порт, а может ждать запроса от контроллера. Мне показалось, что 30 секунд недостаточно, чтобы датчик вышел на стабильные показания, так что я провел серию экспериментов. В скетч добавил режим, в котором датчик принудительно включается и выключается. Пробовал запускать его на минуту и две, регулярно опрашивать и усреднять показания. В итоге оказалось, что как раз-таки 30 секунд — оптимальный период работы.
В новой версии скетча добавлен автоматический режим, когда датчик сам включается и выключается, и ручной. Добавлены шкалы на графике. В итоге экран прибора выглядит примерно так:

Датчик протока воды: принцип работы, устройство и монтаж прибора

Код скетча


///////////////////////////////////////////////////////////////////////
///                    © tykhon, 2021
///////////////////////////////////////////////////////////////////////
#include "Wire.h"
#include <SoftwareSerial.h>
#include <TFT.h> 

/////////////////// for general purposes ////////////////////////////////

boolean automode = true;                            // manual on/off sensor or auto.
                                                    // Auto: sensot itself turn on (for 30 secs. )and off (for 1-30 mins) and gathers statistics.
                                                    // Manual: sensor never shuts off by itself, but the program turns it on (for work_time) and off (work_period - work_time) and handle all the incoming data.

byte mode = 3;                                      // 0 for countinuous work of sensor 1-30 for work with 1-30 min delays. Set 0 for automode = false; 1-30 for automode = true
byte work_period = 2;                               // period of time (work delay) in min  1 to 30; Recommended: 2, 3, 4, 5, 6, 10, 15, 20, 30. Relevant only if  automode = false;
byte work_time = 1;                                 // time of work of sensor in min  1 to 29, should be less than work_period; Relevant only if  automode = false;


/////////////////// for LCD ////////////////////////////////////////////

#define TFT_CS     10
#define TFT_RST    9  
#define TFT_DC     8
int line_25[135] = {};  
int line_10[135] = {};  
byte lineIndex;
TFT TFTscreen = TFT(TFT_CS, TFT_DC, TFT_RST);
char Pm25fc[5], Pm10fc[5], maxvaluec[4], line10meanc[4], line25meanc[4], hour_scalec[4];

////////////////// for SDS 011 sensor //////////////////////////////////

int rxPin = 3;
int txPin = 2;
SoftwareSerial mySerial(3, 2); //RX, TX
unsigned int Pm25 = 0;
unsigned int Pm10 = 0;
unsigned int Pm25sum = 0;
unsigned int Pm10sum = 0;
float Pm25f = 0.0;
float Pm10f = 0.0;


#define DS1307_ADDR 0x68                     // RTC address
unsigned int current_minute, lastminute;
boolean active = false;
unsigned int loops = 0;

/////////////////// for date and time //////////////////////////////////

byte bcdToDec(byte val)  {
  return ( (val/16*10)   (val) );
}

/////////////////// returns date and time //////////////////////////////////

String getdate(){
  Wire.beginTransmission(DS1307_ADDR);
  byte zero = 0x00;
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDR, 7);
  int secondint = bcdToDec(Wire.read());
  int minuteint = bcdToDec(Wire.read());
  current_minute = minuteint;
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());
  String second = String(secondint); if (secondint < 10) {second ="0" second;};
  String minute = String(minuteint); if (minuteint < 10) {minute ="0" minute;};
  return String(hour) ":" minute ":" second " " String(monthDay) "/" String(month) "/" String(year);  /// 
}


/////////////////// gets data from sensor  //////////////////////////////////

void print_Pm(){

  Pm25f = Pm25/10.0;
  Pm10f = Pm10/10.0;
  String dataString = getdate() "  Pm2.5: " String(Pm25f,2) "  Pm10: " String(Pm10f,2);
  dataString.replace(".",",");
  dataString.replace("  ","t");
  Serial.println(dataString);

  line_25[lineIndex] = Pm25;
  line_10[lineIndex] = Pm10;
  lineIndex  ;
  if (lineIndex >= sizeof(line_10)/sizeof(int)) {lineIndex = 0;};
}


//////////////////// draws graph  ////////////////////////////////////////

void tft_graph(){

                        //   x1 y1  x2  y2
  unsigned int line10sum = 0;
  unsigned int line25sum = 0;
  unsigned int elements = 0;
  TFTscreen.stroke(20,0,0);
  TFTscreen.fill(20,0,0);
  TFTscreen.rect(0, TFTscreen.height()-65, TFTscreen.width(), 64);
  TFTscreen.stroke(250,180,10);
  
  TFTscreen.line(20, 65, 20, 118);
  TFTscreen.line(20, 118, 156, 118);

  int maxvalue = 0;
  for (int i = 0; i < (sizeof(line_10)/sizeof(int)); i  ){
    maxvalue = max(maxvalue, line_10[i]);
    maxvalue = max(maxvalue, line_25[i]);
    if (line_10[i] > 0) {
      line10sum  = line_10[i];
      line25sum  = line_25[i];
      elements   ;
    };
  };
  float line10mean = line10sum / (elements*10);
  float line25mean = line25sum / (elements*10);

  maxvalue = int(ceil( float(maxvalue)/50.0)*50);
  String maxvalues = String(maxvalue/10);
  maxvalues.toCharArray(maxvaluec,4);

  String line10means = String(int(round(line10mean 0.25)));
  line10means.toCharArray(line10meanc,4);
  String line25means = String(int(round(line25mean 0.25)));
  line25means.toCharArray(line25meanc,4);

  TFTscreen.setTextSize(1);
  TFTscreen.stroke(255,255,255);
  TFTscreen.text(maxvaluec, 1, 65); 
  int hours_count = sizeof(line_10)/sizeof(int);
  int period = work_period;
  if (automode) {period = mode;};
  hours_count = hours_count * period;
  
  hours_count = hours_count / (-60);
  int onestep = 1;
  if (hours_count < -5) {onestep = 2;};
  for (int i = 0; i >= hours_count; i = i - onestep) {
    String hour_scales = String(i);
    hour_scales.toCharArray(hour_scalec,4);
    int posx = 15  (sizeof(line_10)/sizeof(int))   i*(60/period);
    TFTscreen.stroke(250,180,10);
    TFTscreen.line(posx 5, 118, posx 5, 121);
    TFTscreen.stroke(255,255,255);
    int shift = posx 5;
    if (shift > 155) {shift = shift-10;};
    TFTscreen.text(hour_scalec, shift, 121);
  };



  
  TFTscreen.stroke(10,180,250);
  TFTscreen.text(line10meanc, 1, 85);  
  TFTscreen.stroke(180,10,250);
  TFTscreen.text(line25meanc, 1, 105);  
  TFTscreen.setTextSize(2);

  int g = 20 (sizeof(line_10)/sizeof(int));
  for (int i = lineIndex-1; i >= 0; i--){ 
    int x1 = g;
    g--;
    int y1 = map(line_10[i],maxvalue,0,66,118);
    int y2 = map(line_25[i],maxvalue,0,66,118);
        
    TFTscreen.stroke(10,180,250);
    TFTscreen.line(x1, y1, x1, 118);
    TFTscreen.stroke(180,10,250);
    TFTscreen.line(x1, y2, x1, 118);

  };
  for (int i = (sizeof(line_10)/sizeof(int))-1; i >= lineIndex; i--){ 
    int x1 = g;
    g--;
    int y1 = map(line_10[i],maxvalue,0,66,118);
    int y2 = map(line_25[i],maxvalue,0,66,118);

    TFTscreen.stroke(10,180,250);
//    TFTscreen.point(x1, y1); 
      TFTscreen.line(x1, y1, x1, 118);
    TFTscreen.stroke(180,10,250);
//    TFTscreen.point(x1, y2); 
      TFTscreen.line(x1, y2, x1, 118);
  };  
}

///////////////////// prints data on screen ///////////////////////////

void tft_output(){

  TFTscreen.stroke(20,0,0);
  TFTscreen.text(Pm10fc, 70, 2);  
  TFTscreen.text(Pm25fc, 70, 32);  

  String Pm10fs = String(Pm10f);
  String Pm25fs = String(Pm25f);

  Pm10fs.toCharArray(Pm10fc,5);
  Pm25fs.toCharArray(Pm25fc,5);

  TFTscreen.stroke(255,255,255);
  TFTscreen.text(Pm10fc, 70, 2);  
  TFTscreen.text(Pm25fc, 70, 32);  
}


//////////////////  reads serial port and decodes data //////////////////////


void ProcessSerialData()
{
  uint8_t mData = 0;
  uint8_t i = 0;
  uint8_t mPkt[10] = {0};
  uint8_t mCheck = 0;
  while (mySerial.available() > 0)
  {
    // from www.inovafitness.com
    // packet format: AA C0 PM25_Low PM25_High PM10_Low PM10_High 0 0 CRC AB
    mData = mySerial.read();     delay(2);//wait until packet is received
    if (mData == 0xAA) //head1 ok
    {
      mPkt[0] =  mData;
      mData = mySerial.read();
      if (mData == 0xc0) //head2 ok
      {
        mPkt[1] =  mData;
        mCheck = 0;
        for (i = 0; i < 6; i  ) //data recv and crc calc
        {
          mPkt[i   2] = mySerial.read();
          delay(2);
          mCheck  = mPkt[i   2];
        }
        mPkt[8] = mySerial.read();
        delay(1);
        mPkt[9] = mySerial.read();

        if (mCheck == mPkt[8]) //crc ok
        {
          mySerial.flush();
          Pm25 = (uint16_t)mPkt[2] | (uint16_t)(mPkt[3] << 8);
          Pm10 = (uint16_t)mPkt[4] | (uint16_t)(mPkt[5] << 8);
          if (Pm25 > 9999)
            Pm25 = 9999;
          if (Pm10 > 9999)
            Pm10 = 9999;
          return;
        } else {Serial.println('crc not ok');};
      } else {Serial.println('head not ok');};
    }
  }
}


//////////////////  sends work mode command to SDS011  //////////////////////

void SDS011workmode(byte mode)
{
  byte cs = 7   mode;
  uint8_t sleep_command[] = {0xAA, 0xB4, 0x08, 0x01, mode, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, cs, 0xAB};      
//                                                     ^^ 0 for continuous, 1-30 for 1-30 min delay between turns on.              ^^ checksum: 07 for 0x00, 08 for 0x01 and so on
  for (uint8_t i = 0; i < 19; i  ) {
    mySerial.write(sleep_command[i]);
  }
}


//////////////////  sends SLEEP command to SDS011  //////////////////////

void SDS011sleep()
{
  uint8_t sleep_command[] = {0xAA, 0xB4, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x05, 0xAB};      

  for (uint8_t i = 0; i < 19; i  ) {
    mySerial.write(sleep_command[i]);
  }
}

//////////////////  sends WAKEUP command to SDS011  //////////////////////

void SDS011wakeup()
{
  uint8_t wakeup_command[] = {0xAA, 0xB4, 0x06, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x06, 0xAB};

  for (uint8_t i = 0; i < 19; i  ) {
    mySerial.write(wakeup_command[i]);
  }
}  

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
  Wire.begin();
  SDS011wakeup();
  delay(10);
  SDS011wakeup();
  if (automode == false) {SDS011workmode(0);} else {SDS011workmode(mode);};
  TFTscreen.begin();
  delay(100);
  TFTscreen.setRotation(1); 
  TFTscreen.background(20,0,0); 
  TFTscreen.setTextSize(2);
  TFTscreen.stroke(0,250,250);
  TFTscreen.text("Pm10", 2, 2); 
  TFTscreen.stroke(180,10,250);
  TFTscreen.text("Pm2.5", 2, 32);  
//  tft_graph();

  if (automode == false) { //(mode != 0)&&(
    delay(30000);
//    SDS011sleep();
  }
  ProcessSerialData();
  print_Pm();
  tft_output();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void loop()
{
  getdate();

  if (automode == false) {
    if (((current_minute work_time)%work_period == 0)&&(active == false)) {
      SDS011wakeup();
      active = true;
    };

    if (active == true) {
      ProcessSerialData();
      loops   ;
      Pm25sum  = Pm25;
      Pm10sum  = Pm10;
//      /*
      Serial.print (loops);
      Serial.print (" Pm25 = ");
      Serial.print (Pm25);
      Serial.print ("  Pm10 = ");
      Serial.println (Pm10);
//      */
    };

    if (((current_minute)%work_period == 0)&&(active == true)) {
      SDS011sleep();
      active = false;
      Pm25 = Pm25sum/loops;
      Pm10 = Pm10sum/loops;
      Pm25sum = 0;
      Pm10sum = 0;
      loops = 0;
      print_Pm();
      tft_output();
      tft_graph();
    };

  } else {                     // if sensor goes on and off by itself
    
    if (((current_minute)%mode == 0)&&(lastminute != current_minute)) {
      ProcessSerialData();
      print_Pm();
      tft_output();
      tft_graph();
      lastminute = current_minute;
    }
  }                           // if sensor goes on and off by itself

  delay(1000);
}   // loop

Про анемометры:  Testo 425 Руководство по эксплуатации онлайн [1/17]

Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.

Измерение расхода жидкости в безнапорных потоках. анализ современных методов

Разрабатывая нашим клиентам решения по измерению расхода жидкостей, мы создали отличную методику выбора расходомеров, которой готовы поделиться. Три несложных шага – и вы безошибочно выберете нужный расходомер даже из сотни моделей.

Испытательная лаборатория «Технометр», г. Санкт-Петербург

Tehnometr.png

скачать pdf >>

За последние 10–15 лет рынок средств измерений безнапорных потоков стал весьма разнообразным. Европейские и западные технологии, активно внедряющиеся на территории Российской Федерации, значительно преобразили ассортимент доступных приборов.

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

Мы часто выбираем приборы измерения безнапорных потоков для своих клиентов, поэтому разработали систему, позволяющую уже на втором шаге отсеять до 90 % неподходящих к конкретной задаче расходомеров:
1. Оцениваем характеристики объекта измерения.
2. Выбираем метод измерения, подходящий под характеристики.
3. Из расходомеров, использующих этот метод, отбираем прибор по соотношению «цена/качество».

Ключевой шаг – выбор метода. На сегодняшний день в мировой практике активно используются всего четыре метода измерения расхода безнапорного потока: бесконтактный радарный, погружной доплеровский, ультразвуковой и электромагнитный метод. Определившись с методом измерения, мы значительно сокращаем диапазон поиска.

В этой статье мы представим анализ существующих в настоящий момент методов измерения расхода воды в безнапорных потоках с описанием как их практической области применения, так и ограничений в применении. Для каждого метода мы подобрали имеющиеся на российском рынке модели расходомеров, которые уже внесены в Государственный реестр средств измерений РФ, а также те, которые, возможно, будут внесены в реестр.

Подход к измерению

Расход воды для любого сечения определяется формулой: Q = Vср. × S, где Q – это расход воды, Vср. – средняя скорость, S – измеренное сечение. Таким образом, для того чтобы вычислить расход в безнапорном потоке, нам необходимо достоверно определить геометрические размеры измерительного створа, а с помощью средства измерения измерить скорость и уровень потока.

Методы измерения расхода воды в безнапорных потоках можно подразделить на две основные группы:
— двухканальные расходомеры, основанные на принципе измерения «площадь – скорость», выполняющие прямые измерения скорости и уровня потока. К этому типу относятся и гибридные системы, которые применяются для обеспечения достоверного определения объемного расхода воды в безнапорных трубопроводах, как правило, при имеющемся широком диапазоне значений расхода и скорости, например, для городской ливневой канализации;
— одноканальные расходомеры, которые измеряют только значения уровня, а скорость потока вычисляется на основании существующих методик измерения.

В табл. 1 приведены все существующие методы измерения скорости и уровня потока и их возможные сочетания в различных моделях расходомеров для безнапорных потоков.

Таблица 1. Методы измерения скорости и уровня потока и их возможные сочетания в различных моделях расходомеров для безнапорных потоков (увеличить изображение)

Tab_small.png

Двухканальные расходомеры

Эти приборы, основанные на методе «площадь – скорость», выполняют измерения и скорости потока, и уровня потока.

Измерение значений уровня потока принято считать самым простым в организации процесса определения объемного расхода воды в безнапорных потоках, но и этому параметру стоит уделить внимание. Уровень потока может быть измерен тремя способами:
— с использованием бесконтактного радарного метода измерения, который является, пожалуй, оптимальным. Ввиду высокой частоты измерения ему не страшны образование пара и пены над потоком. При возможном переполнении трубопровода датчик имеет степень защиты IP68 и с легкостью выдержит погружение;
— с помощью погружного гидростатического метода измерения. При выборе датчика уровня, основанного на этом методе, необходимо уделять внимание качеству исполнения самого устройства, способности применяемых материалов выдержать длительную работу в агрессивной среде (например, если речь идет об измерениях сточной воды или жидкостей с содержанием абразивных веществ);
— с применением бесконтактного ультразвукового метода измерения. Необходимо оценить вероятность появления пара над потоком в зимний период времени. Практика показывает, что датчики уровня, основанные на ультразвуковом методе измерения, могут воспринять поверхность пара как поверхность воды, тем самым значительно искажая уровень потока в сторону увеличения, а значит, увеличивая и значение расхода.

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

Бесконтактный радарный метод

Один из самых универсальных методов, обеспечивающий точность данных даже в сложных условиях измерений.

Для измерения скорости потока используется бесконтактный радарный датчик скорости. Скорость потока жидкости определяется бесконтактным радарным методом. Микроволновое излучение, формируемое датчиком скорости, попадая на свободную поверхность воды, отражается от неоднородностей, присутствующих на поверхности потока, и попадает обратно в датчик скорости, который по разности частот (излучаемой и принимаемой) измеряет скорость движения поверхности потока жидкости. Объемный расход и объем жидкости определяются на основании эпюры распределения скоростей, уровня потока и площади внутреннего сечения трубопровода. Радарные волны имеют высокую частоту излучения (24 ГГц), поэтому являются радиопрозрачными, то есть способны выполнять измерения через пластиковые поверхности, пар и пену.

Важно! Выбирая бесконтактный радарный датчик скорости, нужно понимать, какую антенну использует датчик: рупорную или планарную.

Рупорная антенна – металлическая конструкция, состоящая из волновода переменного (расширяющегося) сечения с открытым излучающим концом. Как правило, рупорную антенну возбуждают волноводом, присоединенным к узкому концу рупора. По форме рупора различают E‑секториальные, H‑секториальные, пирамидальные и конические рупорные антенны.

Планарная, или патч-антенна – СВЧ-антенна, состоящая из плоского металлического лепестка, закрепленного параллельно пластине земли. Обычно эту конструкцию заключают в пластиковый радиопрозрачный кожух как для защиты от механических повреждений, так и из эстетических соображений. Такие антенны просты в изготовлении и легко могут быть модифицированы под требуемые технические условия.

Для своих клиентов чаще всего мы выбираем приборы, оснащенные рупорными антеннами, тем более что в настоящий момент только они внесены в Государственный реестр СИ РФ. Они имеют очевидные преимущества перед измерителями скорости с патч-антеннами при измерениях скорости потока в трубопроводах и узких каналах:
— рупорные антенны хорошо экранированы, что обеспечивает лучшую помехоустойчивость, нежели у патч-антенн;
— рупорные антенны имеют узкую диаграмму направленности и низкий уровень боковых лепестков, что обеспечивает точные измерения в стесненных условиях, например, в колодцах (рис. 1). Патч-антенна в силу широкой диаграммы направленности и высокого уровня боковых лепестков, находясь в стесненных условиях, собирает большое количество переотраженных «паразитных» шумов именно от боковых лепестков. Мощность «паразитных» шумов значительно выше мощности сигналов, отраженных от поверхности потока воды, что и является причиной невозможности их применения в колодцах и других закрытых пространствах (рис. 2);

Ris_1.png

Рис. 1. Условная схема диаграммы направленности основного лепестка и боковых лепестков рупорной антенны датчика скорости, установленного в канализационном колодце: 1 – датчик скорости, 2 – диаграмма направленности основного лепестка, 3 – диаграмма направленности боковых лепестков

Ris_2.png

Рис. 2. Условная схема диаграммы направленности основного лепестка и боковых лепестков патч-антенны датчика скорости, установленного в колодце: 1 – датчик скорости, 2 – диаграмма направленности основного лепестка, 3 – диаграмма направленности боковых лепестков

— узкая направленность излучения радарного датчика с рупорной антенной позволяет использовать его более эффективно в сложных задачах измерений, например, при измерениях на большой высоте над каналом, при чрезмерном испарении или больших слоях пены на поверхности потока. Именно поэтому датчики скорости на базе рупорных антенн могут применяться как в безнапорных трубопроводах, так и в открытых каналах, а датчики скорости на базе патч-антенн предназначены для измерения скорости потока в реках и широких открытых каналах;
— измеряемое значение минимальной скорости потока для рупорной антенны составляет от 0,08 м/с, а для патч-антенны – от 0,1 м/с до 0,3 м/с. Некоторые производители датчиков скорости на базе патч-антенн для улучшения потребительских свойств своей продукции указывают минимальную скорость потока от 0,1 м/с, но стоит учитывать, что у некоторых моделей датчиков скорости диапазон от 0,1 м/с до 0,3 м/с является не измеряемым, а рассчитываемым, исходя из полученных значений уровня потока по принципу расходомеров‑уровнемеров. При выборе расходомера рекомендуем проверить его работу при минимальной скорости потока, подключив только датчик скорости (без использования датчика уровня).

Практическая область применения

Бесконтактный радарный метод измерения на базе рупорной антенны идеально подходит для безнапорных потоков со скоростью более 0,08 м/с (измерение расхода сточных, ливневых, промышленных стоков, промывной воды, других типов агрессивных жидкостей. Измерение расхода в трубопроводах диаметром от 150 до 8000 мм, каналах шириной до 20 м).

Про анемометры:  Урок-проект "Оптические приборы". 11-й класс

Бесконтактный радарный метод измерения на базе патч-антенны идеально подходит для использования в широких каналах и реках (равнинных, горных).

Ограничения в применении

При скорости ниже 0,08 м/с датчик скорости на базе рупорной антенны перестает измерять. Радарное излучение датчика скорости использует эффект Доплера, то есть луч датчика скорости отражается от неровностей, образующихся на поверхности потока. При скорости ниже 0,08 м/с поверхность потока становится зеркальной и луч радара не возвращается к датчику, а переотражается в обратном датчику направлении.

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

Датчик скорости на базе рупорной антенны

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

Датчик скорости на базе патч-антенны

Датчики, разработанные на ба­зе патч-антенны, используются для измерений расхода воды в открытых каналах и реках. Широкополосность диаграммы направленности в этих случаях выступает преимуществом этих расходомеров. Минимальная скорость измерения таких датчиков составляет 0,3 м/с (для некоторых моделей 0,1 м/с), при скорости потока ниже 0,3 м/с расходомер определяет расход как одноканальный расходомер-уровнемер.

Представленные на рынке РФ расходомеры, применяющие бесконтактный радарный метод

Датчик на базе конструкции рупорной антенны: расходомер Raven-Eye (номер в Государственном реестре: 63805-16), производство Flow-Tronic, Бельгия.

Датчик на базе конструкции планарной антенны (патч-антенны):
— расходомер NivuFlow 7550 (не внесен в Государственный реестр СИ), производство Nivus, Германия;
— расходомер Q‑Eye (не внесен в Государственный реестр СИ), производство Hydrovision (Seba), Германия;
— расходомер Phoenix (не внесен в Государственный реестр СИ), производство Flow-Tronic, Бельгия.

Погружной доплеровский метод

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

Погружной доплеровский метод может быть представлен двумя типами датчиков: датчик непрерывного излучения и датчик импульсного излучения. Оба типа датчиков используют один и тот же метод измерения – эффект Доплера. Но есть некоторые различия в выполнении измерений.

Датчик скорости непрерывного действия имеет два кристалла: первый – излучающий ультразвуковые сигналы, второй – принимающий сигналы, отраженные от частиц в потоке. Оба кристалла непрерывно излучают и принимают сигналы, отсюда и понятие «непрерывного действия».

Датчик скорости импульсного излучения имеет один кристалл, который выступает и в роли излучателя, и в роли кристалла, принимающего сигнал. После отправки сигнала датчик скорости еще находится в состоянии вибрации, которое можно сравнить с состоянием языка колокола после удара. Пока вибрация не успокоится, кристалл не будет способен принять отраженные сигналы обратно. Вследствие этого образуется «временное» окно, когда датчик не способен работать. Такая «слепая зо­на» измерений составляет 7–10 см над датчиком.

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

Практическая область применения

Доплеровский метод измерения обычно применяют для определения расхода ливневых и хозяйственно-бытовых стоков на трубопроводах диаметром до 1,5 м и открытых каналах шириной до 2 м.

Ограничения в применении

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

На рис. 3 условно показана ситуация с умеренным содержанием взвешенных частиц в потоке. На рис. 4 – с повышенным содержанием взвешенных частиц в потоке, а на рис. 5 – с высоким содержанием взвешенных частиц в потоке.

Ris_3.png

Рис. 3. Установленный датчик скорости в условиях умеренной концентрации взвешенных частиц: 1 – датчик скорости, 2 – покрытие ультразвукового сигнала датчика скорости, 3 – профиль скоростей потока

Ris_4.png

Рис. 4. Установленный датчик скорости в условиях повышенной концентрации взвешенных частиц: 1 – датчик скорости, 2 – покрытие ультразвукового сигнала датчика скорости, 3 – профиль скоростей потока

Ris_5.png

Рис. 5. Установленный датчик скорости в условиях высокой концентрации взвешенных частиц: 1 – датчик скорости, 2 – покрытие ультразвукового сигнала датчика скорости, 3 – профиль скоростей потока

Работу датчика скорости в данных условиях можно сравнить с работой фонаря в густом тумане – чем гуще туман, тем короче луч света. Этот эффект также можно назвать поглощением сигнала.

Представленные на рынке РФ расходомеры, применяющие доплеровский метод

Доплер непрерывного действия:
— расходомер Beluga (номер в Государственном реестре: 63804-16), производство Flow-Tronic (Бельгия);
— расходомер Greyline AVFM (но­мер в Государственном реестре: 48751‑11), производство Greyline Technologies (Канада);
— расходомер Взлет РБП (номер в Государственном реестре: 52517-13), производство АО «Взлет» (Россия).

Доплер импульсного действия:
— расходомер Nivus OCFM (номер в Государственном реестре: 41981-09), производство Nivus (Германия);
— расходомер Nivus OCFM Pro (номер в Государственном реестре: 34977-07), производство Nivus (Германия).

Ультразвуковой метод Transit-Time

Ультразвуковой метод измерения скорости потока Transit-Time, или времяимпульсный, является одним из наиболее распространенных, потому как имеет самый большой опыт применения по всему миру ввиду его давности.

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

Практическая область применения

— Обычно ультразвуковой метод измерения скорости применяют в трубопроводах большого диаметра с вероятностью появления принулевых значений скорости либо в каналах шириной более 15 м.

— Длина прямого участка для установки – не менее 13 Нмакс (Нмакс – максимальный уровень потока в измерительном створе).

Ограничения в применении

Сложность монтажа и демонтажа датчиков скорости, например для последующей поверки.

Для получения средней скорости потока с помощью ультразвукового метода необходимо выполнить измерения в разных плоскостях измерительного сечения. Как известно, скорость по поперечному сечению потока изменяется: ближе к стенкам сечения скорость ниже, ближе к поверхности потока – выше, такое распределение называется профилем скоростей потока по поперечному сечению. В связи с этим необходимо как минимум предусмотреть установку датчиков на дне трубопровода (канала) и в центре. Выбор количества пар датчиков скорости определяется, исходя из размеров сечения трубопровода или канала и диапазона изменения уровня потока. На рис. 6 показан неправильный способ установки датчиков скорости, на рис. 7 – правильный способ установки датчиков.

Ris_6.png

Рис. 6. Неправильная установка ультразвуковых датчиков скорости Transit-Time в зависимости от наполнения трубопровода: 1 – датчик скорости, 2 – ультразвуковой сигнал от датчика к датчику, 3 – профиль скоростей потока

Ris_7_small.png

Рис. 7. Правильная установка ультразвуковых датчиков скорости Transit-Time в зависимости от наполнения трубопровода: 1 – датчик скорости, 2 – ультразвуковой сигнал от датчика к датчику, 3 – профиль скоростей потока (увеличить изображение)

Измерение уровня

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

Представленные на рынке РФ расходомеры, применяющие метод Transit-Time

— Расходомер Accusonic (номер в Государственном реестре: 42521‑09), производство Accusonic Technologies (США).
— Расходомер NivuChannel (номер в Государственном реестре: 39714‑08), производство Nivus (Германия).
— Расходомер Flo-Sonic модели FPFM, OCFM, OC Hybrid (номер в Государственном реестре: 55609‑13), производство Flow-Tronic (Бельгия).

Электромагнитный метод

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

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

Практическая область применения

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

Ограничения в применении

При использовании в качестве технического решения по измерению сточной воды в трубопроводе перед узлом учета образуется застойная зона, которая нуждается в периодической профилактике в виде очистки канализационных сетей (рис. 8).

Ris_8.png

Рис. 8. Наполнение приходящего трубопровода при установке электромагнитного датчика скорости с вертикальным изливом: 1 – датчик скорости, 2 – уровень потока в приходящем трубопроводе, 3 – уровень излива измерительного участка

Представленные на рынке РФ расходомеры, применяющие электромагнитный метод

— Расходомер Jaeger Observer (но­мер в Государственном реестре: 71634‑18), производство Jaeger Mes­stechnik (Австрия).
— Расходомер Sewer-Mag (номер в Государственном реестре: 46039‑10), производство Flow-Tronic (Бельгия).
— Расходомер АЭФТ Экосток (номер в Государственном реестре: 68933‑17), производство ООО «ТД АЭфТ» (Россия).

Одноканальные расходомеры

Это расходомеры, выполняющие только измерение уровня потока (измерение по одному каналу). Скорость потока рассчитывается на основании калибровки расходомера по месту его установки (рис. 9). Суть калибровки состоит в том, что в момент монтажа расходомера-уровнемера в выбранном измерительном створе производится мгновенное измерение максимальной или средней скорости потока (в зависимости от выбранной методики измерений). Далее на основании полученных значений, а также с учетом параметров фактического строительного уклона трубопровода и коэффициента шероховатости стенок выполняют калибровку измерительного створа. Такая калибровка в последующем используется расходомером-уровнемером для автоматического расчета расхода по измеренному уровню без измерения значений скорости.

Ris_9.png

Рис. 9. Расходомер-уровнемер, установленный на безнапорном трубопроводе: 1 – ультразвуковой датчик уровня, 2 – волновод, 3 – ультразвуковое излучение

Практическая область применения

Безнапорные трубопроводы или открытые каналы без местных сопротивлений, имеющие длину прямого участка более 30 Нмакс (Нмакс – максимальный уровень потока в измерительном створе).

Ограничения в применении

— Дно измерительного створа не должно подвергаться заилению или отложению осадка.

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

— Длина прямого участка – не менее 30 Нмакс (Нмакс – максимальный уровень потока в измерительном створе).

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

Представленные на рынке РФ одноканальные средства измерения (расходомеры-уровнемеры)

— Эхо-Р‑02 (номер в Госреестре: 21807-06), производство ООО ПНП «Сигнур» (Россия).
— Взлет РСЛ (номер в Госреестре: 60777-15), производство АО «Взлет» (Россия).
— LT-US (номер в Госреестре: 61687-15), производство компании Lacroix Sofrel (Франция).

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

Опубликовано в журнале ИСУП № 3(81)_2021

А.В. Конев, главный метролог,
испытательная лаборатория «Технометр», г. Санкт-Петербург,
e-mail: tm-metrology@anemometers.ru,
сайт: tehnometr.ru

Оцените статью
Анемометры
Добавить комментарий