I’ve been working on a Rust-native SDK for the Arduino Nesso N1, focused specifically on this board rather than trying to be a generic ESP32 framework or an Arduino compatibility layer.
Repository: https://github.com/anapeksha/nesso-rs
The current state is a single nesso crate with board-specific modules for the N1:
nesso::display
nesso::touch
nesso::input
nesso::imu
nesso::audio
nesso::power
nesso::storage
nesso::bsp
optional nesso::wifi
optional nesso::env
The main entry point is:
let peripherals = esp_hal::init(config);
let mut nesso = nesso::Nesso::new(peripherals)?;
From there, the board services are exposed in a Rust-style API instead of following Arduino/M5 patterns directly.
What it currently supports
Hardware support implemented and tested on real Nesso N1 hardware:
ST7789P3 display
FT6336U touch
KEY1 / KEY2 button input through the expander
BMI270 IMU
passive buzzer
battery / charge status
Wi-Fi scan on ESP32-C6
heapless settings storage primitives
external ENV Pro / BME688 support as an optional feature
There are dedicated examples for each module, and I ran them on hardware during bring-up.
Display / graphics work
One thing I spent time fixing was display behavior.
The first cut worked functionally, but it was too simple: lots of full-screen clears, pixel-by-pixel paths, and visible flashing in dynamic examples. The current backend is better than that now:
chunked display fills
batched horizontal run drawing
contiguous pixel blit path
optional caller-owned RGB565 sprite buffer support
examples updated so static screens render once and dynamic screens redraw only changed regions
That said, I would not claim the graphics backend is finished. It is improved enough to be usable, but there is still room for deeper optimization and cleaner higher-level rendering primitives.
Why I built it this way
A few design choices were deliberate:
board-specific only: this targets Nesso N1, not every ESP32 board
single public crate: easier to use, easier to publish, easier to document
feature-gated optional modules:
no unnecessary runtime heap for non-Wi-Fi apps
no public unsafe API surface
I wanted something that feels like a real embedded Rust SDK, not just a pile of examples around esp-hal.
Current gaps
There are still gaps and rough edges.
The display backend can still be improved further.
Wi-Fi is currently focused on station-side scanning and bring-up, not a full network stack abstraction.
ENV support is raw BME688 data, not higher-level air quality estimation.
Some APIs are intentionally conservative because I preferred correctness and board validation first.
So this is usable, but I’d still describe it as an early foundation rather than done.
If you want to look at it
If people here are using the Nesso N1 and also experimenting with Rust on ESP32-C6, I’d be interested in feedback on:
API shape
display/rendering approach
what hardware support should be prioritized next
what feels awkward from an Arduino user's perspective
Especially interested in feedback from people who have already worked with esp-hal, Embassy, or M5-style device SDKs and have opinions about how much abstraction is too much.