QMP6988
が同じ I2C アドレス (0x70) を持っています。この問題を解決するためには、Unit Pahub v2.1 の DIP スイッチを他のアドレスに切り替える必要があります。他のバージョンの Unit Pahub は、A0-A2 の抵抗をハンダ付けしてアドレス切り替えが可能です。この方法は、他のセンサーライブラリで Wire を簡単にラップして使用することができます。Unit Pahub の拡張インターフェースのスイッチ操作のみを行い、チャンネルを切り替えた後、対応するセンサーの読み書きを手動で行います。
#include <M5Unified.h>
#include <M5UnitUnified.h>
#include <M5UnitUnifiedHUB.h>
#include "Wire.h"
namespace {
m5::unit::UnitUnified Units;
m5::unit::UnitPaHub2 hub0{0x77}; // デフォルトは 0x70 ですが、0x77 に変更します
} // namespace
void setup()
{
M5.begin();
M5.Display.setFont(&fonts::FreeMonoBold12pt7b);
auto pin_num_sda = M5.getPin(m5::pin_name_t::port_a_sda);
auto pin_num_scl = M5.getPin(m5::pin_name_t::port_a_scl);
M5_LOGI("getPin: SDA:%u SCL:%u", pin_num_sda, pin_num_scl);
Wire.begin(pin_num_sda, pin_num_scl, 400000U);
if (!Units.add(hub0, Wire) || // hub0 をコアに接続
!Units.begin()) {
M5_LOGE("初期化に失敗しました");
M5.Display.clear(TFT_RED);
while (true) {
m5::utility::delay(10000);
}
}
}
void scan_ch(uint8_t ch)
{
M5.Display.clear();
int textColor = YELLOW;
for (size_t i = 0; i < 2; i++) {
M5.Display.setCursor(0, 0);
M5.Display.print("アドレスをスキャン中 [HEX]\r\n");
M5.Display.printf("Pahub チャンネル: %d\r\n", ch);
for (uint8_t addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
uint8_t error = Wire.endTransmission();
if (error == 0) {
M5.Display.print(addr, HEX);
M5.Display.print(" ");
} else {
M5.Display.print(".");
}
delay(10);
}
if (textColor == YELLOW) {
textColor = CYAN;
} else {
textColor = YELLOW;
}
M5.Display.setTextColor(textColor, BLACK);
}
}
void loop()
{
M5.update();
for (uint8_t i = 0; i < 6; i++) {
// 各チャンネルを選択してスキャン
hub0.selectChannel(i);
scan_ch(i);
}
}
もし、UnitUnified ドライバに対応したセンサーライブラリを使用している場合は、add
メソッドを使ってセンサーインスタンスを直接ハブに登録し、Units.update();
を使用すると、各チャンネルのセンサーデータが自動的に取得されます。
#include <M5Unified.h>
#include <M5UnitUnified.h>
#include <M5UnitUnifiedHUB.h>
#include <M5UnitUnifiedENV.h>
namespace {
m5::unit::UnitUnified Units;
m5::unit::UnitPaHub2 hub0{0x77}; // デフォルトは 0x70 ですが、0x77 に変更します
m5::unit::UnitENV3 unitENV3_0;
m5::unit::UnitENV3 unitENV3_1;
auto& sht30_0 = unitENV3_0.sht30;
auto& qmp6988_0 = unitENV3_0.qmp6988;
auto& sht30_1 = unitENV3_1.sht30;
auto& qmp6988_1 = unitENV3_1.qmp6988;
} // namespace
void setup()
{
M5.begin();
M5.Display.setFont(&fonts::FreeMonoBold12pt7b);
auto pin_num_sda = M5.getPin(m5::pin_name_t::port_a_sda);
auto pin_num_scl = M5.getPin(m5::pin_name_t::port_a_scl);
M5_LOGI("getPin: SDA:%u SCL:%u", pin_num_sda, pin_num_scl);
Wire.begin(pin_num_sda, pin_num_scl, 400000U);
if (!hub0.add(unitENV3_0, 0) || // unitENV3_0 を hub0 チャンネル 0 に接続
!hub0.add(unitENV3_1, 1) || // unitENV3_1 を hub0 チャンネル 1 に接続
!Units.add(hub0, Wire) || // hub0 をコアに接続
!Units.begin()) {
M5_LOGE("初期化に失敗しました");
M5.Display.clear(TFT_RED);
while (true) {
m5::utility::delay(10000);
}
}
}
void loop()
{
M5.update();
Units.update();
if (sht30_0.updated()) {
M5.Display.setCursor(0, 0);
M5.Display.fillRect(0, 0, 320, 60, BLACK);
M5.Display.printf(">CH0 SHT30Temp:%2.2f\n>Humidity:%2.2f", sht30_0.temperature(), sht30_0.humidity());
M5_LOGI("\n>CH0 SHT30Temp:%2.2f\n>Humidity:%2.2f", sht30_0.temperature(), sht30_0.humidity());
}
if (qmp6988_0.updated()) {
M5.Display.setCursor(0, 60);
M5.Display.fillRect(0, 60, 320, 60, BLACK);
M5.Display.printf(">CH0 QMP6988Temp:%2.2f\n>Pressure:%.2f", qmp6988_0.temperature(), qmp6988_0.pressure());
M5_LOGI("\n>CH0 QMP6988Temp:%2.2f\n>Pressure:%.2f", qmp6988_0.temperature(), qmp6988_0.pressure());
}
if (sht30_1.updated()) {
M5.Display.setCursor(0, 120);
M5.Display.fillRect(0, 120, 320, 60, BLACK);
M5.Display.printf(">CH1 SHT30Temp:%2.2f\n>Humidity:%2.2f", sht30_1.temperature(), sht30_1.humidity());
M5_LOGI("\n>CH1 SHT30Temp:%2.2f\n>Humidity:%2.2f", sht30_1.temperature(), sht30_1.humidity());
}
if (qmp6988_1.updated()) {
M5.Display.setCursor(0, 180);
M5.Display.fillRect(0, 180, 320, 60, BLACK);
M5.Display.printf(">CH1 QMP6988Temp:%2.2f\n>Pressure:%.2f", qmp6988_1.temperature(), qmp6988_1.pressure());
M5_LOGI("\n>CH1 QMP6988Temp:%2.2f\n>Pressure:%.2f", qmp6988_1.temperature(), qmp6988_1.pressure());
}
}
CoreS3 の場合、リセットボタンを 2 秒ほど長押しして、内部の緑色の LED が点灯したらボタンを離します。これでデバイスはダウンロードモードに入り、プログラム書き込みの準備が整います。
時分割接続方式を使用して、複数の Unit ENV-III の温湿度データを読み取り、表示します。