ここまでの実験で、マイコン単独にてアナログセンサーの値をとらえることができました。ここからはその値をHTTPサーバを通してクライアント送るシステムに改造します。まずは配線の変更から着手します。今度はマイコンとESP8266が連携して動作しますので、マイコンにプログラムを書き込んだ後、図のようにUARTの信号をお互いに接続します。
次のコードがHTTPサーバ経由でセンサーの値を、クライアントのWebブラウザに表示させるプログラムです。
#include "mbed.h" DigitalOut led(LED1); AnalogIn a2(dp13); Serial pc(dp16,dp15); int main(){ char msg[1024]; pc.baud(115200); wait(5); pc.printf("AT+CIPMUX=1\r\n"); wait(1); pc.printf("AT+CIPSERVER=1,8888\r\n"); while(1) { pc.scanf("%s",msg); if (strstr(msg,"+IPD")!=NULL){ pc.printf("AT+CIPSEND=0,103\r\n"); wait(0.5); pc.printf("HTTP/1.1 200 OK\nContent-length: 43\nContent-Type: text/html\n\n"); pc.printf("<html><body><H1>%f</H1></body></html>",a2.read()); } } }
前回紹介したWebブラウザで発光ダイオードを点灯させるプログラムにほんの少し改造を加えたものですが、むしろロジックとしては単純になっています。前回に比べる、追加した部分は3行目のアナログ入力の設定と、19行目のHTMLにアナログ値を埋め込むところです。また前回の“Hello world”に比べて全体の文字数が3減っているので16行目と18行目の文字数に関わる値を3減らしています。
下図左は室内の照明が太陽電池に当たっている状態で、サーバにアクセスに行った時の表示例です。下図右は太陽電池をふさぎ照明が当たらない状態でサーバにアクセスした際の表示例です。
このように、HTTPサーバにアクセスに行った時の太陽電池が捉えた光の量をブラウザーを通して読みだすことができるようになりました。以下はクライアントからアクセスがあった時のESP8266のTXが出力したログです。
+IPD,0,370:GET /favicon.ico HTTP/1.1 Host: 192.168.4.1:8888 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36 Accept: */* Referer: http://192.168.4.1:8888/ Accept-Encoding: gzip, deflate, sdch Accept-Language: ja,en-US;q=0.8,en;q=0.6 AT+CIPSEND=0,103 OK > Recv 103 bytes SEND OK
ログのリスト1行の"+IPD"にサーバ側のプログラムが反応してレスポンスとしてアナログ値をWebブラウザに送出します。2行目から10行目までがWebブラウザからのリクエストです。Webブラウザに対するレスポンスは12行目から14行目の間で送出していますがこのログには表示されていません。もしそれらのデータを観測する場合は、RXD側につなぎ替えてログを取るとよいでしょう。
今回はWebブラウザを通じて、リモートでサーバに接続されたアナログセンサーの値を読みだす作例を紹介しました。6回にわたってESP8266を使った手作りIoTということで連載してきましたが、今回をもってひとまず最終回となります。
引き続きクラウドとの連携などについても準備を進めているところですので、編集部までご意見ご要望など頂ければ、続編などとして企画しますのでよろしくお願い致します。
Copyright © ITmedia, Inc. All Rights Reserved.