WROOM と Arduino で Wi-Fi ストリーミング 電圧計 作ってみました

ESP8266 ( ESP-WROOM-02 )

こんばんは。 今回は、話題のESP-WROOM-02とArduino UNOでシリアルATコマンド通信をして、iPadのSafariやAndroidのGoogle ChromeなどのブラウザにWi-Fiでリアルタイムストリーミング電圧計を作成してみました。もちろん、ブラウザのServer-Sent Eventsを使用してます。

スポンサーリンク

ATコマンドを使った通信は、今はもはや動かない可能性があります。
以下のプログラムは無保証とさせて頂きますのでご了承ください。
ESPr Developer などの ESP-WROOM-02開発ボードを使った方が遙かに簡単でおススメです。

ESPr Developer ( ESP-WROOM-02 開発ボード )の使い方をザッと紹介

以下、古い記事です。
(2018/11/25)

 

前回では、リアルタイムレベルメーターをご報告しましたが、今回はもっとシンプルにただ単にArduinoのanalog IN の電圧値を数値で表示するだけのMax 5Vの電圧計です。 前回のメーターはオペアンプを増設しなければならなくて、なかなか記事アップにまで持っていけなかったので、シンプルなものをまずはアップしました。 動画がありますので、こちらをご覧ください。

ArduinoのAnalog A0ピンで乾電池電圧を測定し、A1ピンはArduinoの5Vに接続してあります。
かなりサクッと動いてますね。
パッと見た目は地味で大したことないように見えます。
まるでEthernetShieldを使っているかのような単純さに見えますが、中身はWROOM(ESP8266)でATコマンドで、さらにストリーミングとなるとかなり高度なことをやっていると思ってます。

エネループの電圧と、アルカリ乾電池の電圧を表示するだけのものですが、Wi-Fiで飛ばせて、スマホでリアルタイムに電圧を読み取れるんです。しかも、スマホアプリはブラウザ以外は一切使用していません。

これを応用すれば、グラフにしたり、データロガーができます。 JavaScriptのCanvas要素を使えば、いろんなグラフィカルなことができますね。

参考程度に過去の記事に有線LANのEthernetShield2を使ったServer-Sent Eventsグラフィカル表示がありますので、ご覧ください。 (この写真をクリックするとそのページへ飛びます)

こんな感じでカラフルなグラフィックが可能です。ただし、Arduinoのメモリはガッツリ食います・・・。 WROOM(ESP8266)を使ってはまだここまでできませんので、まずはシンプルなものから報告します。
まず、準備するものはだいたい以下の物です。

●ESP-WROOM-02(ESP8266)
Amazonのマイクロテクニカ販売のもの

●Arduino UNO

●ロジックレベル変換モジュール
秋月電子通商

●3端子レギュレーターTA48M033F 1個
秋月電子通商

●電界コンデンサー
47uF 16V以上 1個
100uF 16V以上 1個

●積層セラミックコンデンサー
0.1uF 2個

●7~12V 1A以上のACアダプター

●ブレッドボード、ジャンパーコード等

●できるだけ最新式の高速CPUスマホ

●スマホブラウザ
iOS8.4 Safari または
Android4.4以上
最新 Google Chrome

●ピンヘッダ、ジャンパーピン、タクトスイッチ等
2mmピンヘッダ
2mmジャンパーピン
2.54mmピンヘッダ
リセットスイッチ用超小型タクトスイッチ(2mmピッチに合うもの)

●Arduino IDEが動くパソコン

ESP-WROOM-02(ESP8266) はamazonさんのマイクロテクニカさん販売のものを使いました。
(※2015年当初とはタイプが異なっています)

これを購入すると取扱説明書がダウンロードできますので、その通りに接続します。
私の場合は2mmピンヘッダもハンダ付けしてジャンパーピンをセットしました。

その他の接続はこのようにします。

※この図にはありませんが、リセットボタンは、必ずプルアップ抵抗をハンダ付けして、ボタンが押されたときに 3.3V と GND がショートしないようにしてください。
この回路図は古いままで、良く分からず作成した当時のものです。

 

以前にも説明しましたが、ルーターを起動してしばらく待ち、ESP-WROOM-02の起動には最低でも170mA以上必要ですので、ArduinoUNOの電源には必ず7V~12Vで1A以上の容量のACアダプターをArduinoに接続してから、Arduino側のUSBを挿してください。
これをやらないと、WROOMが正常に起動しません。 WROOMを起動させる順序は以下の通りです。

  1. ルーターのファイアウォールやアクセス制限を設定して電源ON
  2. ルーターが起動して落ち着くまで5分くらい待つ。
  3. Arduinoに7~12A 1A以上のACアダプターを接続
  4. 10秒くらい待ってからArduinoのUSB端子に接続してパソコンと接続

うまく動作しない場合は以下の記事をご覧ください。

ESP-WROOM-02(ESP8266)とArduinoでWi-Fi通信がやっとできました

再起動する場合にも注意がありますので・・・。

さて、ここで、以前の記事でも紹介しましたが、Arduino UNOのソフトウェアシリアルは、速度が115200bpsに対応してませんので、ハードウェアシリアルで通信します。
つまり、RX(受信)をデジタルピン0番で受信します。送信はソフトウェアシリアルで問題ありません。 ということは、スケッチをコンパイルするときにそれがArduino IDEと干渉してしまうので、コンパイルするときにはデジタルピンの0番を外さないといけません。

このように2番に移す必要はないのですが、変なところに接触してしまわないようにすると、これがいいかなぁという感じです。 あと、忘れがちなのが、プログラムを実行する際には必ずゼロ番ピンに接続することを忘れないでください。 では、サンプルスケッチはこんな感じです。

(Arduino IDE 1.7.6 動作確認済み)

ATコマンドを使った通信は、今はもはや動かない可能性があります。
以下のプログラムは無保証とさせて頂きますのでご了承ください。
ESPr Developer などの ESP-WROOM-02開発ボードを使った方が遙かに簡単でおススメです。

ESPr Developer ( ESP-WROOM-02 開発ボード )の使い方をザッと紹介

(2018/11/25)

 

【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)

/*(動作確認済み)
Arduino IDE 1.7.6
iOS 8.4 Safari
Android 4.4 Google Chrome 44.0.2403.133
*/
#include <SoftwareSerial.h>
#include <avr/pgmspace.h>

SoftwareSerial ESP8266_Serial(2,3); //受信の2番ピンは使わない

boolean WROOM_boot = false;//WROOMが起動したかどうかの判定
boolean WiFi_setup = false;//WIFIセットアップが済んだかどうかの判定
boolean SSE_on = false;

void setup()
{
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  ESP8266_Serial.begin(115200);
  //
  Serial.println(F("Wait."));
  delay(5000);
  
  ESP8266_Serial.print(F("AT+RST"));//ソフトウェアリセット
  ESP8266_Serial.print(F("\r\n"));//ATコマンド送信後に必ずこれをWROOMへ送信する。
}

void loop()
{
  String str;
  char c;

  if(Serial.available()){
    if(WROOM_boot == false){//シリアルが有効であれば、WROOMが起動していると判定
      Serial.println(F("ESP-WROOM-02 Serial Boot OK!"));
      WROOM_boot = true;
    }
    switch (WiFi_setup){
      case false:
        WIFI_SETUP();
        WiFi_setup = true;
        break;
      case true:
        byte ipd_no = 0;
        str = "";
        while(1){
          if(Serial.available()){
            c = Serial.read();
            if(c<0x80 && c>=0){// 不要な文字や読み取り不能な文字をカット
              str += c;
            }
          }
          if(c=='\n'){
            if(str.indexOf("+IPD")>=0){
              ipd_no = str[str.indexOf("+IPD")+5]-0x30;//これが重要。このID番号を取得しておかねばならない
              if(str.indexOf("GET / HTTP")>=0){
                Serial.find("Accept-Language");//ブラウザからのリクエストでこの文字列が来たらレスポンス
                delay(1000);//---あまり短い時間だと動作しない可能性あり。各自の環境に合わせる
                HTTP_response(ipd_no);
                str = "";
                SSE_on = true;
                break;
              }else{     //Google ChromeではGET送信の後すぐにfaviconを投げかけてくるところの対処
//                Serial.println('|');
                Serial.find("Accept-Language");//ブラウザからのリクエストでこの文字列が来たらレスポンス
                delay(1000);//---あまり短い時間だと動作しない可能性あり。各自の環境に合わせる
                str = "";
                if(SSE_on == true){
                  SSE_Responce(ipd_no);
                  SSE_on = false;
                }
                break;
              }
            }
            str = "";
          }
        }
        break;
    }
  }
}

//WI-FIセットアップ関数***********************************
void WIFI_SETUP()
{
  Serial.print(F("."));
    if(Serial.find("ready")){//WROOMからreadyという文字を検知したらセットアップ開始
    delay(2000);//ここはネットワーク環境によって変えてください
    Serial.println();
    Serial.println(F("-----WIFI setup IN"));
    //ステーションモード有効コマンド
    ESP8266_Serial.print(F("AT+CWMODE=1"));
    ESP8266_Serial.print(F("\r\n"));
    Data_Read_Display("OK");  //WROOMからのOKレスポンスを受けたら次へ進む
    //アクセスポイントのSSID、パスワード設定コマンド
    ESP8266_Serial.print(F("AT+CWJAP=\"xxxx\",\"xxxx\""));//ご自分のルーターのSSIDとパスワード  
    ESP8266_Serial.print(F("\r\n"));
    Data_Read_Display("WIFI GOT IP");  //WROOMからWIFI GOT IPというレスポンスを受けたら次へ進む
    //APから割り当てられたIPアドレスとWROOMのMACアドレス確認
    delay(1000);
    ESP8266_Serial.print(F("AT+CIFSR"));
    ESP8266_Serial.print(F("\r\n"));
    Data_Read_Display("OK");//WROOMからのOKレスポンスを受けたら次へ進む
    //マルチプルコネクション有効コマンド
    ESP8266_Serial.print(F("AT+CIPMUX=1"));
    ESP8266_Serial.print(F("\r\n"));
    Data_Read_Display("OK");  //WROOMからのOKレスポンスを受けたら次へ進む
     //サーバーモード有効、ポート番号設定
    ESP8266_Serial.print(F("AT+CIPSERVER=1,80"));//SSEの場合、ここのポート番号を80番にするところがミソ
    ESP8266_Serial.print(F("\r\n"));
    Data_Read_Display("OK");
    Serial.println(F("Arduino WROOM Server OK!"));//この表示が出たらWROOMのサーバー設定終了
  }
}

//WROOMから返って来るコマンドのシリアルモニター用関数***********************************
void Data_Read_Display(String response)
{
  char c;
  String str;
  while(1){
    if(Serial.available()){
      c = Serial.read();
      if(c<0x80 && c>=0){// 不要な文字や読み取り不能な文字をカット
        str += c;
      }
    }
    if(c=='\n'){
      Serial.print(str);
      if(str.indexOf(response)==0){
        str = "";
        break;
      }else if(str.indexOf("ERROR")>=0){
        break;
      }
      str = "";
    }
  }
}

//HTTPレスポンスをブラウザに送信する関数******************************************
//文字列はメモリを食うので、UNO内蔵フラッシュメモリに格納。2次元配列はなぜか使えない
//ここからは内蔵フラッシュメモリ格納定義
const char HTMLstr00[] PROGMEM = "HTTP/1.1 200 OK\r\n";
const char HTMLstr01[] PROGMEM = "Content-Type:text/html\r\n";
const char HTMLstr02[] PROGMEM = "Connection:close\r\n\r\n";
const char HTMLstr03[] PROGMEM = "<!DOCTYPE html><html><head>\r\n";
const char HTMLstr04[] PROGMEM = "<meta name=\"viewport\" content=\"initial-scale=1.5\">\r\n";
const char HTMLstr05[] PROGMEM = "<script type=\"text/javascript\">\r\n";
const char HTMLstr06[] PROGMEM = "var source=new EventSource(\"192.168.0.21\");\r\n";//ここで、ご自分のローカルIPアドレスを入力
const char HTMLstr07[] PROGMEM = "var obj1=document.getElementById(\"SSE_stop\");\r\n";
const char HTMLstr08[] PROGMEM = "source.addEventListener('msg_1',function(event){\r\n";
const char HTMLstr09[] PROGMEM = "var ms1 = document.getElementById('msgs1');\r\n";
const char HTMLstr10[] PROGMEM = "ms1.innerHTML = event.data;});\r\n";
const char HTMLstr11[] PROGMEM = "source.addEventListener('msg_2',function(event){\r\n";
const char HTMLstr12[] PROGMEM = "var ms2 = document.getElementById('msgs2');\r\n";
const char HTMLstr13[] PROGMEM = "ms2.innerHTML = event.data;});\r\n";
const char HTMLstr14[] PROGMEM = "function fnc1(){source.close();}\r\n";//STOPボタンを押したら切断する関数
const char HTMLstr15[] PROGMEM = "</script></head><body><form>\r\n";
const char HTMLstr16[] PROGMEM = "<FONT size=\"4\">\r\n";
const char HTMLstr17[] PROGMEM = "analog A0<div id=\"msgs1\">msg1</div>\r\n";
const char HTMLstr18[] PROGMEM = "analog A1<div id=\"msgs2\">msg2</div><br>\r\n";
const char HTMLstr19[] PROGMEM = "<input type=\"button\" id=\"SSE_stop\" value=\"SSE STOP\" onclick=\"fnc1()\">\r\n";
const char HTMLstr20[] PROGMEM = "</form></body></html>\r\n";
//2次元配列は使えないので、こういうやり方になるらしい。
const char* const HTML_table[] PROGMEM = {
  HTMLstr00, HTMLstr01, HTMLstr02, HTMLstr03, HTMLstr04,
  HTMLstr05, HTMLstr06, HTMLstr07, HTMLstr08, HTMLstr09,
  HTMLstr10, HTMLstr11, HTMLstr12, HTMLstr13, HTMLstr14,
  HTMLstr15, HTMLstr16, HTMLstr17, HTMLstr18, HTMLstr19,
  HTMLstr20
};
//ここからブラウザへの1回目のHTTPレスポンス関数
void HTTP_response(byte ipd_no)
{
  int html_length = 0;
  char HTML_buffer[100];
  
  //一旦フラッシュメモリから読み出し、HTMLの文字数を計算
  for (int i = 0; i < 21; i++){
    strcpy_P(HTML_buffer, (char*)pgm_read_word(&(HTML_table[i])));//内蔵フラッシから読み出してSRAMに格納
    html_length += strlen(HTML_buffer);
  }
  ESP8266_Serial.print(F("AT+CIPSEND=")); //文字送信コマンド。
  ESP8266_Serial.print(ipd_no); //--------Client IDをかならず付ける
  ESP8266_Serial.print(',');
  ESP8266_Serial.print(html_length); //HTMLのバイト数を送る
  ESP8266_Serial.print(F("\r\n"));
  Serial.readStringUntil('>');  //この記号がWROOMから返ってきたら送信スタンバイOKとなる
  
  for (int i = 0; i < 21; i++){
    strcpy_P(HTML_buffer, (char*)pgm_read_word(&(HTML_table[i])));//内蔵フラッシから読み出してSRAMに格納
    ESP8266_Serial.print(HTML_buffer);
  }  
  ESP8266_Serial.print(F("\r\n"));
  Serial.find("OK");//WROOMからOKが返ってきたら1行送信完了
  
  ESP8266_Serial.print(F("AT+CIPCLOSE="));//ここでクローズしないと、ブラウザがフリーズする
  ESP8266_Serial.print(ipd_no); //--------Client IDをかならず付ける
  ESP8266_Serial.print(F("\r\n"));
  Serial.println(F("Connection Close"));
}

//**********************Server-Sent Events レスポンス関数**************
void SSE_Responce(byte ipd_no)
{//Arduino の analogReadの値をブラウザへ1000回送ったらコネクション切断
  String sse_resp;
  //ストリーム配信をブラウザが認識するためのレスポンス
  sse_resp = "HTTP/1.1 200 OK\r\n";
  sse_resp += "Content-Type:text/event-stream\r\n";//SSE使用時に必ずサーバー側からブラウザへこれを返す
  sse_resp += "Cache-Control:no-cache\r\n";
  sse_resp += "\r\n";
  sse_resp += "\0";
 
  ESP8266_Serial.print(F("AT+CIPSEND=")); //文字送信コマンド。
  ESP8266_Serial.print(ipd_no); //--------Client IDをかならず付ける
  ESP8266_Serial.print(',');
  ESP8266_Serial.print(sse_resp.length()); //HTMLのバイト数も送る
  ESP8266_Serial.print(F("\r\n"));
  Serial.readStringUntil('>');  //この記号がWROOMから返ってきたら送信スタンバイOKとなる。
  ESP8266_Serial.print(sse_resp);
  ESP8266_Serial.print(F("\r\n"));
  Serial.readStringUntil('K');
  sse_resp = "";
  delay(1000);
  
  Voltage_Display(ipd_no);//以下の電圧値表示関数でブラウザにイベントを発生させる

  Serial.println(F("Connection Close"));
}

//***************電圧値表示関数*************************
long Voltage_Display(byte ipd_no)
{
  String sse_data;
  float sensorValue1 = 0;
  float sensorValue2 = 0;
  
  while(1){//無限ループ
    sensorValue1 = analogRead(A0);//アナログピンの値を一旦float型に変換
    sensorValue1 = (sensorValue1 / 1024) * 5;//電圧値を出す計算。analogReadは5Vは1024という整数値
    sensorValue2 = analogRead(A1);
    sensorValue2 = (sensorValue2 / 1024) * 5;

    sse_data = "event:msg_1\n";//ブラウザへ送るeventを発生させて改行コードをつける
    sse_data += "data:";//data:の後に送りたいデータをつける
    sse_data += String(sensorValue1);
    sse_data += " V\n\n";//改行コードは2回連続で必要。そうしないと次のeventが発生しない
    sse_data += "event:msg_2\n";
    sse_data += "data:";
    sse_data += String(sensorValue2);
    sse_data += " V\n\n";

    ESP8266_Serial.print(F("AT+CIPSEND=")); //文字送信コマンド。
    ESP8266_Serial.print(ipd_no); //--------Client IDをかならず付ける
    ESP8266_Serial.print(',');
    ESP8266_Serial.print(sse_data.length()); //sse_dataのバイト数をWROOMに送る
    ESP8266_Serial.print(F("\r\n"));
    if(Serial.find(">")==false){//'>'という文字が返ってくればOKだが、無いとエラーなので、ループを抜ける
      Serial.println("SSE STOP************");
      break;
    }
    ESP8266_Serial.print(sse_data);
    ESP8266_Serial.print(F("\r\n"));
    if(Serial.find("OK")){
      continue;
    }
    if(Serial.find("ERROR")){
      Serial.println("SSE STOP************");
      break;
    }  
  }
}

98行目の「WI-FIセットアップ関数」でご自分のルーターのSSIDとパスワードを入力してください。
そして、152行目のローカルアドレスをご自分のルーターで割り当てたアドレスに書き換えてください。

また、「HTTPレスポンスをブラウザに送信する関数」でルーターが割り当てたローカルIPアドレスを入力してください。

それと、先に述べたとおり、コンパイルするときにArduinoのデジタル0番ピンを抜いてからコンパイルし、終わったらまた0番ピンに挿すことを忘れないでください。

今回のスケッチの大きなポイントは、前回の記事で述べましたが、WROOM(ESP8266)との通信手段であるATコマンドで必要とされていたポート番号を 80番に固定 としたことです。

スマホのURLアドレス入力欄にポート番号を 192.168.0.21:1001 などと入力するとServer-Sent Eventsがうまく動いてくれなかったのです。
ですから、試しにポート番号を入力しなくて済むように80番にしたら、難なく動いてくれました。 なぜだかはサッパリわかりません。 解る方がいらっしゃったら、是非ともご連絡いただきたいです。

次に大きなポイントは、ブラウザへレスポンスするHTML文字列が多く、ArduinoUNOではとてもとてもSRAMが足りません。 そこで、Google+の電子工作部というコミュニティーで、Jさんから解決策をいただきました。 つまり、 Serial.print(“text”); という従来の表示関数を Serial.print(F(“test”)); という感じでFマクロでテキストをくくるということで、かなりのメモリ削減ができました。

そして、Arduinoに内蔵してあるフラッシュメモリにHTMLテキストを格納するPROGMEM構文を使うことで、さらに劇的にメモリーが減りました。 こんな長いプログラムで、プログラムストレージ38%、グローバル変数24% で済みました。

いやぁ~~、素晴らしい!! Jさんに感謝、感謝、感謝です。 いずれ、過去のサンプルスケッチもこれに変えて修正していきたいと思います。

これだけ減れば、UNOでJavaScriptのCanvas要素を使うこともできそうです。 それはまた次回に紹介したいと思います。 プログラムの詳細な解説は割愛させていただきますが、私の過去の記事を読み返していただいて、シリアルUART通信のATコマンドのやり取りを理解していただければと思います。 ざっと簡単に言うと、

  1. Wroomにリセット信号を送信してリセット。
  2. シリアル信号を検知し、”WIFI”という文字が返ってきたらWROOMセットアップ開始。
  3. セットアップ完了したら、スマホブラウザのURLにWROOMのローカルアドレスを入力して、GETリクエストする。
  4. ArduinoからWROOMを通してGETレスポンスを返し、一旦切断
  5. Chromeの場合はすぐにブラウザからfavicon要求してくるので、それを利用して、Server-Sent Event のストリームレスポンスを返す。
  6. ブラウザがEventSourceのデータ待ち状態になる
  7. 3秒後にEventSource のデータとして、Arduinoからanalog INの電圧値をブラウザへ連続送信
  8. ブラウザからストップボタンが押されたら強制的にServer-Sent Eventsの切断

もし、わからないことがあれば、お問い合わせいただければお答えします。 では、実際にまずArduinoUNOとESP-WROOM-02(ESP8266)とのATコマンドセットアップのシリアルモニター表示はこんな感じになります。

以前の記事であった文字化けはすっかり解消していますね。 ATコマンドレスポンスもかなりサクサクスムースで、ストレス無しです。 ArduinoのシリアルモニターでWROOMからの全てのレスポンス文字を確認しようとすると、メモリーが足りなくなるので、最低限の検知だけにしました。 Serial.find(“OK”); Serial.readStringUntil(‘>’); という便利な関数がありますね。

でも、これの欠点は一度使ってしまうと、その文字列は捨てられてしまうので、他の検知には使えません。 この関数の情報があまりネットに出ていないので、使い方が分かるまで結構悩みました。

では、セットアップが完了したら、ブラウザのURL入力欄にポート番号無しで入力します。 上記の動画を見ていただければわかるのですが、普通に 192.168.0.21 と入力するだけです。

ここで、スマホLED点灯記事でも紹介しましたが、WROOMが勝手にスマホなどのデバイスにID番号を割り当てるので、その番号を取得しておかねばなりません。

その番号を使ってCLOSEコマンドでコネクションを切断します。 それでないと切断できないのが不便ですね。 HTMLを受信したら、一旦コネクションを切断しなければなりません。

以前の有線LANでServer-Sent Eventsを扱った記事 →ArduinoからiOSやAndroidブラウザへリアルタイムデータ通信(Server-Sent Events使用)ができました。 で説明しましたが、 Server-Sent Events はレスポンスするファイルとEventデータを送信するプログラムを同じHOSTに置かなければならないという前提があります。

そこで、ArduinoがGETレスポンスするサーバーとEventデータを送信するサーバーを兼ねる2役をやるわけです。

ですから、一旦コネクションを切断して再度Eventデータを送信するわけです。 幸い、クライアントのブラウザ側はいつまでもEventSourceのデータ待ち状態になるのでこういうことが可能になるのです。

ということで、ブラウザからGETリクエストした状況のArduinoシリアルモニターはこういう表示になります。

一旦コネクションを切断したことが解ると思います。
そうしたら、EventSourceデータをArduinoが永遠に送信し続けます。
ブラウザは何もしないと永遠に受け続けるので、バッテリーをかなり消耗しますのでご注意を・・・。

ちなみに、ESP-WROOM-02(ESP8266)のTXピンから別のUSBシリアルモジュールを使って、Tera Termというフリーソフトで返って来るコマンドを確認したものがこんな感じです。

Arduinoからデータを送るたびにWROOMから”SEND OK”というレスポンスが返っていることが解ると思います。
こんなやり取りしてたら、さぞかしデータの取りこぼしや遅れが発生するだろうと思ってしまいますが、意外や意外、前回の記事の動画をみていただければ解りますが、かなりリアルタイムに追従して、取りこぼしもありません。
結構スムースでした。

ということで、ここまでできれば、かなりいろいろな応用ができます。
データロガーやカラフルなグラフなどいろいろ夢が広がりますね。

気になるのは、WROOM本体に直接にArduinoスケッチをコンパイルできる機能があることです。 今まで、WROOMはWi-Fiモジュールとして、ATコマンドで動作させてましたが、それが一切無しでいけるそうなのです。

でも、WROOMのメモリ以上のことはできませんが・・・。
ただ、気になるのは、どれだけのメモリーが許容できるのだろうということです。
ライブラリをダウンロードして使うと結構メモリを食うのではないかと思うのですが・・・。
ネットではかなり情報があるので、近々試してみたいと思います。

今回はここまでです。
これが何かのお役に立っていただけたら幸いです。
では、また・・・。

最近は ESP-WROOM-02 ( ESP8266 )をさらに使い易くした ESPr Developer を使っています。
USB-シリアル変換、余裕のある容量の電源レギュレーター、ロジックレベル変換をパッケージにした ESP-WROOM-02 開発ボードです。
Wi-Fi通信が安定して実現できるので、超お勧めです。
Arduino などのハードウェア不要です。
こちらの記事も合わせてご覧ください。
https://www.mgo-tec.com/blog-entry-ss-wroom-howto01.html

その他、以下の記事では Wi-Fi 双方向通信したり、画像を転送したりもできてしまいました。
https://www.mgo-tec.com/blog-entry-jr-train-message-board-01.html
https://www.mgo-tec.com/blog-entry-easywebsocket-beta13.html
https://www.mgo-tec.com/blog-entry-wroom-esp8266-bme280-ssd1351-sd.html
https://www.mgo-tec.com/blog-entry-neopixel-paper-illumination01.html

Amazon.co.jp 当ブログのおすすめ

スイッチサイエンス ESPr Developer 32 Type-C SSCI-063647
スイッチサイエンス
¥2,420(2024/03/28 13:45時点)
ZEROPLUS ロジックアナライザ LAP-C(16032)
ZEROPLUS
¥22,504(2024/03/27 20:02時点)
Excelでわかるディープラーニング超入門
技術評論社
¥1,700(2024/03/28 09:40時点)

コメント

  1. nishioka.sst より:

    記事を参考にさせていただいています。
    図が豊富で、とてもわかり易いです。素晴らしいです。
    ESP8266を使って何か応用したいと思っています。
    Server-Sent Eventsはとても興味深いですね。
    記事を参考に、ESP8266だけで実現できないか調べています。
    上手く行きましたらお知らせします。

  2. mgo-tec より:

    記事をお読みいただき、ありがとうございます。
    とても素晴らしいと言える記事ではなく、とりあえず動作したらアップしているので、サンプルスケッチが未熟だったりしていて逆に申し訳ございません。
    ちょくちょく過去の記事を修正しています。
    実は、ESP-WROOM-02(ESP8266)単体でESP8266 for Aruduino IDEを使って、Server-Sent Eventsは私の方では既に動作しているんです。まだ、記事アップにまで至ってませんが、もうじきアップする予定です。
    ただ、ESP8266単体のADコンバーターは1回路しかなく、しかも1Vまでしか対応していないので、殆ど使えません。
    新たに外部ADコンバーターを増設しなければならないと思っています。それかSPIかI2C通信ですね。
    なかなかオールインワンとはいきませんね。
    もし、SSE通信が成功したらぜひご報告お待ちしております。私もまだまだ試行錯誤中なので、いろいろと参考にしたいです。

  3. nishioka.sst より:

    nishioka.sstです。ご返事ありがとうございます。
    あれから記事を参考にして、先ずEVENTが起こるまでを目指して簡単なプログラムを作りいろいろ試しましたが、起きないですね。原因は、HTTPリクエスト、レスポンスを理解していないこと、細かなタイミング、改行改行・・良くわかってないです。
    諦めず続けます。でもお陰さまでだんだん理解が進んでいるような気がします。
    ESP8266のプログラムをアップされたのですね。動きました。すごいです。
    ADコンバーター、SPI、I2Cは役に立つと思います。
    実験でSDカードをESP8266に接続しました。これらは上手くいっています。
    またお知らせします。

  4. mgo-tec より:

    記事をお読みいただきありがとうございます。
    私も実はHTTPやHTML、JavaScriptはまだまだ勉強中なのでございます。
    C言語も実はまだまだ未熟で、知らないことが多々ありまして、プロの方から見るとダメ出しされそうです。
    >ADコンバーター、SPI、I2Cは役に立つと思います。
    >実験でSDカードをESP8266に接続しました。これらは上手くいっています。
    おお・・・! それはスゴイですね。SPIはまだまだ未知です。
    SPI通信のADコンバーター最近購入したので、これから試してみたいと思います。

  5. たけさん より:

    丁寧な記事で読み応えがありますね。電圧を計るものを作りたいなと思っていたところで、今度作ってみるときに参考にしたいと思います。

    WROOMに付けるボード、3.3V to 5V ロジック変換とリチウムバッテリー充電付きで3.3V と 5V を出せる回路が入ったものがあると便利そうですね。

    また遊びにきます!

    • mgo-tec mgo-tec より:

      たけさん

      記事をお読み頂きありがとうございます。
      まだブログ移設の細かい設定が終わっておらず、プログラムが読み辛くなっている状態で、申し訳ございません。

      リチウムイオンバッテリーの3.3V、5Vは今まさに欲しい物ですね。手頃なモノがいつか出てくることを願って止みません・・・。

  6. yoshi より:

    初めまして、yoshiです。
    丁寧で分かりやすい記事なので、大変喜んでいます。
    しかしながら、素人ですので、わからないところが、沢山あります。宜しくお願い致します。
    #include
    このライブラリーのダウンロード先が、いろいろ探したのですが、
    分かりません。
    ご教授ください。

    • mgo-tec mgo-tec より:

      yoshi さん

      ブログにお越しいただき、ありがとうございます。

      かなり昔に作って、最近は Arduino 純正ハードウェアを使っていなかったので、探すのに時間がかかってしまいました。

      ここのブログ記事で紹介しているソースコードでincludeされているライブラリは、Arduino IDE に予め入っているものです。
      ですから、そのままコンパイル書き込みすればOKです。

      ただATコマンドは、ちゃんと動作させるにはかなり難しいです。
      ESP-WROOM-02 に直接 Arduino スケッチを書きこんだ方が早いし簡単です。
      ブログを読み進んでいただけると、その方法も書かれていますので、よろしかったら参照してみてください。

      • yoshi より:

        早速のご返事、有難う御座います。
        赤外線センサーの変動する値をESP-WROOM2のシリアルモニタで確認するのは、出来るのですが、それをスマホで見たいと感じるようになりました。
        この参照スケッチの電圧値表示関数をどのように修正すれば、いいのか分かりません。
        exturn “C”……を利用して、出来そうなのは、なんとなく
        分かりました、
        もし、可能であれば、ご教授ください。
        ご無理いいます。

        • mgo-tec mgo-tec より:

          しばらく、Arduino UNO や AT コマンドは使っていないので動くかどうか分かりませんが、スケッチの 242~245行の sensorValue1 や sensorValue2 に読み込んだセンサー値を代入すれば表示されると思います。
          試してみて下さい。

  7. yoshi より:

    いつも大変お世話になっております。
    「WROOM と Arduino で Wi-Fi ストリーミング 電圧計 作ってみました」
    (arduino uno+esp8266+FXMA108)で回路作成して、arduinoにスケッチを
    コンパイル書き込みしました。
    Wait.
    ESP-WROOM-02 Serial Boot OK!
    … 
    この場所で止まったまま進行しません。
    アドバイスお願いできませんでしょうか

    • mgo-tec mgo-tec より:

      しばらく ATコマンド使っていないので、すぐに検証できませんが、まずお聞きしたいのは、お持ちの ESP-WROOM-02 で ATコマンドは使える状態でしょうか?
      最新の ESP8266 では、ATコマンドが廃止されたということを聞いたような気がしたもので、ちょっと気になっています。

タイトルとURLをコピーしました