USB-シリアル変換、余裕のある容量の電源レギュレーター、ロジックレベル変換をパッケージにした ESP-WROOM-02 開発ボードです。
ATコマンドやWi-Fi通信が安定して実現できるので、超お勧めです。
こちらの記事も合わせてご覧ください。
https://www.mgo-tec.com/blog-entry-ss-wroom-howto01.html
今回は、ハードウェアのArduinoを一切使わず、ESP-WROOM-02(ESP8266)単体にArduinoスケッチを書き込み、Wi-Fi通信させてみました。
WROOMではNTPサーバーから時刻を取得し、iOSのSafariやAndroidのGoogle ChromeなどのスマートフォンブラウザにServer-Sent Eventsを使ってリアルタイムストリーミング表示させてみました。
見た目は地味ですが、やっている中身はスゴイです。
今までは、ArduinoとWROOM(ESP8266)とシリアルUART通信で、ATコマンドで制御していましたが、ネットでも多くの情報があるとおりに、私もWROOM(ESP8266)に直接Arduinoスケッチをフラッシュに書き込んでみました。
つまり、ハードウェアのArduinoは不要なんです。
こんなちっちゃいものにArduinoとWi-fiモジュールが入っているので、メモリは容量無いだろうと思ってました。
が、しかし!!・・・・
実はArduino MEGA以上のSRAMを装備していたのです。
なんと
フラッシュメモリ 1MB (内19%はブートローダやWiFiで既に使用済み)
SRAM 81KB (内54%は使用済み)
もあるんです。
使用済みのところは、何も動作しない空スケッチをコンパイルした場合のメモリーで既に使用されているのです。
それでも、Arduino MEGAを遙かに超えるメモリーです。
私は何か間違えているんでしょうか・・・???
と思うくらいメモリーがスゴイんです。
SRAMなんかはMEGAが8KBですよ。
WROOMはその10倍です!
ウソでしょ・・・
54%使用済みとしても37kBもあるんです・・・。 ウソでしょ・・・。
何かの間違いかもと思いつつ、多量の文字列を扱うスケッチをコンパイルしてみたら、SRAMが54%から61%に増えただけでした。
こりゃぁ~、本物みたいです。
ということで、ArduinoUNOで苦労したメモリを顧みず、ガンガン文字列を貪欲にスケッチに書き込んでみました。
ATコマンドを一切使わず、NTPサーバーから時刻を取得し、WROOMからスマホブラウザにServer-Sent Eventsで時刻をストリーミング送信して表示させた動画はこんな感じです。
ブラウザからのコネクションもライブラリを使うサクッといきました。
メモリーが多量にあるので、ライブラリをガンガン使えます。
こりゃぁ、みなさんスゴイですよ!!
ただ、残念なのが、ADコンバーターが1ピンしかなく、しかも1Vまでしか使えないことです。
でも、ADコンバーターを外付けすればいいだけの話。
ま、何にしてもESP-WROOM-02(ESP8266)のポテンシャルには参りました・・・。
では、この使用方法を順番に解説していきましょう。
※Windowsの場合について説明します。
1.最新版 Arduino IDE をダウンロード
リンクは→こちら
ここはArduino.ccのホームページです。
必ず1.6.5 の方をダウンロードしてください。
後でインストールする Arduino core for ESP8266 WiFi chip は他のバージョンではまず正常に動作しませんのでご注意ください。
1.6.12でも動作しました。
最近ちょこっと耳にしたのですが、Arduinoを立ち上げた数人の本家の方たちと、ハードウェア設計班とで分裂したらしいですね。
ですから、EthernetShiels2は IDE1.6.5では動作せず、Arduino.orgページのバージョンでないと動作しないなどの問題があるようです。
私は現在 ver1.7.6 と ver1.6.5 の両方を使い分けるので、Windows Installerはダウンロードしませんでした。
ZIPファイルをダウンロードして使い分けてます。
WROOM(ESP8266)は2015/8/22現在ではver 1.6.5 で動作するようなのでそれをダウンロードして、ZIPならばご自分の好きなフォルダに解凍してください。
2.Timeライブラリをダウンロードしてインストール
Arduino playgroundにあるTimeライブラリのホームページを開きます。
リンクは→こちら
次に下図のような表示のところをクリックします。
次にGitHubのところをクリック
次のようなところをクリックしてZIPファイルをダウンロードしてください。
ZIPを解凍するとTime-masterフォルダがありますので、更にその中のTime-masterフォルダをIDEのlibrariesフォルダにフォルダごとコピーしてください。
もし、IDEをWindows Installerでインストールした場合はC:\ドライブのProgram FilesフォルダにArduinoフォルダがあります。
この辺はインターネットに沢山の情報がありますので、分からない場合は検索してみてください。
3.Arduino IDEのボードマネージャーにESP8266をインストール
まず、以下のGitHubのESP8266ボードデータがあるホームページを開きます。
リンク→こちら
そのページの下図のところのテキストをコピーします。
そしたら、Arduino IDE ver 1.6.5を起動して、下図の環境設定を選択。
下図の部分に先ほどコピーしたテキストのリンクをペースト(貼り付け)ます。そしてOKをクリックします。
次に下図のようにボードマネージャーを選択して開きます。
次に下図のようにESP8266ボードをインストールします。
するとこんな感じでインストール開始します。(ネットには接続しておいてください)
終ったら、他のボードも念のため最新版にインストールしておいた方がいいと思います。
4.準備するもの
ESP-WROOM-02
Amazonのマイクロテクニカ販売のもの
超小型USBシリアル変換モジュール(3.3V対応)
秋月電子通商
3端子レギュレーター TA48M033F 1個
秋月電子通商で購入すると、0.1uF と 47uFコンデンサーが付いてました
47uF電界コンデンサ 35V 1個
0.1uF積層セラミックコンデンサ 2個
ブレッドボード、ジャンパーワイヤー等
パソコン、USBケーブル等
最新のiOSやAndroidスマホ
ブラウザは Safari または
Google Chrome
ピンヘッダ、ジャンパーピン、タクトスイッチ等
●2mmピンヘッダ
●2mmジャンパーピン
●2.54mmピンヘッダ
●リセットスイッチ用超表面実装タクトスイッチ(2mmピッチに合うもの)2個
Wi-Fi ルーター環境
5.WROOM(ESP8266)のハンダ付け
まず、ESP-WROOM-02(ESP8266)を接続します。
私はamazonさんのマイクロテクニカさん販売のものを使いました。
これを購入すると取扱説明書がダウンロードできますので、その通りに接続します。
私の場合は説明書通りに2mmピンヘッダもハンダ付けしました。
※2mmピンヘッダおよび2mmジャンパーピン、超小型タクトスイッチ等は別途購入が必要です
下図のような感じです。
フラッシュダウンロードモード(書き込みモード)でジャンパーピンをセットします。
GPIO #15 LOW
GPIO #2 HIGH
GPIO #0 LOW
EN HIGH
この回路図は古いままで、良く分からず作成した当時のものです。
6.各部品の接続
ブレッドボードに下図のように接続します。 シンプルですねぇ~!!
この回路図は古いままで、良く分からず作成した当時のものです。
全てできたら、USBケーブルをパソコンと接続する前にWROOMの電源ピンを外して、3.3Vが来ているか確認してからWROOMと接続した方が安全です。
全てOKならばUSBとパソコンを接続します。
ここで、疑問に思った方は鋭いです。
WROOM(ESP8266)は以前の記事で電源容量がキモとお伝えしました。
しかし、今回の接続では、USBシリアル変換モジュールの最大電流が 100mA なんです。
これでも、問題なく動作しました。
ん?? そうすると、そんなに電流無くてもいけるのかな???
この検証はいつか解決してみたいと思います。
7.Arduino IDEの設定
次にArduino IDE1.6.5を起動して、下図のようにツールメニューを設定します。
まずはボードはGeneric ESP8266 Moduleを選択。
COMポートはご自分の環境に合わせて設定してください。私の場合はCOM3でした。
その他は以下のように全て設定していきます。フラッシュメモリーはとりあえず最大を選んでみました。
Reset Method を “nodemcu” にするとスイッチサイエンスさんの開発ボードを使うときはいちいちリセットボタンを押さずにバンバン書き込めるので便利です。
毎回リセットスイッチを押して再起動したい場合は”ck”にします。この図では”nodemcu”にしてますが、マイクロテクニカさんの場合は”ck”で良いと思います。
いろいろ変えて試してみてください。
次に書き込み装置を設定します。
とりあえず下図のように選択しました。
では、次の項ではスケッチ(プログラミング)例を紹介します。
コメント
参考にさせていただいています。
一点、モジュールの個体差でしょうか
我が家の環境では、
while (millis() – beginWait < 1500) {
の後に、delay(1);を挿入しないと
NTPから取得したデータの更新が
正常に機能せず、time関数の初期値で
表示されていました。
soarusさん
貴重なコメントありがとうございました。
当方の環境ではdelay(1);を入れなくても、iOS、Androidともに問題なかったので、他の方の環境で動くのかが疑問でした。
動かなくて悩んでいる方にはとても助かる意見だと思います。
早速、スケッチを追加修正させていただきました。
当方の環境でもdelay(1);を追加しても問題なく動作しました。
また何かありましたら、意見をお寄せください。
とても興味深い記事だったので参考にさせていただいております。
当記事の通りにセッティングを行い、プログラムをそのまま(SSID,PASSWARDは変えました)検証いたしましたところ、182行目の「setSyncProvider(getNtpTime); 」が引っ掛かってしまい、書き込むことができませんでした。
どのようにしたら改善することができるのでしょうか。
よろしくお願いします。
-環境-
windows7
Arduino 1.6.7
↓エラーコード
—————————————————————–
C:\Users\aki\Documents\Arduino\ESP-WROOM-02\ESP-WROOM-02.ino: In function ‘void setup()’:
ESP-WROOM-02:61: error: ‘getNtpTime’ was not declared in this scope
setSyncProvider(getNtpTime);
^
ESP-WROOM-02:61: error: ‘setSyncProvider’ was not declared in this scope
setSyncProvider(getNtpTime);
^
C:\Users\aki\Documents\Arduino\ESP-WROOM-02\ESP-WROOM-02.ino: In function ‘void loop()’:
ESP-WROOM-02:67: error: ‘HTTP_Responce’ was not declared in this scope
HTTP_Responce();
^
C:\Users\aki\Documents\Arduino\ESP-WROOM-02\ESP-WROOM-02.ino: In function ‘void HTTP_Responce()’:
ESP-WROOM-02:126: error: ‘SSE_Responce’ was not declared in this scope
SSE_Responce();
^
C:\Users\aki\Documents\Arduino\ESP-WROOM-02\ESP-WROOM-02.ino: In function ‘void SSE_Responce()’:
ESP-WROOM-02:169: error: ‘hour’ was not declared in this scope
if(hour()<10){
^
ESP-WROOM-02:174: error: 'minute' was not declared in this scope
if(minute()<10){
^
ESP-WROOM-02:179: error: 'second' was not declared in this scope
if(second()<10){
^
ESP-WROOM-02:187: error: 'getNtpTime' was not declared in this scope
setSyncProvider(getNtpTime);
^
ESP-WROOM-02:187: error: 'setSyncProvider' was not declared in this scope
setSyncProvider(getNtpTime);
^
ESP-WROOM-02:195: error: 'year' was not declared in this scope
sse_data += String(year())+"/"+String(month())+"/"+String(day());
^
ESP-WROOM-02:195: error: 'month' was not declared in this scope
sse_data += String(year())+"/"+String(month())+"/"+String(day());
^
ESP-WROOM-02:195: error: 'day' was not declared in this scope
sse_data += String(year())+"/"+String(month())+"/"+String(day());
^
C:\Users\aki\Documents\Arduino\ESP-WROOM-02\ESP-WROOM-02.ino: In function 'time_t getNtpTime()':
ESP-WROOM-02:229: error: 'sendNTPpacket' was not declared in this scope
sendNTPpacket(timeServerIP);
^
ESP-WROOM-02:242: error: 'SECS_PER_HOUR' was not declared in this scope
return secsSince1900 – 2208988800UL + timeZone * SECS_PER_HOUR;
^
exit status 1
'getNtpTime' was not declared in this scope
——————————————————————————–
A.koniさん
コメントありがとうございます。
おそらく、Arduino IDE が1.6.7であることが原因だと思います。
Arduino core for ESP8266 WiFi chip は推奨Arduino IDE は1.6.5 です。
1.6.7ではまず正常に動作しないようです。
当方のブログでも、最新版IDEのページへリンクを貼っていましたので、修正しました。
私も1.6.7の動作確認は最近までやっておらず、申し訳ございませんでした。
その他のページでも1.6.5をインストールするように修正しています。
Arduino core for ESP8266 WiFi chipも1.6.5限定でなく、他のバージョンでも動作するようにしてほしいですね。
ご指摘ありがとうございました。
当方、1.6.9にて同じコンパイルエラーになっていました。
#include を
#include に変更するとコンパイル、動作ともにできました。
最近Arduinoを始めたど素人ですが参考までに。
kumaさん
コメントありがとうございます。
Sever-Sent Events はしばらく使ってなかったもので、不具合が分かりませんでした。
Arduino Timeライブラリも知らぬ間に結構変更されていて、ライブライ使用方法も変わっていることに気がづきませんでした。
kumaさんのコメント欄では<>の中の文字が消えてしまってますが、現在のTimeライブラリでは
#include <Time.h> → #include <TimeLib.h>
と変更しなければならないということでした。
kumaさん、こういうことでよろしいでしょうか?
当方でもArduno1.6.9でこのように変更したら動作しました。
大変失礼いたしました。
記事を修正したいと思います。
有用な記事ありがとうございます。
ビギナー過ぎて良く分からず、基本的なことかと思いますが質問させてください!
2.Timeライブラリをダウンロードしてインストール
のところで”Time”をクリックしてダウンロードとありますが、クリックすると右記のページが開きます。”http://www.pjrc.com/teensy/td_libs_Time.html”
このページにある” Teensyduino Installer”をクリックして、”http://www.pjrc.com/teensy/td_download.html”を開き、
以下の環境の中から使っている環境のインストーラをダウンロードしてArduinoフォルダの中の”libraries”フォルダにコピーすれば良いという認識で合っていますでしょうか
。
Macintosh OS-X Installer
Linux Installer (32 bit)
Linux Installer (64 bit)
Windows XP / 7 / 8 / 10 Installer
宜しくお願いいたします。
かわさん
記事をご覧頂きありがとうございます。
ライブラリのページが知らぬ間に変わっている事が多く、私も困っております。
今、多忙で記事訂正が出来ないのですが、Windowsであればこちらの記事のTimeライブラリインストールの節を参照してみて下さい
(MACは持ち合わせておりませんので分かりません)
https://www.mgo-tec.com/blog-entry-1616shinonome-ws-oled-news.html
mgo-tecさん
お忙しいところ迅速な返答ありがとうございます!
リンク先確認いたします
かわさん
先のコメントのkumaさんの件で気付いたのですが、Timeライブラリの仕様が変更されておりました。
#include <Time.h> → #include <TimeLib.h>
と変更しないと動きません。
記事も修正しました。
これで試してみてください。
Arduino IDE 1.6.7 にて setSyncProvider(getNtpTime); でコンパイルエラーが出る件。
void setup()の前に、以下を記述するとコンパイルが可能です。
void HTTP_Responce();
void SSE_Responce();
time_t getNtpTime();
unsigned long sendNTPpacket(IPAddress& address);
私の方では Arduino IDE 1.6.7 でコンパイルできましたが、間違いかもしれませんので、他の方で試されてお返事を頂けると幸いです。
macsbugさん
コメント投稿ありがとうございます。
私は1.6.7はいろいろと問題があったので、今は使ってません。
先のコメント投稿でもあったように、現在は1.6.9で快適に動作しております。
setSyncProviderの件もTimeライブラリが知らぬ間にバージョンアップしていたりしてエラーになっていたようです。
最新版をダウンロードした場合には
#include<Time.h> → #include<TimeLib.h>に変更したら動作します。
ただし、注意していただきたいのは、古いIDEをアンインストールする場合、Arduino15フォルダを削除せねばなりません。
その方法はこちらの記事を参照にしてください。
https://www.mgo-tec.com/esp8266-board-install01-html
いつも大変お世話になっております。
無事にEvent 1,2,3 表示しました。
win10,arduino 1.8.0
以前から取り組んでます、sensorValueが表示が出ません。
このデータ送信関数部分では、2か所追加しましたが、画面表示に変化は見られません(本来の表示のみ)、又、試行錯誤中に文字列のみ表示時、sensorValue;値表示は、確認しました。
Server-Sent-Eventが理解できてません。
ヒント、勉強方法をご教授いただけませんか?
yoshiさん
お返事遅くなり、すみません。
Server-Sent Events は2年くらい使っていなかったので、思い出すまでに時間がかかってしまいました。
こちらのページにコメントされたということは、Arduino との ATコマンド通信はやめて、ESP-WROOM-02 へ直接スケッチを書きこんでいるものと解釈させていただきます。
そちらの方が私自身もお勧めしています。
まず、過去の以下の記事をご参照ください。
https://www.mgo-tec.com/blog-entry-36.html
Server-Sent Events はコマンドをブラウザが認識しなければいけないので、V=sensorValue を “data:” の後に続けてテキスト形式で送らなければなりません。
ですから、
の後に、
のところを書き替えても良いですね。
まず、これで試してみて下さい。
いつも大変お世話になっております。
Event 1,2,3すべて表示できています。
arduino 1.8.0 win10 仕様
そこで、以前からお聞きしてます、senValue値を取り込む作業をしてますが、今だ、解決してません。
この部分では、2か所追加しますたが、全く変化ありません。
試行錯誤するなかで、文字列ばかりになり、その時、senValue値が確認できましたが、正常画面じゃありません 。
どのあたりを修正すれば、良いか、ご教授いただけませんか?
又、どんなURLを参考にすれば、良いか教えていただければ
嬉しいです。
よろしくお願いします。
yoshiさん
つい先ほど修正点をお返事したとおり、
が誤りです。
例えば、
のところをを書き替えて、
としてみてください。
因みに、ESP-WROOM-02 ( ESP8266 ) のAnalog 入力は 0~1V の範囲しか計測できませんので、測定範囲が限定されてしまいます。
ちょっと高度なプログラミングが必要ですが、別途、ADコンバーターを I2C や SPI接続で追加する方が、精度の高い電圧値取得ができます。
いつも大変お世話になっております。
Get Sync NTP server Timeの下にString( V )のanalog値を表示できました。
有難うございます。
ボードリセット+ブラウザ更新でanalog値の変化は確認できました。
何もせずに秒数のようにanalog値を出すことは可能ですか、可能であれば
どの辺りの修正が必要ですか?
宜しくお願い致します。
とりあえず、表示出来て良かったですね。
あまり詳しく書いていませんが、今一度以下の記事をお読みください。
https://www.mgo-tec.com/blog-entry-36.html
コネクション確立後は、closeされていなければ、続けてスマホにテキストデータを送れば良いです。
msg_1 のところにデータを表示させたい場合、センサーデータを取得した値をV1とすると、ESP-WROOM-02 から以下のテキストを送信すれば良いです。
テキストで送る方法は、
最後に改行コードを2回送ることがポイントです。
ただし、データを送る頻度はdelay(100);~delay(1000);以上にしておいた方が良いかも知れません。
頻度が高すぎると、通信トラフィックを圧迫します。
あと、ブラウザのテキストレイアウトを変えるには HTML と Javascript の知識が必要です。
ここでは説明できませんので、ネットで検索してみてくださいませ。
いつも大変お世話になっております。
evnt 1の場所に常時、変化するアナログ値が表示出来ました。
有難うございます。
次は、csvでデータを取り込み、exsel表示できるよう頑張ってみます。
又、お聞きすると思いますが、その時はよろしくお願いいたします。
表示できてよかったですね。
因みに、String変数にあまり多量の文字は収納できないので、長い文字列は分割して送った方が良いですヨ(^^)
いつも大変お世話になっております。
esp8266のserial表示をWIFi化出来ないと考え、esp8266をサーバー側
PCをクライアント側でesp8266のanalogデータをPCで受信し、csvdataを溜めてexsel表示出来ないかと色々検索しましたが、もう一歩のところでダメでした。
やはり、SSEを利用したWi-Fi ストリーミングしか、ないのかな思い戻ってきました。
もし、Wi-Fi ストリーミングでデータを取り込み、csvデータとして保存可能ならば、是非、ご教授願います。
ズバリ無いようであれば、参考URL等、教えてください。
宜しくお願い致します。
yoshiさん
いつもブログをご覧いただき、ありがとうございます。
Server-Sent Events データをパソコンに取り込むには、HTML と Javascript の知識があれば可能かと思われます。
私の場合は、一方向送信しかできない Sever-Sent Events はもう使っていません。
今は双方向同時送受信が可能な WebSocket を使っています。
このブログでは何度も取り上げています。
ただ、クライアントのブラウザ経由でパソコンにログを記録することはやったことがありません。
まぁ、これも HTML と Javascript の知識があれば可能です。
その他、スマホの Blynkというアプリを使ってログがスマホに記録できたような気がします。
どこかのサイトに方法があったと思われますが、忘れました。
これはローカル環境だけでなく、クラウドサービスなので、世界中のどこからでもアクセスできます。
意外とリアルタイム追従性は良いと思います。
また、私は使ったことが無いのですが、最近流行っているクラウドサービスの Ambient を使う方法があります。
https://ambidata.io/docs/esp8266/
リアルタイムのレスポンス性は分かりません。
その他別件ですが、パソコンではなく、ESP8266 に接続された micro SD カードにログを保存して、それから CSV で Excel で表示させたことがあります。
以下の記事を参照してみてください。
https://www.mgo-tec.com/blog-entry-bme280-excel.html
いつもご丁寧にご返事いただき感謝しております。
私なりに頑張ってやってみます。
もし、有益な情報が出ましたらご連絡もらえれば
嬉しいです。
センサーの値をスマホにグラフで表示するプログラムを作りたいと思っていました。
大変参考になりました。ありがとうございました。
環境はmacOS Big Sur11.6 Arduino1.8.13 BME280の温度湿度圧力センサーを使いました。
Timer.h
をTimerlin.h
にかえ、IPADress myIP;
myIP=WiFi.localIP()
の宣言をし、str1 += String(WiFi.localIP());
を下のように変えて行いました。str1 += String(myIP[0])+'.'+String(myIP[1])+'.'+String(myIP[2])+'.'+String(myIP[3]);
HitoriUserさん
記事をご覧いただき、ありがとうございます。
この記事はかなり古くて、今Arduino core ESP8266の環境も大幅に変わっていると思いますが、動いたんですね~。それはよかったです。
ところで、ご存知かもしれませんが、スマホと連携してグラフを表示させるなら、ESP32を使ってAmbientというWebサイトを使えば超簡単にできますよ~!
(^^)