ソースを参照

Added pressure printing

Victor 3 年 前
コミット
326bf0ed9e
3 ファイル変更58 行追加22 行削除
  1. BIN
      assets/mm_hg_17x15.png
  2. 34 18
      sensors/BMP280.c
  3. 24 4
      views/General_view.c

BIN
assets/mm_hg_17x15.png


+ 34 - 18
sensors/BMP280.c

@@ -75,24 +75,40 @@ static double bmp280_compensate_T_double(I2CSensor* i2c_sensor, int32_t adc_T) {
 
 static double bmp280_compensate_P_double(I2CSensor* i2c_sensor, int32_t adc_P) {
     BMP280_instance* bmp280_instance = (BMP280_instance*)i2c_sensor->sensorInstance;
-    double var1, var2, p;
-    var1 = ((double)bmp280_instance->t_fine / (double)2.0) - (double)64000.0;
-    var2 = var1 * var1 * ((double)bmp280_instance->press_cal.dig_P6) / (double)32768.0;
-    var2 = var2 + var1 * ((double)bmp280_instance->press_cal.dig_P5) * (double)2.0;
-    var2 = (var2 / (double)4.0) + (((double)bmp280_instance->press_cal.dig_P4) * (double)65536.0);
-    var1 = (((double)bmp280_instance->press_cal.dig_P3) * var1 * var1 / (double)524288.0 +
-            ((double)bmp280_instance->press_cal.dig_P2) * var1) /
-           (double)524288.0;
-    var1 = ((double)1.0 + var1 / (double)32768.0) * ((double)bmp280_instance->press_cal.dig_P1);
-    if(var1 == (double)0.0) {
-        return 0; // avoid exception caused by division by zero
-    }
-    p = (double)1048576.0 - (double)adc_P;
-    p = (p - (var2 / (double)4096.0)) * (double)6250.0 / var1;
-    var1 = ((double)bmp280_instance->press_cal.dig_P9) * p * p / (double)2147483648.0;
-    var2 = p * ((double)bmp280_instance->press_cal.dig_P8) / (double)32768.0;
-    p = p + (var1 + var2 + ((double)bmp280_instance->press_cal.dig_P7)) / (double)16.0;
-    return p;
+    // double var1, var2, p;
+    // var1 = ((double)bmp280_instance->t_fine / (double)2.0) - (double)64000.0;
+    // var2 = var1 * var1 * ((double)bmp280_instance->press_cal.dig_P6) / (double)32768.0;
+    // var2 = var2 + var1 * ((double)bmp280_instance->press_cal.dig_P5) * (double)2.0;
+    // var2 = (var2 / (double)4.0) + (((double)bmp280_instance->press_cal.dig_P4) * (double)65536.0);
+    // var1 = (((double)bmp280_instance->press_cal.dig_P3) * var1 * var1 / (double)524288.0 +
+    //         ((double)bmp280_instance->press_cal.dig_P2) * var1) /
+    //        (double)524288.0;
+    // var1 = ((double)1.0 + var1 / (double)32768.0) * ((double)bmp280_instance->press_cal.dig_P1);
+    // if(var1 == (double)0.0) {
+    //     return 0; // avoid exception caused by division by zero
+    // }
+    // p = (double)1048576.0 - (double)adc_P;
+    // p = (p - (var2 / (double)4096.0)) * (double)6250.0 / var1;
+    // var1 = ((double)bmp280_instance->press_cal.dig_P9) * p * p / (double)2147483648.0;
+    // var2 = p * ((double)bmp280_instance->press_cal.dig_P8) / (double)32768.0;
+    // p = p + (var1 + var2 + ((double)bmp280_instance->press_cal.dig_P7)) / (double)16.0;
+    int64_t value_1 = (bmp280_instance->t_fine) - 128000;
+    int64_t value_2 = value_1 * value_1 * (int64_t)bmp280_instance->press_cal.dig_P6;
+    value_2 = value_2 + ((value_1 * (int64_t)bmp280_instance->press_cal.dig_P5) << 17);
+    value_2 = value_2 + (((int64_t)bmp280_instance->press_cal.dig_P4) << 35);
+    value_1 = ((value_1 * value_1 * (int64_t)bmp280_instance->press_cal.dig_P3) >> 8) +
+              ((value_1 * (int64_t)bmp280_instance->press_cal.dig_P2) << 12);
+    value_1 = (((((int64_t)1) << 47) + value_1)) * ((int64_t)bmp280_instance->press_cal.dig_P1) >>
+              33;
+
+    if(!value_1) return 0; // Avoid division by zero
+
+    int64_t p = 1048576 - adc_P;
+    p = (((p << 31) - value_2) * 3125) / value_1;
+    value_1 = (((int64_t)bmp280_instance->press_cal.dig_P9) * (p >> 13) * (p >> 13)) >> 25;
+    value_2 = (((int64_t)bmp280_instance->press_cal.dig_P8) * p) >> 19;
+    p = ((p + value_1 + value_2) >> 8) + (((int64_t)bmp280_instance->press_cal.dig_P7) << 4);
+    return p / 256.0;
 }
 
 static bool bmp280_readCalValues(I2CSensor* i2c_sensor) {

+ 24 - 4
views/General_view.c

@@ -4,8 +4,9 @@ static View* view;
 
 static const uint8_t temp_positions[3][2] = {{37, 24}, {37, 16}, {9, 16}};
 static const uint8_t hum_positions[2][2] = {{37, 38}, {65, 16}};
+
 static uint8_t sensor_index = 0;
-static char buff[5];
+static char buff[7];
 static void _draw_noSensors(Canvas* canvas) {
     canvas_draw_str(canvas, 0, 24, "Sensors not found");
 }
@@ -69,7 +70,7 @@ static void _draw_temp(Canvas* canvas, float temp, uint8_t pos) {
     }
 }
 
-static void _draw_hum(Canvas* canvas, float hum, uint8_t pos) {
+void _draw_hum(Canvas* canvas, float hum, uint8_t pos) {
     //Рисование рамки
     canvas_draw_rframe(canvas, hum_positions[pos][0], hum_positions[pos][1], 54, 20, 3);
     canvas_draw_rframe(canvas, hum_positions[pos][0], hum_positions[pos][1], 54, 19, 3);
@@ -116,6 +117,24 @@ static void _draw_hum(Canvas* canvas, float hum, uint8_t pos) {
         canvas, hum_positions[pos][0] + 27 + int_len / 2 + 2, hum_positions[pos][1] + 10 + 7, "%");
 }
 
+static void _draw_press(Canvas* canvas, float press) {
+    UNUSED(press);
+    const uint8_t x = 29, y = 39;
+    //Рисование рамки
+    canvas_draw_rframe(canvas, x, y, 69, 20, 3);
+    canvas_draw_rframe(canvas, x, y, 69, 19, 3);
+
+    //Рисование иконки
+    canvas_draw_icon(canvas, x + 3, y + 4, &I_arrow_up_7x13);
+
+    //Давление
+    snprintf(buff, 6, "%d", (uint16_t)press);
+    canvas_set_font(canvas, FontBigNumbers);
+    canvas_draw_str_aligned(canvas, x + 30, y + 10, AlignCenter, AlignCenter, buff);
+    //Единица измерения
+    canvas_draw_icon(canvas, x + 50, y + 3, &I_mm_hg_17x15);
+}
+
 static void _draw_sensorsCarousel(Canvas* canvas) {
     //Рисование рамки
     canvas_draw_rframe(canvas, 3, 0, 122, 63, 7);
@@ -139,8 +158,9 @@ static void _draw_sensorsCarousel(Canvas* canvas) {
     }
 
     //Печать значения температуры
-    _draw_temp(canvas, app->sensors[sensor_index]->pressure, 1);
-    _draw_hum(canvas, app->sensors[sensor_index]->hum, 0);
+    _draw_temp(canvas, app->sensors[sensor_index]->temp, 1);
+    //_draw_hum(canvas, app->sensors[sensor_index]->hum, 1);
+    _draw_press(canvas, app->sensors[sensor_index]->pressure);
 }
 
 static void _draw_callback(Canvas* canvas, void* _model) {