Tankgeber simulieren

Liebe Freunde ich habe mir vorgestern ein Moped geholt. Bisschen Baustelle aber es wird schon.

Diese benötigt nun ein neues Kombiinstrument. In dem Zuge möchte ich natürlich eins mit einer Tankanzeige haben. Leider habe ich aber keinen Tankgeber eingebaut. Ich möchte den Tank auch nicht zerschneiden.

Deswegen kam mir folgender Gedanke. Da KI welches ich kaufen will hat eine 100 Ohm einstellung für die Tankanzeige. Wäre es nicht möglich einen Durchflussimpulsgeber zu nehmen und mittels Zähler dann einen Widerstand auszugeben?

Und wenn ich dann Volltanke wird dieser mittels Taster wieder auf 0 gestellt.

Mit einem FET könntest du einen Widerstand nachbilden.

Arduino PWM -> Integrierglied -> FET -> Tankanzeige

Die gezählten Impulse müsste man aber zyklisch im EEprom abspeichern. :o

Es sei denn du willst den Arduino ständig unter Spannung halten. ?
Außerdem, wenn die Batterie mal leer wird, verlierst du auch die Impulse.

Man sollte nicht immer auf die selbe Speicherstellen im EEprom schreiben.
Also die Adresse incrementieren, wenn Ende des Adressraums erreicht dann bei 0 anfangen.

Beim Start des Arduino (Zündschlüssel drehen) sucht dieser nach der Adresse mit den höchstem Inhalt und hat die Startadresse wieder.
Nach dem Tanken, wird mit dem Taster das EEprom gelöscht. Und Adresszähler auf 0.

Man kann jetzt natürlich Überlegungen anstellen, ob dieser wirklich Aufwand nötig ist.

100.000 Zyklen pro Zelle hört sich viel an.

Kommt auch drauf an wie oft man dies beim Fahren abspeichert.

Mit dem speichern sollte es kein Problem sein. Ich habe mehrere Nanos hier. Wenn einer mal fritte geht ist es auch egal.

Jetzt mal ein anderer Gedankengang. Ich habe mir überlegt einfach 3 Relaistreiberplatinen zu nehmen und diese einfach über einen BCD Code zu schalten.

Die Tankanzeige geht von 0-100 Ohm. Da bräuchte ich nur 3 Widerstände um alle 5 Bereiche der Tankanzeige anzuzeigen. Und ich müsste nicht an das 12V Netz der Maschine.
Habe da mal was versucht

#define FLOWSENSORPIN 2

// count how many pulses!
volatile uint16_t pulses = 0;
// track the state of the pulse pin
volatile uint8_t lastflowpinstate;
// you can try to keep time of how long it is between pulses
volatile uint32_t lastflowratetimer = 0;
// and use that to calculate a flow rate
volatile float flowrate;
// Interrupt is called once a millisecond, looks for any pulses from the sensor!
SIGNAL(TIMER0_COMPA_vect) {
  uint8_t x = digitalRead(FLOWSENSORPIN);
  
  if (x == lastflowpinstate) {
    lastflowratetimer++;
    return; // nothing changed!
  }
  
  if (x == HIGH) {
    //low to high transition!
    pulses++;
  }
  lastflowpinstate = x;
  flowrate = 1000.0;
  flowrate /= lastflowratetimer;  // in hertz
  lastflowratetimer = 0;
}

void useInterrupt(boolean v) {
  if (v) {
    // Timer0 is already used for millis() - we'll just interrupt somewhere
    // in the middle and call the "Compare A" function above
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
  } else {
    // do not call the interrupt function COMPA anymore
    TIMSK0 &= ~_BV(OCIE0A);
  }
}

void setup() {
   Serial.begin(9600);
  pinMode(3, OUTPUT);    //20 ohm   
  pinMode(4, OUTPUT);    // 40 ohm
  pinMode(5, OUTPUT);    // 80 ohm 
  
 
   
   pinMode(FLOWSENSORPIN, INPUT);
   digitalWrite(FLOWSENSORPIN, HIGH);
   lastflowpinstate = digitalRead(FLOWSENSORPIN);
   useInterrupt(true);
}

void loop()                     
{ 
  Serial.print("Pulses: "); Serial.println(pulses, DEC);
   if (pulses >= 14000)
    {
        for(int i=3;i<9; i++)
          {
            digitalWrite(3, LOW);   // set the LED on
          digitalWrite(4, LOW); 
          digitalWrite(5, LOW); 
          
          }  
    }
  else if (pulses >= 11201)
    {
        for(int i=3;i<8; i++)
          {
            digitalWrite(3, HIGH);   // set the LED on
          }    
    }
  else if (pulses >= 8401)
    {
        for(int i=3;i<7; i++)
          {
            digitalWrite(4, HIGH);   // set the LED on
          }    
    }
  else if (pulses >= 5601)
    {
        for(int i=3;i<6; i++)
          {
            digitalWrite(3, HIGH);   // set the LED on
            digitalWrite(4, HIGH); 
          }
              
    }
  else if (pulses >= 2801)
    {
        for(int i=3;i<5; i++)
          {
            digitalWrite(5, HIGH);   // set the LED on
          }    
    }
  else if (pulses >= 2800)
    {
      digitalWrite(3, HIGH);   // set the LED on  
       digitalWrite(5, HIGH);    
    }
    
  delay(100);
}

Den Code nur grob angesehen.
Wenn dein KI nur 5 Bereiche angezeigen kann, dann mache es so.

Bei den Relais würde ich über kleine SSR nachdenken.

rudirabbit:
Bei den Relais würde ich über kleine SSR nachdenken.

Wieso keine Transistoren mit Widerständen?

ElEspanol:
Wieso keine Transistoren mit Widerständen?

Stromsenke geht wohl auch.

Er hat aber geschrieben, das er den Arduino potentialfrei von Bordnetz des Mopeds haben will.
So habe ich das zumindest verstanden.

Gemeinsame Masse ist doch eh da.

Das ist eben die Frage :confused: , so wie das verstehe will er den Arduino mit einer zweiten Batterie betreiben.

Egal, ich weiß was du meinst - und du weißst was ich meine :slight_smile: - also frohes Neues.

Liebe Leute wenn ich irgendwo gedankliche Fehler mache, dann klärt mich auf.
Ich lerne das gerade alles und kann natürlich einiges nicht richtig abschätzen.

Du solltest etwas mehr Informationen liefern, wie du dir das schaltungstechnisch vorstellst. Z.B. hat das Moped eine Batterie? Soll der Arduino eine eigene bekommen? Warum ?
Link zum Kombiinstrument, etc.

Hallo nochmals. Um das Motorrad handelt es sich um eine Yamaha TZR 50.
Angeschlossen soll ein Zubehör Tacho.

Ich habe im Anhang Vom Motorrad und vom Tacho die Schaltbilder angehangen.
Der Arduino soll über die Batterie des Mopeds versorgt werden.

Der neue Tacho kann eingstellt werden auf 100 oder 500 Ohm.
Da jetzt nur 5 Striche als Auflösung der Tankanzeige vorhanden war mir der Aufwand zu hoch um was m modulierendes herzustellen.

Der Arduino soll über die Batterie des Mopeds versorgt werden.

Dann würde die vorgeschlagene Stromsenke als Simulation der Widerstände im Prinzip funktionieren.

Das Bordnetz eines Mopeds(Fahrzeugs) ist nie sauber, ein normaler Anschluß über den Regler(7805) reicht hier für störungsfreien Betrieb nicht aus.
Irgendwo habe ich hier eine entsprechende Schaltung gesehen, so in etwa schaut das aus.

Ich sehe das hier vorgeschlagene: Arduino PWM -> Integrierglied -> FET -> Tankanzeige

Als eine gute Lösung, nur ein FET als variable Stromsenke.

Spannungsversorgung.pdf (13.9 KB)

Dann würde ich im Sketch statt DigitaWrite AnalogWrite nehme und dann mittels PWM die Widerstandshöhe ändern?

genau