Can bus wagen uitlezen met Sparkfun module
2 berichten
• Pagina 1 van 1
Can bus wagen uitlezen met Sparkfun module
Enige tijd geleden heb ik een uitlezing gemaakt voor de can bus van mijn wagen, om op die manier een digitale uitlezing van snelheid en toerental te krijgen.
Een en ander is wonderwel gelukt, ik gebruik het display nu al enkele jaren.
Nu wil ik een uitbreiding maken om de gereden afstand uit te lezen.
Mijn uitgangspunt is een demo van Sparkfun zelf.
Serial.println("Please choose a menu option.");
Serial.println("1.Speed");
Serial.println("2.RPM");
Serial.println("3.Throttle");
Serial.println("4.Coolant Temperature");
Serial.println("5.O2 Voltage");
Serial.println("6.MAF Sensor");
Serial.println("7.Distance");
}
void loop(){
while(Serial.available()){
UserInput = Serial.read();
if (UserInput=='1'){
Canbus.ecu_req(VEHICLE_SPEED, buffer);
Serial.print("Vehicle Speed: ");
Serial.println(buffer);
delay(500);
}
else if (UserInput=='2'){
Canbus.ecu_req(ENGINE_RPM, buffer);
Serial.print("Engine RPM: ");
Serial.println(buffer);
delay(500);
}
else if (UserInput=='3'){
Canbus.ecu_req(THROTTLE, buffer);
Serial.print("Throttle: ");
Serial.println(buffer);
delay(500);
}
else if (UserInput=='4'){
Canbus.ecu_req(ENGINE_COOLANT_TEMP, buffer);
Serial.print("Engine Coolant Temp: ");
Serial.println(buffer);
delay(500);
enz.
Als ik nu bijvoorbeeld de snelheid opvraag d.m.v. Canbus.ecu_req(VEHICLE_SPEED, buffer); en daarna bv het toerental d.m.v. Canbus.ecu_req(ENGINE_RPM, buffer); dan wordt toch nog de snelheid weergegeven.
Slechts bij de tweede poging Canbus.ecu_req(ENGINE_RPM, buffer); wordt het toerental weergegeven. Geen wonder dus dat nu ik 3 waarden wil opvragen een en ander nogal door elkaar loopt.
Ik dacht eerst dat het iets te maken had met het ledigen van die buffer variabele en heb aldus van alles geprobeerd, zonder resultaat.
Uiteindelijk heb ik de code op deze manier veranderd, nl 2 maal na elkaar dezelfde waarde opvragen... en dit werkt!
Canbus.ecu_req(ENGINE_RPM, buffer);
delay(500);
Canbus.ecu_req(ENGINE_RPM, buffer);
Serial.print("Engine RPM: ");
Serial.println(buffer);
delay(500);
Op zich ben ik blij iets te hebben gevonden, maar mooi is het niet en over de efficiëntie durf ik mij ook niet uitspreken.
Heeft iemand een idee wat hier aan de hand is, want ik ga er toch van uit dat een bedrijf als Sparkfun zijn huiswerk gedaan heeft...
Een en ander is wonderwel gelukt, ik gebruik het display nu al enkele jaren.
Nu wil ik een uitbreiding maken om de gereden afstand uit te lezen.
Mijn uitgangspunt is een demo van Sparkfun zelf.
Serial.println("Please choose a menu option.");
Serial.println("1.Speed");
Serial.println("2.RPM");
Serial.println("3.Throttle");
Serial.println("4.Coolant Temperature");
Serial.println("5.O2 Voltage");
Serial.println("6.MAF Sensor");
Serial.println("7.Distance");
}
void loop(){
while(Serial.available()){
UserInput = Serial.read();
if (UserInput=='1'){
Canbus.ecu_req(VEHICLE_SPEED, buffer);
Serial.print("Vehicle Speed: ");
Serial.println(buffer);
delay(500);
}
else if (UserInput=='2'){
Canbus.ecu_req(ENGINE_RPM, buffer);
Serial.print("Engine RPM: ");
Serial.println(buffer);
delay(500);
}
else if (UserInput=='3'){
Canbus.ecu_req(THROTTLE, buffer);
Serial.print("Throttle: ");
Serial.println(buffer);
delay(500);
}
else if (UserInput=='4'){
Canbus.ecu_req(ENGINE_COOLANT_TEMP, buffer);
Serial.print("Engine Coolant Temp: ");
Serial.println(buffer);
delay(500);
enz.
Als ik nu bijvoorbeeld de snelheid opvraag d.m.v. Canbus.ecu_req(VEHICLE_SPEED, buffer); en daarna bv het toerental d.m.v. Canbus.ecu_req(ENGINE_RPM, buffer); dan wordt toch nog de snelheid weergegeven.
Slechts bij de tweede poging Canbus.ecu_req(ENGINE_RPM, buffer); wordt het toerental weergegeven. Geen wonder dus dat nu ik 3 waarden wil opvragen een en ander nogal door elkaar loopt.
Ik dacht eerst dat het iets te maken had met het ledigen van die buffer variabele en heb aldus van alles geprobeerd, zonder resultaat.
Uiteindelijk heb ik de code op deze manier veranderd, nl 2 maal na elkaar dezelfde waarde opvragen... en dit werkt!
Canbus.ecu_req(ENGINE_RPM, buffer);
delay(500);
Canbus.ecu_req(ENGINE_RPM, buffer);
Serial.print("Engine RPM: ");
Serial.println(buffer);
delay(500);
Op zich ben ik blij iets te hebben gevonden, maar mooi is het niet en over de efficiëntie durf ik mij ook niet uitspreken.
Heeft iemand een idee wat hier aan de hand is, want ik ga er toch van uit dat een bedrijf als Sparkfun zijn huiswerk gedaan heeft...
Advertisement
Re: Can bus wagen uitlezen met Sparkfun module
maak je niet druk over de efficientie want overal staan delays tussen die de zaak natuurlijk vertragen.
en om een afstand te berekenen heb je de tijd nodig tussen de readings. dat kun je doen met millis()
kijk ook eens naar switch case dat bespaart een hoop regels.
kijk eens wat er gebeurt als je buffer leeg maakt, want die blijft natuurlijk een waarde houden.
en om een afstand te berekenen heb je de tijd nodig tussen de readings. dat kun je doen met millis()
kijk ook eens naar switch case dat bespaart een hoop regels.
kijk eens wat er gebeurt als je buffer leeg maakt, want die blijft natuurlijk een waarde houden.
paul deelen
shooter@home.nl
shooter@home.nl
2 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 60 gasten