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

Implemented conversion to Fahrenheit

Victor 3 лет назад
Родитель
Сommit
d323d2d423
6 измененных файлов с 50 добавлено и 24 удалено
  1. 27 18
      interfaces/OneWire.c
  2. 4 0
      interfaces/OneWire.h
  3. 1 0
      interfaces/Sensors.c
  4. 2 1
      scenes/TempHum_scene.c
  5. 8 4
      unitemp.c
  6. 8 1
      unitemp.h

+ 27 - 18
interfaces/OneWire.c

@@ -49,8 +49,15 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
     //Проверка на допустимость опроса датчика
     if(furi_get_tick() - instance->lastPollingTime < POLLING_INTERVAL) {
         //Возврат ошибки если последний опрос датчика был неудачным
-        if(sensor->hum == -128.0f && sensor->temp == -128.0f) return UT_TIMEOUT;
+        if(instance->lastHum == -128.0f && instance->lastTemp == -128.0f) {
+            sensor->hum = instance->lastHum;
+            sensor->temp = instance->lastTemp;
+            return UT_TIMEOUT;
+        }
+
         //Выход в случае раннего опроса
+        sensor->hum = instance->lastHum;
+        sensor->temp = instance->lastTemp;
         return UT_EARLYPOOL;
     }
 
@@ -81,8 +88,8 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
             //Включение прерываний
             __enable_irq();
             //Запись неправильных значений
-            sensor->hum = -128.0f;
-            sensor->temp = -128.0f;
+            instance->lastHum = -128.0f;
+            instance->lastTemp = -128.0f;
             //Возврат признака отсутствующего датчика
             return UT_TIMEOUT;
         }
@@ -96,8 +103,8 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
             //Включение прерываний
             __enable_irq();
             //Запись неправильных значений
-            sensor->hum = -128.0f;
-            sensor->temp = -128.0f;
+            instance->lastHum = -128.0f;
+            instance->lastTemp = -128.0f;
             //Возврат признака отсутствующего датчика
             return UT_TIMEOUT;
         }
@@ -110,8 +117,8 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
             //Включение прерываний
             __enable_irq();
             //Запись неправильных значений
-            sensor->hum = -128.0f;
-            sensor->temp = -128.0f;
+            instance->lastHum = -128.0f;
+            instance->lastTemp = -128.0f;
             //Возврат признака отсутствующего датчика
             return UT_TIMEOUT;
         }
@@ -125,8 +132,8 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
             //Включение прерываний
             __enable_irq();
             //Запись неправильных значений
-            sensor->hum = -128.0f;
-            sensor->temp = -128.0f;
+            instance->lastHum = -128.0f;
+            instance->lastTemp = -128.0f;
             //Возврат признака отсутствующего датчика
             return UT_TIMEOUT;
         }
@@ -151,8 +158,8 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
     //Проверка контрольной суммы
     if((uint8_t)(data[0] + data[1] + data[2] + data[3]) != data[4]) {
         //Запись неправильных значений
-        sensor->hum = -128.0f;
-        sensor->temp = -128.0f;
+        instance->lastHum = -128.0f;
+        instance->lastTemp = -128.0f;
         //Если контрольная сумма не совпала, возврат ошибки
         return UT_BADCRC;
     }
@@ -160,7 +167,7 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
     /* Преобразование данных в явный вид */
     //DHT11 и DHT12
     if(sensor->type == DHT11 || sensor->type == DHT12_1W) {
-        sensor->hum = (float)data[0];
+        instance->lastHum = (float)data[0];
         sensor->temp = (float)data[2];
 
         //Проверка на отрицательность температуры
@@ -168,28 +175,30 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
             //Проверка знака
             if(!(data[3] & (1 << 7))) {
                 //Добавление положительной дробной части
-                sensor->temp += data[3] * 0.1f;
+                instance->lastTemp += data[3] * 0.1f;
             } else {
                 //А тут делаем отрицательное значение
                 data[3] &= ~(1 << 7);
-                sensor->temp += data[3] * 0.1f;
-                sensor->temp *= -1;
+                instance->lastTemp += data[3] * 0.1f;
+                instance->lastTemp *= -1;
             }
         }
     }
 
     //DHT21, DHT22, AM2320
     if(sensor->type == DHT21 || sensor->type == DHT22 || sensor->type == AM2320_1W) {
-        sensor->hum = (float)(((uint16_t)data[0] << 8) | data[1]) / 10;
+        instance->lastHum = (float)(((uint16_t)data[0] << 8) | data[1]) / 10;
         //Проверка на отрицательность температуры
         if(!(data[2] & (1 << 7))) {
-            sensor->temp = (float)(((uint16_t)data[2] << 8) | data[3]) / 10;
+            instance->lastTemp = (float)(((uint16_t)data[2] << 8) | data[3]) / 10;
         } else {
             data[2] &= ~(1 << 7);
-            sensor->temp = (float)(((uint16_t)data[2] << 8) | data[3]) / 10 * -1;
+            instance->lastTemp = (float)(((uint16_t)data[2] << 8) | data[3]) / 10 * -1;
         }
     }
 
+    sensor->hum = instance->lastHum;
+    sensor->temp = instance->lastTemp;
     //Возврат признака успешного опроса
     return UT_OK;
 }

+ 4 - 0
interfaces/OneWire.h

@@ -11,6 +11,10 @@ typedef struct {
     const GPIO* gpio;
     //Время последнего опроса
     uint32_t lastPollingTime;
+    //Последнее успешное значение температуры
+    float lastTemp;
+    //Последнее успешное значение влажности
+    float lastHum;
 } OneWireSensor;
 
 /**

+ 1 - 0
interfaces/Sensors.c

@@ -279,6 +279,7 @@ UnitempStatus unitemp_sensor_getValues(Sensor* sensor) {
 
     if(sensor->interface == ONE_WIRE) {
         sensor->status = unitemp_oneWire_getData(sensor);
+        if(app->settings.unit == FAHRENHEIT) uintemp_celsiumToFarengate(sensor);
         return sensor->status;
     }
 

+ 2 - 1
scenes/TempHum_scene.c

@@ -25,8 +25,9 @@ static void TempHum_draw_callback(Canvas* canvas, void* _model) {
                 snprintf(
                     buff,
                     sizeof(buff),
-                    "%2.1f*C/%d%%",
+                    "%2.1f*%c/%d%%",
                     (double)app->sensors[i]->temp,
+                    app->settings.unit == CELSIUS ? 'C' : 'F',
                     (int8_t)app->sensors[i]->hum);
                 canvas_draw_str(canvas, 64, 24 + 10 * i, buff);
             }

+ 8 - 4
unitemp.c

@@ -9,6 +9,10 @@
 //Данные приложения
 Unitemp* app;
 
+void uintemp_celsiumToFarengate(Sensor* sensor) {
+    sensor->temp = sensor->temp * (9.0 / 5.0) + 32;
+}
+
 /**
  * @brief Сохранение настроек на SD-карту
  * 
@@ -142,10 +146,10 @@ static bool unitemp_loadSettings(void) {
             //Чтение значения параметра
             int p = 0;
             sscanf(line, "UNIT %d", &p);
-            if(p == CELSIUM) {
-                app->settings.unit = CELSIUM;
+            if(p == CELSIUS) {
+                app->settings.unit = CELSIUS;
             } else {
-                app->settings.unit = FARENGATE;
+                app->settings.unit = FAHRENHEIT;
             }
             FURI_LOG_D(APP_NAME, "UNIT: %d\r\n", p);
         } else {
@@ -190,7 +194,7 @@ static bool unitemp_alloc(void) {
 
     //Установка значений по умолчанию
     app->settings.infinityBacklight = true; //Подсветка горит всегда
-    app->settings.unit = CELSIUM; //Единица измерения - градусы Цельсия
+    app->settings.unit = CELSIUS; //Единица измерения - градусы Цельсия
 
     app->gui = furi_record_open(RECORD_GUI);
     //Диспетчер окон

+ 8 - 1
unitemp.h

@@ -33,7 +33,7 @@
 
 /* Объявление перечислений */
 //Единицы измерения
-typedef enum { CELSIUM, FARENGATE } measureUnit;
+typedef enum { CELSIUS, FAHRENHEIT } measureUnit;
 
 /* Объявление структур */
 //Настройки плагина
@@ -70,5 +70,12 @@ typedef struct {
 
 /* Объявление прототипов функций */
 
+/**
+ * @brief Перевод значения температуры датчика из Цельсия в Фаренгейты
+ * 
+ * @param sensor Указатель на датчик
+ */
+void uintemp_celsiumToFarengate(Sensor* sensor);
+
 extern Unitemp* app;
 #endif