From ed839d0620c00183005d2b0177386858a1da600d Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Wed, 23 Apr 2025 22:50:26 +0200 Subject: [PATCH] Better precision --- apps/com.example.imu/assets/main.py | 38 +++++++++++------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/apps/com.example.imu/assets/main.py b/apps/com.example.imu/assets/main.py index 13290c4e..db2d2afc 100644 --- a/apps/com.example.imu/assets/main.py +++ b/apps/com.example.imu/assets/main.py @@ -3,23 +3,11 @@ from qmi8658 import QMI8658 import time import machine - sensor = QMI8658(I2C(0, sda=machine.Pin(48), scl=machine.Pin(47))) templabel = lv.label(subwindow) templabel.align(lv.ALIGN.TOP_MID, 0, 10) -#scale = lv.scale(subwindow) -#scale.set_size(lv.pct(80), 50) -#scale.align(lv.ALIGN.TOP_MID, 0, 40) - -#acclabelx = lv.label(subwindow) -#acclabelx.align(lv.ALIGN.CENTER, -100, 0) -#acclabely = lv.label(subwindow) -#acclabely.align(lv.ALIGN.CENTER, 0, 0) -#acclabelz = lv.label(subwindow) -#acclabelz.align(lv.ALIGN.CENTER, 100, 0) - sliderx = lv.slider(subwindow) sliderx.align(lv.ALIGN.CENTER, 0, -60) slidery = lv.slider(subwindow) @@ -35,20 +23,22 @@ slidergz = lv.slider(subwindow) slidergz.align(lv.ALIGN.CENTER, 0, 90) def map_nonlinear(value: float) -> int: - """Convert a value from [-200, 200] to [0, 100] with non-linear stretching around 0.""" - # Step 1: Normalize input from [-200, 200] to [-1, 1] - normalized = value / 200.0 - # Step 2: Apply non-linear transformation (preserve sign) - sign = 1 if normalized >= 0 else -1 - abs_normalized = abs(normalized) - # Use square root (or another power < 1) to stretch small values - non_linear = sign * (abs_normalized ** 0.5) - # Step 3: Scale and shift to [0, 100] - # Map [-1, 1] to [0, 100] (i.e., -1 -> 0, 0 -> 50, 1 -> 100) - return int((non_linear + 1) * 50.0) + # Preserve sign and work with absolute value + sign = 1 if value >= 0 else -1 + abs_value = abs(value) + # Apply non-linear transformation (square root) to absolute value + # Scale input range [0, 200] to [0, sqrt(200)] first + sqrt_value = (abs_value ** 0.5) + # Scale to output range [0, 100] + # Map [0, sqrt(200)] to [50, 100] for positive, [0, 50] for negative + max_sqrt = 200.0 ** 0.5 # Approx 14.142 + scaled = (sqrt_value / max_sqrt) * 50.0 # Scale to [0, 50] + return int(50.0 + (sign * scaled)) # Shift to [0, 100] + + canary = lv.obj(subwindow) -canary.add_flag(0x0001) # LV_OBJ_FLAG_HIDDEN is 0x0001 +canary.add_flag(lv.obj.FLAG.HIDDEN) while canary.get_class(): #print(f"""{sensor.temperature=} {sensor.acceleration=} {sensor.gyro=}""") templabel.set_text(f"Temperature: {sensor.temperature:.2f}")