0
Offline
Newbie
Karma: 0
Posts: 36
Arduino rocks
|
 |
« Reply #90 on: February 15, 2010, 08:02:08 pm » |
|
|
|
|
|
Logged
|
|
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 36
Arduino rocks
|
 |
« Reply #92 on: February 16, 2010, 08:57:25 am » |
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
Sr. Member
Karma: 3
Posts: 261
Arduino rocks
|
 |
« Reply #93 on: February 16, 2010, 11:15:14 am » |
google docs would be fine, but you need make it public so i can read it  xlsx would also be ok, im running office 2007.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 36
Arduino rocks
|
 |
« Reply #94 on: February 16, 2010, 12:08:47 pm » |
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
Newbie
Karma: 0
Posts: 36
Arduino rocks
|
 |
« Reply #95 on: February 16, 2010, 12:11:12 pm » |
|
|
|
|
|
Logged
|
|
|
|
|
Austria
Offline
Sr. Member
Karma: 3
Posts: 261
Arduino rocks
|
 |
« Reply #96 on: March 16, 2010, 12:25:28 pm » |
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 4
Arduino rocks
|
 |
« Reply #97 on: March 16, 2010, 03:24:11 pm » |
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
Sr. Member
Karma: 3
Posts: 261
Arduino rocks
|
 |
« Reply #98 on: June 01, 2010, 04:01:12 pm » |
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  designer2k2
|
|
|
|
|
Logged
|
|
|
|
|
Austria
Offline
Sr. Member
Karma: 3
Posts: 261
Arduino rocks
|
 |
« Reply #99 on: June 08, 2010, 02:22:36 pm » |
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...  You can have as many as you want, for 60 per set i send them worldwide  Interested? See here: MDforum/OrderThreadwith 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  Für 60 pro Set versende ich Weltweit, jeder kann haben soviel er will Interesse? Hier gehts weiter: MDforum/BestellThreadGrüße, Stephan Martin
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
God Member
Karma: 0
Posts: 596
Arduino rocks
|
 |
« Reply #100 on: June 14, 2010, 06:38:33 am » |
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" ? /* * 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
Faraday Member
Karma: 104
Posts: 5531
|
 |
« Reply #101 on: June 14, 2010, 06:58:06 am » |
You could simplify your character creation into this: 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
God Member
Karma: 0
Posts: 596
Arduino rocks
|
 |
« Reply #102 on: June 14, 2010, 09:21:09 am » |
Yes, that's much better. Thank you.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 30
Arduino rocks
|
 |
« Reply #103 on: July 19, 2010, 04:38:32 am » |
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=item2ea4ef86e7there'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=item1c137a3147a 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.htmbut 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
Sr. Member
Karma: 3
Posts: 261
Arduino rocks
|
 |
« Reply #104 on: July 20, 2010, 02:54:01 pm » |
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  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 
|
|
|
|
|
Logged
|
|
|
|
|
|