Advertisement
jarekmor

sonda UART mon

Oct 27th, 2024
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. // Definicje stanów sondy
  2. #define SENSOR_WARMING 0x01
  3. #define SENSOR_READY 0x02
  4.  
  5. class LambdaSensorMonitor {
  6. private:
  7.     static const int FRAME_LENGTH = 35;  // Standardowa długość ramki
  8.     static const int STATUS_BYTE_POS = 6; // Pozycja bajtu statusu w ramce
  9.     uint8_t dataBuffer[50];  // Bufor na dane (z zapasem)
  10.     int bufferIndex = 0;
  11.    
  12. public:
  13.     // Inicjalizacja UART
  14.     void begin(unsigned long baudRate) {
  15.         Serial.begin(baudRate);
  16.     }
  17.    
  18.     // Główna funkcja sprawdzająca stan sondy
  19.     bool isSensorReady() {
  20.         if (Serial.available() > 0) {
  21.             // Czytaj dane do bufora
  22.             while (Serial.available() > 0 && bufferIndex < sizeof(dataBuffer)) {
  23.                 dataBuffer[bufferIndex] = Serial.read();
  24.                
  25.                 // Sprawdź czy mamy kompletną ramkę
  26.                 if (bufferIndex >= FRAME_LENGTH - 1) {
  27.                     // Sprawdź czy ramka zaczyna się od 0x4C
  28.                     if (dataBuffer[0] == 0x4C) {
  29.                         // Sprawdź bajt statusu
  30.                         uint8_t status = dataBuffer[STATUS_BYTE_POS];
  31.                        
  32.                         // Reset bufora
  33.                         bufferIndex = 0;
  34.                        
  35.                         // Zwróć true jeśli sonda jest gotowa
  36.                         if (status == SENSOR_READY) {
  37.                             return true;
  38.                         }
  39.                         // Jeśli status to WARMING, kontynuuj oczekiwanie
  40.                         else if (status == SENSOR_WARMING) {
  41.                             return false;
  42.                         }
  43.                     }
  44.                     // Jeśli ramka nie zaczyna się od 0x4C, przesuń bufor
  45.                     else {
  46.                         // Przesuń dane w buforze o jeden bajt w lewo
  47.                         for (int i = 0; i < bufferIndex - 1; i++) {
  48.                             dataBuffer[i] = dataBuffer[i + 1];
  49.                         }
  50.                         bufferIndex--;
  51.                     }
  52.                 } else {
  53.                     bufferIndex++;
  54.                 }
  55.             }
  56.         }
  57.        
  58.         // Jeśli nie ma nowych danych lub nie znaleziono poprawnej ramki
  59.         return false;
  60.     }
  61.    
  62.     // Funkcja oczekująca na rozgrzanie sondy
  63.     bool waitForSensorReady(unsigned long timeout = 90000) { // timeout domyślnie 90 sekund
  64.         unsigned long startTime = millis();
  65.        
  66.         while (millis() - startTime < timeout) {
  67.             if (isSensorReady()) {
  68.                 return true;
  69.             }
  70.             // Krótkie opóźnienie aby nie obciążać procesora
  71.             delay(10);
  72.         }
  73.        
  74.         return false; // Timeout - sonda nie rozgrzała się w określonym czasie
  75.     }
  76. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement