4 个版本
0.1.3 | 2020年2月5日 |
---|---|
0.1.2 | 2020年1月6日 |
0.1.1 | 2020年1月5日 |
0.1.0 | 2020年1月5日 |
#1517 在 硬件支持
每月 28 次下载
21KB
217 行
Raspberry Pi的CCS811库
由于我在学习Rust并想将其用于嵌入式编程,因此创建了此库。它受到了Marten Penning用C编写的CCS811库的启发。如果您发现我的Rust代码有问题,或者有任何改进建议或功能请求,请在此仓库中创建问题,并帮助我改进 :)
此库依赖于rppal crate进行与芯片的I2C通信。将来可能可以将此抽象化,使此库也能在其他平台上工作。
接线
CCS811 | Raspberry Pi | |
---|---|---|
VCC | 引脚1 (3.3V) | |
GND | 引脚6 (GND) | |
SCL | 引脚5 (SCL & GPIO 3) | |
SDA | 引脚3 (SDA & GPIO 2) | |
WAK | 引脚11 (GPIO 17) | 可选/可以更改 |
如何使用
use rppal::i2c::I2c;
use rppal::gpio::Gpio;
use std::thread::sleep;
use std::time::Duration;
use ccs811;
fn main() {
let i2c = I2c::with_bus(1).expect("Couldn't start i2c. Is the interface enabled?");
let wake_pin = Gpio::new().expect("Can not init gpio")
.get(17).expect("Could not attach to wake pin");
wake_pin.into_output().set_low();
let mut ccs811 = ccs811::new(i2c, None);
match ccs811.begin() {
Ok(()) => match ccs811.start(ccs811::MODE::Sec1) {
Ok(()) => (),
Err(error) => panic!("Could not start: {}", error)
},
Err(error) => panic!("Could not init the chip: {}", error)
}
println!("Chip Bootloader Version: {:x?}", ccs811.bootloader_version().unwrap());
println!("Chip Hardware Version: {:x?}", ccs811.hardware_version().unwrap());
println!("Chip Application Version: {:x?}", ccs811.application_version().unwrap());
sleep(Duration::from_secs(5));
let mut i = 0;
loop {
match ccs811.read() {
Ok(data) => {
println!("{}mins => t_voc: {}, e_co2: {}, raw: {:x?}", i, data.t_voc, data.e_co2, data.raw);
},
Err(error) => println!("Could not read data: {}", error)
};
i += 1;
sleep(Duration::from_secs(60))
}
}
如何烧录新固件
大多数芯片都有版本1.0.0或1.1.0。目前在我创建此readme的地方,有2.0.0和2.1.0版本。这些版本使芯片的结果对我来说更加可靠和稳定。在我之前,有一些无原因上升的值,在烧录新固件后停止了。
您可以从 ams.com 获取当前固件。只需下载zip文件,对于未使用的芯片,请选择2.0.0的二进制版本,对于已使用的芯片,请选择2.1.0的二进制版本(固件readme中所述)。
以下是一个示例代码,通过创建Rust可执行文件,将芯片连接到Raspberry Pi并执行它来烧录新固件。以下代码假定文件 CCS811_FW_App_v2-0-1.bin
在执行时与可执行文件位于同一目录中。
use rppal::i2c::I2c;
use rppal::gpio::Gpio;
use std::fs::File;
use std::io::Read;
use ccs811;
fn main() {
let i2c = I2c::with_bus(1).expect("Couldn't start i2c. Is the interface enabled?");
let wake_pin = Gpio::new().expect("Can not init gpio")
.get(17).expect("Could not attach to wake pin");
wake_pin.into_output().set_low();
let mut ccs811 = ccs811::new(i2c, None);
let mut file = File::open("./CCS811_FW_App_v2-0-1.bin")
.expect("No firmware found");
let mut data = vec![];
let read = file.read_to_end(&mut data)
.expect("Could not load firmware");
println!("Firmware has size of {} bytes", read);
ccs811.flash(data)
.expect("Failed to flash firmware");
println!("Flashed :)");
}
依赖项
~380KB