Take 1

我们实现LED指南针的最简单方法是什么?即使它不完美。

首先,我们只关心磁场的X和Y分量,因为当你看指南针时,你总是把它保持在水平位置,因此指南针在XY平面上。

例如,在以下情况下,您将打开哪个LED。EMF代表地球磁场,绿色箭头表示EMF的方向(它指向北方)。

Southeast LED,对吗?

在这种情况下,磁场的X和Y分量有什么迹象?两者都是正的。

如果我们只看X和Y分量的符号,我们就能确定磁场属于哪个象限。

在前面的示例中,磁场位于第一象限(x和y为正),打开SouthEastLED是有意义的。 同样,如果磁场在不同的象限,我们可以打开不同的LED。

让我们试试这个逻辑。以下是启动代码:

#![deny(unsafe_code)]
#![no_main]
#![no_std]

#[allow(unused_imports)]
use aux15::{entry, iprint, iprintln, prelude::*, switch_hal::OutputSwitch, Direction, I16x3};

#[entry]
fn main() -> ! {
    let (leds, mut lsm303dlhc, mut delay, _itm) = aux15::init();
    let mut leds = leds.into_array();

    loop {
        let I16x3 { x, y, .. } = lsm303dlhc.mag().unwrap();

        // Look at the signs of the X and Y components to determine in which
        // quadrant the magnetic field is
        let dir = match (x > 0, y > 0) {
            // Quadrant ???
            (true, true) => Direction::Southeast,
            // Quadrant ???
            (false, true) => panic!("TODO"),
            // Quadrant ???
            (false, false) => panic!("TODO"),
            // Quadrant ???
            (true, false) => panic!("TODO"),
        };

        leds.iter_mut().for_each(|led| led.off().unwrap());
        leds[dir as usize].on().unwrap();

        delay.delay_ms(1_000_u16);
    }
}

led模块中有一个Direction枚举,它有8个以基点命名的变体:North, East, Southwest等。 每个变体代表指南针中8个led中的一个。Leds值可以使用Direction enum进行索引;索引的结果是指向该Direction的LED。