esp-open-rtosを使ってみる

i2c通信(BMP280)

exampleディレクトリーには、センサーやTFT/LCDを扱うための沢山のサンプルコードが含まれています。
今回は、その中からbmp280のサンプルを紹介します。
このサンプルは、i2cのBMP280から温度と気圧を取り出すサンプルです。
BMP280とi2cで通信する部分は、extras/bmp280の関数群として提供されていますが、関数だけなので、
ドライバータスクは自分で作る必要が有ります。
同じi2cの温度計でも、こちらで紹介しているBM180とは提供されている範囲が全く 違います。
アプリケーションのタスク構成はものすごくシンプルで、1つのタスクしかありません。

BMP280モジュールとの接続は、extras/bmp280/README.mdに記載されています。
const uint8_t scl_pin = 0; // GPIO0
const uint8_t sda_pin = 2; // GPIO2
こちらも、i2cのPullUpはなくても動きました。

BMP280は4ピン仕様(i2c専用)と6ピン仕様(i2c/SPI兼用)のモジュールが有りますが、
6ピン仕様のモジュールをi2cで使うときは以下の結線でi2cモジュールとして使うことができます。
サンプルでのi2cアドレスは
#define BMP280_I2C_ADDRESS_0  0x76
と定義されているので、SDOはGndに落とします。
BMP280 ESP8266
SCL GPIO0
SDA GPIO2
CSB 3.3V
SDO i2cアドレス選択
Gnd=0x76/3.3V=0x77

サンプルコードをビルドして実行すると、以下の様に表示されます。(一部、無関係な表示は消しています)
BMP180とは違ってPa単位の表示です。
1hPaは100Paなので、1011hPaとなります。
SDK version : 0.9.9
GIT version : a721fb0
BMP280: found BMP280
Pressure: 101123.47 Pa, Temperature: 19.20 C
Pressure: 101120.48 Pa, Temperature: 19.19 C
Pressure: 101123.64 Pa, Temperature: 19.18 C
Pressure: 101124.84 Pa, Temperature: 19.17 C
Pressure: 101125.62 Pa, Temperature: 19.18 C
Pressure: 101126.44 Pa, Temperature: 19.21 C
Pressure: 101126.37 Pa, Temperature: 19.22 C
Pressure: 101129.98 Pa, Temperature: 19.23 C
Pressure: 101124.64 Pa, Temperature: 19.23 C
Pressure: 101122.56 Pa, Temperature: 19.24 C
Pressure: 101127.77 Pa, Temperature: 19.25 C
Pressure: 101121.66 Pa, Temperature: 19.24 C
Pressure: 101123.40 Pa, Temperature: 19.25 C
Pressure: 101121.98 Pa, Temperature: 19.25 C

実際のi2c通信はBMP180と同様に以下の様に行っています。
static bool read_register16(i2c_dev_t *dev, uint8_t addr, uint16_t *value)
{
    uint8_t d[] = {0, 0};
    if (!i2c_slave_read(dev->bus, dev->addr, &addr, d, sizeof(d))) {
        *value = d[0] | (d[1] << 8);
        return true;
    }
    return false;
}

static inline int read_data(i2c_dev_t *dev, uint8_t addr, uint8_t *value, uint8_t len)
{
    return i2c_slave_read(dev->bus, dev->addr, &addr, value, len);
}

i2cアクセスのAPIはextras/i2cで提供されています。
extras/i2c/i2c.hに各パラメータの説明が有ります。

続く....