• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Odczyt zmiennej float z macierzy i problem wyświetlaniem (arduino, ds18b20)
#1
Napisałem prostą funkcję wyświetlającą temperaturę z DS18b20 przy użyciu macierzyled. Mam jednak dziwny problem wyświetleniem zmiennej typu float. Dane z czujników temperatury są przechowywane w macierzy czteroelementowej. Wartość temperatury jest rozbijana na trzy cyfry (zmienne d1, d2, d3). Jak wpiszę coś do macierzy ręcznie to wyświetla poprawnie, jak wpiszę przy użyciu biblioteki dallas do obsługi czujnika, to wyświetla bzdury. Ciekawe jest to, że zmienne d1, d2, d3 są poprawnie obliczane. W obydwu przypadkach na serialu mam to samo i nie wiem jak to ugryźć. Coś się dzieje w momencie przejścia danych przez wspomnianą macierz. Spróbowałem też bezpośrednio przy użyciu biblioteki dallas wpisać do zmiennej temp i to też działa. Ewidentnie coś się dzieje przy zapisie do macierzy. Jak odkomentuję linię (//temperatureDallas[0] = 22.3) to jest ok, a jak zakomentuję to nie jest dobrze wyświetlane. Wydruk danych na serialau jest taki sam w obydwu przypadkach. Poniżej przesyłam moją funkcję i wyjście seriala. Czy kto spotkał się z czymś takim?

Kod:
float temperatureDallas[4] = {55,55,55,55};

void ledMatrixAgent(){
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillisLed >= 5000) { //odswiez ekran co 1s
  previousMillisLed = currentMillis; 

  uint16_t TMP[16] = {0}; //tymaczasowy bufor wyswietlacza
  uint8_t d1 = 0, d2 = 0, d3 = 0;
  Serial.print("ds18b20: "); Serial.println(temperatureDallas[0]);
  //temperatureDallas[0] = 22.3;
  float temp = (float)temperatureDallas[0];
  int intiger = (int)temp;
  int fraction = (int)((temp + 0.05 - intiger) * 10); 

  Serial.print("*: "); Serial.println(intiger);
  Serial.print("*: "); Serial.println(fraction);

  d1 = intiger / 10;
  d2 = intiger % 10;
  d3 = fraction;

  //koordynaty wzlędem prawego dolnego rogu
  switch (mode){
    case 0: //tryb bezczynnosci
      Serial.println(d1);
      Serial.println(d2);
      Serial.println(d3);
      for (int8_t i = 9; i >= 0; i--){
        TMP[i+3] |= (uint16_t)M[d1*10+i] << 10;
        TMP[i+3] |= (uint16_t)M[d2*10+i] << 4;
      }

      for (int8_t i = 7; i >= 0; i--){
        TMP[i+5] |= (uint16_t)S[d3*8+i];
      }

      break;
    case 1:
      break;
  }

  //podział na wyswietlacze
  for (uint8_t i = 0; i < 8; i++){
    G_L[i] = (TMP[i] & 0xFF00) >> 8;
    G_P[i] = (TMP[i] & 0x00FF);
  }
  for (uint8_t i = 8; i < 16; i++){
    D_L[i-8] = (TMP[i] & 0xFF00) >> 8;
    D_P[i-8] = (TMP[i] & 0x00FF);
  }

//zapis do wyswietlacza
  //matrix.clear();
  matrix.drawBitmap(0, 0, D_L, 8, 8, LED_ON);
  //matrix.writeDisplay();
  matrix.drawBitmap(8, 0, D_P, 8, 8, LED_ON);
  matrix.writeDisplay();

  //matrix2.clear();
  matrix2.drawBitmap(0, 0, G_L, 8, 8, LED_ON);
  //matrix2.writeDisplay();
  matrix2.drawBitmap(8, 0, G_P, 8, 8, LED_ON);
  matrix2.writeDisplay();
  }
}



Serial:

ds18b20: 22.30
*: 22
*: 3
2
2
3
 
Odpowiedź
  


Wiadomości w tym wątku
Odczyt zmiennej float z macierzy i problem wyświetlaniem (arduino, ds18b20) - przez Herrero - 21-11-2019, 10:08

Skocz do:


Przeglądający: 1 gości