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