今から始める電子工作 Step4 ④ 温湿度センサ HTS221 グラフ

 ここでは、測定した温湿度のデータをグラフ化します。センサはI2CバスにつないだHTS221で、グラフィック・ディスプレイはSPIバスにつないだST7789です。

 

 HTS221は、AdafruitのStemma QT/Qwiicボードを利用しました。

 HTS221ボード解説のページ

温湿度センサHTS221のおもなスペック

 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 IDE;2.3.5
  • Windows11;24H2
  • Arduino UNO R4 WiFi 

接続

ライブラリの導入

 HTS221でライブラリを検索します。

 Adafuit HTS221ライブラリをインストールします。

 途中で、パネルが出る場合がありますが、全てをインストールを選びます。

スケッチ

 サンプルのスケッチ例 -> Adafuit HTS221からadafruit_hts221_testを選択します。

 Qwiicコネクタに接続しているので、1か所変更します。

 if (!hts.begin_I2C(HTS221_I2CADDR_DEFAULT, &Wire1)) {
 
 
 実行している様子です。
 

  I2Cバスの記述だけにします。
 
#include <Wire.h>
#include <Adafruit_HTS221.h>
#include <Adafruit_Sensor.h> Adafruit_HTS221 hts; void setup(void) { Serial.begin(9600); delay(2000); Serial.println("\nAdafruit HTS221 test!"); // Try to initialize! if (!hts.begin_I2C(HTS221_I2CADDR_DEFAULT, &Wire1)) { Serial.println("Failed to find HTS221 chip"); while (1) { delay(10); } } Serial.println("\nHTS221 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; } Serial.println(" "); } void loop() { sensors_event_t temp; sensors_event_t humidity; hts.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C"); Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH"); delay(3000); }

グラフィック・ディスプレイをつなぐ

<温湿度のデータを表示>

#include <Wire.h>
#include <Adafruit_HTS221.h>
#include <Adafruit_Sensor.h> Adafruit_HTS221 hts; #include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <Fonts/FreeMonoBold12pt7b.h>
#include <Fonts/FreeMono12pt7b.h> #define TFT_CS 10 // SS #define TFT_RST 9 // Or set to -1 and connect to Arduino RESET pin #define TFT_DC 8 Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); float tempC, humi; void setup(void) { Serial.begin(9600); delay(2000); Serial.println("\nAdafruit HTS221 test!"); // Try to initialize! if (!hts.begin_I2C(HTS221_I2CADDR_DEFAULT, &Wire1)) { Serial.println("Failed to find HTS221 chip"); while (1) { delay(10); } } Serial.println("\nHTS221 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; } Serial.println(" "); tft.init(240, 320); // Init ST7789 320x240 Serial.println(F("Initialized TFT")); tft.fillScreen(ST77XX_BLACK); tft.setRotation(1); tft.setFont(&FreeMono12pt7b); tft.setCursor(10, 50); tft.setTextColor(ST77XX_YELLOW); tft.setTextSize(1); tft.println("humi & temp"); tft.drawRect(2+60, 62, 320-2-60, 240-64, ST77XX_GREEN); } void loop() { read_HTS221(); Serial.print("Temperature: "); Serial.print(tempC); Serial.println(" degrees C"); Serial.print("Humidity: "); Serial.print(humi); Serial.println("% rH"); tft.fillRect(180,29,135,28,ST77XX_BLACK); tft.setCursor(180, 50); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(1); tft.print(tempC,1); tft.print("'C "); tft.print(humi,0); tft.print("%"); delay(3000); } float read_HTS221() { sensors_event_t temp; sensors_event_t humidity; hts.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data tempC = temp.temperature; humi = humidity.relative_humidity; return tempC, humi; }

<温度グラフ部分>

#include <Wire.h>
#include <Adafruit_HTS221.h>
#include <Adafruit_Sensor.h> Adafruit_HTS221 hts; #include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <Fonts/FreeMonoBold12pt7b.h>
#include <Fonts/FreeMono12pt7b.h>#define TFT_CS 10 // SS #define TFT_RST 9 // Or set to -1 and connect to Arduino RESET pin #define TFT_DC 8 Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); float tempC, humi; void setup(void) { Serial.begin(9600); delay(2000); Serial.println("\nAdafruit HTS221 test!"); // Try to initialize! if (!hts.begin_I2C(HTS221_I2CADDR_DEFAULT, &Wire1)) { Serial.println("Failed to find HTS221 chip"); while (1) { delay(10); } } Serial.println("\nHTS221 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; } Serial.println(" "); tft.init(240, 320); // Init ST7789 320x240 Serial.println(F("Initialized TFT")); tft.fillScreen(ST77XX_BLACK); tft.setRotation(1); tft.setFont(&FreeMono12pt7b); tft.setCursor(10, 50); tft.setTextColor(ST77XX_YELLOW); tft.setTextSize(1); tft.println("humi & temp"); tft.drawRect(2+60, 62, 320-2-60, 240-64, ST77XX_GREEN); tft.drawLine(60-6,240-60,2+60,240-60, ST77XX_WHITE); // 10;scale = 2 tft.drawLine(60-6,240-60-60,2+60,240-60-60, ST77XX_WHITE); // 40;scale = 2 } #define xMax 245 #define loopDelay 3000 int x=xMax; float xjiku[xMax]; int scale = 2; int yoffset=200; int Xjiku, Xjiku_org[xMax]; int Yjiku, Yjiku_org[xMax]; void loop() { read_HTS221(); Serial.print("\nx: "); Serial.println(x); Serial.print("Temperature: "); Serial.print(tempC); Serial.println(" degrees C"); Serial.print("Humidity: "); Serial.print(humi); Serial.println("% rH"); dispData(); xjiku[xMax] = tempC; // data shift for (int i = 1; i <= xMax; i++) { xjiku[i-1] = xjiku[i]; } Serial.println("\n TFTdisplay start"); tft.setCursor(60-6-44,240-60+5); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(1); tft.println(10); tft.setCursor(60-6-44,240-60-60+5); tft.println(40); for (int i=xMax-1 ;i >=0 ; i--){ if ((int)xjiku[i] != 0) { Xjiku = i + 320-7-xMax; Yjiku = -1 * xjiku[i] * scale + yoffset; tft.fillCircle(Xjiku, Yjiku, 2, ST77XX_ORANGE); Xjiku_org[i] =Xjiku; Yjiku_org[i] =Yjiku; } } if (x!=0) x--; if (x==0) x=xMax; delay(loopDelay); for (int i=xMax-1 ;i >=0 ; i--){ if ((int)xjiku[i] != 0) { tft.fillCircle(Xjiku_org[i], Yjiku_org[i], 2, ST77XX_BLACK); } } } float read_HTS221() { sensors_event_t temp; sensors_event_t humidity; hts.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data tempC = temp.temperature; humi = humidity.relative_humidity; return tempC, humi; } void dispData(){ tft.fillRect(180,29,135,28,ST77XX_BLACK); tft.setCursor(180, 50); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(1); tft.print(tempC,1); tft.print("'C "); tft.print(humi,0); tft.print("%"); }

 実行している様子です。

前へ

今から始める電子工作 Step4 ③ 温度センサ 白金測温抵抗体 MAX31865