Update: Jun. 23, 2014

ワイヤレス温湿度計の製作

無線モジュールXBee (ジグビー)を使用して離れた場所の温度・湿度が計測できる温湿度計を製作しましたので紹介します。


 


仕様の概要

リモート側のユニット(写真右)には、単3アルカリ乾電池4本を内蔵し、120時間(5日間)以上連続で温湿度を計測し、ローカル側(写真左)に無線でデータを送信します。
リモート側のXBeeとPICマイコンは通常スリープ状態となっており、4秒毎にスリープから起動して計測を行い、データを送信後、再びスリープ状態となります。
従って省電力で動作しますので連続120時間の計測が行えるわけです。
データは、温度、湿度とともにリモート側の電池電圧も合わせて送信しますので、リモート側の電池が大丈夫かどうかの判断が付くようになっています。(電池電圧3.6Vまで動作します)

 表示されている電圧は、リモート側の電池電圧


XBeeには、いろいろのタイプがありますが、今回の製作ではシリーズ2のワイヤアンテナタイプを使用しました。(シリーズ2が現在、最新のモノです。シリーズ1は、古いタイプ)
通信距離は、大体30m~40mくらいです。
XBeeは、透過モード ( Transparent mode )で ボーレート9600bps のUART として使用しています。


 使用したXBee(ジグビー)無線モジュール (XB24-Z7WIT-004)


 データが受信できないときの表示



使用した温度・湿度センサーは、AOSONG社の AM2302 です。秋月で購入できます。

 温度・湿度センサー AM2302

AM2302 は、高分子容量式の湿度センサーでワンワイヤでデータを取得できますので、配線は電源、グランドおよびデータラインだけ済み、簡単です。
データは、16ビットの湿度データ + 16ビットの温度データ + 8ビットのパリティーからなりますが、本機ではパリティービットは利用していません。
高分子容量式は、低湿度から高湿度まで比較的リニアな出力が得られるので、一般的には高精度な測定値を得られるとされています。(実験で確かめてみましたので、この後で報告します。)



ケースは、XBee無線モジュールの電波を阻害しないようにプラスチック製のものを使用しました。
基板は、回路が簡単なのでユニバーサル基板上に組み、両面テープでケースに貼りつけてあります。
液晶表示器には、秋月で売っている3.3V動作のI2C仕様のものを使用しました。
XBee、マイコンとも3.3Vで動作します。これからは液晶表示器も3.3V動作のものが主流になってくるでしょう。
この液晶表示器は、I2Cでデータを送りますので、データラインは2本で済みます。

 ローカル側ユニットの内部 (ケースに当たるのでXBeeのアンテナは折り曲げています)


 リモート側ユニットの内部




回路図


ローカル側ユニットの回路




リモート側ユニットの回路



XBee の設定

XBee無線モジュールは、秋月などで購入できるXBee USBインターフェースボード などを使用してUSBでパソコンと接続したうえで XBee のサイトからダウンロードしたX-CTUを使用して以下の様にモードの設定を行ってから使用します。

設定内容
(1)  ローカル側は透過モードのコーディネータ ( Coordinator AT ) に、リモート側は透過モードのルータ( Rooter AT ) に設定。
(2) PAN ID をローカル側、リモート側とも同じ任意の数字に設定する。
(3) リモート側のみ Sleep mode を PIN Hibernate に設定する。この設定でPICのRA1ピンの信号によりXBeeが Sleep/Wake up 制御されるようになる。
(3) その他の設定はデフォルトのままにしておく。

 XBee USBインターフェースボード (AE-XBEE-USB)。 秋月で購入できる

 X-CTU を立ち上げたときの画面。 USBポートが仮想RS232CとしてPCと接続される


 初めはUnknown なので READ をクリックすると現状のXBeeの設定内容が表示される

 Versions をクリックしてXBeeを最新バージョンにしておく
                                                     (途中で何度もエラーになるかも知れませんががその都度クリックを繰り返して根気よくバージョンアップを続けて下さい)



 PIN ID を任意の値(ただしCoodinator/Rooterとも同じ数字)に設定。
                                                     Rooter のみ Sleep Modes を 1-PIN HIBERNATE に設定。
                                                     最後に Write をクリックしてXBee に設定を書込んで終了です。




プログラムの概要


私は、今までマイコンに主として PIC16F87* シリーズのものを使用し、C言語のコンパイラもCCS社のものを使っていましたが、リリースから十数年にもなり、さすがに古さを感じて来ました。
そこで、今回の開発からマイコンには、最新のPIC16F1シリーズ(エフワンシリーズ)のPIC16F1827を使用し、コンパイラもマイクロチップ社からリリースされているフリー版のXC8コンパイラを使ってみました。

PIC16F1827 は18ピンですが、内蔵モジュールのピン配置をある程度プログラムで変更できますので、省ピンパッケージながら使い勝手が非常にいいです。
OSCを内蔵し、4Kワードのメモリーを持っており、しかも秋月で\130円で購入できます。
しかもコンパイラも無償で使用できるのですから、ほんとにいい時代になりましたHi。

今回の製作ではPIC16F1827は、内蔵のOSCを使用しています。また、MCLR端子も内蔵ウィークプルアップがあるので、MCLR端子にプルアップは不要です。
プログラムはマイクロチップ社純正のPICKit3を使用して書込んでいます。


 エフワンシリーズの18ピン PIC16F1827 4キロワードのメモリーを内蔵

XC8コンパイラは、Hi-Tech Cコンパイラを引き継いでいるようですので、動作的には信頼ができます。
レジスタの内容をレジスタ名とともにそのまま記述していきますので、CCSコンパイラに比べると、めんどっチィ(面倒)と言えばめんどっチィですが、アセンブラライクな記述なので、マイコンの動作の把握が容易です。なので多分、CCSコンパイラよりもコンパイラバグが入り込む余地も少ないように思います。(CCSコンパイラは結構バグが多いです。。。)

温度・湿度センサー AM2302 はワンワイヤ式のデータ出力です。データのDUTYで 0 / 1 を区別します。
プログラムでは、キャプチャ機能を割込みで使用し、データのHigh期間の時間を計測して0 / 1 を判定していますが、データのHigh期間は、22 uSしかないのでPICの内蔵クロックを最高の32MHzで使用して処理を間に合せています。
なお、AM2302 はデータラインにウィークプルアップを内蔵しているので、データラインを長く引き回さないかぎり、外部のプルアップは不要です。

また、湿度センサーに誤差がある場合、PICの#6ピン(RB0) #7ピン(RB1) をグランドに接続することで補正できるようにしてあります。
RB0 をグランドに接続すると表示値が -3 % 、RB1 をグランドに接続すると表示値が +3% となります。(表示値の±3 % ではなく、表示値に単純に3を加減算するだけの補正です)

電源起動時、XBeeモジュール同志がお互いに認証し合うので、この間20秒間はリモート側は電源オン状態を維持します。
認証が終了するとリモート側ユニットはスリープ状態となり、省電力モードとなります。(省電力モードのとき、消費電流は約70uA。ウェークアップすると約50mA)
リモート側は、4秒毎にスリープから起動して温度・湿度・電池電圧を測定してローカル側へXBeeを経由してUART(9600bps)でデータを送信し、そのあと再びスリープします。

リモート側は、電池電圧が3.6Vになるまで使用できます。(3.6V以下になると ローカル側で BATT LOW と表示されます。)
実際に新品の単3電池を使用して電池電圧の変化を計測してみました。
大体、スタートから130時間で電池電圧3.6Vとなりました。


          リモート側電池の放電特性





XBeeはリモート側の電源を絶対に切らないという条件ならもっと省電力の設定が出来るようなのですが、本機はリモート側、ローカル側ともいつでも電源のON/OFFが可能で、その都度互いの通信認証が実行されるなるようにしていますので、省電力性能としてはXBee本来の性能よりも落ちています。




湿度の校正実験

温度計に比べると湿度計の値は本当に正しいのかどうか、チョッと疑問なところです。
実際、家の中にあるいくつかの湿度計はそれぞれ±5%くらいの表示の違いがあり、どれが正しいのかよく判りません。
そこで、JISで規定されている飽和塩法 (JIS B7920 ) で確かめてみることにしました。

この方法は、塩化ナトリウムの飽和水溶液を閉じた空間に放置すると空間の相対湿度が75%になるというものです。
製作した温湿度計で実験してみました。

純粋の塩化ナトリウムを使用する方が精度が上がりますが、手に入りやすい財団法人塩事業センターの「食卓塩」を使用しました。この塩は、塩化ナトリウム99%以上と表示されています。

 実験に使用した塩化ナトリウム「食卓塩」

この塩を約50グラム(瓶の半分)をタッパーに入れて、蒸留水で溶かします。
このとき、蒸留水はほんの少しでOKです。塩がドロドロ状態でほんの少しだけ上澄み液ができる程度に濃い~状態で溶かします。


 ドロドロ状態の食塩水

それから、食塩水と温湿度計ユニットをタッパーに入れて蓋をします。

 食塩水と温湿度計ユニットをタッパーに入れる


 タッパーに入れたら、蓋をする


 実験開始直後は、57.8%

 実験開始後、2時間 71.6%

 実験開始後、6時間 73.2%

 実験開始後、8時間 74.4%

 実験開始後、12時間 74.5%

以上の実験結果より、大体8時間程度でタッパー内の湿度は約75%に安定しました。
温度・湿度センサーAM2302の湿度の精度は結構高く、JISの飽和塩法で定められている値とほぼ同じ値を示すことが判りました。

今回の実験では、塩化ナトリウムによる75%の1点だけの校正しかしていませんが、もし高純度な塩化マグネシウムが手に入れば、同じ方法で湿度33%の校正も可能になります。

それからいろいろ実験していて判ってきたことですが、湿度というものは、どうも塊りで分布しているようで、部屋の中でほんの少し測定場所を移動させるだけで測定値が5%くらいは変わってくるようです。
なので、家の中に置いてあるいくつかの湿度計の値がそれぞれ違うのは、単に湿度計の誤差のせいだけではなさそうです。


ソフトウェアのダウンロード

PICのソフトウェアはこちらからダウンロードできます。