Датчик уровня топлива, Нужна помощь!
- Войдите на сайт для отправки комментариев
Пнд, 15/07/2013 - 13:05
Хочу сделать датчик уровня топлива в газовом балоне автомобиля, минимальное напряжение у меня при замерах получилось, полный бак 0.09в пустой бак 2.9в.
На просторах интернета нашел наработки кода и начал разбираться и переделывать.
Со всем разобрался, но есть одна проблема, дело в том что у автора кода было так что чем выше напряжение тем больше топлива в баке, а у меня наоборот тем меньше напряжение тем больше топлива в баке.
Вопрос как сделать так чтобы было чем меньше напряжение тем больше топлива в баке??
К ардуино подключен LCD дисплей 16x2, датчик уровня топлива подключен к аналоговому входу A0
#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(18, 19, 14, 15, 16, 17);
//специальные символы для отображения уровня топлива
uint8_t stripe_begining_full [8] = {0x1f,0x10,0x17,0x17,0x17,0x10,0x1f};
uint8_t stripe_begining_empty [8] = {0x1f,0x10,0x15,0x12,0x15,0x10,0x1f};
uint8_t stripe_midde_full [8] = {0x1f,0x0,0x1f,0x1f,0x1f,0x0,0x1f};
uint8_t stripe_midde_empty [8] = {0x1f,0x0,0x0,0x0,0x0,0x0,0x1f};
uint8_t stripe_midde_warning [8] = {0x1f,0x4,0x4,0x4,0x0,0x4,0x1f};
uint8_t stripe_midde_happy [8] = {0x1f,0x0,0x11,0x4,0x13,0x0,0x1f};
uint8_t stripe_end_full [8] = {0x1f,0x1,0x11,0x5,0x19,0x1,0x1f};
uint8_t stripe_end_empty [8] = {0x1f,0x1,0x1,0x1,0x1,0x1,0x1f};
void setup()
{
analogWrite(11, 50); //контрастность экранчика
analogWrite(12, 100); //яркость подсветки
lcd.begin(16, 2); //Дисплей 16Х2
lcd.createChar(4,stripe_begining_empty);
lcd.createChar(1,stripe_begining_full);
lcd.createChar(2,stripe_midde_full );
lcd.createChar(3,stripe_midde_empty );
//lcd.createChar(4,stripe_midde_warning);
lcd.createChar(5,stripe_midde_happy);
lcd.createChar(6,stripe_end_full);
lcd.createChar(7,stripe_end_empty);
}
void loop()
{
Serial.begin(9600);
float voltage_sum = 0;
float max_voltage = 2.9;
///////////////////
//опрос дтчиков и расчет
////////////////////
//getting sensors data
float sum1,sum2,sum3,sum4,sum5,sum6,sum7,sum8,sum9,sum10,sum11,sum12,sum13,sum14,sum15,sum16,sum17,sum18,sum19,sum20,sum21,sum22;
sum1 = GetSensorsDataSum(0);
delay(200);
sum2 = GetSensorsDataSum(0);
delay(200);
sum3 = GetSensorsDataSum(0);
delay(200);
sum4 = GetSensorsDataSum(0);
delay(200);
sum5 = GetSensorsDataSum(0);
delay(200);
sum6 = GetSensorsDataSum(0);
delay(200);
sum7 = GetSensorsDataSum(0);
delay(200);
sum8 = GetSensorsDataSum(0);
delay(200);
sum9 = GetSensorsDataSum(0);
delay(200);
sum10 = GetSensorsDataSum(0);
delay(200);
sum11 = GetSensorsDataSum(0);
delay(200);
sum12 = GetSensorsDataSum(0);
delay(200);
sum13 = GetSensorsDataSum(0);
delay(200);
sum14 = GetSensorsDataSum(0);
delay(200);
sum15= GetSensorsDataSum(0);
delay(200);
sum16 = GetSensorsDataSum(0);
delay(200);
sum17 = GetSensorsDataSum(0);
delay(200);
sum18 = GetSensorsDataSum(0);
delay(200);
sum19 = GetSensorsDataSum(0);
delay(200);
sum20 = GetSensorsDataSum(0);
delay(200);
sum21 = GetSensorsDataSum(0);
delay(200);
sum22 = GetSensorsDataSum(0);
voltage_sum = (sum1+sum2+sum3+sum4+sum5+sum6+sum7+sum8+sum9+sum10+sum11+sum12+sum13+sum14+sum15+sum16+sum17+sum18+sum19+sum20+sum21+sum22) / 22;
DisplayFuelData(0, voltage_sum, max_voltage, 11);
delay (1000); //waiting 7 seconds
// */
}
float GetSensorsDataSum (int first_sensor_pin)
{
float U1 =(analogRead(first_sensor_pin))/205.2;
Serial.println(analogRead(first_sensor_pin));
return U1;
}
void DisplayFuelData(int row, float voltage_sum, float max_voltage, int numberOfCells)
{
int column=0;
lcd.setCursor(column,row);
////////////////////////////
//STARTING DRAWING FUEL BAR
////////////////////////////
float one_cell_voltage;
if (numberOfCells!=0)
{ one_cell_voltage = max_voltage/numberOfCells;} //11 cells
else {lcd.setCursor(0,3); lcd.print ("DELENIE NA NOL!!"); return;}
int full_cells;
if (one_cell_voltage!=0)
{ full_cells = (int)(voltage_sum/one_cell_voltage);}
else {lcd.setCursor(0,3); lcd.print ("DELENIE NA NOL!!"); return;}
//////////////
//PERCENTAGE//
//////////////
int percents;
if (max_voltage!=0)
{ percents = (int) ((voltage_sum*100)/max_voltage);}
else {lcd.setCursor(0,3); lcd.print ("DELENIE NA NOL!!"); return;}
if (percents <= 7 ) //empty
{
lcd.setCursor(0,row);
lcd.print("\4\3\3\3\3\3\3\3\3\3\7");
//lcd.setCursor(2,2); lcd.print("I drew empty bar");
}
if (percents >= 90)//full
{ lcd.print("\1\2\2\2\2\2\2\2\2\2\6");// lcd.setCursor(2,2); lcd.print("I drew full bar");
}
if ((percents>7)&&(percents<90))
{
lcd.write(1); //first cell
column++;
lcd.setCursor(column,row);
for(int i=0; i<numberOfCells-2;i++) //-2, first and last cell
{
if (i<full_cells-1){lcd.write(2);}
else {lcd.write(3);}
column++;
lcd.setCursor(column,row);
}
lcd.write(7); //last cell
// lcd.setCursor(2,2); lcd.print("I drew normal bar");
}
//ПРОЦЕНТЫ
Serial.println(voltage_sum);
lcd.setCursor(12,0);
lcd.print(percents);
lcd.print("%");
/////////
//выводим напряжение
/////////
lcd.setCursor(0,1);
lcd.print(voltage_sum);
lcd.print("v ");
////////////////////
//выводим колличество литров
/////////////////////
lcd.setCursor(6,1);
float litres =(voltage_sum / (max_voltage/60)); //60 литров топлива
lcd.print(litres); lcd.print(" lit");
}
отнимите от максимального значения текущее, получится наоборот все
floatGetSensorsDataSum (intfirst_sensor_pin)101{102floatU1 =(analogRead(first_sensor_pin))/205.2;103Serial.println(analogRead(first_sensor_pin));104105returnU1;106}107в смысле на 102 строке?
мне в идеале нужно сдеать так чтобы при 2.9в показало 0в а при 0 в показало 2.9в
та зачем там трогать, можно просто среднее значение корректировать voltage_sum которое
ну от 2.9В или сколько там с АЦП выдаст отнимайте текущее значение
например текущее 0, корректируем 2.9-0 = 2.9
текущее 2.9, 2.9-2.9=0
ну как то так
Не моглибы вы написать формулку для voltage_sum чтоб так происходило, в програмировании я дуб дубом.
ну если voltage_sum в вольтах, то в 92 вставте voltage_sum = 2.9-voltage_sum
Спасибо большое Michal, всё работает!!!
Добрый вечер. У вас данное устройство сделано на MEGA ? Работает ли сейчас данный скетч? А то пока нету индикатора