Files
xterra-overland-dashboard/docs/pico-architecture.md
T
2026-06-03 02:29:30 -06:00

4.6 KiB

Pico Dashboard Architecture

Purpose

The Raspberry Pi Pico 2 W dashboard is the primary user interface for the Xterra Overland Power & Monitoring Dashboard.

Its responsibilities are:

  • Display live system status
  • Display alarms and warnings
  • Allow relay control
  • Provide touchscreen navigation
  • Communicate with the ESP32 cargo controller
  • Provide audible alerts through a dashboard buzzer

The Pico is intentionally a display and control device.

The ESP32 remains responsible for hardware control and sensor collection.


Hardware

Dashboard Controller

  • Raspberry Pi Pico 2 W

Display

  • ST7796S
  • 320x480 resolution
  • SPI interface

Touch Controller

  • FT6336U
  • Capacitive touch
  • I2C interface

Audio

  • Active buzzer

Communications

Primary:

  • UART over CAT5

Backup:

  • WiFi HTTP API

Fallback only:

  • RS-485 (not currently planned)

Software Architecture

main.py
│
├── app_state.py
│
├── comms/
│   ├── uart_client.py
│   ├── http_client.py
│   └── protocol.py
│
├── hardware/
│   ├── display.py
│   ├── touch.py
│   └── buzzer.py
│
├── alarms/
│   ├── alarm_manager.py
│   └── alarm_definitions.py
│
└── ui/
    ├── screen_manager.py
    ├── dashboard_screen.py
    ├── battery_screen.py
    ├── temps_screen.py
    ├── power_screen.py
    ├── system_screen.py
    └── alarm_overlay.py

Application State

A single application state object should hold all current controller data.

Example:

state.battery_soc
state.battery_voltage

state.fridge_zone_1_temp
state.fridge_zone_2_temp

state.starlink_enabled
state.fridge_enabled

state.ignition_on

state.uart_connected
state.wifi_connected

All screens should render from the application state rather than communicating directly with the ESP32.


Communication Layer

Responsibilities

  • Send status requests
  • Receive status responses
  • Send relay commands
  • Handle communication failures
  • Switch to HTTP fallback if UART fails

The communication layer should be the only component that knows how to talk to the ESP32.


Screen Manager

The screen manager owns navigation.

Initial screens:

  1. Dashboard
  2. Battery
  3. Temperatures
  4. Power
  5. System

Only one screen should be active at a time.


Dashboard Screen

The dashboard screen is the default landing page.

Display:

  • Battery SOC
  • Battery voltage
  • Battery current
  • Remaining runtime
  • Fridge temperatures
  • Relay status
  • Communication status
  • Active alarms

Goal:

Quick vehicle-at-a-glance information.


Battery Screen

Display:

  • SOC
  • Voltage
  • Current
  • Remaining amp-hours
  • Runtime estimate
  • Battery temperature

Future:

  • BMS cell voltages
  • Charge/discharge limits

Temperature Screen

Display:

  • Fridge Zone 1
  • Fridge Zone 2
  • Rear Seat Area
  • Outside Air

Display sensor fault indicators when sensors are missing.


Power Screen

Display:

  • Starlink relay status
  • Fridge relay status

Allow relay control.

Future:

  • Inverter
  • Lighting
  • Additional accessory relays

System Screen

Display:

  • ESP32 status
  • Communication status
  • Firmware versions
  • WiFi status
  • Sensor health

Future:

  • Configuration options

Alarm Manager

The alarm manager continuously evaluates system state.

Initial alarms:

Battery Low

Triggered when SOC falls below configured threshold.

Battery Voltage Low

Triggered when voltage falls below configured threshold.

Fridge Temperature High

Triggered when fridge temperature exceeds configured threshold.

Sensor Failure

Triggered when a sensor becomes unavailable.

Communication Failure

Triggered when ESP32 communication is lost.


Alarm Overlay

The alarm overlay is visible from any screen.

Severity levels:

  • Info
  • Warning
  • Critical

Critical alarms should trigger the buzzer.


Buzzer Manager

Initial buzzer events:

  • Critical battery alarm
  • High fridge temperature
  • Communication loss
  • Sensor failure

The buzzer should be non-blocking and event-driven.


UI Design Goals

  • Touchscreen-only operation
  • Large buttons
  • Readable in sunlight
  • Minimal navigation depth
  • Fast status visibility
  • Safe operation while driving

Initial Bring-Up Order

  1. Display test
  2. Touch test
  3. Buzzer test
  4. Static UI rendering
  5. UART communications
  6. Live status display
  7. Relay control
  8. Alarm overlay
  9. WiFi fallback

Out of Scope

Not currently planned:

  • Persistent logging
  • Historical graphs
  • Cloud connectivity
  • Internet access requirements
  • User accounts
  • Remote access

The system is intended to operate fully offline.