M5Stack ( ESP32 ) のボタンで記事を選択できる Yahoo News 電光掲示板 天気予報 Watch

記事公開日:2018年10月8日


スポンサーリンク

ESP32-DevkitC と ILI9341 モジュールの接続

これもこちらの記事のものと同じですが、念のためここでも紹介します。

firebase_esp32_m5stack_smapho12.jpg


写真にするとこんな感じです。

selectbox_m5stack_esp32_07.jpg


ここでは、タクトスイッチを1つしか接続していませんが、スイッチを M5Stack と同じ数にしたい場合、GPIO #35 に接続してあるスイッチと同じ構成で、GPIO #34, GPIO #25 に接続すれば良いと思います。
(※下のコメント投稿欄で、2.8インチの ILI9341 モジュールを使った読者の方がいらっしゃいます。合わせて参照してみてください。)

シンプルになった ESP32 開発ボード用文字列表示サンプルスケッチ

M5Stack のところで先に紹介しましたが、私の自作ライブラリ ESP32_mgo_tec beta ver 1.0.50 で、文字列表示がシンプルになりました。
M5Stack プログラムの流用ですが、ちょっと変更するだけで、ESP32 開発ボードにも使えます。
以下のようにスケッチを入力してコンパイルしてみてください。

4-12行を付け足して、19-24行 が M5Stack と違うところです。
22行で、お使いになる ILI9341 ボードによって、LCD.dispRotation 関数の数値を 1~13 または 250, 251 に替えてみて下さい。

#define MGO_TEC_BV1_M5STACK_SD_SKETCH
#include <mgo_tec_bv1_m5stack_sd_simple1.h>

const int8_t sck = 18; // SPI clock pin
const int8_t miso = -1; // MISO(master input slave output) don't using
const int8_t mosi = 23; // MOSI(master output slave input) pin
const int8_t cs = 14; // Chip Select pin
const int8_t dc = 27; // Data/Command pin
const int8_t rst = 33; // Reset pin
const int8_t lcd_led_pin = 32;

const uint8_t cs_sd = 4; //SD card CS ( Chip Select )

const char* utf8sjis_file = "/font/Utf8Sjis.tbl"; //UTF8 Shift_JIS 変換テーブルファイル名を記載しておく
const char* shino_full_font_file = "/font/shnmk16.bdf"; //オリジナル東雲全角フォントファイル
const char* shino_half_font_file = "/font/shnm8x16.bdf"; //半角フォントファイル名を定義

void setup() {
  SFR.init( cs_sd, 19000000 ); //sd_cs = 4, sd_frequency = 19000000
  SFR.init3File( utf8sjis_file, shino_half_font_file, shino_full_font_file );
  LCD.ILI9341init(sck, miso, mosi, cs, dc, rst, lcd_led_pin, 40000000, false); //microSDを使う場合、必ず false にする
  LCD.dispRotation( 250 ); //ILI9341ボードメーカーにより異なる。1-13, 250, 251 の値のうち何れか。
  LCD.displayClear();
  LCD.brightness( 255 ); //LCD LED Full brightness

  //font[max=8], scl_set[max=8], disp_fnt[max=8]
  mM5.font[0].y0 = 0;
  mM5.disp_fnt[0].dispText( mM5.font[0], "これはテストです" );

  mM5.font[1].y0 = 32;
  //red:(0 - 31), green:(0 - 63), blue:(0 - 31)
  mM5.font[1].red = 31, mM5.font[1].green = 0, mM5.font[1].blue = 0;
  mM5.font[1].Xsize = 2, mM5.font[1].Ysize = 2;
  mM5.disp_fnt[1].dispText( mM5.font[1], "日本語漢字" );

  mM5.font[2].x0 = 50; mM5.font[2].y0 = 64;
  mM5.font[2].red = 0, mM5.font[2].green = 63, mM5.font[2].blue = 0;
  mM5.disp_fnt[1].dispText( mM5.font[2], "ABCDEFGabcdefg" );

  mM5.font[3].x0 = 100; mM5.font[3].y0 = 100;
  mM5.font[3].red = 0, mM5.font[3].green = 0, mM5.font[3].blue = 31;
  mM5.disp_fnt[3].dispText( mM5.font[3], "今日はいい天気" );

  String str1 = "Hello World M5Stack ! ハローワールド 日本語漢字 ";
  mM5.font[4].y0 = 150;
  mM5.font[4].red = 31, mM5.font[4].green = 63, mM5.font[4].blue = 0;
  mM5.font[4].Xsize = 2, mM5.font[4].Ysize = 3;
  mM5.scl_set[4].interval = 10; //(millisecond)
  mM5.disp_fnt[4].initScrolle( mM5.font[4], mM5.scl_set[4] );
  mM5.disp_fnt[4].newSetText( mM5.scl_set[4], str1 );

  String str2 = "2行目の電光掲示板スクロールです。";
  mM5.font[5].y0 = 200;
  mM5.font[5].red = 31, mM5.font[5].green = 0, mM5.font[5].blue = 31;
  mM5.font[5].Xsize = 3, mM5.font[5].Ysize = 1;
  mM5.scl_set[5].interval = 5; //(millisecond)
  mM5.disp_fnt[5].initScrolle( mM5.font[5], mM5.scl_set[5] );
  mM5.disp_fnt[5].newSetText( mM5.scl_set[5], str2 );
}

void loop() {
  mM5.disp_fnt[4].scrolleText( mM5.font[4], mM5.scl_set[4] );
  mM5.disp_fnt[5].scrolleText( mM5.font[5], mM5.scl_set[5] );
}

コンパイル書き込み実行して、以下のように表示されればOKです。

selectbox_m5stack_esp32_08.jpg


本来は、ESP32 開発ボード用のライブラリ関数を作りたかったのですが、時間が足りませんでした。

ESP32 開発ボード用 Yahoo Watch スケッチ

では、以下のスケッチ(プログラム)を入力してみてください。

#define MGO_TEC_BV1_M5STACK_SD_SKETCH
#include <mgo_tec_bv1_m5stack_sd_yahoo.h>

const int8_t sck = 18; // SPI clock pin
const int8_t miso = -1; // MISO(master input slave output) don't using
const int8_t mosi = 23; // MOSI(master output slave input) pin
const int8_t cs = 14; // Chip Select pin
const int8_t dc = 27; // Data/Command pin
const int8_t rst = 33; // Reset pin
const int8_t lcd_led_pin = 32;

const uint8_t cs_sd = 4; //SD card CS ( Chip Select )

const uint8_t buttonA_GPIO = 35;
//const uint8_t buttonB_GPIO = 34;
//const uint8_t buttonC_GPIO = 25;

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

const char* utf8sjis_file = "/font/Utf8Sjis.tbl"; //UTF8 Shift_JIS 変換テーブルファイル名を記載しておく
//const char* shino_full_font_file = "/font/shnmk16.bdf"; //オリジナル東雲全角フォントファイル
const char* shino_half_font_file = "/font/shnm8x16.bdf"; //半角フォントファイル名を定義
const char* shino_full_font_file = "/font/MYshnmk16.bdf"; //自作改変全角東雲フォントファイル
const char* my_font_file = "/font/MyFont.fnt"; //自作フォントファイル名を定義(天気予報用)

//-----Yahooニュース切替select box関連初期化-----
const uint8_t max_select2 = 9;
mgo_tec_esp32_bv1::SelectUrl sel_news[ max_select2 ] = {
  { "主要", "/pickup/rss.xml" },
  { "スポーツ", "/pickup/sports/rss.xml" },
  { "エンタメ", "/pickup/entertainment/rss.xml" },
  { "IT", "/pickup/computer/rss.xml" },
  { "経済", "/pickup/economy/rss.xml" },
  { "科学", "/pickup/science/rss.xml" },
  { "国際", "/pickup/world/rss.xml" },
  { "地域", "/pickup/local/rss.xml" },
  { "国内", "/pickup/domestic/rss.xml" }
};
//------Yahooニュース表示関連初期化----------------
const char* yahoo_news_host = "news.yahoo.co.jp";
const char* yahoo_weather_host = "rss-weather.yahoo.co.jp";
const char* yahoo_weather_target_url = "/rss/days/4410.xml"; //地域:東京
uint8_t url0_num = 0;
uint8_t url1_num = 1;
boolean isChange_news = false;
//------ NTP時刻文字表示系 引数初期化-----
int timezone = 9; //Tokyo
const char *ntp_server_name = "time.windows.com";
//-----Webデータ取得変数-------------
uint32_t wifi_connect_last_time = 0;
boolean isWifi_connect_first = true;
boolean isClear_disp = false;

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

  mM5.btnA.init( buttonA_GPIO, true, 30, 500 ); //長押し設定 true, チャタリング対策 30ms, 長押し500ms
//  mM5.btnB.init( buttonB_GPIO, true, 30, 500 ); //長押し設定 true, チャタリング対策 30ms, 長押し500ms
//  mM5.btnC.init( buttonC_GPIO, true, 30, 500 ); //長押し設定 true, チャタリング対策 30ms, 長押し500ms
  SFR.init( cs_sd, 19000000 ); //sd_cs = 4, sd_frequency = 19000000
  SFR.init3File( utf8sjis_file, shino_half_font_file, shino_full_font_file );
  mM5.yahoo[0].initWeather( my_font_file ); //天気予報用自作フォント初期化
  LCD.ILI9341init(sck, miso, mosi, cs, dc, rst, lcd_led_pin, 40000000, false); //microSDを使う場合、必ず false にする
  LCD.dispRotation( 250 ); //ILI9341ボードメーカーにより異なる。1-13, 250, 251 の値のうち何れか。
  LCD.displayClear();
  LCD.brightness( 255 ); //LCD LED Full brightness

  setupWatchFont(); //時計表示フォントセットアップ
  setupYmdFont(); //年月日表示フォントセットアップ
  setupWeatherFont(); //天気予報フォントセットアップ
  setupNewsFont(); //ニュース記事文字列のセットアップ
  setupMessageWindow(); //メッセージウィンドウ表示セットアップ
  //起動時のみのメッセージウィンドウ設定
  mM5.msg.m_padding = 4;
  mM5.msg.dispMsgWindow( 0, "WiFi Connecting..." );

  getWeb();
  mM5.watch.watchDispReset(); //時計表示が崩れる為に一旦リセット

  TaskHandle_t th; //マルチタスクハンドル定義
  xTaskCreatePinnedToCore(Task1, "Task1", 8192, NULL, 5, &th, 0); //マルチタスク起動
}
//***********メインループ****************************
void loop(){
  //Statusメッセージ表示
  mM5.wifi_msg.dispWifiStatusMsgShort(); //WiFiステータス表示
  mM5.watch.ntp_msg.dispWebGetStatusMsgShort( mM5.watch.ntp_msg_status, "NTP" );
  mM5.yahoo[0].weather_msg.dispWebGetStatusMsgShort( mM5.yahoo[0].weather_msg_status, "天" );
  mM5.yahoo[0].news_msg.dispWebGetStatusMsgShort( mM5.yahoo[0].news_msg_status, sel_news[url0_num].name );
  mM5.yahoo[1].news_msg.dispWebGetStatusMsgShort( mM5.yahoo[1].news_msg_status, sel_news[url1_num].name );

  if( isChange_news == true ){
    LCD.displayClear( 0, 24, 319, 239 );
    mM5.watch.watchDispReset();
    mM5.yahoo[0].m_isWeather_get = true;
    mM5.watch.m_changeYMD = true;
    isChange_news = false;
  }
  mM5.watch.scrolleWatch(); //時計スクロール
  mM5.watch.displayColon2(); //時計コロン表示
  mM5.watch.displayYMDW(); //年月日、曜日表示

  //Yahoo! Japan RSS 天気予報表示
  mM5.yahoo[0].dispYahooJweatherMyFont( mM5.yahoo[0].weather_fnt );
  //Yahoo! Japan RSS ニューススクロール
  mM5.yahoo[0].scrolleYahooJnews2( mM5.yahoo[0].news_font, mM5.yahoo[0].news_scl_set );
  mM5.yahoo[1].scrolleYahooJnews2( mM5.yahoo[1].news_font, mM5.yahoo[1].news_scl_set );

  button_action(); //ボタン操作
}
//************ マルチタスクループ ******************
void Task1(void *pvParameters) {
  while(1){
    getWeb(); //Web記事およびNTP時刻取得
    delay(1); //マルチタスクの場合、これ絶対必要!
  }
}
//******時計表示フォント設定****************************
void setupWatchFont(){
  uint8_t i;
  for( i = 0; i < 4; i++ ){ //時、分のフォント色設定
    mM5.watch.font[i].red = 31, mM5.watch.font[i].green = 0, mM5.watch.font[i].blue = 31;
  }
  for( i = 4; i < 6; i++ ){ //秒のフォント色設定
    mM5.watch.font[i].red = 0, mM5.watch.font[i].green = 63, mM5.watch.font[i].blue = 31;
  }
  //コロンフォント色設定 red(0-31), green(0-63), blue(0-31)
  mM5.watch.colon1_font.red = 31, mM5.watch.colon1_font.green = 63, mM5.watch.colon1_font.blue = 0;
  mM5.watch.colon2_font.red = 0, mM5.watch.colon2_font.green = 0, mM5.watch.colon2_font.blue = 31;
  uint16_t x0 = 0, y0 = 29; //時計表示左端の座標
  uint8_t x_size = 3, y_size = 3;
  mM5.watch.init( x0, y0, x_size, y_size );
}
//******年月日表示フォント設定**************************
void setupYmdFont(){
  //red(0-31), green(0-63), blue(0-31)
  mM5.watch.ymd_font.y0 = 79;
  mM5.watch.ymd_font.Xsize = 2, mM5.watch.ymd_font.Ysize = 2;
}
//******Yahooニュース天気予報フォント設定****************
void setupWeatherFont(){
  mM5.yahoo[0].weather_fnt.Xsize = 2, mM5.yahoo[0].weather_fnt.Ysize = 2;
  mM5.yahoo[0].weather_fnt.y0 = 111;
}
//******Yahooニュース記事フォント設定********************
void setupNewsFont(){
  mM5.yahoo[0].news_font.y0 = 144;
  mM5.yahoo[0].news_font.Xsize = 3, mM5.yahoo[0].news_font.Ysize = 3;
  // red(0-31), green(0-63), blue(0-31)
  mM5.yahoo[0].news_font.red = 31, mM5.yahoo[0].news_font.green = 63, mM5.yahoo[0].news_font.blue = 0;
  mM5.yahoo[0].news_font.bg_red = 0, mM5.yahoo[0].news_font.bg_green = 0, mM5.yahoo[0].news_font.bg_blue = 25;

  mM5.yahoo[1].news_font.y0 = 192;
  mM5.yahoo[1].news_font.Xsize = 3, mM5.yahoo[1].news_font.Ysize = 3;
  // red(0-31), green(0-63), blue(0-31)
  mM5.yahoo[1].news_font.red = 31, mM5.yahoo[1].news_font.green = 63, mM5.yahoo[1].news_font.blue = 0;
  mM5.yahoo[1].news_font.bg_red = 0, mM5.yahoo[1].news_font.bg_green = 0, mM5.yahoo[1].news_font.bg_blue = 25;
  //ヒープ領域配列確保。※不要な時は必ずdeleteしておく。
  for( int i = 0; i < 2; i++ ){
    mM5.yahoo[i].news_scl_set.disp_txt_len = 13; //ディスプレイに表示する半角相当文字数
    mM5.yahoo[i].initScrolle( mM5.yahoo[i].news_font, mM5.yahoo[i].news_scl_set );
  }
  Serial.printf("Free Heap Size = %d\r\n", esp_get_free_heap_size());
}
//*****メッセージ表示設定**************************
void setupMessageWindow(){
  mM5.wifi_msg.m_padding = 4; //pixel単位
  mM5.wifi_msg.m_txt_length = 6; //文字表示数(半角相当)
  //背景色のみ設定 red(0-31), green(0-63), blue(0-31)

  mM5.watch.ntp_msg.m_x0 = 56;
  mM5.watch.ntp_msg.m_padding = 4; //pixel単位
  mM5.watch.ntp_msg.m_txt_length = 5; //文字表示数(半角相当)
  //背景色のみ設定 red(0-31), green(0-63), blue(0-31)
  mM5.watch.ntp_msg.m_bg_red = 10;
  mM5.watch.ntp_msg.m_bg_green = 10;
  mM5.watch.ntp_msg.m_bg_blue = 15;

  mM5.yahoo[0].weather_msg.m_x0 = 104;
  mM5.yahoo[0].weather_msg.m_padding = 4; //pixel単位
  mM5.yahoo[0].weather_msg.m_txt_length = 4; //文字表示数(半角相当)
  //背景色のみ設定 red(0-31), green(0-63), blue(0-31)
  mM5.yahoo[0].weather_msg.m_bg_red = 10;
  mM5.yahoo[0].weather_msg.m_bg_green = 10;
  mM5.yahoo[0].weather_msg.m_bg_blue = 15;

  mM5.yahoo[0].news_msg.m_x0 = 144;
  mM5.yahoo[0].news_msg.m_padding = 4; //pixel単位
  mM5.yahoo[0].news_msg.m_txt_length = 10; //文字表示数(半角相当)
  //背景色のみ設定 red(0-31), green(0-63), blue(0-31)
  mM5.yahoo[0].news_msg.m_bg_red = 10;
  mM5.yahoo[0].news_msg.m_bg_green = 10;
  mM5.yahoo[0].news_msg.m_bg_blue = 15;

  mM5.yahoo[1].news_msg.m_x0 = 232;
  mM5.yahoo[1].news_msg.m_padding = 4; //pixel単位
  mM5.yahoo[1].news_msg.m_txt_length = 10; //文字表示数(半角相当)
  //背景色のみ設定 red(0-31), green(0-63), blue(0-31)
  mM5.yahoo[1].news_msg.m_bg_red = 10;
  mM5.yahoo[1].news_msg.m_bg_green = 10;
  mM5.yahoo[1].news_msg.m_bg_blue = 15;
}
//*******NTPサーバー、Yahoo! Japan RSS 記事取得*******
void getWeb(){
  if( isWifi_connect_first || isChange_news || (millis() - wifi_connect_last_time > 180000) ){ //3分毎に記事取得
    WiFi_AP_Connect(); //WiFi起動、アクセスポイント接続
    if( isChange_news == false ){
      mM5.watch.getNTPserverSel( timezone, ntp_server_name );
    }
    mM5.yahoo[0].getYahooJweather( yahoo_weather_host, yahoo_weather_target_url );
    mM5.yahoo[0].getYahooJnews( yahoo_news_host, sel_news[url0_num].url );
    mM5.yahoo[1].getYahooJnews( yahoo_news_host, sel_news[url1_num].url );
    delay(1000);
    WiFi.disconnect( true,true ); //WiFi OFF, eraseAP=true これを使う場合、Core Debug Level "なし" に設定する
    WiFi.mode( WIFI_OFF ); //これを使う場合、Core Debug Level "なし" に設定する

    Serial.printf( "Free heap after TLS %u\r\n", xPortGetFreeHeapSize() );
    isWifi_connect_first = false;
    wifi_connect_last_time = millis();
  }
}
//*******WiFiアクセスポイント接続*************
void WiFi_AP_Connect(){
  mM5.wifi_msg.WifiStatus = mM5.wifi_msg.WifiConnecting; //WiFiメッセージウィンドウ設定
  Serial.println();
  Serial.println( F("Connecting Wifi...") );
  Serial.println( ssid );

  int16_t wifi_state = WiFi.status();
  Serial.printf( "\r\nWiFi.status = %d\r\n", wifi_state );

  if( isWifi_connect_first == true ){
    //WiFiが急に接続できなくなった場合の応急処置
    WiFi.disconnect( true, true ); //WiFi OFF, eraseAP=true
    delay(1000);
    WiFi.begin( ssid, password );

    while ( WiFi.status() != WL_CONNECTED ) {
      delay(500);
      Serial.print(".");
    }
    isWifi_connect_first = false;
  }else{
    uint32_t last_time = millis();
    if( wifi_state != WL_CONNECTED ){
      WiFi.begin( ssid, password ); //常時 WiFi ON の場合、ここをコメントアウト
      while ( wifi_state != WL_CONNECTED ) {
        delay(500);
        Serial.print(".");
        if( millis() - last_time > 20000 ) break; //Time OUT
      }
    }
    //マルチタスクでメッセージウィンドウを正しく表示させるための処置
    if( millis() - last_time < 1000 ) delay(2000); 
  }
  wifi_state = WiFi.status();
  Serial.printf( "\r\nWiFi.status = %d\r\n", wifi_state );
  if( wifi_state == WL_CONNECTED ){
    Serial.println("");
    Serial.println( "WiFi connected" );
    Serial.println( "IP address: " );
    Serial.println( WiFi.localIP() );
    wifi_connect_last_time = millis();
  }

  if( wifi_state == WL_CONNECTED ){
    mM5.wifi_msg.WifiStatus = mM5.wifi_msg.WifiConnected; //WiFiメッセージウィンドウ設定
  }else{
    mM5.wifi_msg.WifiStatus = mM5.wifi_msg.WifiFailed; //WiFiメッセージウィンドウ設定
    Serial.println( "WiFi AP Not Found" );
  }
}
//***** セレクトボックス表示設定 ***************
void selectUrl(){
  mgo_tec_esp32_bv1::BtnDispSelectBox Sel;
  const uint8_t max_select1 = 2;
  String sel_news_line[ max_select1 ] = { "News 0", "News 1" };
  uint16_t x0 = 96, y0 = 50, x1 = 240; //セレクトボックス位置
  uint8_t max_in_page_num1 = 3; //セレクトボックスの行数設定
  uint8_t default_sel_num = 0; //デフォルトのセレクト
  uint8_t news_num = Sel.dispBtnSelStrDef( mM5.btnA, sel_news_line, x0, y0, x1, default_sel_num, max_in_page_num1, max_select1 );

  uint8_t max_in_page_num2 = 5; //セレクトボックスの行数設定
  if( news_num == 0 ){
    url0_num = Sel.dispBtnSelUrlDef( mM5.btnA, sel_news, x0, y0, x1, url0_num, max_in_page_num2, max_select2 );
    isChange_news = true;
  }else if( news_num == 1 ){
    url1_num = Sel.dispBtnSelUrlDef( mM5.btnA, sel_news, x0, y0, x1, url1_num, max_in_page_num2, max_select2 );
    isChange_news = true;
  }
}
//****************************************
void button_action(){
  mM5.btnA.buttonAction();
  switch( mM5.btnA.ButtonStatus ){
    case mM5.btnA.MomentPress:
      Serial.println("Button A Moment Press");
      selectUrl();
      break;
    case mM5.btnA.ContPress:
      Serial.println("-------------Button A Cont Press");
      break;
    default:
      break;
  }
/*
  mM5.btnB.buttonAction();
  switch( mM5.btnB.ButtonStatus ){
    case mM5.btnB.MomentPress:
      Serial.println("Button B Moment Press");
      mM5.yahoo[0].news_scl_set.interval++;
      if( mM5.yahoo[0].news_scl_set.interval> 200 ) mM5.yahoo[0].news_scl_set.interval = 200;
      break;
    case mM5.btnB.ContPress:
      Serial.println("-------------Button B Cont Press");
      mM5.yahoo[0].news_scl_set.interval--;
      if( mM5.yahoo[0].news_scl_set.interval < 0 ) mM5.yahoo[0].news_scl_set.interval = 0;
      break;
    default:
      break;
  }

  mM5.btnC.buttonAction();
  switch( mM5.btnC.ButtonStatus ){
    case mM5.btnC.MomentPress:
      Serial.println("Button C Moment Press");
      mM5.yahoo[1].news_scl_set.interval++;
      if( mM5.yahoo[1].news_scl_set.interval> 200 ) mM5.yahoo[1].news_scl_set.interval = 200;
      break;
    case mM5.btnC.ContPress:
      Serial.println("-------------Button C Cont Press");
      mM5.yahoo[1].news_scl_set.interval--;
      if( mM5.yahoo[1].news_scl_set.interval < 0 ) mM5.yahoo[1].news_scl_set.interval = 0;
      break;
    default:
      break;
  }
*/
}

【軽く解説】

基本的に、前述の M5Stack 用のスケッチと同じです。
変わったところだけ説明します。

●4-16行:
ここで、GPIO のアサインを決めます。
スイッチを M5Stack と同じ数にしたい場合は、15-16行のコメントを解除してください。

●60-69行:
スイッチを M5Stack と同じ数にしたい場合、61-62行のコメントを解除してください。
67行で、お使いになる ILI9341 ボードによって、LCD.dispRotation 関数の数値を 1~13 または 250, 251 に替えてみて下さい。

●309-341行:
スイッチを M5Stack と同じ数にしたい場合、ここのコメントを解除してください。

コンパイル書き込み実行

これでコンパイル書き込み実行すれば、最初に紹介した動画のように動作すると思います。

編集後記

今回もまたとても勉強になりました。
リクエストを頂いたおかげで、新たな知識を得ることができました。

今までコンパイラや #ifdef などのプリプロセッサについてはほんの少ししか理解していませんでした。
こんなにコンパイラの挙動に合わせてライブラリプログラムを組み直したことはありませんでした。
ヘッダファイルも沢山つくりました。
今まで、何でライブラリ内にはあんなに #ifdef や #define が多いのだろうと疑問に思っていましたが、いざ、自分が作ってみると、なるほどなと思いました。
これからはコンパイラも勉強しなければいけないなと思いました。
(あまり気が進みませんが・・・)

ということで、今回はここまでです。

ではまた・・・。

このブログの維持運営にご支援いただけると助かります。
支援方法はこちらの記事をご覧ください。
(管理人:mgo-tec)

 


スポンサーリンク


 

mgo-tec電子工作ブログ管理人おすすめ
Amazon.co.jp
M5Stack Basic
スイッチサイエンス
Amazon.co.jp
ESPr Developer 32
スイッチサイエンス(Switch Science)
Amazon.co.jp
Amazon.co.jp

「M5Stack ( ESP32 ) のボタンで記事を選択できる Yahoo News 電光掲示板 天気予報 Watch」への22件のフィードバック

  1. mgo-tec 様

    リクエストにお応えいただきありがとうございます。
    Arduino IDE version 1.8.6 で動作確認とのことで、インストールしようとしたところ、すでに version 1.8.7 が最新となっていて、とりあえずインストールしました。
    「旧バージョン」のインストール手順に従って、version 1.8.6 をインストールしようと解凍まではできるのですが、開こうとすると「初期化中…」とのメッセージとなり画面が消えてしまいます。
    PCの不具合なのか、プログラムの不具合なのかわからず困っています。
    ご指導いただけると幸いです。

    1. juchang さん

      いつも世話になっております。

      Arduino IDE 1.8.7 が出ていることを初めて知りました。
      情報ありがとうございます。

      私の Windows 10 環境で、
      Arduino IDE ver 1.8.7
      Arduino core for the ESP32 stable ver 1.0.0
      は、問題無く動作確認できました。

      juchangさんのコメントから、最新版Arduino IDE 1.8.7 をインストールされたのに、なぜか再度 1.8.6 をインストールされていると読み取れます。
      おそらく、旧版 Arduino IDE は不要だと思いますので、アンインストールしてから 1.8.7 をインストールしていただければ良いと思います。

      私は installer でインストールせず、ZIP 形式で 1.8.7 をダウンロードして、その中の
      Arduino.exe
      というファイルを実行させています。
      一度 installer でインストールされていたら、アンインストールされてからインストールしてみてください。

      それでもインストールできない場合、Windows 10 の場合以下のパスのどれかに Arduino 15 または Arduino フォルダがあると思います。

      C:\Users\User-Name\AppData\Local
      C:\Users\User-Name\AppData\Roaming
      C:\Users\User-Name\AppData\LocalLow
      

      Arduino 15 フォルダは、Arduino core for the ESP32, ESP8266 関連フォルダです。
      IDE の初期設定が含まれています。
      Arduino フォルダまたは Arduino 15 フォルダのバックアップを取ってから、そのフォルダごと削除して再インストールしてみてください。

  2. mgo-tec 様

    Arduino IDE ver.1.8.7 で動作確認ができました。
    最近はぶっつけ本番で、ILI9341 LCD モジュールでの動作確認をしており、ボタン操作もばっちりです。
    まだ外付けのマイクロSDカードを使っているので、これからモジュール付属のSDカードスロットを使う方法を色々試してみたいと思います。
    いつも初歩的な質問ばかりで申し訳ありません。
    今後ともご指導の程よろしくお願いいたします。

    1. juchang さん

      無事動いてよかったです。
      安心しました。
      今回はライブラリを大幅修正して、いろいろ苦情が来そうな予感がしたので、ホッとしています。

      今回は我ながら自信作です。
      Core Debug Level “なし” に設定してコンパイルすれば、Yahoo ニュースとのコネクションも延々と安定動作すると思います。
      セレクトボックスもこれからいろいろと応用が利きそうです。

      juchang さんのリクエストで修正している最中に、いろいろ発見があり、新たな知識習得ができました。
      逆に切っ掛けを作ってくださり、感謝感謝です。
      いつも本当にありがとうございます。
      こちらこそ、今後ともよろしくお願いいたします。
      m(_ _)m

  3. こんにちは

    FireBaseもこの実験もスムーズに再現できました。
    サンスマートのLCDもうまくいきました。
    しかしLCDがili9341ドライバーのISPパネルの物がうまく働きません。
    画角とかは正常なのですが、色がすべて反転してるのです。
    1-13, 250, 251 の値のうち何れかということですべてやりましたが
    色反転は同じです。
    RGB(0.0.0)で白、31.63.31で黒、0.61.31で赤というような表示です。
    なにか解決法は無いでしょうか?

    1. マッキーさん

      いつもお試しいただき、ありがとうございます。

      なるほど!
      ボードによって反転する回路になっている場合もあるんですね。

      この場合は、ILI9341 のデータシートにあるコマンド Inversion On (0x21) を実行すれば良いと思います。
      早速、それ用の新しい関数を追加しました。
      dispInversionOn および dispInversionOff という関数です。
      以下のリンクで、beta ver 1.0.51 をダウンロードして、再インストールしてください。
      https://github.com/mgo-tec/ESP32_mgo_tec
      ※古いライブラリはフォルダごと削除してから再インストールしてください。

      その後、対象のスケッチの 67行目と68行目の間、LCD.dispRotation 関数の後に、

      LCD.dispInversionOn();
      

      と入力して、コンパイル書き込み実行させてみてください。

  4. mgo-tec 様

    HiLetgo 2.8″ ILI9341 LCD のSDカードスロットの接続で試行錯誤しています。
    今までサインスマートの LCD は使用していませんでしたが、原因究明のため新たに購入し試してみたところ、テキスト通りの動作を確認できました。
    改めてプルアップの追加をいろいろと試してみましたがうまくいきません。
    Amazon レビューに、「SD MISO だけ 1kΩの抵抗を入れたら正常に読み込めるようになった」とのことで、試してみましたがダメでした。
    他に何か試せるようなことがありましたら、ご教示の程お願いいたします。

    1. juchang さん

      いつもコメントありがとうございます。

      私はその LCD モジュールは持っていないので、良く分かりませんが、Amazon の簡易回路を見てみると、レビューにあるように、SD_MISO にだけ何故かプルアップ抵抗がありませんね。
      それに 1kΩ のプルアップ抵抗を入れれば良いような気がします。
      ただ、1kΩ というのは小さすぎるような気もしますが、良く分かりません。

      その他の方法として、クロック周波数を下げてみてはいかがでしょうか?
      スケッチの 63行目の
      SFR.init( cs_sd, 40000000 );
      を 20000000 とか、それ以下に下げてみて動くかですかね?

      今のところ、それくらいしかアドバイスできませんが、私ももうちょっと調べてみて、分かったらまたお知らせします。

      1. mgo-tec 様

        接続成功!!
        クロック周波数を 10000000 まで下げてみたところ動作確認できました。
        これから、ブレッドボードを3枚つなげて、LCD、ESP32-Devkit、押し釦を搭載したユニットが完成できそうです。
        いつも的確なアドバイスをいただきありがとうございます。

        1. juchang さん

          動作してよかったですね(^^)

          ただ、10MHz まで下げなければいけないとなると、SDカードの SPI クロックが鈍ってしまっている気がします。
          恐らく、ESP32 DevKitC からSDカードスロット端子までの配線が長すぎると、信号が鈍って、高速の SPI 信号が読み取れないことが起こります。
          極力短い配線にしてみてください。
          HiLetgo のボードのSD カードスロットはプルアップ抵抗だけの単純な構成なので、本来ならば SPI モードの標準最高周波数 約 21 MHz くらいは問題無く動作すると思われます。

          1. mgo-tec 様

            HiLetgo のボードを180度回して接続してみました。
            最初つながった 10MHz からスタートして 1MHz づつ上げていったところ、19 MHz までつながることが確認できました。
            この状態で使用して問題ありませんでしょうか。
            又、さらに周波数を上げる方策はありますでしょうか。
            アドバイスをいただけると幸いです。

          2. juchang さん

            いつもありがとうございます。

            恐らく、SDカード側を ESP32-DevKitC に近づけても、SCK や MOSI が LCD と共通線なので、LCD側が逆に長くなってしまっていると思われます。
            するとあまり意味ありません。
            要するに、SCK や MOSI線もトータル距離が短くならないと、インピーダンスが下がらないのです。
            高周波になると、その線の長さがインピーダンス増加に直結しますので、LCD側とSDカード側の SCK と MOSI 線も短くする必要があります。
            そもそも、HiLetgo のこの基板自体が、SDカードまでの回路が長すぎるので、その分、ジャンパーワイヤーも短くしないと辛いと思います。
            大きくなるとなかなか難しいですね。

            また、HiLetgo は 2.8インチですので、その分、LEDバックライトに多くの電流を使うと思われます。
            私の記事の回路図では、GPIO から定電流ダイオードで電流制限していますが、Amazon の回路図を見ると、電流制限抵抗3.9Ω(kΩ?)が入っているので、ESP32-DevKitC の 3.3V から直に LED 端子に入れた方が良いかもしれません。
            そして、LEDバックライトの大きさから、このボード全体的に、M5Stack よりも瞬間的に大電流が流れていることが想像されます。
            ということは、それの電圧降下で、SDカードの電圧が足りなくなっている可能性があります。
            ESP32-DevKitC の 3.3V からの供給では、電源容量が足りていない可能性もあります。
            ですから、3.3V からのジャンパーワイヤーも太く短く、そして、LCD に接続してある GND 線も太く短い配線にしてみてください。

            それと、ブレッドボードの接触不良や、ハンダ付けしたピンソケットの接触不良も SDカードの読み取りを悪くします。
            私の場合は、格安ブレッドボードやロープロファイルピンソケットを使った工作をしたことがありますが、接触不良が多く、殆ど読み取ってくれませんでした。
            でも、この記事でも紹介している、サンハヤトのブレッドボード SAD-101 に替えたら、接触不良は殆ど無くなりました。
            いずれにしても、ブレッドボードはそういう問題が付き物ですので、高周波動作には限界があります。

            また、私のプログラムでは、40MHz としていますが、実際の所、20MHz でも殆ど変わらないので、SPIモードの標準最高周波数付近の 20MHz で動作すれば良いと思います。
            40MHz はハッキリ言って保証外とも言えますが、それで動いているのでそのままにしていました。
            M5Stack の純正ライブラリも昔は 40MHz にしていたのを見受けられましたが、今は 20MHz にしていたと思います。

            ということで、20MHz で動作すればそれで問題ないと思います。
            これで試してみて下さい。

          3. 追伸;
            それと、もう一つ。
            私が動作確認している、Amazon の micro SDHC カード
            Transcend 32GB
            ですが、これだと SPI モードは 20MHz が限界かも知れません。
            もっと最新のハイスピードで高信頼性のもの、例えば、Sandisk とか TOSHIBA のものだと、読み取れる場合があります。
            ここでは動作保証し兼ねるので紹介しませんが、同じ micro SDHC でもいろいろ class がありますので、注意して購入する必要があります。
            このブログで紹介しているものは格安なので、20MHz が限界かも知れません。

  5. mgo-tec 様

    続報;
    ESP32-DevKitC を LCD の中心付近に配置し、最短となるよう硬いジャンパーワイヤーでブレッドボード上を這わせるように配線し直してみました。
    結果、見事に周波数 40MHz を達成することができました。
    ジャンパーワイヤを太く短くすることがこれほどの効果を上げるとは驚きです。
    大きい画面で試せることでこれからの新作発表が益々楽しみです。
    いろいろとご指導いただきありがとうございました。

    1. juchang さん

      それはそれは良かったです (^^)

      やっぱりジャンパーワイヤーでしたか。
      Amazon の写真を見ても、SDカード端子から SDカードスロットまでの距離が無駄に長すぎますよね。
      こんなに大きな基板スペースがあるのだから、最短回路に設計すれば良いのにと思っていました。
      これは疑問ですね。

      それと、勘違いしていたのですが、Amazon の写真および回路図で見えるチップ抵抗 1kΩ は直列に接続されているので、プルアップ抵抗ではなく、その線の保護抵抗のようです。
      プルアップ抵抗は明記されていませんでした。
      ということは、MISO だけに 1kΩ のプルアップする意味がありません。
      プルアップ抵抗が有るか無いかの推測は、VCC 端子と SCK や MOSI, MISO などの端子の抵抗値をテスターで測れば分かると思います。
      もっとちゃんとした回路図が欲しいですね。

      ということで、juchangさんのこの情報で、このコメントを見た他の HiLetgo ユーザーに大いに助けとなると思います。
      こちらこそ情報ありがとうございました。
      今後とも何卒よろしくお願いいたします。
      m(_ _)m

      1. juchangさん

        3Dプリンターとブレッドボードを合わせた素晴らしい工作写真を投稿して下さり、ありがとうございました。
        juchangさんからご了承いただきましたので、ここで紹介させていただきます。
        ブレッドボードを使って、2.8インチ ILI9341 (SDカードスロット付き)モジュールと ESP32 とのSPI通信距離を出来るだけ短くして、SDカードの40MHz設定通信を実現したアイデアはスバラシイです。

        jcg_m5stack_cm1.jpg

        【juchangさんからのコメント】
        3Dプリンター:idbox
        3Dソフト  :Fusion 360
        因みに、このボードは yunrichlcd 3.2” ILI9341 と共用できるようにしてあります。
        3.2“ の大画面は迫力があり皆さんにお勧めです。

         

        中央の隙間を通して、下の段の ESP32 の GPIO に最短で接続されているようです。
        これはなかなか考え付かないですね。
        ここまでくると、ガッツリケースを作って、ハンダ付けして固めた方が良いと思いますが、ブレッドボード上で別の 3.2インチディスプレイに換装できるということで、納得です。
        確かに、3.2インチは迫力ありそうですね!
        とにかくスバラシイ!!!
        みなさん、3.2インチの ILI9341 はおススメだそうですよ!!!

        juchangさんにはいつも工作を試していただき、感謝で言葉もありません。
        ホントにありがとうございます。
        m(_ _)m

  6. mgo-tecさん。素晴らしい作品で尊敬します。
    プログラムをROMさせてもらっています。
    ウオッチバンド仕様にして下記のようにバッテリーを長持ちさせています。
    ・CPUを80Mhzで動作させる。
    ・記事更新を15分間隔にしている。
    ・点灯時LCD.brightness(30)消灯時(0)ボタン操作から30秒自動消灯
    ・消灯時、フラグを見てスクロール処理しない。
    ・ウォッチバンド付属の850mAh→1000mAhを入れている。
    これで、WIFIがOFFかつ画面消灯の時、消費電流43mAになります。
    そこで、質問です。
    CPUを80Mhzにした際、時刻のピンクの数字が多少崩れます。
    処理速度が足りないと言ってしまえばそれまでですが、
    天才的なライブラリを見ても私ごときでは解読できませんでした。
    これって改良の余地はありますでしょうか?
    80Mhzにしている方法は、
    先頭に、#include を追加
    setup()の最終行に、rtc_clk_cpu_freq_set(RTC_CPU_FREQ_80M);を追加しています。
    引数は、
    RTC_CPU_FREQ_XTAL
    RTC_CPU_FREQ_80M
    RTC_CPU_FREQ_160M
    RTC_CPU_FREQ_240M
    RTC_CPU_FREQ_2M
    ちなみに、
    RTC_CPU_FREQ_XTALは40Mhzですが、低消費電力なので動けば面白いのですが
    WIFI接続失敗するので、接続時のみ一時的に80Mhzにして接続したりして見ましたが、
    40Mhz時はtimelibが2秒で1秒を刻むため、時計が狂ってしまいました。
    シリアルモニタも半分のbpsになります。
    RTC_CPU_FREQ_2Mはスローモーションスクロールでした。

    1. sakuppiさん

      記事をご覧いただき、ありがとうございました。
      そして、高度な改良で運用して下さっているようで、スゴイですね。
      うれしいかぎりです。

      ただ、CPUクロックを下げて作ったことが無いので、改良できるか分かりません。
      そもそも、デスクトップ用でフルパワー運用しか考えていなかったです。
      私の考えられる省電力は、スクロールの完全停止で、ボタンを押したらスクロールするとかですかね?
      いままで省電力プログラムは殆ど組んだことが無いので、全く分かりません。

      ピンクの数字は、速度が少しでも落ちると崩れてしまいますね。
      数字が動いている間に時刻受信したり、記事を受信したりすると数値が変わる場合があるので、高速処理が原則です。
      例えば、以下の記事
      https://www.mgo-tec.com/blog-entry-google-home-m5stack-realtime-message.html
      では、スクロール時計を使うと崩れてしまったので、固定数字時計にしました。
      いろいろとギリギリで動かしています。

      ということで、全くアドバイスになりませんが、省電力化は私もこれから勉強していきたいと思います。
      来年の課題とさせてください。
      m(_ _)m

  7. あっ。失礼しました。
    includeで付け足すのはsoc/rtc.hのつもりの文章です。
    HTMLでかっこの記号内が無視されるのですね。

    1. あー!
      そういうことですか!

      実はこれは WordPress なので、半角の<>という記号は無視されてしまうんです。
      その場合、HTML の<PRE>タグ内にソースコードを入れてくださればと思います。
      お知らせいただきありがとうございます。

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください