rust开发esp32c3驱动oled屏幕

尽意
2025-04-27 / 0 评论 / 2 阅读 / 正在检测是否收录...
使用的是 I2C SSD1306 0.96寸的OLED屏幕

1.在Cargo.toml中添加图形库依赖

# 处理ssd1306屏幕
ssd1306 = {version = "0.10.0",features = ["graphics"]}
embedded-graphics = "0.8.1"

完整配置 Cargo.toml

[package]
name = "esp32c3-oled-demo"
version = "0.1.0"
authors = ["suxii <m@suxii.cn>"]
edition = "2021"
resolver = "2"
rust-version = "1.77"

[[bin]]
name = "esp32c3-oled-demo"
harness = false # do not use the built in cargo test harness -> resolve rust-analyzer errors

[features]
default = []
experimental = ["esp-idf-svc/experimental"]

[dependencies]
log = "0.4"
esp-idf-svc = { version = "0.51", features = ["critical-section", "embassy-time-driver", "embassy-sync","experimental","std"] }
futures = "0.3.31"
anyhow = "1.0.98"

esp-idf-hal = "0.45.2"

# 处理ssd1306屏幕
ssd1306 = {version = "0.10.0",features = ["graphics"]}
embedded-graphics = "0.8.1"

[build-dependencies]
embuild = "0.33"

2.在main.rs中编写rust代码

use esp_idf_hal::{
    delay::FreeRtos,
    i2c::*,
    peripherals::Peripherals,
    prelude::*,
};

use embedded_graphics::{
    mono_font::{ascii::FONT_6X10, MonoTextStyle},
    pixelcolor::BinaryColor,
    prelude::*,
    primitives::{Circle, Line, PrimitiveStyle, Rectangle},
    text::Text
};

use ssd1306::{I2CDisplayInterface, Ssd1306, prelude::*, size::DisplaySize128x64};


fn main() -> anyhow::Result<()> {
    esp_idf_hal::sys::link_patches();
    
    // 初始化外设
    let peripherals = Peripherals::take()?;
    
    // 配置I2C
    let i2c = peripherals.i2c0;
    let sda = peripherals.pins.gpio5;
    let scl = peripherals.pins.gpio6;
    let config = I2cConfig::new().baudrate(400.kHz().into());
    let i2c = I2cDriver::new(i2c, sda, scl, &config)?;

    // 创建SSD1306接口
    let interface = I2CDisplayInterface::new(i2c);
    let mut display = Ssd1306::new(
        interface,
        DisplaySize128x64,
        DisplayRotation::Rotate0
    ).into_buffered_graphics_mode();

    // 初始化显示屏
    display.init().expect("SSD1306 init failed");
    display.flush().expect("Failed to flush display");

    // 创建图形样式
    let text_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::On);
    let line_style = PrimitiveStyle::with_stroke(BinaryColor::On, 1);

    let mut run_x = 64;
    loop {
        // 清空屏幕
        display.clear(BinaryColor::Off).unwrap();

        // 绘制边框
        Rectangle::new(Point::new(0, 0), Size::new(128, 64))
            .into_styled(line_style)
            .draw(&mut display).unwrap();

        // 绘制文本
        Text::new("Hello Rust!", Point::new(10, 15), text_style)
            .draw(&mut display).unwrap();

        // 绘制直线
        Line::new(Point::new(10, 25), Point::new(118, 25))
            .into_styled(line_style)
            .draw(&mut display).unwrap();

        // 绘制圆形
        if run_x > 128 {
            run_x = 0
        }
        run_x+=10;
        Circle::new(Point::new(run_x, 40), 20)
            .into_styled(line_style)
            .draw(&mut display).unwrap();

        // 更新显示
        display.flush().expect("Failed to flush display");
        
        // 间隔2秒
        FreeRtos::delay_ms(2000);
    }
}

3.接线 SSD1306

SDA -> io05
SCL -> io06
VCC -> 5v
GND -> GND

4.效果展示

m9zrm8e5.png

0

评论 (0)

取消