Датчик уровня топлива, Нужна помощь!
- Войдите на сайт для отправки комментариев
Пнд, 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"); }
отнимите от максимального значения текущее, получится наоборот все
float
GetSensorsDataSum (
int
first_sensor_pin)
101
{
102
float
U1 =(analogRead(first_sensor_pin))/205.2;
103
Serial
.println(analogRead(first_sensor_pin));
104
105
return
U1;
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 ? Работает ли сейчас данный скетч? А то пока нету индикатора