Code
The main changes in the code are the image data and width. This will display the resistor symbol in the IEC-60617 style.
Generate project using esp-generate
We will enable async (Embassy) support for this project. To create the project, use the esp-generate
command. Run the following:
esp-generate --chip esp32 oled-rawimg
This will open a screen asking you to select options.
- Select the option "Adds embassy framework support".
Just save it by pressing "s" in the keyboard.
Update Cargo.toml
ssd1306 = { git = "https://github.com/rust-embedded-community/ssd1306.git", rev = "f3a2f7aca421fbf3ddda45ecef0dfd1f0f12330e", features = [
"async",
] }
embedded-graphics = "0.8.1"
#![allow(unused)] fn main() { // 31x7 pixel #[rustfmt::skip] const IMG_DATA: &[u8] = &[ // 1st row 0b00000001,0b11111111,0b11111111,0b00000000, // 2nd row 0b00000001,0b11111111,0b11111111,0b00000000, //3rd row 0b00000001,0b10000000,0b00000011,0b00000000, //4th row 0b11111111,0b10000000,0b00000011,0b11111110, //5th row 0b00000001,0b10000000,0b00000011,0b00000000, //6th row 0b00000001,0b11111111,0b11111111,0b00000000, //7th row 0b00000001,0b11111111,0b11111111,0b00000000, ]; }
We need to set the width to 31. We'll draw the image at the point (x=35, y=35), though there's no particular reason for choosing these coordinates. I just wanted to show something other than the point zero. Feel free to experiment with different values for the point and explore other options.
#![allow(unused)] fn main() { let raw_image = ImageRaw::<BinaryColor>::new(IMG_DATA, 31); let image = Image::new(&raw_image, Point::new(35, 35)); }
Clone the existing project
You can also clone (or refer) project I created and navigate to the oled-rawimg
folder.
git clone https://github.com/ImplFerris/esp32-projects
cd esp32-projects/oled-rawimg
The full code
#![no_std] #![no_main] use embassy_executor::Spawner; use embassy_time::{Duration, Timer}; use embedded_graphics::{ image::{Image, ImageRaw}, pixelcolor::BinaryColor, prelude::Point, }; use esp_backtrace as _; use esp_hal::prelude::*; use log::info; use ssd1306::{ mode::DisplayConfigAsync, prelude::DisplayRotation, size::DisplaySize128x64, I2CDisplayInterface, Ssd1306Async, }; use embedded_graphics::prelude::*; // 31x7 pixel #[rustfmt::skip] const IMG_DATA: &[u8] = &[ // 1st row 0b00000001,0b11111111,0b11111111,0b00000000, // 2nd row 0b00000001,0b11111111,0b11111111,0b00000000, //3rd row 0b00000001,0b10000000,0b00000011,0b00000000, //4th row 0b11111111,0b10000000,0b00000011,0b11111110, //5th row 0b00000001,0b10000000,0b00000011,0b00000000, //6th row 0b00000001,0b11111111,0b11111111,0b00000000, //7th row 0b00000001,0b11111111,0b11111111,0b00000000, ]; #[main] async fn main(_spawner: Spawner) { let peripherals = esp_hal::init({ let mut config = esp_hal::Config::default(); config.cpu_clock = CpuClock::max(); config }); esp_println::logger::init_logger_from_env(); let timer0 = esp_hal::timer::timg::TimerGroup::new(peripherals.TIMG1); esp_hal_embassy::init(timer0.timer0); info!("Embassy initialized!"); let i2c0 = esp_hal::i2c::master::I2c::new( peripherals.I2C0, esp_hal::i2c::master::Config { frequency: 400.kHz(), timeout: Some(100), }, ) .with_scl(peripherals.GPIO18) .with_sda(peripherals.GPIO23) .into_async(); let interface = I2CDisplayInterface::new(i2c0); // initialize the display let mut display = Ssd1306Async::new(interface, DisplaySize128x64, DisplayRotation::Rotate0) .into_buffered_graphics_mode(); display.init().await.unwrap(); let raw_image = ImageRaw::<BinaryColor>::new(IMG_DATA, 31); let image = Image::new(&raw_image, Point::new(35, 35)); image.draw(&mut display).unwrap(); display.flush().await.unwrap(); loop { Timer::after(Duration::from_secs(1)).await; } }