ДМРВ-М и Ардуино

w2den777
Offline
Зарегистрирован: 28.02.2016

Добрый день! возникла необходимость использовать ДМРВ в качестве датчика расхода воздуха вне автомобиля. Имеется ДМРВ-М от Газели и вот такая статья. Дело в том что у него 4 контакта, а в ДМРВ-М целых 6. Подскажите по теме как получить данные с такого датчика. 

w2den777
Offline
Зарегистрирован: 28.02.2016

С контактами разобрался, напряжение шлет в порт 0. Прошивка из ссылки сверху приведена внизу. Там расчитывается CFM, мне нужно расчитать скорость. Сделал небольшой стенд для тарирования из импеллера и термоанемометра testo 425. Сделал новую таблицу вольтаж-расход (я помню про температуру, к ней вернемся потом) Проблема в том, что при подставлении своей таблицы считает все равно неправильно. Приведено 26 значений, соответсвенно массив обзывается float theArray[52]= {. Моя таблица содержит 11 значений, и когда я ставлю вместо 52 число 22 то выдает ошибку. Ставлю 23 и нет ошибки. Дальше непонятно как происходит интерполяция, пожалуйста обьясните почему неправильно считает и как вообще он считает? Почему в цикле for второе условие x+2?

Моя тарировка напряжение-расход

1.93, 0.43,
2.12, 0.7,
2.29, 1.1,
2.55, 2,
2.69, 2.9,
2.79, 3.4,
2,93, 4.7,
3.03, 5.3,
3.05, 5.8,
3.14, 6.3,
3.2, 7.4
Поискал скетчи от термометров, там избыточно сложно, нужен скетч такой как этот - взял с а0, интерполировал по таблице, вывел значение. Помогите!

Код из интернета:

// include library
#include <LiquidCrystal.h>

// create int for program
int val = 0;
float volt = 0;
int cfm = 0;

//Create lookup tale for Ford Mass Air Sensor
float theArray[52]= {
0.1, 2,
0.6, 7,
0.8, 9,
0.9, 12,
1.1, 16,
1.2, 18,
1.3, 22,
1.5, 26,
1.6, 30,
1.7, 36,
1.8, 40,
1.9, 44,
2.0, 49,
2.2, 59,
2.3, 70,
2.4, 79,
2.6, 90,
2.7, 99,
2.9, 119,
3.1, 145,
3.4, 170,
3.5, 195,
3.9, 245,
4.2, 292,
4.4, 340,
4.8, 410};

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
/*
 * pin1 = gnd
 * pin2 = +5v
 * pin3 = gnd
 * pin4 = rs = pin 2 arduino
 * pin5 = r/w = gnd
 * pin6 = e = pin 3 arduino
 * pin7 = no connection
 * pin8 = no connection
 * pin9 = no connection
 * pin10 = nl connection
 * pin11 = db4 = pin 4 arduino
 * pin12 = db5 = pin 5 arduino
 * pin13 = db6 = pin 6 arduino
 * pin14 = db7 = pin 7 arduino
 * pin15 = ledA = +5v
 * pin16 = ledA = gnd
 *
 *
 * 
volts, cfm
*/

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);



void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(20, 4);
}

void loop() {
int  val = analogRead(0);// read analog input

float volt = val * (5.0/1023.0);// convert to voltage
  //print header
  lcd.setCursor(2, 0);
  lcd.print("JOE'S FLOW BENCH");
  //print volts line
  lcd.setCursor(0, 2);
  lcd.print("VOLTS");
  lcd.setCursor(10,2);
  lcd.print(volt);
  //print cfm line
  lcd.setCursor(0, 4);
  lcd.print("CFM");

//create interpolation so we can convert voltage to cfm
for (int x= 0; x<52; x=x+2){
 if (volt >=theArray[x] && volt <=theArray[x+2])
{
   cfm = theArray[x+3] + ( (theArray[x+1] - theArray[x+3]) * ( (volt - theArray[x]) / (theArray[x+2] - theArray[x]) ) );
// temp = base temp + (high temp- base temp) * (Vread - Vbase) / (Vhigh - Vbase)
 }
}

// added this line because cfm would not go to 0 only the lowest value last read
if(volt <= 0.1)
  cfm = 0;
  else
  cfm = cfm;

lcd.setCursor(10, 4);
lcd.print(cfm);
delay(200);
lcd.clear();// clear the LCD screen so numbers disappear and don,t stack up to create false reading

}