From e4774627838c1b3febf61c0073751180e1998f48 Mon Sep 17 00:00:00 2001 From: ede1998 Date: Wed, 5 Aug 2026 18:28:28 +0200 Subject: [PATCH] try different crates --- Cargo.lock | 33 +++++++++ Cargo.toml | 8 ++- src/bin/experiment_ch1115.rs | 106 +++++++++++++++++++++++++++++ src/bin/experiment_sh1106.rs | 121 +++++++++++++++++++++++++++++++++ src/bin/experiment_ssd1306.rs | 122 ++++++++++++++++++++++++++++++++++ src/bin/main.rs | 39 ++++------- 6 files changed, 401 insertions(+), 28 deletions(-) create mode 100644 src/bin/experiment_ch1115.rs create mode 100644 src/bin/experiment_sh1106.rs create mode 100644 src/bin/experiment_ssd1306.rs diff --git a/Cargo.lock b/Cargo.lock index a49367c..ed56a59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -229,6 +229,15 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "ch1115" +version = "0.1.2" +dependencies = [ + "display-interface", + "embedded-graphics-core", + "embedded-hal 1.0.0", +] + [[package]] name = "cobs" version = "0.3.0" @@ -303,6 +312,7 @@ name = "creaturedex" version = "0.1.0" dependencies = [ "base64 0.22.1", + "ch1115", "critical-section", "display-interface-spi", "embassy-executor", @@ -311,6 +321,7 @@ dependencies = [ "embedded-graphics-core", "embedded-hal 1.0.0", "embedded-hal-bus", + "embedded-hal-compat", "embedded-io 0.7.1", "esp-alloc", "esp-bootloader-esp-idf", @@ -322,6 +333,7 @@ dependencies = [ "log", "ndef", "pn532", + "sh1106", "ssd1306", ] @@ -957,6 +969,17 @@ dependencies = [ "embedded-hal 1.0.0", ] +[[package]] +name = "embedded-hal-compat" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08ecac72f6be75ad2d4809c9f07d45502e2e5c9a4e9579077f28d7135de81df3" +dependencies = [ + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "nb 1.1.0", +] + [[package]] name = "embedded-io" version = "0.4.0" @@ -3116,6 +3139,16 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "sh1106" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc12a0563ec9b3b1f99b1f64613581ebbade1347416a34766564f406c15d1bf3" +dependencies = [ + "embedded-graphics-core", + "embedded-hal 0.2.7", +] + [[package]] name = "sharded-slab" version = "0.1.7" diff --git a/Cargo.toml b/Cargo.toml index b731e3e..2725dce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,8 +42,14 @@ embedded-graphics-core = "0.4.1" base64 = { version = "0.22", default-features = false, features = ["alloc"] } pn532 = "0.5.0" ndef = "0.5.0" +ch1115 = { version = "0.1.2", features = ["graphics"] } +sh1106 = "0.5.0" +embedded-hal-compat = "0.13.0" +[patch.crates-io] +ch1115 = { path = "./ch1115" } + # For fine tuning these settings, please refer to https://doc.rust-lang.org/cargo/reference/profiles.html @@ -60,4 +66,4 @@ opt-level = 's' [features] default = [] -wokwi = [] \ No newline at end of file +wokwi = [] diff --git a/src/bin/experiment_ch1115.rs b/src/bin/experiment_ch1115.rs new file mode 100644 index 0000000..f3ed3cc --- /dev/null +++ b/src/bin/experiment_ch1115.rs @@ -0,0 +1,106 @@ +#![no_std] +#![no_main] +#![deny( + clippy::mem_forget, + reason = "mem::forget is generally not safe to do with esp_hal types, especially those \ + holding buffers for the duration of a data transfer." +)] + +use ch1115::Ch1115; +use core::cell::RefCell; +use creaturedex::display::shared_bus::SharedPin; +use embassy_executor::Spawner; +use embassy_time::Timer; +use embedded_graphics::pixelcolor::BinaryColor; +use embedded_graphics::{ + mono_font::{MonoTextStyle, ascii::FONT_6X10}, + prelude::*, + text::Text, +}; +use esp_hal::clock::CpuClock; +use esp_hal::delay::Delay; +use esp_hal::gpio::{Level, Output, OutputConfig}; +use esp_hal::spi::Mode; +use esp_hal::spi::master::{Config as SpiConfig, Spi}; +use esp_hal::time::Rate; +use esp_hal::timer::timg::TimerGroup; +use log::error; + +#[panic_handler] +fn panic(panic_info: &core::panic::PanicInfo) -> ! { + error!("{}", panic_info); + loop {} +} + +extern crate alloc; + +esp_bootloader_esp_idf::esp_app_desc!(); + +#[esp_rtos::main] +async fn main(_spawner: Spawner) { + esp_println::logger::init_logger_from_env(); + + let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max()); + let peripherals = esp_hal::init(config); + + // The following GPIO pins are in use by some feature of the module and should not be used. + let _ = peripherals.GPIO27; + let _ = peripherals.GPIO28; + let _ = peripherals.GPIO29; + let _ = peripherals.GPIO30; + let _ = peripherals.GPIO31; + let _ = peripherals.GPIO32; + let _ = peripherals.GPIO33; + let _ = peripherals.GPIO34; + + esp_alloc::heap_allocator!(#[esp_hal::ram(reclaimed)] size: 73744); + + let mut delay = Delay::new(); + + let timg0 = TimerGroup::new(peripherals.TIMG0); + let sw_interrupt = + esp_hal::interrupt::software::SoftwareInterruptControl::new(peripherals.SW_INTERRUPT); + esp_rtos::start(timg0.timer0, sw_interrupt.software_interrupt0); + + let spi = peripherals.SPI2; + let sck = peripherals.GPIO36; + let mosi = peripherals.GPIO35; + let cs = peripherals.GPIO13; + let reset = peripherals.GPIO10; + let dc = peripherals.GPIO12; + let miso = peripherals.GPIO37; + + let cs = Output::new(cs, Level::High, OutputConfig::default()); + let dc = Output::new(dc, Level::Low, OutputConfig::default()); + let reset = Output::new(reset, Level::High, OutputConfig::default()); + + let spi = Spi::new( + spi, + SpiConfig::default() + .with_frequency(Rate::from_khz(5000)) + .with_mode(Mode::_0), + ) + .unwrap() + .with_sck(sck) + .with_mosi(mosi) + .with_miso(miso); + + let spi = RefCell::new(spi); + let spi_dev = embedded_hal_bus::spi::RefCellDevice::new(&spi, cs, delay).unwrap(); + let interface = display_interface_spi::SPIInterface::new(spi_dev, dc); + + let mut display = Ch1115::new(interface, reset, ch1115::Size128x64); + display.init(&mut delay).unwrap(); + + + loop { + log::info!("Init finished"); + // let text_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::On); + // Text::new("Hello OLED", Point::new(10, 20), text_style) + // .draw(&mut display) + // .unwrap(); + + // display.flush().unwrap(); + Timer::after_millis(1000).await; + } +} diff --git a/src/bin/experiment_sh1106.rs b/src/bin/experiment_sh1106.rs new file mode 100644 index 0000000..68744a8 --- /dev/null +++ b/src/bin/experiment_sh1106.rs @@ -0,0 +1,121 @@ +#![no_std] +#![no_main] +#![deny( + clippy::mem_forget, + reason = "mem::forget is generally not safe to do with esp_hal types, especially those \ + holding buffers for the duration of a data transfer." +)] + +use embassy_executor::Spawner; +use embassy_time::Timer; +use embedded_graphics::pixelcolor::BinaryColor; +use embedded_graphics::{ + mono_font::{MonoTextStyle, ascii::FONT_6X10}, + prelude::*, + text::Text, +}; +use embedded_hal_compat::ReverseCompat; +use esp_hal::clock::CpuClock; +use esp_hal::delay::Delay; +use esp_hal::gpio::{Level, Output, OutputConfig}; +use esp_hal::spi::Mode; +use esp_hal::spi::master::{Config as SpiConfig, Spi}; +use esp_hal::time::Rate; +use esp_hal::timer::timg::TimerGroup; +use log::error; + +#[panic_handler] +fn panic(panic_info: &core::panic::PanicInfo) -> ! { + error!("{}", panic_info); + loop {} +} + +extern crate alloc; + +esp_bootloader_esp_idf::esp_app_desc!(); + +// This creates a defaembedded_hal_compatedReverseCompat::reverse(Output::new(cs,Level::High,OutputConfig::default()))vel::High,OutputConfig::default())) more information see: embedded_hal_compat::ForwardCompat::forward(Spi::new(spi,SpiConfig::default().with_frequency(Rate::from_khz(100)).with_mode(Mode::_0),).unwrap().with_sck(sck).with_mosi(mosi))rward(Spi::new(spi,SpiConfig::default().with_frequency(Rate::from_khz(100)).with_mode(Mode::_0),).unwrap().with_sck(sck).with_mosi(mosi)) to allocate larger buffers etc. in main" +#[esp_rtos::main] +async fn main(_spawner: Spawner) { + esp_println::logger::init_logger_from_env(); + + let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max()); + let peripherals = esp_hal::init(config); + + // The following GPIO pins are in use by some feature of the module and should not be used. + let _ = peripherals.GPIO27; + let _ = peripherals.GPIO28; + let _ = peripherals.GPIO29; + let _ = peripherals.GPIO30; + let _ = peripherals.GPIO31; + let _ = peripherals.GPIO32; + let _ = peripherals.GPIO33; + let _ = peripherals.GPIO34; + + esp_alloc::heap_allocator!(#[esp_hal::ram(reclaimed)] size: 73744); + + let delay = Delay::new(); + + let timg0 = TimerGroup::new(peripherals.TIMG0); + let sw_interrupt = + esp_hal::interrupt::software::SoftwareInterruptControl::new(peripherals.SW_INTERRUPT); + esp_rtos::start(timg0.timer0, sw_interrupt.software_interrupt0); + + let spi = peripherals.SPI2; + let sck = peripherals.GPIO36; + let mosi = peripherals.GPIO35; + let cs = peripherals.GPIO13; + let reset = peripherals.GPIO10; + let dc = peripherals.GPIO12; + let miso = peripherals.GPIO37; + + let cs = Output::new(cs, Level::High, OutputConfig::default()).reverse_cell(); + let dc = Output::new(dc, Level::Low, OutputConfig::default()).reverse_cell(); + let mut reset = Output::new(reset, Level::High, OutputConfig::default()); + + let spi = Spi::new( + spi, + SpiConfig::default() + .with_frequency(Rate::from_khz(5000)) + .with_mode(Mode::_0), + ) + .unwrap() + .with_sck(sck) + .with_mosi(mosi) + .with_miso(miso) + .reverse(); + + let mut display: sh1106::mode::GraphicsMode<_> = + sh1106::Builder::new().connect_spi(spi, dc, cs).into(); + + display.init().unwrap(); + + // Hard reset the OLED + reset.set_high(); + delay.delay_millis(1); + reset.set_low(); + delay.delay_millis(10); + reset.set_high(); + + display.flush().unwrap(); + + display.set_pixel(10, 20, 1); + + display.flush().unwrap(); + + let mut oled = display; + + oled.clear(); + + let text_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::On); + Text::new("Hello OLED", Point::new(10, 20), text_style) + .draw(&mut oled) + .unwrap(); + + oled.flush().unwrap(); + + loop { + log::info!("Init finished"); + Timer::after_millis(1000).await; + } +} diff --git a/src/bin/experiment_ssd1306.rs b/src/bin/experiment_ssd1306.rs new file mode 100644 index 0000000..05f5e96 --- /dev/null +++ b/src/bin/experiment_ssd1306.rs @@ -0,0 +1,122 @@ +#![no_std] +#![no_main] +#![deny( + clippy::mem_forget, + reason = "mem::forget is generally not safe to do with esp_hal types, especially those \ + holding buffers for the duration of a data transfer." +)] +#![deny(clippy::large_stack_frames)] + +use embassy_executor::Spawner; +use embassy_time::Timer; +use embedded_graphics::draw_target::DrawTarget; +use embedded_graphics::pixelcolor::BinaryColor; +use embedded_graphics::text::Text; +use embedded_graphics::{ + mono_font::{MonoTextStyle, ascii::FONT_6X10}, + prelude::*, +}; + +use core::cell::RefCell; +use esp_hal::clock::CpuClock; +use esp_hal::delay::Delay; +use esp_hal::gpio::{Level, Output, OutputConfig}; +use esp_hal::spi::Mode; +use esp_hal::spi::master::{Config as SpiConfig, Spi}; +use esp_hal::time::Rate; +use esp_hal::timer::timg::TimerGroup; +use log::error; +use ssd1306::Ssd1306; +use ssd1306::mode::DisplayConfig; +use ssd1306::rotation::DisplayRotation; +use ssd1306::size::DisplaySize128x64; + +#[panic_handler] +fn panic(panic_info: &core::panic::PanicInfo) -> ! { + error!("{}", panic_info); + loop {} +} + +extern crate alloc; + +esp_bootloader_esp_idf::esp_app_desc!(); + +// This creates a defaembedded_hal_compatedReverseCompat::reverse(Output::new(cs,Level::High,OutputConfig::default()))vel::High,OutputConfig::default())) more information see: embedded_hal_compat::ForwardCompat::forward(Spi::new(spi,SpiConfig::default().with_frequency(Rate::from_khz(100)).with_mode(Mode::_0),).unwrap().with_sck(sck).with_mosi(mosi))rward(Spi::new(spi,SpiConfig::default().with_frequency(Rate::from_khz(100)).with_mode(Mode::_0),).unwrap().with_sck(sck).with_mosi(mosi)) to allocate larger buffers etc. in main" +#[esp_rtos::main] +async fn main(_spawner: Spawner) { + esp_println::logger::init_logger_from_env(); + + let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max()); + let peripherals = esp_hal::init(config); + + // The following GPIO pins are in use by some feature of the module and should not be used. + let _ = peripherals.GPIO27; + let _ = peripherals.GPIO28; + let _ = peripherals.GPIO29; + let _ = peripherals.GPIO30; + let _ = peripherals.GPIO31; + let _ = peripherals.GPIO32; + let _ = peripherals.GPIO33; + let _ = peripherals.GPIO34; + + esp_alloc::heap_allocator!(#[esp_hal::ram(reclaimed)] size: 73744); + + let mut delay = Delay::new(); + + let timg0 = TimerGroup::new(peripherals.TIMG0); + let sw_interrupt = + esp_hal::interrupt::software::SoftwareInterruptControl::new(peripherals.SW_INTERRUPT); + esp_rtos::start(timg0.timer0, sw_interrupt.software_interrupt0); + + let spi = peripherals.SPI2; + let sck = peripherals.GPIO36; + let mosi = peripherals.GPIO35; + let cs = peripherals.GPIO13; + let reset = peripherals.GPIO10; + let dc = peripherals.GPIO12; + let miso = peripherals.GPIO37; + + let cs = Output::new(cs, Level::High, OutputConfig::default()); + let dc = Output::new(dc, Level::Low, OutputConfig::default()); + let mut reset = Output::new(reset, Level::High, OutputConfig::default()); + + let spi = Spi::new( + spi, + SpiConfig::default() + .with_frequency(Rate::from_khz(5000)) + .with_mode(Mode::_0), + ) + .unwrap() + .with_sck(sck) + .with_mosi(mosi) + .with_miso(miso); + + let spi = RefCell::new(spi); + let spi_dev = embedded_hal_bus::spi::RefCellDevice::new(&spi, cs, delay).unwrap(); + let interface = display_interface_spi::SPIInterface::new(spi_dev, dc); + let mut display = Ssd1306::new( + interface, + DisplaySize128x64, + DisplayRotation::Rotate0, + ) + .into_buffered_graphics_mode(); + + display.reset(&mut reset, &mut delay).unwrap(); + display.init().unwrap(); + display.clear(BinaryColor::Off).unwrap(); + + + let mut oled = display; + + let text_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::On); + Text::new("Hello OLED", Point::new(10, 20), text_style) + .draw(&mut oled) + .unwrap(); + + oled.flush().unwrap(); + + loop { + log::info!("Init finished"); + Timer::after_millis(1000).await; + } +} diff --git a/src/bin/main.rs b/src/bin/main.rs index 79bcf8e..5f47555 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -10,7 +10,6 @@ use creaturedex::card::mock::{MOCK_PAYLOAD, MOCK_PAYLOAD2}; use creaturedex::display::shared_bus::init_dual_displays; - use creaturedex::display::views::card_view::render_nfc_payload; use creaturedex::drivers::nfc_pn532::NfcPn532Driver; use creaturedex::navigation::input::init_navigation_button; @@ -18,17 +17,17 @@ use creaturedex::navigation::state::NavigationState; use creaturedex::network::wifi::setup_wifi; use embassy_executor::Spawner; use embassy_time::Timer; -use embedded_graphics::{ - mono_font::{ascii::FONT_6X10, MonoTextStyle}, - prelude::*, - text::Text, - }; use embedded_graphics::draw_target::DrawTarget; use embedded_graphics::pixelcolor::{BinaryColor, Rgb565}; use embedded_graphics::prelude::RgbColor; -use esp_hal::time::Duration; +use embedded_graphics::{ + mono_font::{MonoTextStyle, ascii::FONT_6X10}, + prelude::*, + text::Text, +}; use esp_hal::clock::CpuClock; use esp_hal::delay::Delay; +use esp_hal::time::Duration; use esp_hal::timer::timg::TimerGroup; use log::error; @@ -81,7 +80,7 @@ async fn main(spawner: Spawner) { peripherals.GPIO35, // mosi peripherals.GPIO37, // miso peripherals.GPIO11, // primary cs - peripherals.GPIO5, // oled cs + peripherals.GPIO13, // oled cs peripherals.GPIO10, // shared reset peripherals.GPIO12, // shared dc &mut delay, @@ -97,11 +96,14 @@ async fn main(spawner: Spawner) { Text::new("Hello OLED", Point::new(10, 20), text_style) .draw(&mut oled) .unwrap(); - oled.flush().unwrap(); + let text_style = MonoTextStyle::new(&FONT_6X10, Rgb565::WHITE); + display.clear_screen(0).unwrap(); + Text::new("Hello OLED", Point::new(10, 20), text_style).draw(&mut display).unwrap(); - let mut nfc_driver = NfcPn532Driver::new(peripherals.I2C0, peripherals.GPIO17, peripherals.GPIO18); + let mut nfc_driver = + NfcPn532Driver::new(peripherals.I2C0, peripherals.GPIO17, peripherals.GPIO18); let timeout = Duration::from_millis(1000); if nfc_driver.configure_sam(timeout).is_ok() { log::info!("NFC SAM configuration successful"); @@ -109,24 +111,7 @@ async fn main(spawner: Spawner) { log::error!("NFC SAM configuration failed"); } - - log::info!("Setup complete, entering main loop"); loop { - if let Ok(card_data) = nfc_driver.read_card_data() { - log::info!("NFC Card Read: {:?}", card_data); - } - - if button1.is_low() { - log::info!("Button pressed!"); - display.clear(Rgb565::BLACK).unwrap(); - let payload = if nav_state.toggle_payload() { - &MOCK_PAYLOAD - } else { - &MOCK_PAYLOAD2 - }; - - render_nfc_payload(&mut display, payload); - } Timer::after_millis(10).await; } }