Arduinoではプログラムのことを「スケッチ」と呼ぶことがあります。次のリストはArduinoからESP8266経由でMQTTブローカーに対し、publishするスケッチの例です。
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX char con[]={0x10,0x21,0x00,0x06,'M','Q','I','s','d','p',0x03,0x02,0x00,0x3c,0x00,0x13, 'm','o','s','q','s','u','b','/','1','2','5','1','6','-','h','i','r','o','3'}; byte pub[]={ 0x30,0x15,0x00,0x06,'s','e','r','v','e','r','/','s','a','m','p','l','e','/','h','e','l','l','o'}; void getResponse(int j){ int i; for (i=0;i<j;i++){ if (mySerial.available()) Serial.write(mySerial.read()); delay(1); } } void setup(){ int i,j; Serial.begin(9600); mySerial.begin(9600); while(!Serial); mySerial.print("AT+RST\r\n"); getResponse(5000); mySerial.print("AT+CIPSTART=\"TCP\",\"192.168.1.16\",1883\r\n"); getResponse(1000); mySerial.print("AT+CIPSEND=35\r\n"); getResponse(1000); for (i=0;i<35;i++)mySerial.write(con[i]); getResponse(1000); } void loop(){ mySerial.print("AT+CIPSEND=23\r\n"); getResponse(1000); for (i=0;i<23;i++)mySerial.write(pub[i]); getResponse(1000); }
1行目でSoftwareSerial.hというヘッダファイルをインクルードしています。これはソフトシリアルの機能を使うための前準備です。今回の構成では2系統のシリアルポートが必要です。1つはUSB経由でPCとやりとりするためのシリアルポート、もう1つはESP8266との通信を行うシリアルポートです。
ArduinoのCPUはATMEGA328Pを採用していますが、ハードウェアとしてのシリアルポートは1つしか用意されていません。PCとの通信はモニター程度なので、これをESP8266側に割り当てればよいのですが、この通信ポートはPCからArduinoにプログラムをダウンロードするためにも用いられる大事なシリアルポートなのです。
そのため基板上で結線されており、ユーザーがこのポートを別の用途に割り当てることはできません。そこで今回はソフトウェアでGPIOをシリアルポートの代わりに使えるソフトウェアシリアルを使うことにしました。ソフトウェアシリアルはあまり高速なボーレートでは使えないので、今回はESP8266のボーレートを設定可能な最も遅い9600bpsに設定します。ボーレートの設定コマンドは以下の通りです。このコマンドは一度実行すると設定が不揮発的にESP8266に残ります。
AT+UART_DEF=9600,8,1,0,0
2行目で送信側のTxDをGPIOの11番、そして RXDを12番としてSoftwareSerialのmySerialというオブジェクトを生成しています。3行目と5行目は先に説明したmqttコマンドメッセージをbyte配列に格納したものです。
7行目でgetResponseという関数を定義していますが、これはESP8266からシリアル経由で送信されるデータをPC側に送るための関数です。引数でループ回数を指定しますが、毎回delay(1)が入っていますので、引数を1000とすれば約1秒間にESP8266から受信したデータをPC側に送ることになります。
次のsetup関数内は一度だけ実行される命令を書きます。シリアルポートとソフトウェアシリアルポートを9600bpsに設定します。
19行でシリアルポートの設定完了を待ち、20行でATコマンドを用いてESP8266をリセットしています。その後、5秒間ESP8266の反応を待ちます。次に22行でブローカーのIPアドレスとポート番号を指定して接続に行きます。これが成功するとTCP/IPレベルでのセッションが確立したことになります。
1秒置いた後、今度はMQTTのコネクト要求を送ります。まずATコマンドで35文字送信することをESP8266に伝えます(24行)。1秒後、byte配列として用意したコネクト要求コマンドを送ります。loop関数内には何度も繰り返して実行される命令を記述します。ここでは定期的(約2秒ごと)にパブリッシュメッセージを送ります。
Copyright © ITmedia, Inc. All Rights Reserved.