Raspberry Pi 4をRustのasync/awaitの非同期プログラミングで操作するテストコードです。async_stdとrppalを用いています。

シグナルを受け取ると、Graceful shutdownします。
Dieselを利用して、PostgreSQLに保存します。環境変数DATABASE_URLに適切な値を設定すると保存できます。
Deiselはasync/awaitで使うのが難しかったので、DB系は別スレッドで動作します。
$export DATABASE_URL=postgres://user:pass@localhost/rpi_async$ diesel setup$ ./target/release/rpi_async
DBに保存したデータは以下のようにGrafana等で可視化できます。

CCS811以外の使い方は、以下の書籍に載っています。実装はPythonですが、とても良い本です。
Raspberry Piで学ぶ電子工作
ピン配置
3V3 (1) (2) 5V GPIO2 (3) (4) 5V GPIO3 (5) (6) GND GPIO4 (7) (8) GPIO14 GND (9) (10) GPIO15GPIO17 (11) (12) GPIO18GPIO27 (13) (14) GNDGPIO22 (15) (16) GPIO23 3V3 (17) (18) GPIO24GPIO10 (19) (20) GND GPIO9 (21) (22) GPIO25GPIO11 (23) (24) GPIO8 GND (25) (26) GPIO7 GPIO0 (27) (28) GPIO1 GPIO5 (29) (30) GND GPIO6 (31) (32) GPIO12GPIO13 (33) (34) GNDGPIO19 (35) (36) GPIO16GPIO26 (37) (38) GPIO20 GND (39) (40) GPIO21
- GPIO11 (23)はSPI SCLK
- GPIO09 (21)はSPI MISO
- GPIO10 (10)はSPI MOSI
- GPIO08 (24)はSPI CEO
- GPIO02 (3)はI2C SDA
- GPIO03 (5)はI2C SCL
CH0 Vdd -> 3V3CH1 Vref -> 3V3CH2 AGND -> GNDCH3 CLK -> GPIO11 (23), SPI SCLKCH4 Dout -> GPIO01 (21), SPI MISOCH5 Din -> GPIO10 (19), SPI MOSICH6 CS/SHDN -> GPIO08 (24), SPI CEOCH7 DGND -> GND
フォトレジスタの接続例は以下。
3V3 - CdS Cell - 10 KΩ抵抗 - GND | CH0
Vdd -> 3V3SCL -> GPIO03 (5), I2C SCLSDA -> GPIO02 (3), I2C SDAGND -> GND
Vdd -> 3V3SCL -> GPIO03 (5), I2C SCLSDA -> GPIO02 (3), I2C SDAGND -> GNDWAK -> (40) GPIO21RST -> 3V3ADD -> GND
GPIO21は他のGPIOピンでも問題なし。
ADDはGNDか3V3かによって、I2Cのアドレスが以下のように変化する。
GPIOの入力と出力のテスト。入力のタクトスイッチを押すと、LEDが点灯。
GPIO06 (31) - LED - 330 Ω抵抗 - GND
3V3 - タクトスイッチ - GPIO05 (29)