Калибровка аналогового входа

Jhonson
Offline
Зарегистрирован: 28.02.2014

Добрый день!

Захотелось поставить датчик давления в систему водопровода. Приобрел на али датчик со следующим описанием

"5 в постоянного тока, выход 0,5-4,5 в, датчик давления, датчик масла и воды, 0-10/бар"

Подключил к node mcu и получил следующий результат:

фактическое давление = показания аналогового входа 

0 = 164 ; 1 = 300 ; 2 = 429 ; 3 = 550 ; 4 = 685

Сейчас я решил проблему так (см. код), но наверняка есть более правильный способ?

int aPin = A0;//
float aval = 0;// значение на А0
float bar = 0;// преобразованное значение 

void apin(){ // считывание и преобразование аналогового входа
  aval = analogRead(aPin);
       if (aval < 250 )             {  bar = aval - 165;}
  else if (aval > 250 && aval < 350){  bar = aval * 0.0033;}
  else if (aval > 350 && aval < 500){  bar = aval * 0.0046;}
  else if (aval > 500 && aval < 600){  bar = aval * 0.0054;}
  else if (aval > 600 && aval )     {  bar = aval * 0.0058;}

 

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

Можно завести таблицу в экселе, построить график, включить формулу тренда (многочлен как минимум в 3 члена), и использовать ее для пересчета.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Jhonson, постройте график - тут же линейная зависимость!

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

kalapanga пишет:

тут же линейная зависимость!

127486
Offline
Зарегистрирован: 15.02.2018

Я таким образом выкрутился 

 

 

float calc(int codeMin, int codeMax, float valueMin, float valueMax, int codeValue)
{
    return (codeValue*0.1 - codeMin*0.1)/(codeMax*0.1 - codeMin*0.1)*(valueMax - valueMin) + valueMin;
}
 
 res1 = calc(0, 2911, 0, 10, sensorValue1);
BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Какое значение при 10?

Jhonson
Offline
Зарегистрирован: 28.02.2014

а как это реализовать в коде, могли бы подсказать?

Jhonson
Offline
Зарегистрирован: 28.02.2014

1023 скорее всего

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Jhonson пишет:
1023 скорее всего

Скорее всего? А измерить? Я чота так подумал, что обычная функция map() тут влетит как к себе домой )))

mifar
Offline
Зарегистрирован: 07.04.2021

Jhonson пишет:

Подключил к node mcu

Правильно подключил? Надеюсь, в курсе что у голой esp8266 максимальное входное наапряжение АЦП всего 1В? Но благодаря китайцам, которые предусмотрели делитель на входе АЦП, у модулей nodemcu оно составляет 3 В. Ваш же модуль

Цитата:
"5 в постоянного тока, выход 0,5-4,5 в

 

127486
Offline
Зарегистрирован: 15.02.2018

Мое значение тебе не подойдет, у меня ESP32 + делитель по входу. 

Вот этим скетчем калибровочные значения узнаю. 

 


float calc(int codeMin, int codeMax, float valueMin, float valueMax, int codeValue)
{
    return (codeValue*0.1 - codeMin*0.1)/(codeMax*0.1 - codeMin*0.1)*(valueMax - valueMin) + valueMin;
}
void setup() {
    Serial.begin(115200);   
    Serial.println();
    pinMode(36, INPUT);
    //pinMode(39, INPUT);
   
}

void loop() {
  
  int sensorValue1 = analogRead(36);
  //int sensorValue2 = analogRead(39);       
  float res1;
 // float res2;
   
  res1 = calc(0, 2911, 0, 10, sensorValue1);
  //res2 = calc(0, 2875, 0, 10, sensorValue2);
 
  

  
  
 
  Serial.println(res1);
  Serial.println(sensorValue1);
  
  
  delay(500);
}

 

127486
Offline
Зарегистрирован: 15.02.2018

Про датчик кстати могу добавить следующее. 

У меня их 6 штук. У всех показания разные, погрешность ~0.25, для моих задач это много. 

Для этого и понадобился скетч калибровки. 

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

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

127486 пишет:

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

это не по фэншую, грузопоршневой манометр нужен )))

kalapanga
Offline
Зарегистрирован: 23.10.2016

BOOM пишет:

Jhonson пишет:
1023 скорее всего

Скорее всего? А измерить? Я чота так подумал, что обычная функция map() тут влетит как к себе домой )))

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

Кстати, такие вещи обычно в инструкциях/даташитах прописаны. Jhonson, не смотрели?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

kalapanga пишет:

BOOM пишет:

Jhonson пишет:
1023 скорее всего

Скорее всего? А измерить? Я чота так подумал, что обычная функция map() тут влетит как к себе домой )))

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

Кстати, такие вещи обычно в инструкциях/даташитах прописаны. Jhonson, не смотрели?

Так я спрашивал про 10, ответ был «наверное». Поэтому я только предположил...