使用したモノ
- Arduino Nano (マイコンボード互換品)1個
- AHT 30 (温湿度センサー)1個
- LCD1602A (LCDディスプレイ)1個
- LCD i2cモジュール (PCF8574AT)1個
- ジャンパー線 8本
環境
ArduinoIDE 2.3.3
使用ライブラリ
- LiquidCrystal_I2C
- Adafruit_AHTX0と依存関係のライブラリ
AHTのライブラリは10と20用みたいでしたが、30でも問題なく使用できました。
配線
Wokwiを使用して配線図を作成しました。
I2Cについて調べてみた感じ端末のアドレスに応じて通信を行っているみたいなので、こんな風に同じ場所に繋いでしまって良いそうです。
I2Cについては詳しくないですが、少し線を繋いだだけで動くのは助かります。
コード
#include <LiquidCrystal_I2C.h>
#include <Adafruit_AHTX0.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
Adafruit_AHTX0 aht;
bool is_first = true;
const float threshold = 0.05;
float previous_temp;
float previous_humidity;
void display_aht(float temp,float humidity){ //LCDに映し出す処理の関数
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp,1);
lcd.print("\xdf""C");
lcd.setCursor(0, 1);
lcd.print("Humi: ");
lcd.print(humidity,1);
lcd.print("%");
}
void setup() {
lcd.init();
lcd.backlight();
aht.begin();
}
void loop() {
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);
float temp_change = abs(temp.temperature - previous_temp);
float humidity_change = abs(humidity.relative_humidity - previous_humidity);
if (is_first == true){
display_aht(temp.temperature,humidity.relative_humidity);
is_first = false;
} else if (temp_change > threshold || humidity_change > threshold){
display_aht(temp.temperature,humidity.relative_humidity);
}
previous_temp = temp.temperature;
previous_humidity = humidity.relative_humidity;
delay(300);
}
ライブラリ依存の部分がほとんどで、筆者が記述したのは追加の関数とloop内のif文くらいです。
関数display_ahtはLCDにprintする処理をif文内で使用するので追加しました。
if文に関しては温湿度計を作るにあたって、どのようなLCDの更新方法が良いのか考えましたが、特にいい案はなく。
最初にLCDにprintする処理があって、その後は温湿度のどちらかの変化がthresholdを超えた時にLCDを更新する処理にしました。
変化の値がdelayに少し左右されているように感じますが、筆者が問題に気付くまでは放置です。
コメント