Update BullTron README details
This commit is contained in:
@@ -150,8 +150,8 @@ The GUI shows:
|
|||||||
charge/discharge current and watts, and computed time-to-empty/time-to-full
|
charge/discharge current and watts, and computed time-to-empty/time-to-full
|
||||||
- alarm/status words decoded into readable alarm names where known
|
- alarm/status words decoded into readable alarm names where known
|
||||||
- system/settings values such as the control PIN, firmware/version text,
|
- system/settings values such as the control PIN, firmware/version text,
|
||||||
product info, battery code/SN, production-date raw value, and inferred battery
|
product info, battery code/SN, parsed production date where possible, and
|
||||||
Ah when the settings block contains a plausible capacity
|
inferred battery Ah when the settings block contains a plausible capacity
|
||||||
- raw TX/RX frames for debugging and protocol confirmation
|
- raw TX/RX frames for debugging and protocol confirmation
|
||||||
|
|
||||||
The settings tab has MOS on/off controls, but writes are deliberately guarded:
|
The settings tab has MOS on/off controls, but writes are deliberately guarded:
|
||||||
@@ -160,6 +160,11 @@ The default write registers mirror the BullTron system screen: `0x00A5` for
|
|||||||
charge MOS and `0x00A6` for discharge MOS. The live MOS status still comes from
|
charge MOS and `0x00A6` for discharge MOS. The live MOS status still comes from
|
||||||
read-only telemetry registers `0x0035` and `0x0036`.
|
read-only telemetry registers `0x0035` and `0x0036`.
|
||||||
|
|
||||||
|
The MOS status can lag the requested control state until that MOSFET path is
|
||||||
|
actually used. For example, disabling charging may still display as ON while
|
||||||
|
the pack is idle or discharging; it only reports OFF once charging is attempted
|
||||||
|
and the BMS applies the charge MOS state.
|
||||||
|
|
||||||
Scan results are sorted so likely BullTron devices appear first. The Android app
|
Scan results are sorted so likely BullTron devices appear first. The Android app
|
||||||
accepts scanned devices whose BLE name contains `DL` or `B35`, or whose legacy
|
accepts scanned devices whose BLE name contains `DL` or `B35`, or whose legacy
|
||||||
advertising payload contains marker bytes for `DL`, `PU`, or `JHB`. The desktop
|
advertising payload contains marker bytes for `DL`, `PU`, or `JHB`. The desktop
|
||||||
@@ -241,14 +246,18 @@ Important fields:
|
|||||||
| `0x003A`-`0x003D` | Alarm/status words | 16-bit bitmaps |
|
| `0x003A`-`0x003D` | Alarm/status words | 16-bit bitmaps |
|
||||||
|
|
||||||
Time-to-empty/time-to-full is computed by the app instead of read as one live
|
Time-to-empty/time-to-full is computed by the app instead of read as one live
|
||||||
BLE value:
|
BLE value. Current app logic uses the remaining-capacity register when present,
|
||||||
|
falling back to rated capacity times SOC fraction only if remaining Ah is not
|
||||||
|
available:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
if register 0x002F == 1:
|
remaining_Ah = register_0x0030_Ah if available else rated_capacity_Ah * SOC_percent / 100
|
||||||
time-to-full = rated_capacity_Ah * (100 - SOC_percent) / abs(current_A) * 60
|
|
||||||
|
|
||||||
if register 0x002F == 2:
|
if current_A > 0:
|
||||||
time-to-empty = rated_capacity_Ah * SOC_percent / abs(current_A) * 60
|
time-to-full = max(rated_capacity_Ah - remaining_Ah, 0) / abs(current_A) * 60
|
||||||
|
|
||||||
|
if current_A < 0:
|
||||||
|
time-to-empty = remaining_Ah / abs(current_A) * 60
|
||||||
```
|
```
|
||||||
|
|
||||||
## Repository Contents
|
## Repository Contents
|
||||||
|
|||||||
Reference in New Issue
Block a user