Module max31865::examples::_01_stm32_ssd1306[][src]

An example of reading the temperature and writing it to a screen.

Devices

Connections

SSD 1306

MAX31865

 
#![no_std]
 
extern crate cortex_m;
extern crate embedded_graphics;
extern crate embedded_hal;
extern crate ssd1306;
extern crate panic_abort;
extern crate max31865;
extern crate stm32f103xx_hal as hal;
 
use hal::i2c::{DutyCycle, I2c, Mode};
use hal::spi::Spi;
use hal::prelude::*;
use ssd1306::{Builder, mode::TerminalMode};
use ssd1306::prelude::*;
use core::fmt::Write;
use max31865::{Max31865, SensorType, FilterMode};
 
fn main() {
    let dp = hal::stm32f103xx::Peripherals::take().unwrap();
    let mut flash = dp.FLASH.constrain();
    let mut rcc = dp.RCC.constrain();
    let clocks = rcc.cfgr.freeze(&mut flash.acr);
    let mut afio = dp.AFIO.constrain(&mut rcc.apb2);
    let gpioa = dp.GPIOA.split(&mut rcc.apb2);
    let mut gpiob = dp.GPIOB.split(&mut rcc.apb2);
 
    // I2C pins
    let scl = gpiob.pb8.into_alternate_open_drain(&mut gpiob.crh);
    let sda = gpiob.pb9.into_alternate_open_drain(&mut gpiob.crh);
 
    let i2c = I2c::i2c1(
        dp.I2C1,
        (scl, sda),
        &mut afio.mapr,
        Mode::Fast {
            frequency: 400_000,
            duty_cycle: DutyCycle::Ratio1to1,
        },
        clocks,
        &mut rcc.apb1,
    );
 
 
    let mut disp: TerminalMode<_> = Builder::new().with_size(DisplaySize::Display128x32).connect_i2c(i2c).into();
    disp.init().unwrap();
    disp.clear().unwrap();
 
    disp.write_str("init temp sensor").unwrap();
 
    let nss = gpiob.pb12.into_push_pull_output(&mut gpiob.crh);
    let sck = gpiob.pb13.into_alternate_push_pull(&mut gpiob.crh);
    let miso = gpiob.pb14;
    let mosi = gpiob.pb15.into_alternate_push_pull(&mut gpiob.crh);
    let rdy = gpioa.pa8;
 
    let spi1 = Spi::spi2(
        dp.SPI2,
        (sck, miso, mosi),
        max31865::MODE,
        100_000.hz(),
        clocks,
        &mut rcc.apb1,
    );
 
    let mut max31865 = Max31865::new(spi1, nss, rdy).unwrap();
    max31865.set_calibration(43234).unwrap();
    max31865.configure(true, true, false, SensorType::ThreeWire, FilterMode::Filter50Hz).unwrap();
 
    let mut last = 0;
 
    loop {
        if max31865.is_ready().unwrap() {
            let temp = max31865.read_default_conversion().unwrap();
 
            if temp != last {
                last = temp;
 
                let n = temp / 100;
                let dec = temp % 100;
 
                disp.clear().unwrap();
                write!(disp, "Temp: {}.{}n", n, dec).unwrap();
                disp.flush().unwrap();
            }
        }
 
    }
}