できること

番外編② XOceanを使ってみた〜ArduinoとEnOceanを使用した温湿度表示(その2)

第1回:番外編① XOceanを使ってみた〜ArduinoとEnOceanを使用した温湿度表示

 

(注:XOceanは販売を終了しています。そのほかの受信モジュールでも同様の電子工作は制作可能ですので、ご自身で取り組まれる際の参考にしてください。)

みなさん、こんにちは。新米ライターの小西です。前回はXOceanのデータ把握までを試行錯誤してやってみました。なかなかしんどい作業でしたが、これでどのようなEnOcean製品のデータでも理解できるようになりました。

今回はXOceanにカラー漢字LCDシールドを接続して、温湿度モニタリングシステムを作りたいと思います。これで独立した機器として動作しちゃいますね。

ちなみにLCDシールドの購入先やここまでの工程は、前回の記事にまとめています。ぜひ併せてご覧下さい!

では早速、完成形をお披露目します。表示が付くと一気に機器としてそれらしくなります。

entry-spinoff002_ph01

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シールドのサンプルスケッチ取得

図1.カラー漢字LCDシールドのサンプルスケッチ取得。上記作者の方のホームページ中程にあります。

取得したサンプルスケッチをArduino IDEをインストールしたフォルダ内にある “library” というフォルダへコピーします。

図2.カラー漢字LCDシールドのライブラリをコピー

図2.カラー漢字LCDシールドのライブラリをコピー

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

図3.カラー漢字LCDシールドのサンプルスケッチ

図3.カラー漢字LCDシールドのサンプルスケッチ

スケッチがいろいろ入っているので試してみると、楽しくてついつい時間を忘れて遊んでしまいますが、目的はXOceanと接続してLCDに表示させないといけないので、一つサンプルを選びます。今回は “cklcd_mini_sketch”を選びました(一番簡単なサンプルスケッチです)。
それではいよいよソフトウェアを作成していきましょう。

LCDシールド+XOceanのソフトウェア

基本的には前回作成したソフトウェアを移植するだけで、あとは画面表示部分を追加するだけです。

Code-Example
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/*
  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.動作結果

図4.動作結果

使ってみた感想

前回までのセッティングでEnOceanのデータが受信できるようになっていたのと、LCDシールドのサンプルスケッチが充実していたので、簡単にできちゃいました! EnOceanのセンサは買ってきたままの状態で動作しましたし、XOceanはデータを理解することさえクリアできれば、通信プロトコルは規格で決まっているので他のEnOceanセンサを使うときでもすぐに対応できそうです。使ってみると意外と簡単に動作するのが実感できました。

今回はLCDで表示をさせましたがモータとつないだり、照明とつないだりといろいろな機器と連動させて動作できそうです。ちょっとしたIoTやM2MがEnOceanでも実現できそうですね。夢が広がります。

図5.機器全体構成

図5.機器全体構成

図6.運用中(温湿度センサはパーティションに設置しています)

図6.運用中(温湿度センサはパーティションに設置しています)

また、EnOceanのラインナップとしては今回使用した温湿度センサの他にスイッチやマグネットコンタクトセンサがあるようなので、また機会を見つけてこれらの製品も動作させていこうと思います!

 


 

……さてと、さっそく完成したことを上司に報告だ!!

entry-spinoff002_ph02

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

entry-spinoff002_ph03

上司「GOOD JOB!やるねえ~!!」

や、やった!!
いただきました!GOOD JOB!

上司に認めてもらえたXOcean+Arduinoの電子工作のパワー恐るべし。

これからも精進することを心に決めた僕でした★

 

 

今回の連載の流れ

第1回:番外編① XOceanを使ってみた〜ArduinoとEnOceanを使用した温湿度表示
第2回:番外編② XOceanを使ってみた~ArduinoとEnOceanを使用した温湿度表示(その2)(今回)

アバター画像

ローム株式会社 LSI商品開発本部 無線モジュール商品開発部所属。名古屋大学工学部物理工学科卒業後、紆余曲折を経てローム株式会社に入社。音楽が好きでトランペットやベースなど様々な楽器をやっていますが、今は子育てに夢中です!

http://www.rohm.co.jp/web/japan/

FPVフライトが楽しめるマイクロドローンを組み立てよう!