# SSD1306 I2C   [![crates.io](https://img.shields.io/crates/v/ssd1306-i2c)](https://crates.io/crates/ssd1306-i2c) [![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg)](https://github.com/marvinrobot42/ssd1306-i2c) [![Documentation](https://docs.rs/ssd1306-i2c/badge.svg)](https://docs.rs/ssd1306-i2c) ## A Rust crate for SSD1306 LCD display over I2C ## [Documentation](https://docs.rs/ssd1306-i2c/latest/ssd1306_i2c/) [ssd1306]: https://www.digikey.com/htmldatasheets/production/2047793/0/0/1/ssd1306.html#pf13 This crate is a fork of James Waples's SH1106 crate modifed for SSD1306 use updated to use embedded-hal 1.0. The SSD1306 OLED contains old fashion 8 bit parallel interface, a SPI and I2C interface. This crate only uses the I2C interface. Also, note that this driver includes support for several display sizes but only 128 x 64 is avialble for the SSD1306 (as far as I know). ### Features - updated to use embedded-hal version 1.0.x - supports embedded-hal-bus 0.1.0 for I2C bus sharing - uses embedded-graphics crate for graphics abstraction - designed for embedded use (ESP32-C3, -C6 and -S3, etc.) - supports both primary and secondary SSD1306 I2C addresses (default is primary = 0x3c) - no_std embedded compatible #### Notes I wanted to add a LCD/OLED display to my home automation environmental sensor IoT creation but I could not find a crate for the SSD1306 that depends on embedded-hal 1.0. It needs to have several devices on one I2C bus and since my sensors are embedded-hal 1.0 based the SSD1306 crate needs to be also. So I did a quick job of migrating James's SH1106 crate from embedded-hal 0.2.x to 1.0, and modified it for the SSD1306 LOED. Why start with SH1106 instead of his SSD1306 create: because the SH1106 seemed more modern and does not depend on other embedded-hal 0.2 crates like display-interface-i2c (which is four years old now). Note that this ssd1306-i2c crate does not support SH1106 display because the display initialization is not compatible. My Sparkfun SSD1306 OLED (LCD-23453) only supports I2C so I could not work with or test SPI. ### Recent version history - 0.1.5 another typo fix in README.md (thanks to Mr. Stelter) - 0.1.4 More documentation - 0.1.1 Some document typo fixes - 0.1.0 Initial release ## Usage ---- Add the dependencies to `Cargo.toml`. ~~~~toml [dependencies] ssd1306-i2c version = "0.1" embedded-graphics = "0.8.1" esp-idf-hal = "0.43.0" # an embedded-hal for your platform ~~~~ ### Simple Example A more complete example is in the repository examples path. See James's SSH1106 crate repository examples folder for more examples: https://github.com/jamwaffles/sh1106/tree/master/examples. ```rust use ssd1306_i2c::{prelude::*, Builder}; use embedded_graphics::{ mono_font::{ascii::FONT_6X10, ascii::FONT_6X13_BOLD, MonoTextStyleBuilder}, image::{Image, ImageRawLE}, pixelcolor::BinaryColor, prelude::*, text::{Baseline, Text}, }; use log::info; ... fn main() -> Result<()> { // Bind the log crate to the ESP Logging facilities esp_idf_svc::log::EspLogger::initialize_default(); ... let peripherals = Peripherals::take().unwrap(); let pins = peripherals.pins; let sda = pins.gpio0; let scl = pins.gpio1; let i2c = peripherals.i2c0; let config = I2cConfig::new().baudrate(400.kHz().into()); let i2c_dev = I2cDriver::new(i2c, sda, scl, &config)?; let mut display: GraphicsMode<_> = Builder::new() .with_size(DisplaySize::Display128x64NoOffset) .with_i2c_addr(0x3d) //or 0x3c .with_rotation(DisplayRotation::Rotate0) .connect_i2c(i2c_dev) .into(); info!("calling display.init()"); FreeRtos::delay_ms(100); display.init().unwrap(); display.flush().unwrap(); display.clear(); //********* display some text // creating MonoTextStyleBuilder let text_style = MonoTextStyleBuilder::new() .font(&FONT_6X10) .text_color(BinaryColor::On) .build(); let text_style_bold = MonoTextStyleBuilder::new() .font(&FONT_6X13_BOLD) .text_color(BinaryColor::On) .build(); info!("displaying Hello world! on LCD-OLED"); Text::with_baseline("Hello Rust World!....", Point::zero(), text_style_bold, Baseline::Top) .draw(&mut display) .unwrap(); info!("displaying Hello Rust! on LCD-OLED"); Text::with_baseline("SSD1306-I2C", Point::new(0, 19), text_style, Baseline::Top) .draw(&mut display) .unwrap(); display.flush().unwrap(); loop { info!("looping with delay so ESP32 watchdog does not restart controller"); FreeRtos::delay_ms(10000); } } ``` ### License ---- You are free to copy, modify, and distribute this application with attribution under the terms of either * Apache License, Version 2.0 ([LICENSE-Apache-2.0](./LICENSE-Apache-2.0) or ) * MIT license ([LICENSE-MIT](./LICENSE-MIT) or ) at your option. This project is not affiliated with nor endorsed in any way by Sparkfun.