第1回:番外編① XOceanを使ってみた〜ArduinoとEnOceanを使用した温湿度表示
(注:XOceanは販売を終了しています。そのほかの受信モジュールでも同様の電子工作は制作可能ですので、ご自身で取り組まれる際の参考にしてください。)
みなさん、こんにちは。新米ライターの小西です。前回はXOceanのデータ把握までを試行錯誤してやってみました。なかなかしんどい作業でしたが、これでどのようなEnOcean製品のデータでも理解できるようになりました。
今回はXOceanにカラー漢字LCDシールドを接続して、温湿度モニタリングシステムを作りたいと思います。これで独立した機器として動作しちゃいますね。
ちなみにLCDシールドの購入先やここまでの工程は、前回の記事にまとめています。ぜひ併せてご覧下さい!
では早速、完成形をお披露目します。表示が付くと一気に機器としてそれらしくなります。
LCDシールドとこれまでに作ったArduino+XOceanとの接続をやっていきましょう! まずはLCDシールドについて調べました。
カラー漢字LCDシールドについて
LCDシールドについては作者の方のホームページに詳しく書かれています。
http://www.bs21-lab.com/products/p006-ColorKanjiLCD/
LCDシールドは画像の表示ができたり、2画面の重ね合わせができたりするようなので、いろいろ楽しいことができそうですが、今回はシンプルに温度と湿度の表示のみをさせます。このLCDシールドを動作させるサンプルスケッチが用意されているようなので、まずはサンプルスケッチをArduino IDEの中でライブラリ化します。ちなみにArduino IDEのバージョンは1.0.5までしか動作確認はされていないようなので、注意してください。
取得したサンプルスケッチをArduino IDEをインストールしたフォルダ内にある “library” というフォルダへコピーします。
コピーした後、Arduino IDEを起動して、”ファイル” → “スケッチの例” → “ColorKanjiLCD” を選択するとLCDシールド用のサンプルスケッチを立ち上げることができます。
スケッチがいろいろ入っているので試してみると、楽しくてついつい時間を忘れて遊んでしまいますが、目的はXOceanと接続してLCDに表示させないといけないので、一つサンプルを選びます。今回は “cklcd_mini_sketch”を選びました(一番簡単なサンプルスケッチです)。
それではいよいよソフトウェアを作成していきましょう。
LCDシールド+XOceanのソフトウェア
基本的には前回作成したソフトウェアを移植するだけで、あとは画面表示部分を追加するだけです。
/* Color Kanji LCD Shield - Minimum sketch example 本スケッチは "カラー漢字 LCD シールド" の最小スケッチ例です。 Circuit: pins A4(SDA), A5(SCL) for TWI communication in Arduino standard. pins SDA, SCL for TWI communication in Arduino UNO R3, Leonardo. created 15/july/2013 by I.Kato @ BS21 Lab This code is in the public domain. */ // TWI 通信用ライブラリ:必須です #include <Wire.h> // カラー漢字 LCD 用ライブラリ #include <ColorKanjiLCD.h> /********* EnOcean add *********/ #define TEMPID 0x040179BD // EnOceanモジュールID #define SYNC 0x55 // SYNCバイト float Temp=0 ; //温度データ float pastTemp=0 ; //前回の温度データ float Hum=0 ; //湿度データ float pastHum=0 ; //前回の湿度データ /********* EnOcean end *********/ // カラー漢字 LCD シールドの TWI アドレスを 0x3C 以外に設定した場合は、以下の値を書きかえてください。 // TWI 通信できていない時は、カラー漢字 LCD シールド自身に現在設定されている TWI(i2c) アドレスが // 表示されているはずなので、御確認ください。 #define CKLCD_TWI_ADDR 0x3C // カラー漢字 LCD のインスタンス生成 ColorKanjiLCD cklcd (CKLCD_TWI_ADDR); // カラー漢字 LCD シールドの TWI アドレスを指定する // 初期化関数 void setup() { // 必ず、最初に Wire ライブラリを初期化させておいてください。 // 注意:"CKLCD_Wire" は Arduino Due では "Wire1" を、それ以外では "Wire" になります。 CKLCD_Wire.begin(); // 続いて、カラー漢字 LCD ライブラリを初期化します。 // 符号化方式は UTF-8 方式がデフォルトなので、特に指定しなくても OK です。 // 初期化に成功すると、画面はクリアされ、LCD 表示方向はランドスケープ(横向き) に、カーソル位置は (0,0) になります。 // カラー漢字 LCD は、電源投入直後は自動的に Version と TWI アドレスを表示していますので、 // 初期化に失敗した場合は、TWI アドレスが、上記の CKLCD_TWI_ADDR と一致しているか確認してください。 // 仮想画面1(160×256) を背景面に設定します。仮想画面2(160×128) は使用しません。 cklcd.begin (CKLCD_ORIENT_LANDSCAPE + CKLCD_DISP_SCREEN_B1); // 日本語のメッセージを表示させます(仮想画面1を使用)。 // Arduino IDE の符号化方式は UTF-8 方式なので、これだけで表示できます。 // ※ JIS 漢字規格の第一水準字~第三水準字のみ表示できます。第四水準字は表示できません。 // cklcd.v1.print ("日本語で表示"); /**************** EnOcean add ****************/ //Pin 0/1 Serial.begin(57600); // 57600-EnOcean Serial Protocol 3 cklcd.v1.print ("\n XOcean \n\n"); cklcd.v1.print ("温湿度モニタリング \n"); cklcd.v1.print (" システム \n"); /**************** EnOcean end ****************/ } // ループ関数 void loop() { /********* EnOcean add *********/ unsigned char dataReceive = 0 ; //受信確認フラグ unsigned char aChar = 0 ; //データ格納用変数 unsigned char pos = 0 ; //ESPデータ位置 unsigned long senderID = 0 ; //温湿度モジュールのID unsigned short dataLength = 0 ; //データ長 unsigned char optLength = 0 ; //オプションデータ長 unsigned char packettype = 0 ; //パケットタイプ char buf[1] ; while(Serial.available()>0){ // XOcean受信したか? aChar = Serial.read(); switch(pos){ case(0): if( SYNC == aChar){ // SYNCバイトだったら受信開始 delay(5); pos++; // pos移動 SYNC -> dataLength dataReceive = 1 ; } break; case(1): dataLength = 0x00FF & aChar ; // dataLength 上位1バイトです。 pos++; // pos移動 dataLength -> dataLength break; case(2): dataLength = (dataLength<<8) + aChar ; // dataLength 下位1バイトです。 pos++ ; // pos移動 dataLength -> optLength break; case(3): optLength = aChar ; // optionLength pos++ ; // pos移動 optLength -> packet type break; case(4): packettype = aChar ; // packettype pos++; // pos移動 packet type -> crc break; case(5): pos++; // pos移動 crc -> header break; case(6): pos++; // pos移動 header -> ID1 break; case(7): senderID = 0x0000FF & aChar ; // ID1バイト pos++; // pos移動 ID1 -> ID2 break; case(8): case(9): case(10): senderID = (senderID<<8) + aChar ; // ID2-4バイト pos++; // pos移動 ID2 -> ID4 -> data1 break; case(11): pos++; // pos移動 data1 -> data2 break; case(12): if(TEMPID == senderID ){ pastHum = Hum ; Hum = (float)aChar * 100/250 ; // humdata } pos++; // pos移動 data2(hum) -> data3(temp) break; case(13): if(TEMPID == senderID ){ pastTemp = Temp; Temp = (float)aChar * 40/250 ; // Tempdata } pos++; break; default: break; } } if(dataReceive ==1){ if(TEMPID == senderID ){ cklcd.v1.clear(); // 一旦、仮想画面をクリアする cklcd.v1.print ("\nTemperature 前回 \n"); cklcd.v1.print (" "); cklcd.v1.print (Temp , 2); cklcd.v1.print ("℃ "); cklcd.v1.print (" "); cklcd.v1.print (pastTemp , 2); cklcd.v1.print ("℃ \n"); cklcd.v1.print ("Humidity 前回 \n"); cklcd.v1.print (" "); cklcd.v1.print (Hum , 2); cklcd.v1.print ("% "); cklcd.v1.print (" "); cklcd.v1.print (pastHum , 2); cklcd.v1.print ("% \n\n"); } dataReceive = 0 ; } /********* EnOcean end *********/ }
前回と違う部分は表示部分をLCDシールドに合わせたところと、1回前の値も表示させるようにしたところです。
使ってみた感想
前回までのセッティングでEnOceanのデータが受信できるようになっていたのと、LCDシールドのサンプルスケッチが充実していたので、簡単にできちゃいました! EnOceanのセンサは買ってきたままの状態で動作しましたし、XOceanはデータを理解することさえクリアできれば、通信プロトコルは規格で決まっているので他のEnOceanセンサを使うときでもすぐに対応できそうです。使ってみると意外と簡単に動作するのが実感できました。
今回はLCDで表示をさせましたがモータとつないだり、照明とつないだりといろいろな機器と連動させて動作できそうです。ちょっとしたIoTやM2MがEnOceanでも実現できそうですね。夢が広がります。
また、EnOceanのラインナップとしては今回使用した温湿度センサの他にスイッチやマグネットコンタクトセンサがあるようなので、また機会を見つけてこれらの製品も動作させていこうと思います!
……さてと、さっそく完成したことを上司に報告だ!!
上司「……(ニタニタ)」
上司「GOOD JOB!やるねえ~!!」
や、やった!!
いただきました!GOOD JOB!
上司に認めてもらえたXOcean+Arduinoの電子工作のパワー恐るべし。
これからも精進することを心に決めた僕でした★
今回の連載の流れ
第1回:番外編① XOceanを使ってみた〜ArduinoとEnOceanを使用した温湿度表示
第2回:番外編② XOceanを使ってみた~ArduinoとEnOceanを使用した温湿度表示(その2)(今回)