Hello All!
I'm new on this forum. I don't have big expirience with Arduino, but I'm trying to do something
In my project I want connect newest instrument cluster which works on the CAN communication to my old car Volvo 96' with OBD ISO9141-2.
My sketch can read PID's from car, do some calculations and send this by CAN frames to instrument cluster.
But the problem is with delay. I cannot read few PID's in short time period, because I'm losing data, and having only "0".
In program is also many calculations for fuel consumption, but for now this is doesn't matter.
Below You can see my actually part of sketch which reading PID's:
void loop(){
  Serial.println("Laczenie z OBD9141:");                         // Nawiazywanie podłaczenia OBD9141
  bool init_success = obd.init();         Â
  Serial.print("Polaczony!");
  Serial.println(init_success);
  Serial.print("Komunikaty z OBD:");
          // Jeśli połączony to przechodzi ponizej
 Â
  if (init_success){                                  // Zaczyna szukac PIDów
    bool res;
   Â
Â
   while(1){                                    // Rozpoczecie pętli pobierania PID
aktualnyCzas = millis();Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â // POBIERZ CZAS Z LICZNIKA
     if (aktualnyCzas - czasDlaPID2 >= 20UL){                     // sprawdzenie czasu mills czy juz mozna pobrac PID
    Â
      res = obd.getCurrentPID(0x0C, 2);                      // PID dla RPM 2bajty
      if (res){
        rpm = ((obd.readUint16()/4)/0.125);                      //przypisanie ramki do zmiennej i wykonanie obliczen Â
      }
      Â
       czasDlaPID2 = aktualnyCzas;
     }
    Â
     if (aktualnyCzas - czasDlaPID1 >= 25UL){                     // sprawdzenie czasu mills czy juz mozna pobrac PID
     Â
      res = obd.getCurrentPID(0x0D, 1);                       // PID dla predkosci 1bajt
      if (res){
        vehspeed0 = obd.readUint8();                       //przypisanie ramki do zmiennej i wykonanie obliczen                       Â
      }
      Â
       czasDlaPID1 = aktualnyCzas;                         // przypisanie czasu
     }
                                      Â
    Â
     if (aktualnyCzas - czasDlaPID3 >= 400UL){                     // sprawdzenie czasu mills czy juz mozna pobrac PID
     Â
      res = obd.getCurrentPID(0x05, 1);                      // PID temp silnika 1bajt
      if (res){Â
        engtemphex = obd.readUint8();                      //przypisanie ramki do zmiennej i wykonanie obliczen
      }
      czasDlaPID3 = aktualnyCzas;                         // przypisanie czasu
     }
    Â
     if (aktualnyCzas - czasDlaPID4 >= 50UL){                     // sprawdzenie czasu mills czy juz mozna pobrac PID
     Â
      res = obd.getCurrentPID(0x04, 1);                      // obciazenie silnika 1bajt
      if (res){
        obciaz = (obd.readUint8()/2.55);                     //przypisanie ramki do zmiennej i wykonanie obliczen
      }
      czasDlaPID4 = aktualnyCzas;                         // przypisanie czasu
     }  Â
     if (aktualnyCzas - czasDlaPID5 >= 20UL){                    // sprawdzenie czasu mills czy juz mozna pobrac PID
     Â
      res = obd.getCurrentPID(0x10, 2);                      // mass air flow
      if (res){
        massAirFlow = ((obd.readUint16()*256)/100);               //przypisanie ramki do zmiennej i wykonanie obliczen
      }
      czasDlaPID5 = aktualnyCzas;                         // przypisanie czasu
     }   Â
             // KONIEC ODCZYTU Z OBD
            Â
         //Obliczanie spalania godzinowego
        Â
     float(massPetrol) = massAirFlow/14.7;                     // 14,7g/s powietrza = 1g/s paliwa
     spalanieLH = ((massPetrol/760)*180);                      // spalanieLH = litrów na godzinę*0,05 dla ICL ----- massPetrol/760)*3600)*0.05
         //Obliczenia spalania chwilowego
        Â
     vehspeed = vehspeed0*0.0039062;   Â
     spalanieKmL = (vehspeed/((massPetrol/760)*3600))/0.00195313;          // jednostka koncowka KM/L || KM/H / L/H = km/L + przeliczenie na ICL /0.00195313
   Â
           Â
            // ROZBIJANIE BAJOW RPM NA DWA OSOBNE
{
    rpmH = (rpm >> 8);
    rpmL = (rpm & 0xFF);
}
            // ROZBIJANIE BAJOW SPEED NA DWA OSOBNE
{
    speedH = (vehspeed >> 8);
    speedL = (vehspeed & 0xFF);
}
            // ROZBIJANIE BAJOW spalania godzinowego NA DWA OSOBNE
{
    spalanieGodzinoweH = (spalanieLH >> 8);
    spalanieGodzinoweL = (spalanieLH & 0xFF);
}
            // ROZBIJANIE BAJOW spalania chwilowego NA DWA OSOBNE
{
    spalanieChwiloweH = (spalanieKmL >> 8);
    spalanieChwiloweL = (spalanieKmL & 0xFF);
}
    Â
   Â
         //MONITOROWANIE ODCZYTNYCH PID NA PC
     if (aktualnyCzas - czasDlaWyswietlen1 >= 500UL) {                    // sprawdzenie warunkiem mills czy nadawac do monitora (co 500ms)
     czasDlaWyswietlen1 = aktualnyCzas;                            // przypisanie aktualnego czasu do zmiennej czas dla wyswietlen
     Â
      Serial.print("WARTOSCI Z PIDOW\n\n");
      Serial.print("Result 0x05 (EngTemp): ");
      Serial.println(engtemphex, HEX);
      Serial.print("Result 0x0C (RPM): ");
      Serial.println(rpm, DEC);
      Serial.print("Result 0x04 (EngLoad): ");
      Serial.println(obciaz, HEX);
      Serial.print("Result 0x0D (Speed): ");
      Serial.println(vehspeed, HEX);
      Serial.print("Result 0x10 (MassAirFlow): ");
      Serial.println(massAirFlow, HEX);
      Serial.print("ROZBITE NA BAJTY\n\n");
      Serial.print("rpmH: ");
      Serial.println(rpmH, BIN);
      Serial.print("rpmL: ");
      Serial.println(rpmL, BIN);
      Serial.print("sppedH: ");
      Serial.println(speedH, BIN);
      Serial.print("speedL: ");
      Serial.println(speedL, BIN);Â
      Serial.print("Spalanie godzinowe: ");
      Serial.println(spalanieLH, DEC);
      Serial.print("Spalanie chwilowe: ");
      Serial.println(spalanieKmL, DEC); Â
       Â
  Â
     }
    Â
      // WARUNEK NA CISNIENIE OLEJU
     Â
      if (rpm > 4800) {
         oilpresu = 0xA5;                          // warunek na cisnienie oleju kiedy silnik odpalony
      }
      else if (rpm < 4800){
         oilpresu = 0x00;                          // warunek na cisnienie oleju kiedy silnik zgaszony
      }
In this Sketch is working only reading of the RPM from PID 0x0C. My questions is, how I can read more PID in short time? Why I'm losing data?