Pages: 1 ... 5 6 [7] 8   Go Down
Author Topic: Multidisplay, a Open Source inCar Display, Logger  (Read 62197 times)
0 Members and 5 Guests are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 36
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://spreadsheets.google.com/ccc?key=0AhE0WRDzzOwidG82M2FQX2FVdHJuN1pmNkhtN21zV2c&hl=en

take a look at my work and make sure i got all the right parts?  smiley
Logged

Austria
Offline Offline
Sr. Member
****
Karma: 3
Posts: 260
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

i cant access the spreadsheet  :-X

deep link to the datasheet i got: http://www2.produktinfo.conrad.com/datenblaetter/425000-449999/440483-da-01-en-ENTSTOERDROSSEL_MESC_400M_01.pdf

on the supplier page, the part MESC-400M-YY is ok!

according to here: http://www.fastrongroup.com/products/inductors/pdf/SuppressionCoils.pdf

the YY is the Packing Code, so with 01 i got the Reel Version, with 00 you would get em boxed.

Means 00 or 01 would be ok  smiley
« Last Edit: February 16, 2010, 02:46:50 am by designer2k2 » Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 36
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

do you have a copy of office?  what spreadsheet formats can you read?  i have it stored on the pc in office 2007 xlsx format.
Logged

Austria
Offline Offline
Sr. Member
****
Karma: 3
Posts: 260
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

google docs would be fine, but you need make it public so i can read it  smiley

xlsx would also be ok, im running office 2007.
Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 36
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

can i get your email?  i'll email it to you.  i'll 'try' to make the doc public, though i 'thought' i did.  hehe.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 36
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://spreadsheets.google.com/ccc?key=0AhE0WRDzzOwidG82M2FQX2FVdHJuN1pmNkhtN21zV2c&hl=en

its set to edit without signing in now.  should work.  smiley
Logged

Austria
Offline Offline
Sr. Member
****
Karma: 3
Posts: 260
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Featured on Hackaday  smiley-grin

http://hackaday.com/2010/03/16/keep-tabs-on-your-car-without-obd-ii/
Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

While I'm not exactly sure how I would use this...  I'm desperately trying to find a reason!  Very nice work.
Logged

Austria
Offline Offline
Sr. Member
****
Karma: 3
Posts: 260
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,

to get the support and development sorted we created a forum where everything about it can be discussed!

http://mdforum.designer2k2.at/

join in if you have questions, we dont bite  smiley-grin

designer2k2
Logged


Austria
Offline Offline
Sr. Member
****
Karma: 3
Posts: 260
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello, Hallo,



[english]

im proud to announce that the second batch of prints has arrived!!!  8-)

20 sets are avaiable, should be enough for everybody, i hope...  smiley-wink

You can have as many as you want, for 60€ per set i send them worldwide  smiley

Interested? See here: MDforum/OrderThread

with greetings from Austria,
Stephan Martin

[german]

das 2te Set Prints ist angekommen!!!  8-)

insgesamt 20 Sets sind verfügbar, sollte für jeden reichen, hoffe ich smiley-wink

Für 60€ pro Set versende ich Weltweit, jeder kann haben soviel er will  smiley

Interesse? Hier gehts weiter: MDforum/BestellThread

Grüße,
Stephan Martin
Logged


0
Offline Offline
God Member
*****
Karma: 2
Posts: 596
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A bit OT, I know, but...

I wrote some code to display a "progress bar" with pixel resolution rather than character resolution. It uses 5 custom chars.

Here's an example sketch that includes the function and different display styles.

How did you implement your "bars" ?

Code:
/*
 * Simple "graphical" bar on 5x8 lcd display.
 *
 * Author: Marcello Romani mromani@ottotecnica.com
 *
 * Hardware requirements:
 * - Arduino 2009 board
 * - Nuelectrocnics display shield:
 *   http://www.nuelectronics.com/estore/index.php?main_page=product_info&cPath=1&products_id=2
 * - A standard LCD shield can be used as well, provided you correct the LiquidCrystal pin assignments
 *
 * Usage:
 * - Connect two potentiometers to analog inputs 1 and 2.
 * - select the display style by uncommenting the desired display funcion in loop()
 *
 */

#include <LiquidCrystal.h>

// pin assignments are for nuelectronics' lcd+keypad shield;
// adjust for other lcd shields
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// lcd size
const int LCD_NUM_COLS = 16;
const int LCD_NUM_ROWS = 2;

// analog channels to read and display
// change to taste
#define ANALOG_CHANNEL_1  1
#define ANALOG_CHANNEL_2  2


const int ANALOG_POLL_TIME = 100;    // unit: ms
const int NUM_VALUES = LCD_NUM_ROWS;
const int MAX_VALUE = 1023;
const int MIN_VALUE = 0;
int value[NUM_VALUES];
const int channels[NUM_VALUES] = { ANALOG_CHANNEL_1, ANALOG_CHANNEL_2 };

// custom characters for progress bar generation
byte graph0[8] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};

byte graph1[8] = {
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
};

byte graph2[8] = {
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
};

byte graph3[8] = {
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
};

byte graph4[8] = {
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
};

byte graph5[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};


void createCustomChars() {
  lcd.createChar(0, graph0);
  lcd.createChar(1, graph1);
  lcd.createChar(2, graph2);
  lcd.createChar(3, graph3);
  lcd.createChar(4, graph4);
  lcd.createChar(5, graph5);
}


//
// draw a horizontal bar on the display
// using custom chars 0..4
//
// row = number of row to draw to (0 or 1)
// maxChars = maximum bar lenght, in number of display characters
// value = raw value to display
// minValue, maxValue = minimum and maximum value for the value parameter
//
void drawBar(LiquidCrystal* lcdObj, int col, int row, int maxChars, int value, int minValue, int maxValue) {
  // character width in number of pixels
  static const int pixelsPerChar = 5;
  
  // maximum bar width in pixels
  int maxPixels;
  
  // calculated actual bar width
  int numPixels;
  
  // number of full chars to draw
  int q;
  
  // number of pixels in the last char
  int r;
  
  // counter
  int i;
  
  maxPixels = maxChars * pixelsPerChar;
  numPixels = map(value, minValue, maxValue, 0, maxPixels);
  
  q = numPixels / pixelsPerChar;
  r = numPixels % pixelsPerChar;

/*
  // debug over serial line
  Serial.println("----");
  Serial.println(value);
  Serial.println(maxPixels);
  Serial.println(numPixels);
  Serial.println(q);
  Serial.println(r);
*/

  lcdObj->setCursor(col, row);
  
  // always redraw the full bar to erase the previous one
  for (i = 0; i < maxChars; i++) {
    if (i < q) {
      lcdObj->write(5);    // full char
    }
    else if (i == q) {
      lcdObj->write(r);    // last char
    }
    else {
      lcdObj->write(0);    // erase any previous chars
    }
  }
}


// read the analog channels
void updateValues() {
  int i;
  
  for (i = 0; i < NUM_VALUES; i++) {
    value[i] = analogRead(channels[i]);
  }
}


// two orizontal bars
void updateDisplay0() {
  int i;
  
  for (i = 0; i < NUM_VALUES; i++) {
    drawBar(&lcd, 0, i, LCD_NUM_COLS, value[i], MIN_VALUE, MAX_VALUE);
  }
}


// two horizontal bars with raw analog values on the right
void updateDisplay1() {
  static char buf[10];
  int i;
  
  for (i = 0; i < NUM_VALUES; i++) {
    drawBar(&lcd, 0, i, LCD_NUM_COLS - 4, value[i], MIN_VALUE, MAX_VALUE);
    sprintf(buf, "%4d", value[i]);
    lcd.setCursor(LCD_NUM_COLS - 4, i);
    lcd.print(buf);
  }
}


// two horizontal bars with raw analog values on the left
void updateDisplay2() {
  static char buf[10];
  int i;
  
  for (i = 0; i < NUM_VALUES; i++) {
    drawBar(&lcd, 4, i, LCD_NUM_COLS - 4, value[i], MIN_VALUE, MAX_VALUE);
    sprintf(buf, "%4d", value[i]);
    lcd.setCursor(0, i);
    lcd.print(buf);
  }
}


// two horitonal bars with raw analog values beneath them
void updateDisplay3() {
  static char buf[10];
  int i;
  
  for (i = 0; i < NUM_VALUES; i++) {
    drawBar(&lcd, i*(LCD_NUM_COLS/2), 0, LCD_NUM_COLS/2, value[i], MIN_VALUE, MAX_VALUE);
    sprintf(buf, "%8d", value[i]);    // NOTE: field width must be equal to LCD_NUM_COLS/2
    lcd.setCursor(i*(LCD_NUM_COLS/2), 1);
    lcd.print(buf);
  }
}


void setup() {
  // this is required only for debug
  //Serial.begin(115200);
  
  // initialize lcd library
  lcd.begin(LCD_NUM_COLS, LCD_NUM_ROWS);
  
  // create required custom chars
  createCustomChars();
}


void loop() {
    // read the analog values
    updateValues();
    
    // uncomment only one of these:
    //updateDisplay0();
    //updateDisplay1();
    //updateDisplay2();
    updateDisplay3();
    
    // don't write too fast to the lcd...
    delay(ANALOG_POLL_TIME);
}
Logged

North Yorkshire, UK
Offline Offline
Faraday Member
**
Karma: 104
Posts: 5531
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

You could simplify your character creation into this:

Code:
 byte chars[] = {
    B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111,
    B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111,
    B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111,
    B00000, B00000, B00000, B00000, B11111, B11111, B11111, B11111,
    B00000, B00000, B00000, B11111, B11111, B11111, B11111, B11111,
    B00000, B00000, B11111, B11111, B11111, B11111, B11111, B11111,
    B00000, B11111, B11111, B11111, B11111, B11111, B11111, B11111,
    B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111
  };


  for (int i = 0; i < 8; i++){
  lcd.createChar(i, chars + i*8);
  }

Those characters are for a vertical bar so you will want to change that but it gives you the idea.

Mowcius
Logged

0
Offline Offline
God Member
*****
Karma: 2
Posts: 596
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yes, that's much better. Thank you.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 30
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

how do you know that your lambda measurement is accurate ?
first I though narrow band oxygen sensors were very non-linear
basically you can only tell if it is running rich or lean and the computer uses this to adjust the injection time so that the sensor will oscillate between rich and lean constantly

so I guess to know if your engine is healthy you wouldn't just display the actual value of the sensor nor an averaged value
but you would display, maybe, how often per unit of time the sensors switched between rich and lean (I would guess the more often the better, and if it stayed at one value for too long that would be a fault condition and if it stayed lean for too long that would be a "master fault" requiring engine shutdown or limp-home mode)

plus there are at least 3 main types of sensors

zirconia narrowband, this is the most common
zirconia wideband, I guess this is what new cars and performance cars have , also what they use in aftermarket A/F gauges

and titania sensors which is rare (but I just happen to find some on a nissan RB26DETT engine, these are coupled with EGT sensors I guess because their response is temperature sensitive)


a good O² sensor controller should support all of these I guess, so that all can benefit without buying new sensors

but maybe people playing with this will like to buy new wideband sensors

a narrowband sensor with no heater costs 10$
http://cgi.ebay.ca/O2-OXYGEN-SENSOR-STD-1WF-SG12-HONDA-CRX-91-84-/200335656679?cmd=ViewItem&pt=Motors_Car_Truck_Parts_Accessories&hash=item2ea4ef86e7

there's another kind that has a uncontrolled heater that is still narrowband but gives accurate measurement faster

you can get a wideband for about 40$
this is a Bosch LSU 4.2
it's a good sensor but it doesn't like high pressures

http://cgi.ebay.ca/Bosch-057-Wideband-Oxygen-Sensor-17014-Innovate-3737-/120585859399?cmd=ViewItem&pt=Motors_Car_Truck_Parts_Accessories&hash=item1c137a3147

a Bosch LSU 4.9 costs about 60$ I'm not sure if it's better a getting high pressure gas blown on it, there's another one called LC-1 that apparently you can put right after the turbo for the best response, I think they cost 140$ I can't find a link right now

there's a company called innovate motorsports and they make overpriced aftermarket automotives gauges and supposedly they use LC-1 sensors

the thing with wideband O² sensors is that to be accurate they have to be temperature controlled so that have a builting heater that you have to control and some sort of temperature, probably a K type thermocouple

to get an accurate reading you either keep the temperature at a stable temperature (I haven't found the celcius value yet) and the reading you get you run through a formula that takes into account the sensor response curve and that gives you the air/fuel ratio, but sometime the heater is not powerful enough to keep the temperature off so you have to compensate for it in the formula, also if the engine is heavily loaded the sensor temperature can go higher than the desired temperature even with the heater completely off. you have to compensate for that too

there is more information on how to make a wideband o² controller
http://www.megamanual.com/PWC/index.htm

but crucial details have probably been left out to impede DIY development of wideband o² controllers so information from the megasquirt project should be considered suspect until proven otherwise (megasquirt is a partially open ECU system that is getting more secretive as the community is no longer needed by the development team except for marketing purposes)

but still, there is a lot of good information on the megasquirt forum so that's a good source, just be wary





oh and I thought maybe it would be a good thing to have a break point between the datalogging and sensor interface backend and the display and user interface front end


maybe the backend could be a good start for making a truly open ECU

and a break point like this would allow someone to develop a separate front end , maybe some user want to re-use their cluster gauge, or use stepper motor dial gauges or even 7-segment, or those nice 3" cell phone graphical LCD but don't want to mess with the back end ?

what do you think ? makes sense ?
Logged

Austria
Offline Offline
Sr. Member
****
Karma: 3
Posts: 260
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

im currently supporting narrow band sensors (the 0-1V thigs) what only tell you rich or lean.

but also a LC-1 or the PLX SM-AFR work (both testet) and with them you have the bosch LSU 4.2 sensor. the 4.2 is in all current vw/audi cars, so i would call it a good sensor  smiley-wink
high pressure i think is no issue, if you have that high backpressure in you exhaust system, you have a general issue...

making a wideband controller yourself is nice, buts its nearly impossible to calibrate (or do you have a calibration gas tube?) so for example the LC-1 is a perfect working plug and play solution.


you can just take off the lcd and put any displaying device there, theres nobody stopping you from that  smiley

Logged


Pages: 1 ... 5 6 [7] 8   Go Up
Jump to: