第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までしか動作確認はされていないようなので、注意してください。

図1.カラー漢字LCDシールドのサンプルスケッチ取得。上記作者の方のホームページ中程にあります。
取得したサンプルスケッチをArduino IDEをインストールしたフォルダ内にある “library” というフォルダへコピーします。

図2.カラー漢字LCDシールドのライブラリをコピー
コピーした後、Arduino IDEを起動して、”ファイル” → “スケッチの例” → “ColorKanjiLCD” を選択するとLCDシールド用のサンプルスケッチを立ち上げることができます。

図3.カラー漢字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回前の値も表示させるようにしたところです。

図4.動作結果
使ってみた感想
前回までのセッティングでEnOceanのデータが受信できるようになっていたのと、LCDシールドのサンプルスケッチが充実していたので、簡単にできちゃいました! EnOceanのセンサは買ってきたままの状態で動作しましたし、XOceanはデータを理解することさえクリアできれば、通信プロトコルは規格で決まっているので他のEnOceanセンサを使うときでもすぐに対応できそうです。使ってみると意外と簡単に動作するのが実感できました。
今回はLCDで表示をさせましたがモータとつないだり、照明とつないだりといろいろな機器と連動させて動作できそうです。ちょっとしたIoTやM2MがEnOceanでも実現できそうですね。夢が広がります。

図5.機器全体構成

図6.運用中(温湿度センサはパーティションに設置しています)
また、EnOceanのラインナップとしては今回使用した温湿度センサの他にスイッチやマグネットコンタクトセンサがあるようなので、また機会を見つけてこれらの製品も動作させていこうと思います!
……さてと、さっそく完成したことを上司に報告だ!!

上司「……(ニタニタ)」

上司「GOOD JOB!やるねえ~!!」
や、やった!!
いただきました!GOOD JOB!
上司に認めてもらえたXOcean+Arduinoの電子工作のパワー恐るべし。
これからも精進することを心に決めた僕でした★
今回の連載の流れ
第1回:番外編① XOceanを使ってみた〜ArduinoとEnOceanを使用した温湿度表示
第2回:番外編② XOceanを使ってみた~ArduinoとEnOceanを使用した温湿度表示(その2)(今回)






