OBD ISO9141 to CAN - problems with PID reading.

Hello All!

I'm new on this forum. I don't have big expirience with Arduino, but I'm trying to do something :slight_smile:

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?