fix: V3 has white LED on GPIO35, not WS2812B on GPIO38

The Heltec V3 has a plain white LED on GPIO35 (simple GPIO, not
addressable). Only the V4 has a WS2812B RGB LED on GPIO38.

- Created driver/simple_led.rs for single-color GPIO LEDs
- V3/V3-UART boards: SimpleLed on GPIO35 (white blink on RX/TX)
- V4 board: unchanged (WS2812 on GPIO38, green/red colors)
- nRF boards: unchanged (no LED, type LedDriver = ())
This commit is contained in:
swaits committed 2026-04-07 11:30:16 -06:00
1 parent 317236acd1
commit acd97966aa
4 files changed
+46 -29

No files matched your search

+7 -14
View File
@@ -7,12 +7,10 @@
//! use the `heltec_v3` feature instead for native USB CDC-ACM support.
use esp_hal::gpio::{Level, Output, OutputConfig};
use esp_hal::rmt::{Rmt, TxChannelConfig, TxChannelCreator};
use esp_hal::time::Rate;
use super::esp32s3;
use super::traits::{BoardParts, LoRaBoard};
use crate::driver::ws2812::Ws2812;
use crate::driver::simple_led::SimpleLed;
use crate::hal::esp32s3 as mcu;
pub use super::esp32s3::{
@@ -20,7 +18,7 @@ pub use super::esp32s3::{
};
pub type UartDriver = esp_hal::uart::Uart<'static, esp_hal::Async>;
pub type LedDriver = Ws2812;
pub type LedDriver = SimpleLed;
pub struct UartParts {
pub driver: UartDriver,
@@ -38,7 +36,7 @@ impl LoRaBoard for Board {
type CommParts = UartParts;
type DisplayParts = DisplayParts;
type DisplayDriver = DisplayDriver;
type LedDriver = Ws2812;
type LedDriver = LedDriver;
fn init() -> Self {
let p = esp_hal::init(esp_hal::Config::default());
@@ -49,7 +47,7 @@ impl LoRaBoard for Board {
mcu::mac_address()
}
fn into_parts(self) -> BoardParts<RadioParts, UartParts, DisplayParts, Ws2812> {
fn into_parts(self) -> BoardParts<RadioParts, UartParts, DisplayParts, LedDriver> {
let p = self.p;
mcu::start_timer(p.TIMG0);
@@ -80,14 +78,9 @@ impl LoRaBoard for Board {
let i2c = mcu::init_i2c(p.I2C0, p.GPIO17, p.GPIO18);
let display = Some(DisplayParts { i2c });
// WS2812B RGB LED on GPIO38 via RMT channel 0
let rmt = Rmt::new(p.RMT, Rate::from_mhz(80))
.expect("RMT init")
.into_async();
let led_channel = rmt.channel0
.configure_tx(p.GPIO38, TxChannelConfig::default().with_clk_divider(1).with_idle_output(true))
.expect("RMT TX channel init");
let led = Some(Ws2812::new(led_channel));
// White LED on GPIO35
let led_pin = Output::new(p.GPIO35, Level::Low, OutputConfig::default());
let led = Some(SimpleLed::new(led_pin));
BoardParts {
radio,