#1 2018-01-30 22:54:03

Fog
Участник
Зарегистрирован: 2018-01-30
Сообщений: 3

Датчик уровня газа в балоне на авто

Привет !!
Нужна помощь в допиле скейча !!
Хотел зделать датчик уровня газа в балоне на авто .
Использовал АРДУИНО UNO дисплэй OLED 1306 и датчик WPGH-1
Столкнулся с проблемой что датчик работает в диапазоне 0.8v до 4.5v .
Подскажите плиз как допелить скейчь до совершенства ?

#include "U8glib.h"

U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK);  // Display which does not send ACK



                                                                                                                                           
int xmax=128;                                   // max length x-axis
int ymax=64;                                    // max length y-axis
int xcenter=xmax/2;                             // center of x-axis
int ycenter=ymax/2+10;                          // center of y-axis
int arc=ymax/2;                             
int angle=0;                                   
char* label[] = {"LOAD","GAZOLIN","INTAKE", "VOLT"};    // some custom gauge labels
int labelXpos[] = {53, 45, 49, 53};                     // predefined x-position of a gauge label
#define potmeterPin A1                                  // simulate analogue value with potentiometer
int p, w, m;
u8g_uint_t xx=0;

// ------------------------------------------------- void gauge() ------------------------------------------
void gauge(uint8_t angle) {

  // draw border of the gauge
  u8g.drawCircle(xcenter,ycenter,arc+6, U8G_DRAW_UPPER_RIGHT);
  u8g.drawCircle(xcenter,ycenter,arc+4, U8G_DRAW_UPPER_RIGHT);
  u8g.drawCircle(xcenter,ycenter,arc+6, U8G_DRAW_UPPER_LEFT);
  u8g.drawCircle(xcenter,ycenter,arc+4, U8G_DRAW_UPPER_LEFT);

  // draw the needle
  float x1=sin(2*angle*2*3.14/360);              // needle position
  float y1=cos(2*angle*2*3.14/360); 
  u8g.drawLine(xcenter, ycenter, xcenter+arc*x1, ycenter-arc*y1);
  u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_LEFT);
  u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_RIGHT);
  u8g.setFont(u8g_font_chikita);
 
  // show scale labels
  u8g.drawStr( 20, 42, "0");                   
  u8g.drawStr( 25, 18, "25");
  u8g.drawStr( 60, 14, "50");
  u8g.drawStr( 95, 18, "75");
  u8g.drawStr( 105, 42, "100");
 
  // show gauge label
  u8g.setPrintPos(labelXpos[1],32);             
  u8g.print(label[1]);
 
  // show digital value and align its position
  u8g.setFont(u8g_font_profont22);             
  u8g.setPrintPos(54,60);
  if (w<10){                                    // leading 0 when value less than 10
    u8g.print("0");
  }
  if (w>99) {                                   // position at 100%
    u8g.setPrintPos(47,60);
  }
  u8g.print(w);
}

// ------------------------------------------------- void setup() ------------------------------------------
void setup(void) {
  pinMode(potmeterPin, INPUT);
  u8g.setFont(u8g_font_chikita);
  u8g.setColorIndex(1);                         // Instructs the display to draw with a pixel on.

  // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);                     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);                       // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);                       // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255,255,255);
  }
}

// ------------------------------------------------- void loop() ------------------------------------------

void loop(void) {

 
  p = analogRead(potmeterPin);                  // get value from potmeter
  w = map(p,0,1023,0,100);                      // map it between 0 and 100
  m = map(p,0,1023,0,99);                       // map needle movement

  // show needle and dial
  xx = m;                                      // 135 = zero position, 180 = just before middle, 0 = middle, 45 = max
  if (xx<45){                                   // positie correctie
    xx=xx+135;
  }
  else {
    xx=xx-45;
  }
 
  // picture loop
  {
    u8g.firstPage(); 
    do {             
      gauge(xx);
    }
    while( u8g.nextPage() );
  }
  delay(5000);
}

Редактировался Fog (2018-01-30 23:16:08)

#2 2018-01-31 00:50:20

Вячеслав Азаров
Участник
Из прошлого
Зарегистрирован: 2017-05-25
Сообщений: 793

Re: Датчик уровня газа в балоне на авто

Так а в чем ваша проблема? Вы не можете составить арифметическое преобразование диапазона значений датчика?

#3 2018-01-31 21:23:34

Fog
Участник
Зарегистрирован: 2018-01-30
Сообщений: 3

Re: Датчик уровня газа в балоне на авто

Да . Что бы при наличии в 0.8 или 1v на входе , дисплэй отоброжал  (0)

#4 2018-01-31 21:42:07

Вячеслав Азаров
Участник
Из прошлого
Зарегистрирован: 2017-05-25
Сообщений: 793

Re: Датчик уровня газа в балоне на авто

Fog пишет:

Да . Что бы при наличии в 0.8 или 1v на входе , дисплэй отоброжал  (0)

За преобразование диапазонов зачений датчиков, в вашей программе, отвечают эти две функции:

  w = map(p,0,1023,0,100);                      // map it between 0 and 100
  m = map(p,0,1023,0,99);                       // map needle movement 

Почитайте в справочнике Ардуино или в исходниках как ими воспользоваться и вам станет понятно, что нужно сделать.

#5 2018-02-01 22:31:06

Fog
Участник
Зарегистрирован: 2018-01-30
Сообщений: 3

Re: Датчик уровня газа в балоне на авто

Спс !! Прочёл, понял. Но дисплэй отображает всё что ниже 1v со значением " - ", подскажите плиз как убрать ?

#6 2018-02-01 22:37:27

Вячеслав Азаров
Участник
Из прошлого
Зарегистрирован: 2017-05-25
Сообщений: 793

Re: Датчик уровня газа в балоне на авто

Fog пишет:

Спс !! Прочёл, понял. Но дисплэй отображает всё что ниже 1v со значением " - ", подскажите плиз как убрать ?

Подберите необходимое корректируюшее смешение нуля. Это здесь:

 // show needle and dial
  xx = m;                                      // 135 = zero position, 180 = just before middle, 0 = middle, 45 = max
  if (xx<45){                                   // positie correctie
    xx=xx+135;
  }
  else {
    xx=xx-45;
  }

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела