فهرست منبع

Added support for negative temperature DS18B20, improved polling mechanism

Victor 3 سال پیش
والد
کامیت
492b31411c
3فایلهای تغییر یافته به همراه17 افزوده شده و 13 حذف شده
  1. 1 0
      Sensors.h
  2. 14 12
      interfaces/OneWireSensor.c
  3. 2 1
      scenes/TempHum_scene.c

+ 1 - 0
Sensors.h

@@ -10,6 +10,7 @@ typedef enum {
     UT_EARLYPOOL, //Опрос раньше положенной задержки
     UT_BADCRC, //Неверная контрольная сумма
     UT_ERROR, //Прочие ошибки
+    UT_POLLING, //В датчике происходит преобразование
 } UnitempStatus;
 
 //Порт ввода/вывода Flipper Zero

+ 14 - 12
interfaces/OneWireSensor.c

@@ -137,6 +137,8 @@ bool unitemp_OneWire_init(void* s) {
         GpioPullUp, //Принудительная подтяжка линии данных к питанию
         GpioSpeedVeryHigh); //Скорость работы - максимальная
 
+    if(!oneWire_start(instance)) return false;
+
     //TODO: настройка разрядности преобразования
     return true;
 }
@@ -158,18 +160,18 @@ bool unitemp_OneWire_deinit(void* s) {
 UnitempStatus unitemp_OneWire_update(void* s) {
     Sensor* sensor = (Sensor*)s;
     OneWireSensor* instance = ((Sensor*)s)->instance;
-    oneWire_start(instance);
-    oneWire_write(instance, 0xCC); // skip ROM
-    oneWire_write(instance, 0x44); // convert t
-    furi_delay_ms(800);
-
-    oneWire_start(instance);
-    oneWire_write(instance, 0xCC); // skip ROM
-    oneWire_write(instance, 0xBE); // Read Scratch-pad
-    uint8_t Temp_byte1 = oneWire_read(instance);
-    uint8_t Temp_byte2 = oneWire_read(instance);
-    uint16_t TEMP = ((uint16_t)Temp_byte2 << 8) | Temp_byte1;
-    sensor->temp = (float)TEMP / 16;
+    if(sensor->status != UT_POLLING) {
+        if(!oneWire_start(instance)) return UT_TIMEOUT;
+        oneWire_write(instance, 0xCC); // skip ROM
+        oneWire_write(instance, 0x44); // convert t
+        return UT_POLLING;
+    } else {
+        if(!oneWire_start(instance)) return UT_TIMEOUT;
+        oneWire_write(instance, 0xCC); // skip ROM
+        oneWire_write(instance, 0xBE); // Read Scratch-pad
+        int16_t raw = oneWire_read(instance) | ((int16_t)oneWire_read(instance) << 8);
+        sensor->temp = (float)raw / 16.0f;
+    }
 
     return UT_OK;
 }

+ 2 - 1
scenes/TempHum_scene.c

@@ -18,7 +18,8 @@ static void TempHum_draw_callback(Canvas* canvas, void* _model) {
             canvas_draw_str(canvas, 0, 24 + 10 * i, app->sensors[i]->name);
 
             canvas_set_font(canvas, FontSecondary);
-            if(app->sensors[i]->status != UT_OK && app->sensors[i]->status != UT_EARLYPOOL) {
+            if(app->sensors[i]->status != UT_OK && app->sensors[i]->status != UT_EARLYPOOL &&
+               app->sensors[i]->status != UT_POLLING) {
                 canvas_draw_str(canvas, 96, 24 + 10 * i, "timeout");
             } else {
                 char buff[20];