Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑭ 温湿度センサ HTS221
Adafruitから入手した半導体温湿度センサ HTS221(STMicroelectronics)を利用します。
●AdafruitのStemma QT/Qwiicボード
Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。
コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。
●温湿度センサHTS221のおもなスペック
- 電源電圧 1.7~3.6V
- 電流 動作時;2uA、パワーダウン時;0.5uA
- 湿度 確度±3.5%RH(20~80%)、分解能0.004%RH
- 温度 確度±0.5℃(15~40 °C)、分解能0.016℃
- インターフェース I2C(0~400kHz)、SPI(最大10MHz)
- スレーブ・アドレス 0x5f(固定)
●使用環境
- Arduino UNO R4 Minima
- Arduino IDE 2.2.1
- Windows10 22H2
●接続
Arduino UNO R4 MinimaのI2C信号とセンサをJSTコネクタでつなぎます(Stemma QT/Qwiicボードの写真の比率は異なる)。
●スレーブ・アドレスを確認
従来からよく使われているi2cScanner.inoを動かしてスレーブ・アドレスを確認します。電源は3.3Vです。
0x5fを見つけてきました。
●ライブラリの用意
HTS221で検索して、見つかったAdafruit HTS221ライブラリをインストールします。
インストールを始めたとき、関連のライブラリや依存関係をインストールするかというパネルが出た場合は、全てをインストールを選びます。
●サンプル・スケッチ
メニューのファイル->スケッチ例から、Adafruit HTS221のadafruit_hts221_test.inoを選択し、
コンパイル、実行します。
●4桁の7セグメントLED表示器をつないで測定結果を表示する
連載の第4回目の記事を参照しながら表示器を接続します。
Arduino UNO R4 Minimaでセンサ・インターフェーシング ④ 温湿度センサSi7021の測定結果を7セグメントLEDに表示
スケッチです。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include "Adafruit_LEDBackpack.h"
#include <Adafruit_HTS221.h>
#include <Adafruit_Sensor.h>
Adafruit_7segment matrix = Adafruit_7segment();
Adafruit_HTS221 hts;
void setup(void) {
Serial.begin(115200);
while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens
Serial.println("HTS221 + 7segment LED");
if (!hts.begin_I2C()) { // Try to initialize!
Serial.println("Failed to find HTS221 chip");
while (1) { delay(10); }
}
Serial.println("HTS221 Found!");
// hts.setDataRate(HTS221_RATE_1_HZ);
Serial.print("Data rate set to: ");
switch (hts.getDataRate()) {
case HTS221_RATE_ONE_SHOT: Serial.println("One Shot"); break;
case HTS221_RATE_1_HZ: Serial.println("1 Hz"); break;
case HTS221_RATE_7_HZ: Serial.println("7 Hz"); break;
case HTS221_RATE_12_5_HZ: Serial.println("12.5 Hz"); break;
}
matrix.begin(0x71);
matrix.setBrightness(0x05); // default 0x0E
}
void loop() {
sensors_event_t temp;
sensors_event_t humidity;
hts.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
float tempC = temp.temperature;
float humi = humidity.relative_humidity;
Serial.print("Temperature: "); Serial.print(tempC); Serial.println(" degrees C");
Serial.print("Humidity: "); Serial.print(humi); Serial.println("% rH");
matrix.print(tempC, DEC);
matrix.writeDisplay();
delay(2000);
matrix.print(humi, DEC);
matrix.writeDisplay();
delay(5000);
}
実行例です。
●グラフィック・ディスプレイに測定結果を表示
次の記事を参考に、グラフィック・ディスプレイに測定した温度と湿度を表示します。
Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑤ 温湿度センサSi7021の測定結果をグラフィック・ディスプレイに表示
スケッチです。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_HTS221.h>
#include <Adafruit_Sensor.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_HTS221 hts;
void setup(void) {
Serial.begin(115200);
while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens
Serial.println("HTS221 + SSD1306");
if (!hts.begin_I2C()) { // Try to initialize!
Serial.println("Failed to find HTS221 chip");
while (1) { delay(10); }
}
Serial.println("HTS221 Found!");
// hts.setDataRate(HTS221_RATE_1_HZ);
Serial.print("Data rate set to: ");
switch (hts.getDataRate()) {
case HTS221_RATE_ONE_SHOT: Serial.println("One Shot"); break;
case HTS221_RATE_1_HZ: Serial.println("1 Hz"); break;
case HTS221_RATE_7_HZ: Serial.println("7 Hz"); break;
case HTS221_RATE_12_5_HZ: Serial.println("12.5 Hz"); break;
}
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.clearDisplay();
display.drawRect(0, 0, display.width(), display.height(), SSD1306_WHITE);
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(4,3);
display.println("Temperature:");
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(4,34);
display.println("Humidity:");
display.display();
delay(200);
}
void loop() {
sensors_event_t temp;
sensors_event_t humidity;
hts.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
float tempC = temp.temperature;
float humi = humidity.relative_humidity;
Serial.print("Temperature: "); Serial.print(tempC); Serial.println(" degrees C");
Serial.print("Humidity: "); Serial.print(humi); Serial.println("% rH");
dispMeasurement(tempC, humi);
delay(5000);
}
void dispMeasurement(float temp, float humi) {
display.setTextSize(2); // Draw 2X-scale text
display.setCursor(10,17);
display.fillRect(10, 17, 70, 16, SSD1306_BLACK);
display.println(temp);
display.setCursor(10, 46);
display.fillRect(10, 46, 70, 16, SSD1306_BLACK);
display.println(humi);
display.display();
}
実行例です。