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

Improved one wire sensors reading

Victor 3 лет назад
Родитель
Сommit
6936855c7a
4 измененных файлов с 42 добавлено и 8 удалено
  1. 18 3
      interfaces/OneWire.c
  2. 10 1
      interfaces/Sensors.c
  3. 11 3
      interfaces/Sensors.h
  4. 3 1
      unitemp.c

+ 18 - 3
interfaces/OneWire.c

@@ -66,6 +66,9 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
         if(timeout > POLLING_TIMEOUT_TICKS) {
             //Включение прерываний
             __enable_irq();
+            //Запись неправильных значений
+            sensor->hum = -128.0f;
+            sensor->temp = -128.0f;
             //Возврат признака отсутствующего датчика
             return UT_TIMEOUT;
         }
@@ -78,6 +81,9 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
         if(timeout > POLLING_TIMEOUT_TICKS) {
             //Включение прерываний
             __enable_irq();
+            //Запись неправильных значений
+            sensor->hum = -128.0f;
+            sensor->temp = -128.0f;
             //Возврат признака отсутствующего датчика
             return UT_TIMEOUT;
         }
@@ -89,6 +95,9 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
         if(timeout > POLLING_TIMEOUT_TICKS) {
             //Включение прерываний
             __enable_irq();
+            //Запись неправильных значений
+            sensor->hum = -128.0f;
+            sensor->temp = -128.0f;
             //Возврат признака отсутствующего датчика
             return UT_TIMEOUT;
         }
@@ -101,6 +110,9 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
         if(timeout > POLLING_TIMEOUT_TICKS) {
             //Включение прерываний
             __enable_irq();
+            //Запись неправильных значений
+            sensor->hum = -128.0f;
+            sensor->temp = -128.0f;
             //Возврат признака отсутствующего датчика
             return UT_TIMEOUT;
         }
@@ -124,6 +136,9 @@ 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;
         //Если контрольная сумма не совпала, возврат ошибки
         return UT_BADCRC;
     }
@@ -151,13 +166,13 @@ UnitempStatus unitemp_oneWire_getData(Sensor* sensor) {
 
     //DHT21, DHT22, AM2320
     if(sensor->type == DHT21 || sensor->type == DHT22 || sensor->type == AM2320_1W) {
-        sensor->hum = (float)(((uint16_t)data[0] << 8) | data[1]) * 0.1f;
+        sensor->hum = (float)(((uint16_t)data[0] << 8) | data[1]) / 10;
         //Проверка на отрицательность температуры
         if(!(data[2] & (1 << 7))) {
-            sensor->temp = (float)(((uint16_t)data[2] << 8) | data[3]) * 0.1f;
+            sensor->temp = (float)(((uint16_t)data[2] << 8) | data[3]) / 10;
         } else {
             data[2] &= ~(1 << 7);
-            sensor->temp = (float)(((uint16_t)data[2] << 8) | data[3]) * -0.1f;
+            sensor->temp = (float)(((uint16_t)data[2] << 8) | data[3]) / 10 * -1;
         }
     }
 

+ 10 - 1
interfaces/Sensors.c

@@ -71,7 +71,7 @@ Sensor* unitemp_sensor_alloc(char* name, SensorType st) {
         instance->interface = ONE_WIRE;
         instance->lastPollingTime = 0;
         sensor->instance = instance;
-        sensor->interface = ONE_WIRE;
+        sensor->type = st;
     }
     return sensor;
 }
@@ -120,4 +120,13 @@ bool unitemp_sensors_deInit(void) {
         }
     }
     return result;
+}
+
+UnitempStatus unitemp_sensor_getValues(Sensor* sensor) {
+    if(sensor == NULL) return UT_ERROR;
+
+    if(sensor->interface == ONE_WIRE) {
+        return unitemp_oneWire_getData(sensor);
+    }
+    return UT_ERROR;
 }

+ 11 - 3
interfaces/Sensors.h

@@ -33,7 +33,7 @@ typedef enum {
 } SensorType;
 
 //Типы подключения датчиков
-typedef enum {
+typedef enum Interface {
     ONE_WIRE, //Собственный однопроводной протокол датчиков DHTXX и AM23XX
     DALLAS, //Однопроводной протокол Dallas
     I2C,
@@ -43,14 +43,14 @@ typedef enum {
 } Interface;
 
 //Порт ввода/вывода Flipper Zero
-typedef struct {
+typedef struct GPIO {
     const uint8_t num;
     const char* name;
     const GpioPin* pin;
 } GPIO;
 
 //Датчик
-typedef struct {
+typedef struct Sensor {
     //Имя датчика
     char* name;
     //Температура
@@ -105,4 +105,12 @@ bool unitemp_sensors_init(void);
  */
 bool unitemp_sensors_deInit(void);
 
+/**
+ * @brief Получение данных указанного датчика
+ * 
+ * @param sensor Указатель на датчик
+ * @return Статус опроса датчика
+ */
+UnitempStatus unitemp_sensor_getValues(Sensor* sensor);
+
 #endif

+ 3 - 1
unitemp.c

@@ -259,10 +259,12 @@ int32_t unitemp_app() {
     while(1) {
         FURI_LOG_D(APP_NAME, "Sensors values:");
         for(uint8_t i = 0; i < app->sensors_count; i++) {
+            UnitempStatus s = unitemp_sensor_getValues(app->sensors[i]);
             FURI_LOG_D(
                 APP_NAME,
-                "%s: %2.1f*C/%d%%",
+                "%s (%d): %2.1f*C/%d%%",
                 app->sensors[i]->name,
+                s,
                 (double)app->sensors[i]->temp,
                 (uint8_t)app->sensors[i]->hum);
         }