Lambda-Anzeige

guntherb: Aber um ein paar bunte LEDs am Armaturenbrett anzusteuern reichts allemal.

Stimmt nur wird die Led für Lambda >1 wohl selten leuchten, wie combie schon sagte.

Wenn er in dem Bereich "analog" was anzeigen will kommt er um eine Breitbandsonde nicht herum. Das Arbeitstemperaturproblem der Sonde müsste man kompensieren können wenn man diese näher am Zylinderkopf montiert.

Was bleibt ist die komplexere Auswertung, bzw die externe Elektronik. Theoretisch ist hier der Pumpstrom das Nutzsignal.

Wie würde so eine Schaltung aussehen ?

guntherb: Aber um ein paar bunte LEDs am Armaturenbrett anzusteuern reichts allemal.

Genau erfasst. Ich will eigentlich nur ein Gerät was mir Anhaltspunkte liefert um damit weiter zu arbeiten. Zumal Vergaser so ungenau arbeiten, das eine Breitbandsonde unglaublich übertrieben genau wäre (mit einem Eurofighter auf Spatzen schießen)

Bei Vergasern arbeitet man immer mit Kompromissen, also reicht eine Sprungsonde und der Rest wird nach eigenem Geschmack gestaltet. (ein LM3914 arbeitet zu Linear für eine Sprungsonde)

Die genauere Variante die ich bauen will, ist nur da um zu gucken was geht und zu lernen :)

Was wäre eigentlich mit dieser Funktion?! Was meint Ihr? Mir scheint das diese Funktion für meine Ansprüche ausreicht, besonderts wenn es an die kleine LED-Variante geht.

//My Lambda Air/Fuel jump sensor - Bosch
//Lambdavoltage to Lambdavalue at 800C°

  // out[] holds the values wanted in (Lambda/100)
  int out[] = {121, 121, 121, 120, 120, 120, 119, 119, 119, 118, 118, 118, 117, 117, 117, 116, 116, 116, 115, 115, 115, 114, 114, 114, 113, 113, 113, 112, 112, 112, 111, 111, 111, 110, 110, 110, 110, 109, 109, 109, 109, 108, 108, 108, 108, 107, 107, 107, 107, 106, 106, 106, 106, 105, 105, 105, 105, 104, 104, 104, 104, 103, 103, 103, 103, 103, 103, 102, 102, 102, 102, 102, 102, 102, 102, 102, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 98 , 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 96, 96, 96, 96, 96, 96, 95, 95, 95, 94, 94, 94, 93, 93, 92, 92, 91, 91, 90, 90, 90, 89, 89, 88, 88, 87, 87, 86, 86, 85, 85, 85, 84, 84, 83, 83, 82, 82, 81, 81, 80, 80, 80, 79, 79, 78, 78, 77, 77, 77, 76, 76, 75, 75, 75, 75, 74, 74, 74, 73, 73, 73, 72, 72, 72, 71, 71, 71, 70, 70, 70, 70, 69, 69, 69, 68, 68, 68, 67, 67, 67, 66, 66, 66, 65, 65, 65};

  // in[] holds the measured analogRead() (values/100) for defined distances
  // note: the in array should have increasing values
  int in[]  = { 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 74, 75, 75, 76, 76, 76, 77, 77, 78, 78, 79, 79, 79, 80, 80, 81, 81, 82, 82, 82, 83, 83, 84, 84, 84, 85, 85, 86, 86, 87, 87, 87, 88, 88, 89, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 94, 94, 94, 95, 95, 95, 96, 96, 97, 97, 98, 98, 98, 99, 99, 100, 100, 100, 101, 101, 102, 102, 102, 103, 103, 104, 104, 104, 105, 105, 105, 106, 106, 107, 107, 107, 108, 108, 109, 109, 109, 110, 110, 111, 111, 111, 112, 112, 113};
  val = analogRead(A0);
  lambda = multiMap(val, in, out, 256);

schnibbelwind: Was wäre eigentlich mit dieser Funktion?!

Klar geht die. Multimap macht die klassische lineare Interpolation zwischen den Tabellenpunkten.

So, hab wieder etwas getüftelt und habe ein Problem mit den if Schleifen.

Und zwar wird immer nur eine Entscheidung zwischen LED 1, 8 und 10 getroffen. Alle anderen LEDs bleiben aus :frowning:
Über Serial habe ich die selbe Ausgabe.

Wo liegt hier der Fehler ?! :fearful:

/*
  
*/

// initialisieren ---------------------------------------------------------------------------------


// port setup  ------------------------------------------------------------------------------------
  int analogInput = 1;
  boolean swPin = 12;
  
  boolean ledPin1 = 2;
  boolean ledPin2 = 3;
  boolean ledPin3 = 4;
  boolean ledPin4 = 5;
  boolean ledPin5 = 6;
  boolean ledPin6 = 7;
  boolean ledPin7 = 8;
  boolean ledPin8 = 9;
  boolean ledPin9 = 10;
  boolean ledPin10 = 11;
  
// variablen  ------------------------------------------------------------------------------------
  float vin = 0.0;
  int value = 0;
  
// programm setup---------------------------------------------------------------------------------
void setup(){
  // declaration of pin modes
  pinMode(analogInput, INPUT); 
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin8, OUTPUT);
  pinMode(ledPin9, OUTPUT);
  pinMode(ledPin10, OUTPUT);
  pinMode(swPin, INPUT);
  // debug
  Serial.begin(9600);
}
// programm  ------------------------------------------------------------------------------------
void loop(){
  // read the value on analog input
  analogReference(INTERNAL);
  value = analogRead(analogInput);

  vin = (value * 1.1) / 1024.0 *1000;  
  //debug
  Serial.print(vin);
  Serial.print('\t');
//if ( digitalRead(swPin) == HIGH){
//------------------------------------------------------------------------------------------------
// mV@650C° DOT
  Serial.print("650C");
  Serial.print('\t');
  
  if (vin >= 1065)              {digitalWrite(ledPin1, HIGH);  Serial.print(1);}   else digitalWrite(ledPin1, LOW);
  if (vin >=1100 && vin <= 995) {digitalWrite(ledPin2, HIGH);  Serial.print(2);}   else digitalWrite(ledPin2, LOW);
  if (vin >=1030 && vin <= 920) {digitalWrite(ledPin3, HIGH);  Serial.print(3);}   else digitalWrite(ledPin3, LOW);
  if (vin >=960 && vin <= 840)  {digitalWrite(ledPin4, HIGH);  Serial.print(4);}   else digitalWrite(ledPin4, LOW);
  if (vin >=880 && vin <= 660)  {digitalWrite(ledPin5, HIGH);  Serial.print(5);}   else digitalWrite(ledPin5, LOW);
  if (vin >=780 && vin <= 345)  {digitalWrite(ledPin6, HIGH);  Serial.print(6);}   else digitalWrite(ledPin6, LOW);
  if (vin >=445 && vin <= 220)  {digitalWrite(ledPin7, HIGH);  Serial.print(7);}   else digitalWrite(ledPin7, LOW);
  if (vin >=130 && vin <= 275)  {digitalWrite(ledPin8, HIGH);  Serial.print(8);}   else digitalWrite(ledPin8, LOW);
  if (vin >=170 && vin <= 55)   {digitalWrite(ledPin9, HIGH);  Serial.print(9);}   else digitalWrite(ledPin9, LOW);
  if (vin >=0 && vin <= 95)     {digitalWrite(ledPin10, HIGH); Serial.print(10);}  else digitalWrite(ledPin10, LOW);
//------------------------------------------------------------------------------------------------  
//};

/*
if ( digitalRead(swPin) == LOW){
//------------------------------------------------------------------------------------------------
// mV@800C° DOT
  Serial.print("800C");
  Serial.print('\t');
  if (vin >= 950)               {digitalWrite(ledPin1, HIGH);  Serial.print(1);}   else digitalWrite(ledPin1, LOW);
  if (vin >=975 && vin <= 905)  {digitalWrite(ledPin2, HIGH);  Serial.print(2);}   else digitalWrite(ledPin2, LOW);
  if (vin >=930 && vin <= 860)  {digitalWrite(ledPin3, HIGH);  Serial.print(3);}   else digitalWrite(ledPin3, LOW);
  if (vin >=886 && vin <= 815)  {digitalWrite(ledPin4, HIGH);  Serial.print(4);}   else digitalWrite(ledPin4, LOW);
  if (vin >=840 && vin <= 630)  {digitalWrite(ledPin5, HIGH);  Serial.print(5);}   else digitalWrite(ledPin5, LOW);
  if (vin >=775 && vin <= 325)  {digitalWrite(ledPin6, HIGH);  Serial.print(6);}   else digitalWrite(ledPin6, LOW);
  if (vin >=415 && vin <= 205)  {digitalWrite(ledPin7, HIGH);  Serial.print(7);}   else digitalWrite(ledPin7, LOW);
  if (vin >=260 && vin <= 120)  {digitalWrite(ledPin8, HIGH);  Serial.print(8);}   else digitalWrite(ledPin8, LOW);
  if (vin >=160 && vin <= 50)   {digitalWrite(ledPin9, HIGH);  Serial.print(9);}   else digitalWrite(ledPin9, LOW);
  if (vin >=0 && vin <= 80)     {digitalWrite(ledPin10, HIGH); Serial.print(10);}  else digitalWrite(ledPin10, LOW);
//------------------------------------------------------------------------------------------------
};
*/

Serial.print('\n');
  // sleep...
  delay(500);
}

vin >=1100 && vin <= 995

Vin kann nie größer 1100 und kleiner 995 sein.
Zumindest nicht gleichzeitig.
Dieser Logik konsequent folgend, ist es völlig ok, wenn die zugehörige LED nicht an geht.

Die LED Pins als boolean zu definieren ist auch falsch! Verwende const byte oder const int

combie: Vin kann nie größer 1100 und kleiner 995 sein. Zumindest nicht gleichzeitig. Dieser Logik konsequent folgend, ist es völlig ok, wenn die zugehörige LED nicht an geht.

Das war es, war wohl schon etwas wirre im Kopf :astonished: :D

Boolean ist kein Problem. Läuft jetzt auch. ;)

Auf der aktuellen Arduino Version geht das nicht mehr. Da wird das alles auf 1 gekürzt

Wenn wir schon am meckern sind, analogReference muß nur einmal definiert werden. In der Loop hat das nichts zu suchen.

Bei den vielen "if" gibt es durchaus noch Möglichkeiten der Verbesserung. Also die bereits angesprochene lineare Interpolation, oder auch die fertige Multimap funktion ansehen.