Просмотр исходного кода

fixed negative temperature display on non-original dht22 sensors. fixed display of negative temperature in the range from 0 to -1 degrees

Victor 3 лет назад
Родитель
Сommit
ff29694f69
2 измененных файлов с 23 добавлено и 8 удалено
  1. 13 4
      interfaces/SingleWireSensor.c
  2. 10 4
      views/General_view.c

+ 13 - 4
interfaces/SingleWireSensor.c

@@ -257,12 +257,21 @@ UnitempStatus unitemp_singlewire_update(Sensor* sensor) {
     //DHT21, DHT22, AM2320
     //DHT21, DHT22, AM2320
     if(sensor->type == &DHT21 || sensor->type == &DHT22 || sensor->type == &AM2320_SW) {
     if(sensor->type == &DHT21 || sensor->type == &DHT22 || sensor->type == &AM2320_SW) {
         sensor->hum = (float)(((uint16_t)data[0] << 8) | data[1]) / 10;
         sensor->hum = (float)(((uint16_t)data[0] << 8) | data[1]) / 10;
+
+        uint16_t raw = (((uint16_t)data[2] << 8) | data[3]);
         //Проверка на отрицательность температуры
         //Проверка на отрицательность температуры
-        if(!(data[2] & (1 << 7))) {
-            sensor->temp = (float)(((uint16_t)data[2] << 8) | data[3]) / 10;
+        if(READ_BIT(raw, 1 << 15)) {
+            //Проверка на способ кодирования данных
+            if(READ_BIT(raw, 0x60)) {
+                //Не оригинал
+                sensor->temp = (float)((int16_t)raw) / 10;
+            } else {
+                //Оригинальный датчик
+                CLEAR_BIT(raw, 1 << 15);
+                sensor->temp = (float)(raw) / -10;
+            }
         } else {
         } else {
-            data[2] &= ~(1 << 7);
-            sensor->temp = (float)(((uint16_t)data[2] << 8) | data[3]) / 10 * -1;
+            sensor->temp = (float)(raw) / 10;
         }
         }
     }
     }
     //Возврат признака успешного опроса
     //Возврат признака успешного опроса

+ 10 - 4
views/General_view.c

@@ -48,7 +48,7 @@ static void _draw_temperature(Canvas* canvas, Sensor* sensor, uint8_t x, uint8_t
     } else {
     } else {
         canvas_draw_rframe(canvas, x, y, 54, 19, 3);
         canvas_draw_rframe(canvas, x, y, 54, 19, 3);
     }
     }
-    int16_t temp_int = sensor->temp;
+
     int8_t temp_dec = abs((int16_t)(sensor->temp * 10) % 10);
     int8_t temp_dec = abs((int16_t)(sensor->temp * 10) % 10);
 
 
     //Рисование иконки
     //Рисование иконки
@@ -68,17 +68,23 @@ static void _draw_temperature(Canvas* canvas, Sensor* sensor, uint8_t x, uint8_t
     }
     }
 
 
     //Целая часть температуры
     //Целая часть температуры
-    snprintf(app->buff, BUFF_SIZE, "%d", temp_int);
+    //Костыль для отображения знака числа меньше 0
+    uint8_t offset = 0;
+    if(sensor->temp < 0 && sensor->temp > -1) {
+        app->buff[0] = '-';
+        offset = 1;
+    }
+    snprintf((char*)(app->buff + offset), BUFF_SIZE, "%d", (int8_t)sensor->temp);
     canvas_set_font(canvas, FontBigNumbers);
     canvas_set_font(canvas, FontBigNumbers);
     canvas_draw_str_aligned(
     canvas_draw_str_aligned(
         canvas,
         canvas,
-        x + 27 + ((temp_int <= -10 || temp_int > 99) ? 5 : 0),
+        x + 27 + ((sensor->temp <= -10 || sensor->temp > 99) ? 5 : 0),
         y + 10,
         y + 10,
         AlignCenter,
         AlignCenter,
         AlignCenter,
         AlignCenter,
         app->buff);
         app->buff);
     //Печать дробной части температуры в диапазоне от -9 до 99 (когда два знака в числе)
     //Печать дробной части температуры в диапазоне от -9 до 99 (когда два знака в числе)
-    if(temp_int > -10 && temp_int <= 99) {
+    if(sensor->temp > -10 && sensor->temp <= 99) {
         uint8_t int_len = canvas_string_width(canvas, app->buff);
         uint8_t int_len = canvas_string_width(canvas, app->buff);
         snprintf(app->buff, BUFF_SIZE, ".%d", temp_dec);
         snprintf(app->buff, BUFF_SIZE, ".%d", temp_dec);
         canvas_set_font(canvas, FontPrimary);
         canvas_set_font(canvas, FontPrimary);