Arduino – ESP32 で、3つの SPI 通信 OLED ディスプレイ に Twitter Trend データを 表示させてみた

ESP32 ( ESP-WROOM-32 )

Arduino core for ESP32 のインストールおよび設定

事前に、Arduino IDE をパソコンにインストールしておき、Arduino core for ESP32 をインストールしておきます。
Arduino IDE は 1.8.5 で動作確認しております。
Arduino core for ESP32 は最新版をインストールしておいてください。
インストール方法は以下の記事を参照してください。

Arduino core for the ESP32 のインストール方法

ESP-WROOM-32 の SPIFFS メモリサイズを増やしておく

事前に、ESP-WROOM-32 の SPIFFS ファイルシステムのメモリサイズを増やしておきます。
16×16 pixel の日本語漢字、東雲フォントは、デフォルト設定では大きすぎて入らないからです。
以下の記事を参照してサイズアップしておいてください。

ESP-WROOM-32 ( ESP32 ) SPIFFS メモリサイズを大きくする方法

東雲フォント、UTF8→Shift_JIS 変換テーブルファイルをダウンロードしておく

東雲フォントは、古川泰之さん作のビットマップフォントで、/efont/ (電子書体オープンラボ) が保守開発をしたものです。
ライセンスは Public Domain で、 フリーです。
私たちの様なアマチュア電子工作家にとっては、とっても有難い神様のようなフォントです。
このような素晴らしいフォントを無料で使えることに、つくづく感謝したいと思います。

これについては、以下の記事で紹介しているので参照してください。

ESP32 で 日本語漢字フォント をカラー OLED に表示させ、4行同時スクロール

その記事を参照して、以下の3つのファイルをダウンロードして、パソコンに保存しておいてください。

Utf8Sjis.tbl

UTF-8 から Shift_JIS へ変換するためのテーブルファイルです。
私の自作のバイナリファイルです。

shnmk16.bdf

16×16 東雲フォント(全角)

shnm8x16.bdf

8×16 東雲フォント(半角)
ファイル名の ”r” を削除して、8文字に収めたものです。

ESP32 用 SPIFFS アップローダープラグインをインストールしてフォントファイルをアップロードしておく

Arduino IDE 用の ESP32 SPIFFS ファイルアップローダープラグインをインストールしておいてください。

インストール方法は以下の記事を参照してください。

ESP-WROOM-32 ( ESP32 ) SPIFFS アップローダープラグインの使い方

そして、上記の3つのフォントファイルを、SPIFFS アップローダープラグインを使って、ESP-WROOM-32 のフラッシュメモリにアップロードしておいてください。
アップロードはルート上でOKです。

アップロードする際は、シリアルモニターは閉じておかないとエラーになりますので気を付けてください。

Time ライブラリをインストールしておく

Arduino 標準の Time ライブラリをインストールしておいてください。
インストール方法は以下の記事を参照してください。

Web News記事自動取得 OLED ( 有機EL )ミニ電光掲示板に16×16フリー日本語フォント( 東雲 ) を使う

ダウンロードした ZIP ファイルを Arduino IDE にインストールする方法は以下の記事を参照してください。

GitHubにある ZIP形式ライブラリ のインストール方法 ( Arduino IDE )

自作 ライブラリのインストール

ライブラリ ESP32_SSD1331 の最新バージョンをアップロードし忘れておりました。
GitHub の以下のリンクにありますので、ZIPファイルをダウンロードして、Arduino IDE にインストールしておいてください。
なお、古いライブラリは必ずフォルダごと削除してからインストールしてください。
申し訳ございませんでした。
m(_ _)m

https://github.com/mgo-tec/ESP32_SSD1331
(2017/12/31)

前回の記事を基に、私自身が Arduino core for ESP32 用ライブラリを新たに作りました。
そして、今回から、Arduino – ESP32 SPIFFS 用の 東雲フォントライブラリと、Gadget ライブラリも新たに作りました。

私の様なアマチュア独学プログラマは、永遠にベータバージョンの試作ライブラリです。
ハッキリ言って素人コードだと思います。
一切動作保証しません。
十分ご理解の上、使ってみてください。

GitHub の以下のリンクにアップしています。
ZIPファイルをダウンロードしてください。

※古いライブラリは予めフォルダごと削除してからインストールしてください

ESP32_TwitterAPI library

https://github.com/mgo-tec/ESP32_TwitterAPI

ESP32_SPIFFS_ShinonomeFNT

https://github.com/mgo-tec/ESP32_SPIFFS_ShinonomeFNT

ESP32_SSD1331 beta ver 1.5

https://github.com/mgo-tec/ESP32_SSD1331

ESP32_SPIFFS_SSD1331_Gadgets

https://github.com/mgo-tec/ESP32_SPIFFS_SSD1331_Gadgets

ZIP形式ファイルの Arduino IDE へのインストール方法は以下の記事を参照してください。

GitHubにある ZIP形式ライブラリ のインストール方法 ( Arduino IDE )

 

Twitter API の登録、および認証キーの取得

事前に、Twitter API の登録を済ませておいて、認証キーを取得しておいてください。
方法は前回の記事で紹介しましたので参照してください。

Twitter API から Arduino – ESP32 を使ってトレンドツイートを取得してみた

必要なキーは以下の4つです。

consumer_key
consumer_secret
access_token
access_secret

Arduino IDE にスケッチ(ソースコード)を入力

さて、ようやくスケッチの入力です。
初めての方は、ここまでくる工程がエライ面倒だと思います。
お察しします。

では、以下のスケッチを入力してみてください。
自作ライブラリを予めインストールしたおかげで、メインのソースコードはかなり簡単になりました。

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

#include "ESP32_TwitterAPI.h"
#include "ESP32_SPIFFS_SSD1331_Gadgets.h"

const char *ssid = "xxxxx"; //ご自分のルーターのSSIDに書き換えてください。
const char *password = "xxxxx"; //ご自分のルーターのパスワードに書き換えてください。

const char consumer_key[]    = "xxxxxxxx";
const char consumer_secret[] = "xxxxxxxxxxxxxxxxxxxx";
const char access_token[]    = "xxxxxxxxxxxxxxxxxxxx";
const char access_secret[]   = "xxxxxxxxxxxx";

//Twitter api root CA
const char* root_ca = 
"-----BEGIN CERTIFICATE-----\n" \
"MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\n" \
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" \
"d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\n" \
"ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\n" \
"MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\n" \
"LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\n" \
"RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm\n" \
"+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW\n" \
"PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM\n" \
"xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB\n" \
"Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3\n" \
"hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg\n" \
"EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF\n" \
"MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA\n" \
"FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec\n" \
"nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z\n" \
"eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF\n" \
"hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2\n" \
"Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\n" \
"vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep\n" \
"+OkuE6N36B9K\n" \
"-----END CERTIFICATE-----\n";

const char *twit_host        = "api.twitter.com";
const char *twit_URL         = "https://api.twitter.com/1.1/trends/place.json";
const char *twit_URI         = "/1.1/trends/place.json";
const int httpsPort           = 443;

String woeid = "23424856"; //WOEID ( Japan )

//-----------------------------------------------------------------
const char* UTF8SJIS_file = "/Utf8Sjis.tbl"; //UTF8 Shift_JIS 変換テーブルファイル名を記載しておく
const char* Shino_Zen_Font_file = "/shnmk16.bdf"; //全角フォントファイル名を定義
const char* Shino_Half_Font_file = "/shnm8x16.bdf"; //半角フォントファイル名を定義

const uint8_t SCLK_OLED =  14; //SCLK
const uint8_t MOSI_OLED =  13; //MOSI (Master Output Slave Input)
const uint8_t MISO_OLED =  12; //これは実際は使っていない。MISO (Master Input Slave Output)
const uint8_t DC_OLED =  21; //OLED DC(Data/Command)
const uint8_t RST_OLED =  4; //OLED Reset

const uint8_t CS1_OLED = 16;
const uint8_t CS2_OLED = 15;
const uint8_t CS3_OLED = 27;

WiFiMulti wifiMulti;

ESP32_SSD1331 _ssd1331(SCLK_OLED, MISO_OLED, MOSI_OLED, CS1_OLED, DC_OLED, RST_OLED);
ESP32_SPIFFS_ShinonomeFNT _SFR;
ESP32_WebGet _EWG;
ESP32_SPIFFS_SSD1331_Gadgets ESSG;
ESP32_TwitterAPI ETwit;

enum MAXDATA { Display_MaxData = 4, Get_MaxData = 12 , MaxTxt = 100 };

String utf8_str[Get_MaxData];
uint8_t font_buf[Get_MaxData][MaxTxt][16] = {0};
uint8_t sj_txt[Get_MaxData][MaxTxt]; //Shift_JISコード格納
uint16_t sj_length[Get_MaxData] = {0}; //Shift_JISコードの長さ

uint32_t LastTime = 0;
bool WebGet[12] ={false, false, false, false, 
                  false, false, false, false,
                  false, false, false, false}; //TweetをGETした場合はtrue
//トレンドデータ毎の文字色
uint8_t disp_color[Get_MaxData][3] = {{7, 0, 0},{0, 7, 0},{7, 7, 0},{0, 0, 3},
                                      {7, 0, 3},{0, 7, 3},{7, 7, 1},{2, 3, 3},
                                      {7, 7, 3},{7, 2, 1},{1, 1, 3},{1, 5, 1}};
//一つのディスプレイに4行表示する場合の垂直位置
uint8_t disp_Y[4] = {0, 16, 32, 48};                           

//**********セットアップ関数************************
void setup(){
  Serial.begin(115200);
  delay(10);

  Serial.println();
  Serial.print(F("Connecting to "));
  Serial.println(ssid);

  wifiMulti.addAP(ssid, password);

  Serial.println(F("Connecting Wifi..."));
  if(wifiMulti.run() == WL_CONNECTED) {
      Serial.println("");
      Serial.println(F("WiFi connected"));
      Serial.println(F("IP address: "));
      Serial.println(WiFi.localIP());
  }
  delay(1000);

  //NTPサーバーから時刻を取得---------------------------
  _EWG.EWG_NTP_TimeLib_init(9, "time.windows.com"); //NTPサーバー取得初期化
  _EWG.NTP_OtherServerSelect(9); //NTPサーバーと接続できなかった場合、他のNTPサーバーと接続できるか試す関数

  _ssd1331.SSD1331_Init(false, CS1_OLED, CS2_OLED, CS3_OLED);
  _SFR.SPIFFS_Shinonome_Init3F(UTF8SJIS_file, Shino_Half_Font_file, Shino_Zen_Font_file); //ライブラリ初期化。2ファイル同時に開く

  _ssd1331.Display_Clear(CS1_OLED, 0, 0, 95, 63);
  _ssd1331.Display_Clear(CS2_OLED, 0, 0, 95, 63);
  _ssd1331.Display_Clear(CS3_OLED, 0, 0, 95, 63);

  Display_Waiting();

  ETwit.TwitterAPI_begin(twit_host);
  ETwit.TwitterAPI_Key_Set(consumer_key, consumer_secret, access_token, access_secret);

  if( ETwit.TrendTweet_Get(root_ca, twit_URL, twit_URI, woeid, Get_MaxData, utf8_str) == false ){ //ツイート取得
    Display_Failed();
  }else{
    for(int i=0; i<Get_MaxData; i++){
      WebGet[i] = true;
    }
    OLED_Display_Write();
  }

  LastTime = millis();
}
//**********メインループ**********************
void loop(){
  int i=0;

  if(millis() - LastTime > 180000){ //Tweet get every 3 minutes.
    Display_Waiting();

    if( ETwit.TrendTweet_Get(root_ca, twit_URL, twit_URI, woeid, Get_MaxData, utf8_str) == false ){ //ツイート取得
      Display_Failed();
    }else{
      for(i=0; i<Get_MaxData; i++){
        WebGet[i] = true;
      }
      OLED_Display_Write();
    }

    LastTime = millis();
  }

  for(i=0; i<4; i++){
    if(sj_length[i] > 12) ESSG.Scroll_1_line(CS1_OLED, disp_Y[i], i, disp_color[i][0], disp_color[i][1], disp_color[i][2], 20, sj_txt[i], sj_length[i], &WebGet[i]);
  }
  for(i=4; i<8; i++){
    if(sj_length[i] > 12) ESSG.Scroll_1_line(CS2_OLED, disp_Y[i-4], i, disp_color[i][0], disp_color[i][1], disp_color[i][2], 20, sj_txt[i], sj_length[i], &WebGet[i]);
  }
  for(i=8; i<12; i++){
    if(sj_length[i] > 12) ESSG.Scroll_1_line(CS3_OLED, disp_Y[i-8], i, disp_color[i][0], disp_color[i][1], disp_color[i][2], 20, sj_txt[i], sj_length[i], &WebGet[i]);
  }
}
//***********************************************************
void OLED_Display_Write(){
  uint16_t len1[Get_MaxData] = {0};

  int i=0;
  for(i=0; i<12; i++){
    sj_length[i] = _SFR.SjisShinonomeFNTread_ALL(utf8_str[i], sj_txt[i], font_buf[i]);

    if(sj_length[i] > 12 ){
      utf8_str[i] = utf8_str[i] + "  ";
      sj_length[i] = _SFR.SjisShinonomeFNTread_ALL(utf8_str[i], sj_txt[i], font_buf[i]);
      len1[i] = 12;
    }else{
      len1[i] = sj_length[i];
    }
  }

  _ssd1331.Display_Clear(CS1_OLED, 0, 0, 95, 63);
  _ssd1331.Display_Clear(CS2_OLED, 0, 0, 96, 63);
  _ssd1331.Display_Clear(CS3_OLED, 0, 0, 96, 63);

  for(i=0; i<4; i++){
    _ssd1331.SSD1331_8x16_Font_DisplayOut(CS1_OLED, len1[i], 0, disp_Y[i], disp_color[i][0], disp_color[i][1], disp_color[i][2], font_buf[i]);
  }
  for(i=4; i<8; i++){
    _ssd1331.SSD1331_8x16_Font_DisplayOut(CS2_OLED, len1[i], 0, disp_Y[i-4], disp_color[i][0], disp_color[i][1], disp_color[i][2], font_buf[i]);
  }
  for(i=8; i<12; i++){
    _ssd1331.SSD1331_8x16_Font_DisplayOut(CS3_OLED, len1[i], 0, disp_Y[i-8], disp_color[i][0], disp_color[i][1], disp_color[i][2], font_buf[i]);
  }
}
//******************************************
void Display_Waiting(){
  _ssd1331.Display_Clear(CS1_OLED, 0, 0, 95, 63);
  _ssd1331.Display_Clear(CS2_OLED, 0, 0, 96, 63);
  _ssd1331.Display_Clear(CS3_OLED, 0, 0, 96, 63);

  uint16_t len[2] = {0};
  uint8_t tmp_sj_txt[2][12];
  uint8_t tmp_font_buf[2][12][16];
  len[0] = _SFR.SjisShinonomeFNTread_ALL("Getting", tmp_sj_txt[0], tmp_font_buf[0]);
  len[1] = _SFR.SjisShinonomeFNTread_ALL("TwitterTrend", tmp_sj_txt[1], tmp_font_buf[1]);
  _ssd1331.SSD1331_8x16_Font_DisplayOut(CS1_OLED, len[0], 0, 16, 7, 0, 0, tmp_font_buf[0]);
  _ssd1331.SSD1331_8x16_Font_DisplayOut(CS1_OLED, len[1], 0, 32, 7, 0, 0, tmp_font_buf[1]);
  _ssd1331.SSD1331_8x16_Font_DisplayOut(CS2_OLED, len[0], 0, 16, 0, 7, 0, tmp_font_buf[0]);
  _ssd1331.SSD1331_8x16_Font_DisplayOut(CS2_OLED, len[1], 0, 32, 0, 7, 0, tmp_font_buf[1]);
  _ssd1331.SSD1331_8x16_Font_DisplayOut(CS3_OLED, len[0], 0, 16, 0, 0, 3, tmp_font_buf[0]);
  _ssd1331.SSD1331_8x16_Font_DisplayOut(CS3_OLED, len[1], 0, 32, 0, 0, 3, tmp_font_buf[1]);
}
//******************************************
void Display_Failed(){
  for(int i=0; i<Get_MaxData; i++){
    sj_length[i] = 0;
  }

  sj_length[0] = _SFR.SjisShinonomeFNTread_ALL(utf8_str[0], sj_txt[0], font_buf[0]);
  sj_length[4] = _SFR.SjisShinonomeFNTread_ALL(utf8_str[0], sj_txt[4], font_buf[4]);
  sj_length[8] = _SFR.SjisShinonomeFNTread_ALL(utf8_str[0], sj_txt[8], font_buf[8]);

  _ssd1331.Display_Clear(CS1_OLED, 0, 0, 95, 63);
  _ssd1331.Display_Clear(CS2_OLED, 0, 0, 96, 63);
  _ssd1331.Display_Clear(CS3_OLED, 0, 0, 96, 63);
}

【解説】

●1行目:
今回新たに自作した、Twitter API ライブラリのインクルードです。

●2行目:
今回新たに自作した、SPIFFS 専用の Gadgets ライブラリです。
このライブラリ内で、ESP32_SPIFFS_ShinonomeFNT.h や Utf8sjis ライブラリをインクルードしています。

●4-5行目:
ご自分のルーターの SSID と パスワードに書き換えてください。

●7-10行目:
Twitter API で取得した、ご自分の認証キーに書き換えてください。

●13-36行:
これは、https://apps.twitter.com/ のルートCA証明書です。
SSL通信には必須のものです。
これはこのままでも良いのですが、これの取得方法は以下の記事を参照してください。

Arduino – ESP32 WiFiClientSecure ライブラリで、安定して https ( SSL )記事をGETする方法

これは、将来的には SPIFFS へファイル化してしまっても良いですね。

●43行:
トレンドデータを取得する地域を日本全体としています。
これについては前回の記事を参照してください。

●46-48行:
UTF-8 → Shift_JIS 変換テーブルファイルと、東雲フォント全角、半角ファイルの定義です。

●50-58行:
ESP32 の HSPI インターフェースの GPIO 番号の定義です。
CS ( Chip Select )ピン以外は、3つの OLED 共通の信号線です。

●62-66行:
自作ライブラリのクラス初期化です。
特に、62-64行のアンダーバーのあるクラス名は、ライブラリ内で定義しているので、変えられません。

●68-73行:
東雲フォントを表示させるためには、UTF8の文字コードを Shift_JIS に変換する必要があるため、それに伴った配列を確保する必要があります。
ここは SRAM メモリをかなり消費するところなので、できるだけ節約したいところですが、今回は多めに確保しています。
MaxTxt は 100 もいらないかもしれませんね。

●76行目:
トレンドデータを GET したら、true に変える変数です。
12位まで取得します。

●80行目:
フルカラー OLED SSD1331 の、トレンドデータ毎の色を256色で指定しています。
RGB を混ぜて色を作ります。

赤:0~7
緑:0~7
青:0~3

●84行目:
一つのディスプレイに4行の文字を表示できますが、その垂直座標位置を決めています。
東雲フォントは 16ドットなので、16の倍数になっています。

●107-108行:
NTPサーバーから時刻を取得する自作ライブラリです。
108行では、接続できなかった場合、他のサーバーもトライしてみます。

●110行:
自作ライブラリ関数で、SSD1331 の初期化です。
ここが今回の重要ポイントです。

false としているのは、HSPI インターフェースのハードウェアCS動作をしない設定です。
HSPI や ハードウェアCSピンについては、以下の記事を参照してください。

ESP32 の SPI_MODE が修正。HSPI , VSPI , 複数SPIデバイス制御 , SPI高速化などについて

ハードウェアCSピンを使ってしまうと、表示の高速化は可能なのですが、複数の SPI デバイスを CSピンで切り替えて使うことができません。
そこで、この初期化で、ハードウェアCSピンを無効にして、digitalWrite関数を使って CSピンを切り替えています。

●111行:
SPIFFS ファイルを3つ同時に開く初期化です。
Arduino core for ESP32 のライブラリでは4つ以上のファイルを同時に開くと動かないかもしれないので、これ以上のファイルを開く場合には一旦閉じた方が良いかもしれません。
今回のスケッチでは関係ありませんが・・・。

●113-115行:
CSピンを切り替えて、ここのディスプレイを消去しています。

●117行:
ディスプレイで「Waiting」表示をさせています。
194-210で関数化しています。

●119-120行:
自作 Twitter API ライブラリ関数の初期化と、認証キーのセットです。

●122行:
日本全体のトレンドツイートを12位まで取得する自作ライブラリ関数です。
取得できない場合、false が返ってきます。

●128行:
ここで、OLED SSD1331 ディスプレイに文字を表示させています。
163-192行で関数化しています。

●134-161行:
メインループです。
137-150行で3分毎に Twitter API からトレンドデータを取得し、152-160行で、それぞれの OLED ディスプレイのトレンドデータが、半角12文字を超えた場合だけスクロールするようにしています。

●163-192行:
トレンドデータを取得したら、UTF-8文字列をShift_JISコードに変換して、16×16 pixel の東雲フォントを取得します。
それをそれぞれのディスプレイに固定表示させています。

●194-210行;
書くディスプレイに「Waiting」という文字列を表示させています。

●212-224行:
ここでは、Twitter API からトレンドデータを取得できなかった場合の表示させる文字列を東雲フォントに変換しています。

Wi-Fi環境の設定確認

スケッチをコンパイルする前に、ご自分のルーターを起動しておき、ESP-WROOM-32 ( ESP32 )がインターネットに接続できるように、Wi-Fiルーターの設定を予め済ませておいてください。

特に、最近、私自身も陥ったトラブルがあります。

Google Home や IoT家電が増えると、Wi-Fiルーターの設定で、接続できる DHCP 最大数をいつの間にか超えてしまっていて、IPアドレスが自動で割り当てられなくなっていたということがありました。
その場合は最大数を増やすか、使わない機器の電源を切り、ルーターを再起動してください。

また、MACアドレスフィルタリングの設定を見直すことも忘れないでください。

その他、Wi-Fiルーター自体のファイアウォール設定で、ESP32 が弾かれてしまっている可能性がありますので、それも確認しておいてください。

ESP-WROOM-32 ( ESP32 )の MAC アドレス等の確認方法は以下の記事を参照してください。

ESP-WROOM-32 ( ESP32 ) チップ・メモリ・MACアドレス情報取得方法

コンパイル書き込み実行

では、いよいよコンパイル書き込み実行をしてみてください。

間髪入れずに、シリアルモニターを 115200bps で起動するとこんな感じで表示されればOKです。

あとは、記事の冒頭で紹介した動画のようにディスプレイに表示されればOKです。

最初でも言いましたが、ペーパー(紙)を適当にカットして、下図の様に立てかけるだけで、それなりのオブジェになりますね。

半角の12文字を超える場所が、ツイートを取得する度に変化するので、見ていて面白いですね。

まとめ

どうでしょうか?

うまく動きましたでしょうか?

今回は我ながらイイ感じのオブジェができたと思いました。
これに加えて、Yahoo RSS ニュース電光掲示板を表示させておくと、ニュースとツイートトレンドがマッチして、ホントに今現在日本で何が起こっているか、一発で把握できますね。

3分毎のトレンドデータ取得なので、地震の検知は無理ですね。
Twitter API で急上昇したツイートというデータを取得できれば、自身の検知もできそうな気がします。

ということで、今回はここまでです。
ここまで出来れば、Google Home にトレンドデータを喋らせることはそれほど難しくないので、記事書くの止めようかなぁ・・・。

ではまた・・・。

コメント

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