2023.9.11 Coskx Lab
1 はじめに
Wi-FiマイコンESP-WROOM-02はArduinoIDEでの開発が便利です。
ボードとしてGeneric ESP8266 Moduleを選んでおくと,ESP8266がWi-Fi接続のWebサーバ動作をするスケッチ例が既に使えるようになっています。
ここでは,温度センサの値を発信するESP-WROOM-02がWebサーバとして働くようにします。
温度センサはADT7410を使用します。
このWebサーバから温度データをもらうためには,PCなどからWebブラウザでアクセスします。
"マイコンのサーバ"と"PCのWebブラウザ"のふるまい
2 使用環境
3 準備
3.1 ArduinoIDE
(1)[ファイルFile] -> [環境設定(Preferences)]の追加のボードマネージャに"https://arduino.esp8266.com/stable/package_esp8266com_index.json"を追加し、"OK"をクリックします。
(2)ツール[Tools] > ボード[Board] > Boards Manager
検索boxに「esp8266」を入力すると複数のボード候補が出てくるので
最新版の「esp8266」をinstall
(3)ツール[Tools] > ボード[Board] ボード選択では"Generic ESP8266 Module"を選びます。
3.2 AE-ESP-WROOM-02-DEV
AE-ESP-WROOM-02-DEVの説明書を読んでプログラムの転送方法を確認します。
RSTスイッチとPGMスイッチを両方押した状態から,RSTスイッチを離し,次にPGMスイッチを離すと,プログラム転送(書き込み)モードになります。
4 AE-ESP-WROOM-02-DEVと温度センサADT7410の配線
温度センサADT7410は温度をデジタル値に変換しているので,そのデータをAE-ESP-WROOM-02-DEVが読み出します。
AE-ESP-WROOM-02-DEVと温度センサADT7410はI2C接続ですので,電源線,GND線の他はSCLとSDAの2本のみで通信できます。
I2C 用の端子は,ESP8266 データシート上では SDA:IO2,SCL:IO14 となっていましたが、pins_arduino.h で SDA:IO4,SCL:IO5 として定義されています。
SDA IO4
SCL IO5
なおADT7410ではSDA,SCLをpullupせずに動作しています。
AE-ESP-WROOM-02-DEVと温度センサADT7410の配線
ブレッドボードには載せないので,AE-ESP-WROOM-02-DEVのピンを上向きに付けています。
AE-ESP-WROOM-02-DEVと温度センサADT7410
5 AE-ESP-WROOM-02-DEVのスケッチコード(サーバプログラム)
クライアント(例えばPCのwebブラウザ)からのリクエストで,サーバであるAE-ESP-WROOM-02-DEVは,温度センサADT7410の値を取得し,クライアントに返します。
送信ではHTTP通信の手順に従います。
setupでは,自分が接続すべきWi-FiアクセスポイントのSSIDとパスワードを設定して,LANの一員になろうと試みます。
成功すると,LAN内のDHCPサーバからIPアドレス(一次的な)をもらいます。
またmDNSプロトコルで,自分のホスト名を有効にします。
LAN内機器についてDNSサーバはホスト名の解決ができないので,WebブラウザはIPアドレスでアクセスしてくるのですが,mDNSのおかげでホスト名+".local"(ブラウザが賢いのでホスト名だけでもOK)としてアクセスすることができます。
ここでは,"http://esp8266.local/"でアクセスできます。IPアドレスはDHCPサーバにによりマイコン起動時に自動で割り当てられるので,いつも同じIPアドレスになっているとは限らないため,サーバ名(ホスト名)でアクセス可能になるmDNSの仕組みはありがたいです。
アクセスがあると,温度センサADT7410から,温度を取得し,"ホスト名","レスポンス回数","温度"の文字列をスペース区切りで返すようにしています。
次のコードは,IDEの既存スケッチ例"HelloServer.ino"を元に作ったものです。
補足
「server.on("/", handleRoot);」は,ブラウザから「http://サーバ名/」というアクセスがあったら,handleRoot()を実行してね,という設定です。
通常,ブラウザには「http://サーバ名」と入力しますが,ブラウザはその後ろに「/」を加えて「http://サーバ名/」のように送信します。
6 PCのWebブラウザからアクセス
プログラムがAE-ESP-WROOM-02-DEVに転送された直後に,ArduinoIDEのシリアルモニタには次のように表示されます。(AE-ESP-WROOM-02-DEVをリセットした直後も同じように表示されます。文字化けするときは,115200baudであることを確認してください)
ここでAE-ESP-WROOM-02-DEVに割り当てられたIPアドレスは192.168.1.16であることがわかります。
まず最初にgoogle chromeからIPアドレスでアクセスしてみました。
正確には"http://192.168.1.16/"のように書きます。
32.6が気温です。
次にホスト名でアクセスしてみました。
正確には"http://esp8266.local/"のように書きます。
33.6が気温です。
7 WinPCのExcelから2つのAE-ESP-WROOM-02-DEVにアクセス
2つのAE-ESP-WROOM-02-DEV(それぞれ温度センサADT7410を持っている)に,同じLAN内にあるWinPCのExcelからアクセスします。
2つのAE-ESP-WROOM-02-DEVには,プログラムコード上で
#define SERVERNAME "esp8266a"
と
#define SERVERNAME "esp8266b"
のように別々のサーバ名(ホスト名)を与え,起動しておきます。
Excelから,mDNSの恩恵で,2つのURLをホスト名を使ってアクセスします。
ExcelでVBAのプログラムを走らせ,Start,Stopボタンで動作を制御します。
なおVBAでブラウザと同じHTTPアクセスをするためには,Microsoft XMLライブラリを使います。
VBAの環境を開いて,メニューから"ツール"→"参照設定"を選ぶと,"参照設定"ダイアログが開くので,ライブラリファイルの中から"Microsoft XML, v6.0"を探して,チェックを入れてOKで組み込まれます。
Microsoft XMLライブラリからXMLHTTP60のオブジェクトを使って,関数requestHTTP内でHTTPアクセスします。
2つのAE-ESP-WROOM-02-DEVからは,それぞれ"ホスト名","アクセス回数","温度"がスペース区切りで送られてくるので,それを指定のセルに表示します。
VBAのプログラムは次のようになりました。
補足
httpReq.setRequestHeader "Pragma", "no-cache"
httpReq.setRequestHeader "Cache-Control", "no-cache"
httpReq.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
の3行は,キャッシュに残っているデータは捨てて,必ず新しいデータを受け取るようにしなさいの意味です。
これがないと,キャッシュ内のデータを受け取るだけになってしまい,古いデータが表示されたままになってしまいます。
VBAが動作しているExcelの画面内で次のようにアクセス結果を表示します。
約1秒ごとにアクセスを繰り返します。
温度センサADT7410の個体差が測定温度に現れています。±0.3度程度の違いが現れます。
8 まとめ
Wi-FiマイコンESP-WROOM-02をWebサーバとして動作させ,ESP-WROOM-02に接続された温度センサADT7410の値を,クライアントがリクエストしたタイミングでデータを送信するようにしました。
また複数のESP-WROOM-02サーバからデータを得るためにVBAを使ってExcelに表示する例を示しました。
補足
Excelの画面では見た目が悪いので,Powerpointで作ることもできます。Excelのセルに表示するのではなく,Powerpointの表に表示することなどが考えられます。ただし,表示場所を指示するのが面倒なのと,ExcelVBAとPowerpointVBAに多少違いがあるので,注意が必要です。