Makato-kanのアイコン画像
Makato-kan 2022年09月24日作成 (2024年02月19日更新)
製作品 製作品 閲覧数 964
Makato-kan 2022年09月24日作成 (2024年02月19日更新) 製作品 製作品 閲覧数 964

SPRESENCEとDHT11で作る 窓際専用温湿度計測器 

SPRESENCEとDHT11で作る 窓際専用温湿度計測器 

初めに:

窓際の温度が室温と違うと色々不都合(結露・床焼け・冷暖房効きにくい原因等)、室温測定はすでにしているので、比較する為以下の仕様を考えました。

仕様:

測定場所とデータ保存するPCとは1M位の距離なので有線接続する
測定時刻も取得する
電源は太陽電池とリチウムポリマー電池の充電器経由で給電する
温度と湿度の測定をする
太陽電池の出力を5V最大にしたADCで取り込む

ハードウェア:

マイコンはGPS内蔵のSPRESENCEを使いました。
 温度センサーはインターフェース電圧がSPRESENCEとちょっと違うけど
 I2Cセンサーより単純そうなDHT11を使いました。
 太陽電池の出力がADCの最大超えないようなイメージで40kΩと10kΩで分圧しました。

部品表:

SPRESENSEメイン基板 1枚
 DHT11 温湿度センサー 1個
 84.5x65mm 太陽電池パネル 1枚
 ソーラリチウムポリマー電池充電基板 1枚
 抵抗 太陽電池プラス側40kΩ
    太陽電池マイナス側10kΩ
    DHT11は本来プルアップ抵抗入れますが、SPRESENCEのIOが1.8Vなので
    あえてプルアップせず10kΩの抵抗を直列に入れています。

回路図:

DHT11はSPRESENSEからに3.3V、データ線に10kΩ抵抗を直列にいれています。
 ※10kΩは入れても入れなくても動作しました。
キャプションを入力できます

ブルーの線はUART-USB変換やラズベリーパイなどのUART-RXDに接続します
 ブラックの線はUART-USB変換やラズベリーパイなどのGNDに接続します

製作品

キャプションを入力できます

測定データ仕様

測定時刻とDHT11の温湿度、ソーラパネル出力を分圧してSPRESENSEのADCに入れた値の3つをCSV出力し、測定場所から2mの2芯シールド線でホストコンピュータに3分に一回シリアル転送します。

プログラム:

/* * DHT11とリチウムポリマー電池用ソーラ充電器の太陽電池電圧を測定し * シリアル接続でパソコンに送信する。 * 測定時刻は内蔵gnssが取得した時間を使う * DHT11のライブラリはadafroutsのDHT11を使用した * 参考文献 SPRESENCEのサンプルプログラムとネット情報いろいろ */ #include <DHT.h> #define DHTPIN 22 // Digital pin connected to the DHT sensor #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); #include <RTC.h> #include <GNSS.h> SpGnss Gnss; 50 #define MY_TIMEZONE_IN_SECONDS (9 * 60 * 60) // JST void printClock(RtcTime &rtc) { float h = dht.readHumidity(); // Read temperature as Celsius (false) float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } int sensor1 = analogRead(A2); String data = ""+String(rtc.year())+","+String(rtc.month()) +","+String(rtc.day())+","+String(rtc.hour())+":"+String(rtc.minute()) +","+String(t)+","+String(h)+","+String(sensor1); Serial.println(data); Serial2.println(data); } void updateClock() { static RtcTime old; RtcTime now = RTC.getTime(); // Display only when the second is updated if (now != old) { printClock(now); old = now; } } void setup() { Serial.begin(1200); sleep(5); Serial2.begin(1200); sleep(5); while (!Serial); Serial.println("Example for GPS clock"); //Initialize DHT11 dht.begin(); // Initialize RTC at first RTC.begin(); int ret; ret = Gnss.begin(); assert(ret == 0); ret = Gnss.start(); assert(ret == 0); // LowPower.clockMode(CLOCK_MODE_32MHz); // delay(200); } void loop() { // Wait for GNSS data if (Gnss.waitUpdate()) { SpNavData NavData; // Get the UTC time Gnss.getNavData(&NavData); SpGnssTime *time = &NavData.time; // Check if the acquired UTC time is accurate if (time->year >= 2000) { RtcTime now = RTC.getTime(); // Convert SpGnssTime to RtcTime RtcTime gps(time->year, time->month, time->day, time->hour, time->minute, time->sec, time->usec * 1000); #ifdef MY_TIMEZONE_IN_SECONDS // Set the time difference gps += MY_TIMEZONE_IN_SECONDS; #endif int diff = now - gps; if (abs(diff) >= 1) { RTC.setTime(gps); } } } updateClock(); delay(50000); //測定間隔設定 }

測定データ出力:

キャプションを入力できます
Arduino-IDEのシリアルコンソール画面です。使うときはパソコン側でシェルスクリプトつかい
データ取り込みます。

シェルスクリプト例

ラズベリーパイでデータ受信してMQTTパブリッシャーを使いデータ送信する場合の例です

#!/bin/bash TTY="/dev/ttyACM0" # -lは標準入力を読みます -mはメッセージを送ります -fはファイルを指定します MOSQUITTO_COMMAND="/usr/bin/mosquitto_pub -h hostname.local -u user-name -P passwd -t sensor/dht11-110 -l" while true; do read -r line < "$TTY" # echo "Received: $line" 動作確認用 echo "$line" |eval $MOSQUITTO_COMMAND done

ご注意:

GPS電波受信困難な場所では時刻取得失敗します。
 設置場所は窓際で天空が見える場所にする必要あります。
 LowPower.hを入れるとdelay()の動作が変わってしまうようで、毎回setup()から動作してしまい
 電波受信良くない場所でつかうと一向に時刻取得しないのでLowPower.hは使いませんでした。

Makato-kanのアイコン画像
屋外で温度湿度を測定し記録するので、壊れやすいと思い大量にDHT11とESP-WROOM-02を購入したのですが思いのほか壊れなかったので、何にでもDHT11をくっつけています。
ログインしてコメントを投稿する