ESP32 OLED ニュース、天気予報写真

ESP32 と 有機EL SSD1331 で Yahoo News 、 天気予報 、 NTP 時計 Wi-FI ガジェットを作ってみた

記事公開日:2017年6月8日
最終修正日:2017年8月2日

スポンサーリンク

Arduino core for ESP32 が大幅アップデートされたため、自作ライブラリもアップデートしました。
最新版をダウンロードしてください。
そして、以下の記事で ESP32 の CPU デュアルコア対応にしましたので、合わせてご覧ください。
Yahoo ニュース、天気予報、NTP時計ガジェットを ESP32 マルチタスク ( デュアルコア )で動かしてみた
(2017/8/2)

こんばんは。

前回までの記事では、ESP32 – DevKitC ( ESP-WROOM-32 開発ボード ) と フルカラー 有機EL ( OLED )  SSD1331を使った、NTP時計やフォント表示などをやってきましたが、今回からはそれらを全て合体して、普段の生活や仕事で必要な Wi-Fi ガジェット を作ってみました。

Wi-Fi 定期自動取得して表示させるものは、こんな感じです。

●Yahoo! Japan RSS ニューストピックストップ記事
●年月日、曜日
●NTPサーバー、定期自動補正ウォッチ
●今日と明日の天気予報

OLED SSD1331 は 96×64 pixel なので、16×16ドットの日本語表示幅では4列で別々のガジェットを表示できます。

まず、動作動画をご覧ください。

いかがでしょうか。
ESP8266 ではなかなかここまでの情報を同時にスムースにスクロールすることはできませんでしたが、流石にESP32 ( ESP-WROOM-32 )はスゴイですね。

今までの日本語フォント表示やスクロール、天気予報表示では、プログラムがゴチャゴチャしていて、私自身も使い辛かったので、今回はできるだけライブラリ化して、Arduino スケッチ上ではできるだけシンプルになるようにしてみました。
ただ、素人の即席自作ですので、動作は保証しません。
今回は見切り発車的なリリースですので、ご了承ください。

Web から 定期的に記事を GET していると、しばらく経つとフリーズしているということがあります。
これの原因はまだ不明です。
ESP32 – DevKitC に供給する電源に問題があるかも知れないですし、私のプログラムミスかも知れません。
もし、解る方がいらっしゃったら、コメント等でご連絡いただけると助かります。

2017/8/2 に Arduino core for ESP32 が大幅アップデートされ、フリーズしなくなりました。
今後はできるだけこれらのライブラリ群を修正していきたいと思っていますが、いろいろと忙しく、なかなか手が回らない状況ですので、ご容赦ください。
(このブログを維持するのが、とっても辛くなってきました・・・。)

では、泣き言はこれくらいにして、これについて説明していきたいと思います。

準備するもの

前回の記事と同じデバイスですが、初めてこのページを見る方のために念のため説明しておきます。

ESP32 – DevKitC ( ESP-WROOM-32 開発ボード )

私は秋月電子通商さんで購入しましたが、Amazonさんでも以下の販売店にありました。

カラー OLED SSD1331 モジュール

秋月電子通商さんに Pmod という製品でありました。
これの、VCCEN と PMODEN 端子をHIGH にプルアップすれば同じように使用できます。
出所がしっかりしているので、信頼性はありますね。

http://akizukidenshi.com/catalog/g/gM-11560/

Amazon.co.jpでは現在中国販売店しかありません。
値段が安いところもありますが、品質は正直言って分かりません。
スイマセン。

SparkFun マイクロSDカードスロット・ピッチ変換基板

これはピンヘッダは別売りです。別途ハンダ付けしてください。

micro SDHC カード

私が使って動作確認が取れている micro SDHC カードは以下のものです。


1/4W 10kΩ程度の固定抵抗 2つ

ブレッドボード、ジャンパーワイヤーパソコン、USBケーブル等

ESP32 – DevKitC と接続する

前回までの記事と全く同じです。
micro SDHC カードスロットは VSPI 接続。
OLED SSD1331 は HSPI 接続です。

もし、micro SDHC カードの読み取りや書き込み不良があれば、SCK や CSピンもプルアップしてみてください。

HSPI_VSPI_20

Arduino IDE の設定

Arduino IDE は 1.8.2 を使用してください。
そして、Arduino core for the ESP32 は必ず最新版をダウンロードして、get.exe を実行してインストールしてください。
古いと WiFi に接続できなかったりすることがあります。

Arduino core for the ESP32 のインストール方法は以下のページを参照してください。

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

自作ライブラリのダウンロード

Arduino core for ESP32 が大幅アップデートされたため、自作ライブラリもアップデートしました。
最新版をダウンロードしてください。
(2017/8/2)

Arduino core for the ESP32 用に私が自作したライブラリ群です。
今回のガジェットを作るにあたり、旧ライブラリも少々修正したり、関数を追加していますのでお気を付けください。
以下のGitHub リンクから、ZIP ファイルをダウンロードしてください。
後で述べますが、インストールする前に、必ず旧ライブラリをフォルダごと削除してインストールしてください

ESP32_SD_UTF8toSJIS Beta ver 1.21

今回 Beta ver 1.21にバージョンアップしました

GitHub の以下のページにあります。

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

これは、UTF-8 文字コードから Shift_JIS へ変換するライブラリです。
以下の私の自作テーブルファイルが必要です。

Utf8Sjis.tbl

これは後で述べるリンクからダウンロードできます。

ESP32_SD_ShinonomeFNT Beta ver 1.21

今回 Beta ver 1.21にバージョンアップしました

GitHub の以下のページにあります。

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

UTF-8コードのString 文字列から直接東雲フォントをSDカードから読み込むライブラリです。

ESP32_SSD1331 Beta ver1.3

今回 Beta ver 1.3とバージョンアップしました
GitHub の以下のページにあります。

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

文字フォントを右から左へスクロールする関数をできるだけ簡素化してみました。

ESP32_WebGet Beta ver 1.1

GitHub の以下のページにあります。

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

今回新たに作ったライブラリです。
要するに、Web から情報を取得する関数があります。

また、NTP サーバーから時刻をGET する関数も盛り込みました。

因みに、Yahoo! RSS サイトから記事を取得するには個人利用のみ無料です。
それ以外の利用および商用ライセンス等はそれぞれの記事取得サイトにお問い合わせください。

ESP32_SD_SSD1331_Gadgets Beta ver 1.1

GitHub の以下のページにあります。

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

今回新たに作ったライブラリです。
上記のライブラリを全てまとめて、ガジェット的に関数化したものが入っています。

TimeLib ライブラリのダウンロード

Arduino 標準 Time ライブラリは 2017/6/8 時点で ver 1.5 です。
これのインストール方法は以下のページを参照してください。

https://www.mgo-tec.com/blog-entry-1616shinonome-ws-oled-news.html

ダウンロードしたZIP形式ライブラリのインストール

GitHub からダウンロードしたライブラリは以下のページを参照して、 Arduino IDE にインストールしてください。
ただ、インストールする前に、以前インストールした古いライブラリはフォルダごと削除してからインストールしてください
Windows 10 の場合は以下のフォルダにあります。

C:\Users\ご自分のユーザー名\Documents\Arduino\libraries

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

日本語漢字フォントおよびテーブルファイルのダウンロード

前回と同様ですが、念のために説明しておきます。
フォント類はGitHub の以下のページにあります。

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

ZIPファイルをダウンロードして、解凍してください。
font フォルダの中の以下の3つのファイルが必要です。

これらを micro SDHC カードのルートに /font というフォルダを作成し、そこにコピーしておいてください。

Utf8Sjis.tbl

UTF-8 から Shift_JIS へ変換するためのテーブルファイルです。
私の自作のバイナリファイルです。
ライセンスは MIT です。
著作権表記してあれば、自由に使うことができます。

shnmk16.bdf

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

shnm8x16.bdf

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

天気予報ロゴ自作フォントファイルのダウンロード

以下の記事で自作した天気予報ロゴや、数値、曜日のフォントファイルを使います。

天気予報を自作フォントで表示してみた

エクセル で 16 x 16 ドットフォントを自作して、フルカラー 有機EL ( OLED ) 時計を作ってみた

MyFont.fnt

これは記事を見ながら作成しても良いのですが、面倒な人は GitHub の以下のページにありますので、ダウンロードして使ってみてください。

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

micro SDHC カードにフォントをコピーしておく

micro SDHC カードに上記のフォントファイルをコピーします。

micro SDHC カードのルートに /font フォルダを作成して、以下の4つのファイルをコピーしておいてください。

Utf8Sjis.tbl
shnmk16.bdf
shnm8x16.bdf
Myfont.fnt

Micro SDHC カードは、殆どが予め FAT32 で初期化されていますが、フォーマットされていない場合は以下のページを参照してください。

micro SD 、micro SDHC カードの初期化(フォーマット)方法

Arduino IDE スケッチの入力

では、いよいよ以下のスケッチを入力してみてください。
大分簡単なスケッチになっていると思います。
ライブラリ化するのには苦労しました・・・。

ブラウザからスケッチをコピーしたら、必ず一旦保存してください。そうしないと正しく表示されませんので要注意!!
#include "TimeLib.h" //Arduino time library ver1.5
#include "ESP32_SD_SSD1331_Gadgets.h"
#include "ESP32_SD_ShinonomeFNT.h"
#include "ESP32_SD_UTF8toSJIS.h"
#include "ESP32_SSD1331.h"
#include "ESP32_WebGet.h"

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

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

const uint8_t CS_SD = 5; //SD card CS ( Chip Select )

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 CS_OLED = 15;
const uint8_t DC_OLED =  16; //OLED DC(Data/Command)
const uint8_t RST_OLED =  4; //OLED Reset

ESP32_SD_SSD1331_Gadgets ESSG;
ESP32_SD_UTF8toSJIS u8ts;

ESP32_SSD1331 _ssd1331(SCLK_OLED, MISO_OLED, MOSI_OLED, CS_OLED, DC_OLED, RST_OLED);
ESP32_SD_ShinonomeFNT _SFR(CS_SD, 24000000);
ESP32_WebGet _EWG;

uint8_t Font_buf[2][16] = {0}; //フォントを格納するためのもの

uint8_t sj_txt[1024]; //Shift_JIS コード文字列を格納
uint16_t sj_length; //Shift_JIS コード文字列長

//-----ニュース記事文字列スクロール変数の初期化--------
uint8_t scl_cnt = 0; //pixelのスクロールカウント数
uint16_t SJ_cnt = 0; //Shift_JISコードのカウント数
uint8_t zen_or_han = 0; //全角の場合2, 半角の場合1
bool fnt_read_ok = true; //フォント読み込みOKかどうかのフラグ
uint32_t scl_LastTime = 0;
uint16_t Scrolle_speed = 10; //文字列スクロールインターバル時間

//-----Yahoo記事取得引数初期化-------------------------
uint64_t NewsGetLastTime = 0;
uint64_t WeatherGetLastTime = 0;
bool News_first_get = true;
bool Weather_first_get = true;

//*****************セットアップ******************************
void setup() {
  delay(1000); //ESP32が起動するまで待つ

  _EWG.EWG_AP_Connect(ssid, password); //Wi-Fi ルーターと接続
  delay(1000);

  _ssd1331.SSD1331_Init(); //OLED SSD1331 初期化

  _ssd1331.CommandWrite(0xAE); //Set Display OFF
  _ssd1331.Brightness_FadeOut(0); //明るさをカットオフ

  for(int i=0; i<63; i=i+5){
    _ssd1331.Drawing_Line(95-i, 0, 0, i, 0, i, 31);
    _ssd1331.Drawing_Line(i, 63, 95, 63-i, 0, i, 31);
  }

  _SFR.SD_Shinonome_Init3F(UTF8SJIS_file, Shino_Half_Font_file, Shino_Zen_Font_file); //ライブラリ初期化。3ファイル同時に開く
  ESSG.Gadgets_MyFont_Init(MyFont_file);
  delay(10);
  uint8_t Red = 7; //0-7
  uint8_t Green = 0; //0-7
  uint8_t Blue = 0; //0-3
  uint8_t Sino_font_buf[16][16] = {0}; //東雲(しののめ)フォントバッファ
  sj_length = _SFR.StrDirect_ShinoFNT_readALL("ESP32 日本語", Sino_font_buf);
  _ssd1331.SSD1331_8x16_Font_DisplayOut(12, 0, 32, Red, Green, Blue, Sino_font_buf);

  _ssd1331.CommandWrite(0xAF); //Set Display On
  delay(110);
  _ssd1331.Brightness_FadeIn(5); //明るさ5msずつフェードイン

  _EWG.EWG_NTP_init(9, "time.windows.com"); //NTPサーバーから時刻を取得

  setSyncProvider(EWG_Get_Ntp_Time);
  setSyncInterval(1800); //補正間隔を秒単位で決める
  delay(2000); //時刻取得後、動作安定させるためにしばらく待つ
  NTP_OtherServerSelect(9, 300); //時刻取得できなかった場合他のサーバーを試す関数

  _ssd1331.Brightness_FadeOut(5); //明るさ5msずつフェードアウト
  _ssd1331.Display_Clear(0, 0, 95, 63);
  _ssd1331.Brightness_FadeIn(0); //明るさ最大値でカットイン

  NewsGetLastTime = millis();
  WeatherGetLastTime = millis();
  scl_LastTime = millis();
}
//************* メインループ ****************************************

void loop() {
  YahooNewsGadget(0, 600000, 0, 7, 0); //600秒(10分毎)にニュース記事取得
  YahooWeatherGadget(48, 333000); //333秒毎に天気取得
  YMDW_Gadget(16, 3, 3, 3, 7, 7, 3);
  NTPwatch_Gadget(32, 50, 15, 7, 0, 1); //この関数は最後に置いた方が初回起動時がスムース
}

//************** Yahoo RSS ニュースガジェット ************************
void YahooNewsGadget(uint8_t y0, uint32_t get_interval, uint8_t Red, uint8_t Green, uint8_t Blue){
  if((News_first_get == true) || ((millis() - NewsGetLastTime) > get_interval)){
    char Web_h[3], Web_m[3];
    sprintf(Web_h, "%02d", hour());//ゼロを空白で埋める場合は%2dとする
    sprintf(Web_m, "%02d", minute());
    String news_str = "◆ " + String(Web_h) + ":" + String(Web_m) + " ";
    news_str += _EWG.EWG_https_Web_Get("news.yahoo.co.jp", "/pickup/rss.xml", '\n', "</rss>", "<title>", "</title>", "◆ ");
    Serial.print("News Get = "); Serial.println( news_str );

    sj_length = u8ts.UTF8_to_SJIS(news_str, sj_txt);
    scl_cnt = 0; //pixelのスクロールカウント数
    SJ_cnt = 0; //Shift_JISコードのカウント数
    NewsGetLastTime = millis();
    News_first_get = false;
  }

  if(millis() - scl_LastTime > Scrolle_speed){
    if(fnt_read_ok == true){
      zen_or_han = _SFR.Sjis_inc_FntRead(sj_txt, sj_length, &SJ_cnt, Font_buf);
    }
    fnt_read_ok = _ssd1331.Scroller_8x16_RtoL4line(y0, 0, zen_or_han, Font_buf, Red, Green, Blue);
    scl_LastTime = millis();
  }
}
//************** 年月日、自作フォント曜日表示ガジェット ***************
void YMDW_Gadget(uint8_t y0, uint8_t YMD_red, uint8_t YMD_green, uint8_t YMD_blue, uint8_t week_red, uint8_t week_green, uint8_t week_blue){
  ESSG.ShinonomeClock_YMD(0, y0, YMD_red, YMD_green, YMD_blue);
  ESSG.MyFontClock_Weekday(80, y0, week_red, week_green, week_blue);
}
//************** NTP時計表示ガジェット ********************************
void NTPwatch_Gadget(uint8_t y0, uint8_t HM_interval, uint8_t S_interval, uint8_t red, uint8_t green, uint8_t blue){
  ESSG.MyFont_HM_Clock(0, y0, 'H', 'V', 'H', 'V', 0, 0, 1, 1, HM_interval, red, green, blue);
  ESSG.Shinonome_Sec_Clock(80, y0, 'H', 'V', 0, 0, S_interval, red, green, blue);
}
//************** Yahoo RSS 天気予報ガジェット *************************
void YahooWeatherGadget(uint8_t y0, uint32_t get_interval){
  if((Weather_first_get == true) || ((millis() - WeatherGetLastTime) > get_interval)){
    String weather_str = _EWG.EWG_https_Web_Get("rss-weather.yahoo.co.jp", "/rss/days/4410.xml",  '>', "</rss", "】 ", " - ", "|");
    Serial.print("Weather forecast = "); Serial.println(weather_str);
    ESSG.YahooJ_Weather_TodayTomorrow(y0, weather_str);
    delay(100);
    WeatherGetLastTime = millis();
    Weather_first_get = false;
  }
}
//************ NTP server 取得出来ない場合、別サーバーを選ぶ **********
void NTP_OtherServerSelect(uint8_t timezone, uint32_t set_interval){
  if(year() < 2017){
    const char *ntpServerName[6] = {
      "time.nist.gov",
      "time-a.nist.gov",
      "time-b.nist.gov",
      "time-nw.nist.gov",
      "time-a.timefreq.bldrdoc.gov",
      "time.windows.com"
    };
    for( int i=0; i<6; i++ ){
      if(year() >= 2017) break;
      _EWG.EWG_NTP_init(timezone, ntpServerName[i]);
      setSyncProvider(EWG_Get_Ntp_Time);
      setSyncInterval(set_interval); //補正間隔を秒単位で決める
      delay(2000);
    }
    if(year() < 2017){
      Serial.println("------ ALL NTP Server Disconnection");
    }
  }
}

【解説】

●1行目:
Arduino IDE 標準 Time ライブラリです。2017/6/8時点でver 1.5 になっています。
hour(); minute(); などの関数が使えるようになります。

●2-6行目:
私の自作ライブラリのインクルードです。
ここまで全部インクルードしなくても良いのですが、何のライブラリを使っているかが一目で分かるために敢えてインクルードしています。
2重インクルード防止策は施しています。

●8-9行目:
ここのxxxx のところを、ご自分の Wi-Fi ルーターの SSID とパスワードに書き換えてください。

●11-14行:
micro SDHC カードの /font/ フォルダにコピーしたフォントファイル類を定義します。

●16-23行:
micro SDHC カードスロットと 有機EL ( OLED ) SSD1331 のGPIO 設定です。
micro SDHC カードスロットは VSPI 接続。
OLED SSD1331 は HSPI 接続です。
HSPI と VSPI については以下の記事を参照してください。

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

●25-26 行:
自作ライブラリのクラス名を宣言します。
ESSG や u8ts は好きな名前に設定できます。

●28-30行:
ここは重要です。
ガジェットライブラリを作るにあたって、ライブラリソースファイルとArduino IDE スケッチのソースファイルとで、クラス名を共有する必要が出てきたため、以下のクラス名は変えないでください。

_ssd1331
_SFR
_EWG

これらは、ライブラリ内で extern を指定して、外部ファイルでも共有できるようにしています。
もっと良い方法があるかも知れませんので、もし、アイデアがあったらコメント等でご連絡いただけると幸いです。

●34行:
Web から取得したニュース記事文字列は UTF-8 コードなので、それを Shift_JIS に変換した文字列をここに格納します。

●38-43行:
ニュース記事を電光掲示板風スクロールするための変数初期化です。

●46-49行:
ニュース記事を取得するタイミングを設定する変数初期化です。

●55行:
ここで、Wi-Fi ルーター(アクセスポイント)と接続します。
_EWG という共通クラス名がついているので、注意してください。

●58行:
有機EL ( OLED ) SSD1331 の初期化です。
_ssd1331 という共通クラス名が付いているので、注意してください。

●60-61行:
60行のコマンドで SSD1331 ディスプレイをOFF にして、61行でディスプレイの明るさをカットオフします。
何故かというと、明るさを最少にしても薄ら点灯しているためです。
これは、後でフェードインするためにそうしています。

●63-66行:
ディスプレイに直線を描くデモです。

●68行:
ここで、UTF8Sjis テーブルファイルと東雲フォントファイル2つ、合計3つのファイルを開きます。

●69行:
ここで MyFont ファイルを開きます。
この時点で ESP32 で同時に開けるファイル数の最大値4に達しているので、それを頭に入れておくことが大事です。
今回のライブラリバージョンアップで、UTF8Sjis テーブルファイルのファイルハンドル名 _UtoS がライブラリソースファイル内で共通化できたので、ファイルを閉じたり開いたりする必要が無くなりました。

●71-76行:
ここで、OLED SSD1331 に文字列を1行表示させますが、ディスプレイはOFF になっているので、文字は現れません。

●78-80行:
ここで、SSD1331 をON にして、SSD1331 のBrightness を5ms 毎に明るくしていくと、フェードインしているように見えます。

●82行:
NTP タイムサーバーを東京のタイムゾーンを設定します。
time.windows.com が一番つながりやすかったです。
NTP サーバー取得関数群はサンプルスケッチを参照してライブラリ化しました。

●84-85行:
ここで、Time ライブラリ関数の setSyncProvider を使い、ESP32 のシステム時刻を補正します。
EWG_Get_Ntp_Time は自作ライブラリ関数です。
85行の setSyncInterval 関数でNTPサーバー時刻取得間隔を決めます。
ここでは 1800 秒(30分)としています。

●87行:
153-174行で関数化していて、NTPサーバー時刻取得失敗した場合、他のサーバーのコネクションを試します。

●89-91行:
ここで有機EL ( OLED ) SSD1331 をフェードインします。

●100-103行:
Verry Simple! です。
ディスプレイに4行表示させるガジェットでたった4つの関数だけで済んでいます。
ただ、注意していただきたいのは、ニュースや天気予報記事を取得する関数が最初に持ってきた方が、初回立ち上がりのディスプレイ表示はキレイです。

●107-130行:
Yahoo! Japan RSS ニューストピックストップ記事を取得し、文字列をスクロールさせる関数です。
記事を取得する部分は108-121行で、スクロールする部分は123-129行です。
get_interval で記事を取得する間隔を決め、Scrolle_speed でスクロールする速さを決めます。
前回の記事でも述べたように、スクロールさせる関数群が格段に簡単になりました。

●132-135行:
年月日を東雲フォントで表示し、曜日を自作フォントで表示させる関数です。

●137-140行:
自作フォントのNTP 時計を関数化しました。
‘H’ が Horizontal (水平)スクロール、 ‘V’ がVirtical (垂直)スクロールです。
その後の数値が0 または 1 にすることによって、スクロールする方向を決めます。
スクロールする速さは HM_interval で決めます。

●142-151行:
天気予報を表示させる関数です。
144行で Yahoo! Japan RSS 天気予報の週間天気予報を取得し、146行で今日と明日の天気予報に分類して、有機EL ( OLED ) SSD1331 に表示させます。
ここでは、地域は東京で設定していますが、“/rss/days/4410.xml” のところをご自分の地域に設定できます。

こちらのページを開いて各地域をクリックして、ブラウザのURL入力欄アドレスを確認してください。

https://weather.yahoo.co.jp/weather/rss/

●153-174行:
NTP サーバー時刻補正が出来なかった場合、他のサーバーをチェックして取得できるかどうか試す関数です。
time.windows.com が一番取得しやすいようです。

コンパイル実行する

ブラウザからスケッチをコピーしたら、必ず一旦保存してください。そうしないと正しく表示されませんので要注意!!

では、コンパイル書き込み、実行する前に、Wi-Fi ルーターを起動して、5分以上経ってから、コンパイル実行書き込みしてみてください。

最初の動画のように表示されていればOKです。

ちなみに、天気予報の今日と明日の境目は下図のようになっています。
16×16ドットフォントは6文字しか表示できないので、こうなってしまいました。
自分が分かりゃ~イイんです・・・。

ESP32_Gadgets01

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

ESP32_Gadgets02

なお、このライブラリやプログラムはまだ発展途上なので、しばらく時間が経過するとフリーズすることがあります。
この原因はまだ分かりません。
分かり次第お知らせします。

以上です。

まとめ

いかがでしたでしょうか。
うまく動きましたでしょうか?

ESP8266 ではここまでスムースに動かなかったでしょう。
CPU速度と、メモリの大きさで、ESP32はいろいろなことができますね。

先にも述べましたが、このガジェットライブラリはまだ発展途上なので、時間が経つとフリーズしてしまうことがあります。
停止するところは、決まって Arduino core for the ESP32の WiFi ライブラリの client.connect 関数です。
この関数が動く度に電流を消費して電圧ドロップが生じてしまうのか、はたまた自作ライブラリが悪いのか、まだ原因不明です。
ESP8266 でも同じようなフリーズがありましたが、いったい何でしょうねぇ・・・。
いずれにしても、私は基本的に素人のアマチュアで、さらに別の仕事が忙しくて原因追及ができずにいます。

2017/8/2 に Arduino core for ESP32 が大幅アップデートされ、フリーズしなくなりました。

このブログ運営と維持もとても辛くなってきました・・・。
(その割に長文記事を書いてますが・・・。)
なかかな精神的にも辛いものがありますね。

と、泣き言ばかり言ってますが、次回はこれをスマホで操作したりしてみたいと思います。

ではまた・・・。

mgo-tec電子工作 関連コンテンツ ( 広告含む )

スポンサーリンク

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







投稿者:

mgo-tec

Arduino , ESP32 ( ESP-WROOM-32 ) , ESP8266 ( ESP-WROOM-02 )等を使って、主にスマホと連携した電子工作やプログラミング記事を書いてます。ライブラリも作ったりしてます。趣味、独学でやってますので、動作保証はしません。 電子回路やプログラミングの専門家ではありません。 畑違いの仕事をしてます。 でも、少しだけ電気の知識が必要な仕事なので、電気工事士や工事担任者等の資格は持ってます。

「ESP32 と 有機EL SSD1331 で Yahoo News 、 天気予報 、 NTP 時計 Wi-FI ガジェットを作ってみた」への5件のフィードバック

  1. フリーズとは関係有りませんが、IDE1.8.2 起動中にスケッチのソースコードを変更して、(rss等 4410 を 5010 「静岡」)に変更して、書き込みを行うと 75行の ”ESP32  日本語”の表示が ”ESP {“ と表示され 天気予報アイコンが表示されません。
    シリアルモニターの表示が
    WEB HTTP Response
    Client Stop
    Weathen forecast =
    Weathen Today =
    Weathen Tomorrow =
    = が空白です。
    スケッチのソースコードを変更した状態で、保存 終了して。
    IDEを再起動して書き込むと 75行や天気予報アイコンも正常に表示されます。シリアルモニターにも状況が表示されます。
    Arduino core for the ESP32 は最新版を使用、ライブラリも最新版です。
    ESP32 – DevKitC ( ESP-WROOM-32 開発ボード )やESP32 単体で行っても同じ結果が出ました。
    書き込み速度は 921600 と 115200ともエラー無く書き込み出来ます。
    文字のスクロールの早さに感激です。

    1. 太田さん

      いつも当ブログにお越しいただき、そしてコメントいただき、ありがとうございます。
      m(_ _)m

      私の環境ではそういう現象が起こらないので、あくまで予想ですが、ブラウザからソースコードをクリップボードへコピーした時には Shift_JIS 等の文字コードになっていて、Arduino IDE のスケッチを保存しないままコンパイルした場合は、日本語漢字や全角の”】” などの文字コードが正しく変換されなかったと思われます。
      ですから、一旦、Arduino IDE でスケッチを保存すると、UTF-8 コードで保存されるので、正しい文字コードになると思われます。

      MAC は使ったことが無いので分かりませんが、古い Windows を使っていたり、ブラウザが Google Chrome 以外を使うとそういう現象が起こる可能性があります。
      私の場合は、Windows10 で、ブラウザは Google Chrome を使っています。
      文字変換は Microsoft IME を使っています。
      日本語変換ソフトが ATOK だったりした場合はまた違う結果になるかもしれません。
      申し訳ないのですが、Windows の文字コード設定はどこでやるのか良く分かりません。

      いずれにしても、ブラウザからスケッチをコピーした場合は、必ず Arduino IDE で一旦保存して、再起動するということが確実そうですね。
      この件はトラブルシューティングに掲載させていただこうと思います。
      他の方が違う環境で実行してくださると、バグ等の解明が速いですね。
      いつも当ブログのスケッチを実行していただき、ほんとに感謝いたします。
      ありがとうございました。
      m(_ _)m

    2. 太田さん、すみません。

      たった今、同じ現象が私の環境でも起こりました。
      失礼しました。

      おそらく、ブラウザからクリップボードへコピーしただけでは、日本語全角文字 “◆” や “】” が正しく変換されないようです。
      一旦スケッチを保存することによって、正しい文字コードに変換されるようです。
      Arduino IDE 1.8.2 からそういうモードになったのかもしれません。

      ただ、Arduino IDE を再起動しなくても、保存するだけ、その後コンパイルすれば良いことは分かりました。

      ご指摘いただかないと分かりませんでした。
      今まで、他の方も同じ症状でうまく動かなかった可能性がありますね。

      たいへん貴重な情報ありがとうございました。
      重ねてお礼申し上げます。
      m(_ _)m

  2. スケッチを保存してから書き込みを行うとOKでした。
    IDE1.8.3 でのテストも同じ状態ですね。

    1. そうですね。
      スケッチを保存してから書き込みですね。
      それぞれの記事に追加コメント入れました。
      ありがとうございます。

      それと、1.8.3 がリリースされていたんですね。
      知らなかった・・・。

      重ね重ね、情報ありがとうございます。
      m(_ _)m

コメントを残す

メールアドレスが公開されることはありません。

*画像の文字を入力してください。(スパム防止の為)