Датчик уровня топлива, Нужна помощь!

neospromiy
Offline
Зарегистрирован: 15.07.2013

Хочу сделать датчик уровня топлива в газовом балоне автомобиля, минимальное напряжение у меня при замерах получилось, полный бак 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");
}

 

 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

отнимите от максимального значения текущее, получится наоборот все

neospromiy
Offline
Зарегистрирован: 15.07.2013
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 строке?

neospromiy
Offline
Зарегистрирован: 15.07.2013

мне в идеале нужно сдеать так чтобы при 2.9в показало 0в а при 0 в показало 2.9в

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

та зачем там трогать, можно просто среднее значение корректировать voltage_sum которое

ну от 2.9В или сколько там с АЦП выдаст  отнимайте текущее значение

например текущее 0,  корректируем 2.9-0 = 2.9

 текущее 2.9,  2.9-2.9=0

ну как то так

neospromiy
Offline
Зарегистрирован: 15.07.2013

Не моглибы вы написать формулку для voltage_sum чтоб так происходило, в програмировании я дуб дубом.

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

ну если voltage_sum в вольтах, то в 92 вставте voltage_sum = 2.9-voltage_sum

 

neospromiy
Offline
Зарегистрирован: 15.07.2013

Спасибо большое Michal, всё работает!!!

konog
Offline
Зарегистрирован: 17.12.2015

Добрый вечер. У вас данное устройство сделано на MEGA ? Работает ли сейчас данный скетч? А то пока нету индикатора