MQTTで始めるIoTデバイスの作り方 第6回:スマホからのデバイス制御MQTTで始めるIoTデバイスづくり(6)(3/4 ページ)

» 2016年07月28日 07時00分 公開
[今岡通博MONOist]

プログラム解説

 4行目でサブスクライブ要求メッセージを、文字型配列に格納しています。トピックは'#'ですので、全てのトピックに対してサブスクリプション要求を送っていることになります。今回受け取りたいトピックは“ arduino/d2/ ”ですのでそのように設定することも可能です。

char sub[]={0x82,0x06,0x00,0x01,0x00,0x01,'#',0x00};
4行目

 5行目で発光ダイオードをオンにするためのトピックとメッセージを文字型配列に格納し、6行目で発光ダイオードをオフにするためのトピックとメッセージを文字型配列に格納しています。これらの配列を用いて受け取ったメッセージがこれらと符合するか判断します。

char ledOn[] ="arduino/d2/1";
char ledOff[]="arduino/d2/0";
5〜6行目

 20行目で発光ダイオードがつながったピンを、出力モードに設定しています。33行目では文字型配列「sub」に格納されたメッセージを送出し、サブスクライブ要求を送っています。

pinMode(2, OUTPUT);
20行目
for (i=0;i<8;i++)mySerial.write(sub[i]);
33行目

 36行目以降はloop関数で、文字型配列「ledOn」と「ledOff」と受け取ったメッセージが符合するかチェックします。

 37行目ではスタティックな整数型変数「i」と「j」を宣言しています。変数iが12になれば受信メッセージが“arduino/d2/1”と符合したことを示します。その場合D2ピンの値をHIGHとし、発光ダイオードは点灯します。同様に変数jが12になれば受信メッセージが“arduino/d2/0”と符合したことを示します。その場合はD2ピンの値をLOWにします。このとき発光ダイオードは消灯します。それ以外の場合は何も起こりません。これを繰り返します。

void loop(){
  static int i=0,j=0;
  char c;
  while (!mySerial.available());
  c = mySerial.read();
  if (ledOn[i++]!=c)i=0;
  if (i==12)digitalWrite(2, HIGH); 
  if (ledOff[j++]!=c)j=0;
  if (j==12)digitalWrite(2, LOW); 
  }
36〜45行目

Copyright © ITmedia, Inc. All Rights Reserved.