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

Fixing the bit depth of the DS18B20 conversion to 10 bits

Victor 3 лет назад
Родитель
Сommit
27560beb11
2 измененных файлов с 28 добавлено и 3 удалено
  1. 23 2
      interfaces/OneWireSensor.c
  2. 5 1
      scenes/TempHum_scene.c

+ 23 - 2
interfaces/OneWireSensor.c

@@ -6,7 +6,7 @@
 const SensorType DS18B20 = {
 const SensorType DS18B20 = {
     .typename = "DS18B20",
     .typename = "DS18B20",
     .interface = &ONE_WIRE,
     .interface = &ONE_WIRE,
-    .pollingInterval = 500,
+    .pollingInterval = 250,
     .allocator = unitemp_OneWire_alloc,
     .allocator = unitemp_OneWire_alloc,
     .mem_releaser = unitemp_OneWire_free,
     .mem_releaser = unitemp_OneWire_free,
     .initializer = unitemp_OneWire_init,
     .initializer = unitemp_OneWire_init,
@@ -109,6 +109,18 @@ static void oneWire_readBytes(OneWireSensor* instance, uint8_t* data, size_t len
     }
     }
 }
 }
 
 
+/**
+ * @brief Запись массива байт на шину One Wire
+ * 
+ * @param instance Указатель на инстанс датчика
+ * @param data Указатель на массив, откуда будут записаны данные
+ * @param len Количество байт
+ */
+static void oneWire_writeBytes(OneWireSensor* instance, uint8_t* data, size_t len) {
+    for(size_t i = 0; i < len; i++) {
+        oneWire_write(instance, data[i]);
+    }
+}
 bool unitemp_OneWire_alloc(void* s, uint16_t* anotherValues) {
 bool unitemp_OneWire_alloc(void* s, uint16_t* anotherValues) {
     Sensor* sensor = (Sensor*)s;
     Sensor* sensor = (Sensor*)s;
     OneWireSensor* instance = malloc(sizeof(OneWireSensor));
     OneWireSensor* instance = malloc(sizeof(OneWireSensor));
@@ -166,9 +178,18 @@ bool unitemp_OneWire_init(void* s) {
         GpioPullUp, //Принудительная подтяжка линии данных к питанию
         GpioPullUp, //Принудительная подтяжка линии данных к питанию
         GpioSpeedVeryHigh); //Скорость работы - максимальная
         GpioSpeedVeryHigh); //Скорость работы - максимальная
 
 
+    //Установка разрядности в 10 бит
+    if(!oneWire_start(instance)) return false;
+    oneWire_write(instance, 0xCC); // skip ROM
+    oneWire_write(instance, 0x4E); // Запись в память
+    uint8_t buff[3] = {0x4B, 0x46, 0x3F}; //10 бит
+    oneWire_writeBytes(instance, buff, 3);
+
+    //Сохранение значений в EEPROM для автоматического восстановления после сбоев питания
     if(!oneWire_start(instance)) return false;
     if(!oneWire_start(instance)) return false;
+    oneWire_write(instance, 0xCC); // skip ROM
+    oneWire_write(instance, 0x48); // Запись в EEPROM
 
 
-    //TODO: настройка разрядности преобразования
     return true;
     return true;
 }
 }
 
 

+ 5 - 1
scenes/TempHum_scene.c

@@ -20,7 +20,11 @@ static void TempHum_draw_callback(Canvas* canvas, void* _model) {
             canvas_set_font(canvas, FontSecondary);
             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) {
                app->sensors[i]->status != UT_POLLING) {
-                canvas_draw_str(canvas, 96, 24 + 10 * i, "timeout");
+                if(app->sensors[i]->status == UT_BADCRC) {
+                    canvas_draw_str(canvas, 96, 24 + 10 * i, "bad CRC");
+                } else {
+                    canvas_draw_str(canvas, 96, 24 + 10 * i, "timeout");
+                }
             } else {
             } else {
                 char buff[20];
                 char buff[20];
                 snprintf(
                 snprintf(