M5Stack に BME280 のグラフと、ニュース、天気予報を表示させ、Ambient へデータ送信させてみた

M5Stack

BME280モジュール周りの組み立て

M5Stack と BME280モジュールを接続するための工作は以下の記事を参照してください。
できるだけ、熱源のM5Stackから遠ざけ、なお且つI2C通信トラブルが起きない距離感にすることをお勧めします。

BME280 を M5Stack で使って再びハマったこと、BOSCH 純正ドライバの使用について

2018/07/10以降の最新版Arduino – ESP32 をインストールしておく

先に述べましたが、GitHub の Arduino core for the ESP32 が 2018/06/28以降大幅に更新され、しばらく正常に動作しない状態が続いていましたが、2018/07/10以降の最新版では Wi-Fi周りが概ね解消されたので、それを使って下さい。

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

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

インストールする場合は、古い Arduino – ESP32 を全て削除して、ZIPファイルをダウンロードしてインストールしてください。
因みに、この最新版を使うと、古いスケッチが動かない可能性もありますので、詳しくは以下の記事を参照してください。

Arduino – ESP32 大幅更新( 2018/06/28以降 )と I2C 不具合解決、その他気付いたこと

BOSCH製 BME280 ドライバを Arduino IDE にインストールしておく

以下の記事を参照して、GitHubにある BOSCH製ドライバを Arduino IDE にインストールしておいてください。
そして、FLOAT 有効にしておいてください

BME280 を M5Stack で使って再びハマったこと、BOSCH 純正ドライバの使用について

Ambient ライブラリを Arduino IDE にインストールしておく

GitHub の以下のリンクから、Ambient ライブラリの ZIP ファイルをダウンロードして、Arduino IDE に予めインストールしておいてください。

https://github.com/AmbientDataInc/Ambient_ESP8266_lib

ZIPファイルから Arduino IDE に直接インストールする方法は以下の記事を参照してください。
GitHubにある ZIP形式ライブラリ のインストール方法 ( Arduino IDE )

M5Stack にYahooニュースや天気予報、日本語フォント等を表示できるようにしておく

以下の記事を参照して、Yahooニュースや天気予報、日本語フォントやカスタムフォントを表示できるようにしておいてください。
Timeライブラリを忘れずにインストールしておいてください。

M5Stackに天気予報、スクロール時計、Yahooニュース、メッセージ表示させてみた

最新版自作ライブラリをインストールしておく

今回、私の自作ライブラリを更にバージョンアップしました。
最新版を再インストールしてください。
古いライブラリはフォルダごと削除してからインストールしてください

ESP32_mgo_tec ライブラリ

現在、beta ver 1.0.40 です。
GitHub の以下のリンクから ZIP ファイルをダウンロードしてインストールしてください。
https://github.com/mgo-tec/ESP32_mgo_tec

※コンパイルエラー
display_bme680_i2c.h: fatal error: bme260.h: No such file or directory
が出る場合、インストールした私の自作ライブラリのSensorフォルダの中の以下の2つのファイルを削除してみてください。
Windows 10 の場合、以下のパスになります。

C:\Users\__user_name__\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor

削除するファイルは以下の2つです。
display_bme680_i2c.h
display_bme680_i2c.cpp
(2018/09/24)

 

また、この自作ライブラリには、Arduino IDE 標準の Time ライブラリが必要です。
これは外部ライブラリになっているので、GitHub の以下のページから ZIPファイルをダウンロードしてインストールしてください。
https://github.com/PaulStoffregen/Time

スケッチの入力

では、以下のスケッチを入力してみてください。
私は基本素人なので、誤りや不具合があるかも知れません。
何か気付いたことがあれば、コメント投稿等でご連絡いただけると助かります。

●17-18行で、ご自分のアクセスポイント(ルーター)のSSID とパスワードに書き換えてください。

●23行目がカスタムフォントに書き替えた東雲フォントファイルです。
オリジナルの東雲フォントにしたい場合は、これをコメントアウトして、21行目のコメントを解除してください。

●37-38行で、Ambient で取得したチャンネルID と writeキーに書き換えてください。

●29行目で、Yahoo! Japan RSS 内のご自分の地域の天気予報 URL に書き換えてください。
以下のリンクで地域を選択して、URL をコピペしてください。

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

●297-341行の WiFi アクセスポイント接続に関しては、自分自身もいろいろと試行錯誤中です。
ある時には再接続し辛かったり、アクセスポイントにすら接続できなかったりする場合があります。
WiFiMulti にすると接続し易い場合もあるので、ご自分でいろいろ変えてみて下さい。

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

#include "mgo_tec_m5stack_bme280.h"
#include "Ambient.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 int sda = 21; //BME280 I2C
const int scl = 22; //BME280 I2C

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* myfont_file = "/font/MyFont.fnt"; //自作フォントファイル名を定義(天気予報用)

const char* yahoo_news_host = "news.yahoo.co.jp";
const char* yahoo_news_target_url = "/rss/topics/top-picks.xml";
const char* yahoo_weather_host = "rss-weather.yahoo.co.jp";
const char* yahoo_weather_target_url = "/rss/days/4410.xml";

mgo_tec_esp32_bv1::SdShinonomeFont SFR(cs_sd, 40000000);
mgo_tec_esp32_bv1::ILI9341Spi LCD;

//------Ambient関連初期化-------------
WiFiClient client;
Ambient ambient;
unsigned int channelId = 1000; // AmbientのチャネルID
const char* writeKey = "**********"; // ライトキー
boolean ambient_send_ok = false;
//------時刻文字表示系 引数初期化-----
mgo_tec_esp32_bv1::ILI9341Watch wtc;
uint8_t num = 0; //文字列番号
uint8_t colon1_buf[ 2 ][ 16 ] = {}, colon2_buf[ 2 ][ 16 ] = {};
uint16_t colon1_sj_len = 0, colon2_sj_len = 0;
//--------NTP関連定義---------------
int timezone = 9; //Tokyo
const char *ntp_server_name = "time.windows.com";
//-----Yahooニュース記事関連定義------
mgo_tec_esp32_bv1::YahooJrssGet yrg;
mgo_tec_esp32_bv1::FontParameter news_font;
mgo_tec_esp32_bv1::ScrolleParameter news_scl_set;
uint8_t news_sj_txt[ 400 ] = {}; //Shift_JIS文字コード格納
uint8_t news_font_buf[2][16] = {}; //16x16フォント全角1文字格納バッファ
//------天気予報関連定義-------------
mgo_tec_esp32_bv1::FontParameter weather_fnt;
File MyF; //天気予報自作フォント用
//-----Webデータ取得変数-------------
uint32_t web_get_last_time = 0;
bool isWeb_get_first_time = true;
//-----メッセージウィンドウ関連定義----
mgo_tec_esp32_bv1::MessageWindow wifi_msg, 
              ntp_msg, 
              news_msg, 
              weather_msg,
              ambient_msg;
//-----ボタンスイッチ 引数初期化-----------
mgo_tec_esp32_bv1::ButtonSwitch btnA, btnB, btnC;
const uint8_t buttonA_GPIO = 39;
const uint8_t buttonB_GPIO = 38;
const uint8_t buttonC_GPIO = 37;
//------BME280 初期化------------------------
mgo_tec_esp32_bv1::DisplayBme280I2c bme_disp;
mgo_tec_esp32_bv1::FontParameter pres_font, temp_font, hum_font;
mgo_tec_esp32_bv1::FontParameter graph_font;
mgo_tec_esp32_bv1::GraphParameter pres_graph, temp_graph, hum_graph;
int time_measure_mode = 0;
//------------------------------------------
boolean isWifi_connect_first = true;

//***********セットアップ****************************
void setup() {
  delay(1000);
  Serial.begin(115200);
  pinMode(buttonA_GPIO, INPUT); //GPIO #39 は内部プルアップ無し
  pinMode(buttonB_GPIO, INPUT); //GPIO #38 は内部プルアップ無し
  pinMode(buttonC_GPIO, INPUT); //GPIO #37 は内部プルアップ無し

  //ライブラリ初期化。3ファイル同時に開く
  SFR.init3File(utf8sjis_file, shino_half_font_file, shino_full_font_file);

  MyF = SD.open(myfont_file, FILE_READ);
  if (!MyF) {
    Serial.print(myfont_file);
    Serial.println(" File not found");
    return;
  }else{
    Serial.print(myfont_file);
    Serial.println(" File read OK!");
  }

  LCD.ILI9341init(sck, miso, mosi, cs, dc, rst, lcd_led_pin, 40000000, false); //microSDを使う場合、必ず false にする
  LCD.displayClear();
  LCD.brightness(255); //LCD LED Full brightness

  mgo_tec_esp32_bv1::MessageWindow msg;
  msg.m_padding = 4;
  msg.dispMsgWindow( 0, "  Set Up ...WiFi connecting..." );
  //-----------------------------------
  getWeb(); //WiFiセットアップ、Web記事およびNTP時刻取得
  //-----BME280関連--------------------
  setupBmeValueDisp(); //BME280 数値表示セットアップ
  setupBmeGraphDisp(); //BME280 グラフ表示セットアップ
  //-----時計表示関連------------------
  num = 0; //時、十の位の文字列をフォント変換
  wtc.watchStrFontConv( num, " 123456789" );
  for( num = 1; num < 6; num++ ){
    wtc.watchStrFontConv( num, "0123456789" );
  }
  setupWatchFont(); //時計表示フォントセットアップ
  //-----------------------------------
  setupNewsFont(); //ニュース記事文字列のセットアップ
  setupWeatherFont(); //天気予報フォントセットアップ
  setupMessageWindow(); //メッセージウィンドウ表示セットアップ
  //----Ambientライブラリ初期化--------
  ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
  //----------------------------------
  wtc.watchDispReset(); //時計表示が崩れる為に一旦リセット
  //----------------------------------
  TaskHandle_t th; //マルチタスクハンドル定義
  xTaskCreatePinnedToCore(Task1, "Task1", 8192, NULL, 5, &th, 0); //マルチタスク起動
}
//***********メインループ****************************
void loop(){
  //Statusメッセージウィンドウ表示
  wifi_msg.dispWifiStatusMsgShort();
  ambientMessage();
  ntp_msg.dispWebGetStatusMsgShort( wtc.ntp_msg_status, "NTP" );
  weather_msg.dispWebGetStatusMsgShort( yrg.weather_msg_status, "天気" );
  news_msg.dispWebGetStatusMsgShort( yrg.news_msg_status, "News" ); 

  wtc.scrolleWatch(); //時計スクロール
  wtc.displayColon2(); //時計コロン表示

  //Yahoo! Japan RSS 天気予報表示
  yrg.dispYahooJweatherMyFont( MyF ,weather_fnt );
  //Yahoo! Japan RSS ニューススクロール
  yrg.scrolleYahooJnews( news_font, news_scl_set, news_sj_txt, news_font_buf );

  //BME280関連表示
  bme_disp.displayValue( pres_font, temp_font, hum_font );
  bme_disp.drawGraphNowAll( pres_graph, temp_graph, hum_graph );
  bme_disp.displayMinMaxValue( pres_graph, temp_graph, hum_graph, pres_font, temp_font, hum_font );

  button_action(); //ボタン操作
}
//************ マルチタスクループ ******************
void Task1(void *pvParameters) {
  //Wireライブラリ関数は全て同じタスクに置かねばならないので注意
  bme_disp.initBme280Force( sda, scl, 100000 );
  delay(1000);
  while(1){
    bme_disp.getData();
    getWeb(); //Web記事およびNTP時刻取得
    delay(1); //マルチタスクの場合、これ絶対必要!
  }
}
//*************************************************
void setupBmeGraphDisp(){
  pres_graph.frame_y0 = 112;
  pres_graph.x_total_points = 317;
  pres_graph.y_total_points = 100;

  graph_font.red = 31, graph_font.green = 63, graph_font.blue = 31;

  pres_graph.red = 31, pres_graph.green = 0, pres_graph.blue = 0;
  temp_graph.red = 0, temp_graph.green = 63, temp_graph.blue = 0;
  hum_graph.red = 0, hum_graph.green = 55, hum_graph.blue = 31;

  pres_graph.max_value = 1050.0;
  pres_graph.min_value = 850.0;
  temp_graph.max_value = 100.0;
  temp_graph.min_value = 0.0;
  hum_graph.max_value = 100.0;
  hum_graph.min_value = 0.0;
  bme_disp.m_time_measure_mode = (int8_t)bme_disp.Period3sec;

  bme_disp.initGraphAll( pres_graph, temp_graph, hum_graph, graph_font );
}
//*************************************************
void setupBmeValueDisp(){
  //センサー数値フォント色 red(0-31), green(0-63), blue(0-31)
  pres_font.Xsize = 2, pres_font.Ysize = 2;
  pres_font.bg_red = 0, pres_font.bg_green = 0, pres_font.bg_blue = 0;

  temp_font.Xsize = 2, temp_font.Ysize = 2;
  temp_font.bg_red = 0, temp_font.bg_green = 0, temp_font.bg_blue = 0;

  hum_font.Xsize = 2, hum_font.Ysize = 2;
  hum_font.bg_red = 0, hum_font.bg_green = 0, hum_font.bg_blue = 0;

  pres_font.red = 31, pres_font.green = 0, pres_font.blue = 0;
  temp_font.red = 0, temp_font.green = 63, temp_font.blue = 0;
  hum_font.red = 0, hum_font.green = 55, hum_font.blue = 31;

  char unit_c[3][5] = { "hPa ", "℃", "%" };
  bme_disp.initDispValue( pres_font, temp_font, hum_font, 0, 80 , unit_c );
}
//******時計表示フォント設定****************************
void setupWatchFont(){
  for( num = 0; num < 4; num++ ){ //時、分のフォント色設定
    wtc.font[num].red = 31, wtc.font[num].green = 0, wtc.font[num].blue = 31;
    LCD.scrolleFontColorSet( wtc.font[num] );
  }
  for( num = 4; num < 6; num++ ){ //秒のフォント色設定
    wtc.font[num].red = 0, wtc.font[num].green = 63, wtc.font[num].blue = 31;
    LCD.scrolleFontColorSet( wtc.font[num] );
  }

  //コロンフォント色設定 red(0-31), green(0-63), blue(0-31)
  wtc.colon1_font.red = 31, wtc.colon1_font.green = 63, wtc.colon1_font.blue = 0;
  wtc.colon1_font.bg_red = 0, wtc.colon1_font.bg_green = 0, wtc.colon1_font.bg_blue = 0;
  wtc.colon2_font.red = 0, wtc.colon2_font.green = 0, wtc.colon2_font.blue = 31;
  wtc.colon2_font.bg_red = 0, wtc.colon2_font.bg_green = 0, wtc.colon2_font.bg_blue = 0;

  uint16_t x0 = 0, y0 = 46 - 18;
  uint8_t Xsize = 2, Ysize = 1;
  wtc.watchFontSetup2(x0, y0, Xsize, Ysize); //時計フォントセット
}
//******Yahooニュース天気予報フォント設定****************
void setupWeatherFont(){
  weather_fnt.Xsize = 2, weather_fnt.Ysize = 1;
  weather_fnt.y0 = 62;
}
//******Yahooニュース記事フォント設定********************
void setupNewsFont(){
  uint8_t txt_max = 13;

  news_font.x0 = 0;
  news_font.y0 = 46;
  news_font.Xsize = 3, news_font.Ysize = 1;
  // red(0-31), green(0-63), blue(0-31)
  news_font.red = 31, news_font.green = 63, news_font.blue = 0;
  news_font.bg_red = 0, news_font.bg_green = 0, news_font.bg_blue = 25;
  news_scl_set.interval = 30;
  //ヒープ領域配列確保。※不要な時は必ずdeleteしておく。
  LCD.XscrolleFontArrayInit( news_font, news_scl_set, txt_max, news_font.Xsize, news_font.Ysize);
  LCD.scrolleFontSetUp( news_font, news_scl_set );
  Serial.printf("Free Heap Size = %d\r\n", esp_get_free_heap_size());
}
//*****メッセージウィンドウ設定**************************
void setupMessageWindow(){
  wifi_msg.m_x0 = 0;
  wifi_msg.m_y0 = 0;
  wifi_msg.m_size = 1;
  wifi_msg.m_padding = 4; //pixel単位
  wifi_msg.m_txt_length = 7; //文字表示数(半角相当)

  ambient_msg.m_x0 = 64;
  ambient_msg.m_y0 = 0;
  ambient_msg.m_size = 1;
  ambient_msg.m_padding = 4; //pixel単位
  ambient_msg.m_txt_length = 11; //文字表示数(半角相当)

  int16_t xx = 160;
  ntp_msg.m_x0 = 0 + xx;
  ntp_msg.m_y0 = 0;
  ntp_msg.m_size = 1;
  ntp_msg.m_padding = 4; //pixel単位
  ntp_msg.m_txt_length = 6; //文字表示数(半角相当)

  weather_msg.m_x0 = 96 - ntp_msg.m_txt_length * 8 + xx;
  weather_msg.m_y0 = 0;
  weather_msg.m_size = 1;
  weather_msg.m_padding = 4; //pixel単位
  weather_msg.m_txt_length = 7; //文字表示数(半角相当)

  news_msg.m_x0 = 208 - ntp_msg.m_txt_length * 8 - weather_msg.m_txt_length * 8 + xx;
  news_msg.m_y0 = 0;
  news_msg.m_size = 1;
  news_msg.m_padding = 4; //pixel単位
  news_msg.m_txt_length = 7; //文字表示数(半角相当)  
}
//*******NTPサーバー、Yahoo! Japan RSS 記事取得*******
void getWeb(){
  if( (isWeb_get_first_time == true) || (millis() - web_get_last_time > 180000) ){ //3分毎に記事取得
    WiFi_AP_Connect(); //WiFi起動、アクセスポイント接続
    wtc.getNTPserverSel( timezone, ntp_server_name );
    yrg.getYahooJweather( yahoo_weather_host, yahoo_weather_target_url );
    yrg.getYahooJnews( yahoo_news_host, yahoo_news_target_url );
    sendDataToAmbient(); //Ambient へデータ送信
    WiFi.mode(WIFI_OFF); //省電力化のため、ESP32のWiFiをOFF
    isWeb_get_first_time = false;
    web_get_last_time = millis();
  }
}
//*******WiFiアクセスポイント接続*************
void WiFi_AP_Connect(){
  wifi_msg.WifiStatus = wifi_msg.WifiConnecting; //WiFiメッセージウィンドウ設定
  Serial.println();
  Serial.println(F("Connecting Wifi..."));
  Serial.println(ssid);

  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{
    WiFi.begin(ssid, password);
    uint32_t last_time = millis();
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
      if( millis() - last_time > 20000 ) break; //Time OUT
    }
    //マルチタスクでメッセージウィンドウを正しく表示させるための処置
    if( millis() - last_time < 1000 ) delay(2000); 
  }

  int16_t 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());
  }

  if( wifi_state == WL_CONNECTED ){
    wifi_msg.WifiStatus = wifi_msg.WifiConnected; //WiFiメッセージウィンドウ設定
  }else{
    wifi_msg.WifiStatus = wifi_msg.WifiFailed; //WiFiメッセージウィンドウ設定
    Serial.println("WiFi AP Not Found");
  }
}
//*******Ambient用メッセージウィンドウ表示*****************
void ambientMessage(){
  if( ambient_send_ok == true ){
    //Ambient用メッセージウィンドウ色設定 red(0-31), green(0-63), blue(0-31)
    ambient_msg.font.red = 31;
    ambient_msg.font.green = 63;
    ambient_msg.font.blue = 31;
    ambient_msg.m_bg_red = 0; //背景色
    ambient_msg.m_bg_green = 50; //背景色
    ambient_msg.m_bg_blue = 0; //背景色
    ambient_msg.dispMsgWindow( 1, " Ambient◎" );
  }else{
    ambient_msg.font.red = 31;
    ambient_msg.font.green = 0;
    ambient_msg.font.blue = 0;
    ambient_msg.m_bg_red = 15; //背景色
    ambient_msg.m_bg_green = 0; //背景色
    ambient_msg.m_bg_blue = 0; //背景色
    ambient_msg.dispMsgWindow( 2, " Ambient×" );
  }
}
//******Ambientクラウドへデータ送信**************************
void sendDataToAmbient(){
  if( ambient_send_ok && bme_disp.m_isNewData == true ){
    if( bme_disp.m_fPressure != -500.0 && bme_disp.m_fTemperature != -500.0 && bme_disp.m_fHumidity != -500.0 ){
      String pres_str = String(bme_disp.m_fPressure);
      String temp_str = String(bme_disp.m_fTemperature);
      String hum_str = String(bme_disp.m_fHumidity);
  
      Serial.println("-------------Send to Ambient--------------");
      Serial.printf("pressure = %s, temperature = %s, humidity = %s\r\n", pres_str.c_str(), temp_str.c_str(), hum_str.c_str() );
      Serial.println("------------------------------------------");
      ambient.set(1, pres_str.c_str());
      ambient.set(2, temp_str.c_str());
      ambient.set(3, hum_str.c_str());
      ambient.send();
    }
    bme_disp.m_isNewData = false;
  }
}
//****************************************
void button_action(){
  btnA.buttonAction( buttonA_GPIO, true, 30, 300 ); //チャタリング対策 30ms, 長押し300ms
  switch( btnA.ButtonStatus ){
    case btnA.MomentPress:
      Serial.println("Button A Moment Press");
      pres_graph.max_value = 1020.0;
      pres_graph.min_value = 980.0;
      temp_graph.max_value = 30.0;
      temp_graph.min_value = 25.0;
      hum_graph.max_value = 70.0;
      hum_graph.min_value = 40.0;
      bme_disp.m_isDisp_min_max = true;
      break;
    case btnA.ContPress:
      Serial.println("-------------Button A Cont Press");
      pres_graph.max_value = 1050.0;
      pres_graph.min_value = 850.0;
      temp_graph.max_value = 100.0;
      temp_graph.min_value = 0.0;
      hum_graph.max_value = 100.0;
      hum_graph.min_value = 0.0;
      bme_disp.m_isDisp_min_max = true;
    default:
      break;
  }

  btnB.buttonAction(buttonB_GPIO, true, 30, 300); //チャタリング対策 30ms, 長押し300ms
  switch( btnB.ButtonStatus ){
    case btnB.MomentPress:
      Serial.println("Button B Moment Press");
      if( ambient_send_ok == true ){
        ambient_send_ok = false;
      }else{
        ambient_send_ok = true;
      }
      break;
    case btnB.ContPress:
      Serial.println("-------------Button B Cont Press");
      wtc.watchDispReset();
      break;
    default:
      break;
  }

  btnC.buttonAction(buttonC_GPIO, true, 30, 300); //チャタリング対策 30ms, 長押し300ms
  switch( btnC.ButtonStatus ){
    case btnC.MomentPress:
      Serial.println("Button C Moment Press");
      bme_disp.m_time_measure_mode++;
      if( bme_disp.m_time_measure_mode > bme_disp.Period4m48s ){
        bme_disp.m_time_measure_mode = (int8_t)bme_disp.Period3sec;
      }
      bme_disp.reDrawGraphAll( pres_graph, temp_graph, hum_graph, graph_font );
      Serial.printf("mode_time_measure=%d\r\n", bme_disp.TimeMeasureMode);
      break;
    case btnC.ContPress:
      Serial.println("-------------Button C Cont Press");
      break;
    default:
      break;
  }
}

では、次の項では、いろいろな注意点を説明します。

コメント

  1. H.W より:

    mgo−tecさん、
    1週間ほど福岡の方に行ってまして、ご無沙汰しておりました。
    その間に、またさらに素晴しい秀作スケッチが出来上がっており、遅ればせながら模写させて頂きました。

    当初、必要なライブラリー類を更新した後、試しに現状のままのArduino core for ESP32でインストールしてみたら、やはりコンパイルエラーが出たので、この機会に最新版に更新しました。
    その後は、一発Noエラーでコンパイルは完了しました。

    寧ろ意外な所でハマってしまったのが、Ambientの初期登録で、認証メールがgmailのフィルタに引っかかり迷惑メールフォルダに入っていたのに当初気づかなかったことと、ライトキーに誤ってユーザーキーを書き込んでいたこと位ですかね…
    しかし、確かにこのAmbientクラウドは非常に便利で他にも色々と活用ができそうですね?

    本題のスケッチの方ですが、接続状況がWifiとAmbientが追加されてさらに細かく表示がされ、下半分にグラフが表示される様になったので、Yahooニュースのスクロール文字が小さくなって老眼の身にはちょっと辛くはなりましたが、必要十分な情報が盛り沢山でとてもいいですね。。。
    (将来的にグラフのオン/オフ切り替えもできたらベターですね?)

    当方のBME280基板は、目下ブレッドボードで外付けにしていますが、この半分位の大きさの安価なI2C専用基板がある様なので、手に入れたらPROTO基板の空いたスペースに実装してみようと思っています。
    (M5stackの内部環境モニターとなってしまいますが…)

    尚、数時間ほど連続動作させてみましたが、特に接続エラーを起こすことも無く、センサのデータ取得も途切れることはありませんでした。
    また、消費電流は5.14Vで130mA位でしたので、増強したLipo電池で半日位は持ちそうです。。。

    • mgo-tec mgo-tec より:

      H.Wさん

      いつも試していただいて、ありがとうございます。
      m(_ _)m
      今回は、かなり力をいれてプログラミングをしてみました。
      自分なりに納得できる仕上がりになりました。

      でも、おっしゃる通り、私も老眼でニュースや時刻を読み取るのは少々辛いです。
      そうすると、もっと大きいディスプレイが欲しくなりますね。
      とりあえず、ディスプレイに全部盛り込んでみたかっただけのお遊びです。

      Ambient設定については私も迷惑フォルダに入っていました。
      これ、皆さん悩んでいる方も多いかもしれませんね。
      Twitter でツイートしておきます。

      最新版 Arduino – ESP32 は、消費電力も前よりも少なくなり、安定感が増しましたね。
      ますます進化していて有難い限りです。

      なんとか台風の季節前に M5Stack とセンサ連携が形になりました。
      これからは威力を発揮しそうです。

  2. H.W より:

    H.Wです。
    その後の状況ですが、Webゲットが一度出来なくなると所定時間(ディフォルトで3分)経っても再接続ができない状態が継続します…
    (但し、リセットすると直ぐに正常接続します。)
    尚、該当箇所を適宜Wifimultiに変更してみましたが、シリアルモニターでも「…..」が継続表示されて接続できない状態となりました…?

    ところで、7/25発売のInterface9月号ではESP32が特集されますね? 既にAmazonで予約済ですが、
    事前の目次情報を見るとInterfaceなので当然と言えば当然ですが、かなり突っ込んだ解説がされているようで今から楽しみです。

    >第1部 新定番IoTマイコンESP32登場
    >第2部 大人気のIoTプロトタイピング・デバイスM5Stack
    >第3部 IoTマイコンESP32徹底研究
    >第4部 ESP32 IoT実験室

    M5stackについても詳細な事例が取り上げられているようなので期待してます。
    (mgo-techさんも何か記事を投稿されているのでしょうか?)

    • mgo-tec mgo-tec より:

      H.Wさん

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

      実は、私も同じ症状が出ました。
      以前に比べれば、最新版の Web get できなくなることは少なくなりましたが、やはり一度接続できなくなると、二度と繋がらなくなりますね。
      これは謎です。
      WiFi_OFF にしていることに何か原因があると思います。
      電力食ってもよければ、
      WiFi.mode(WIFI_OFF);
      などを外して、常時接続してみてください。
      それでも再接続できなければ、原因は私には分かりません。
      Arduino-ESP32 が更新されるのを待つしか無いと思います。

      Interface のESP32特集については存じております。
      私も買おうと思っています。

      因みに、Interfaceさんからは私のような素人にはお呼びがかからないと思います。
      ですから投稿していません。
      でも、内容は楽しみですね。
      期待しちゃいます。

  3. kuro より:

    「ArduinoIDE」超初心者です、以下について教えてください。

    1.「M5Stack」用にスケッチを検証・コンパイルすると、既定のライブラリが探せないためコンパイルできません。(探せるものもあるようです)
    尚、ファイルは既定の場所にあり壊れてはいないようです。
    何処かに、「path」の設定などが有るのでしょうか。

    2.同名のホルダー及びライブラリが複数存在しますが、何処かにまとめた方がいいのでしょうか、
    また空のホルダーもありますが、削除した方がいいのでしょうか。

    よろしくお願いいたします。

    • mgo-tec mgo-tec より:

      kuroさん

      記事をご覧いただき、ありがとうございます。

      まず、Arduino core for the ESP32 は、2018/07/25くらいから、Stable版というものができました。
      それは、ボードマネージャでインストールします。
      以下の記事をご覧ください。
      Arduino core for the ESP32 のインストール方法

      もし、古い Arduino – ESP32 と、Stable版が二重インストールされているとうまく動作しないかも知れませんので、古いものは esp32 フォルダごと削除してください。
      私は、現在、Stable版を使っています。

      次に、私の自作ライブラリは、古いものはフォルダごと削除してください。
      念のため、バックアップ取っておいた方が良いと思います。
      名前が重複しているものは古い方を削除してください。
      私の自作ライブラリは頻繁にアップデートしていますので、新しいものを使う場合は、古いものを必ず削除してから、再インストールしてください。
      ただし、私のスケッチの古いものは、古いライブラリでないと動作しないものもあります。
      そういうものがありましたら、ご連絡いただければ、対処方法をお教えします。

      とりあえず、それでも動かない場合、エラーメッセージを貼り付けてコメント頂ければと思います。
      宜しくお願いします。

      • kuro より:

        mgo-tecさん、回答ありがとうございました。
        全てのファイルを削除し、再インストールしましたが次のエラーが出るので取りあえずリネームして行いました。(どのようにすればいいのか分からないので)
         ・「WiFi.h」、「SD.h」に対して複数のライブラリが見つかりました
        その後も、下記のようなエラーが出ます。
        どうすればいいのか分かりません、対処方法をご教授願います。(長くてすいません)

        「エラー内容」
        Arduino:1.8.6 (Windows), ボード:”M5Stack-Core-ESP32, QIO, 80MHz, Default, 115200, None”
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c15initBme280ForceEiij+0x1c): undefined reference to `bme280_init’
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c15initBme280ForceEiij+0x20): undefined reference to `bme280_set_sensor_settings’
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c15initBme280ForceEiij+0x24): undefined reference to `bme280_set_sensor_mode’
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c7getDataEv+0x8): undefined reference to `bme280_get_sensor_data’
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o: In function `mgo_tec_esp32_bv1::DisplayBme280I2c::initBme280Force(int, int, unsigned int)’:
        C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_init’
        C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_set_sensor_settings’
        C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_set_sensor_mode’
        libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o: In function `mgo_tec_esp32_bv1::DisplayBme280I2c::getData()’:
        C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_get_sensor_data’
        C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_set_sensor_mode’
        collect2.exe: error: ld returned 1 exit status
        exit status 1
        ボードM5Stack-Core-ESP32に対するコンパイル時にエラーが発生しました。
        「ファイル」メニューの「環境設定」から「より詳細な情報を表示する:コンパイル」を有効にするとより詳しい情報が表示されます。

        • mgo-tec mgo-tec より:

          kuroさん

          エラーメッセージ送って頂きありがとうございます。

          まず、基本的にライブラリ名のリネームはしなくても良いです。
          「WiFi.h」、「SD.h」に対して複数のライブラリが見つかりました
          というメッセージが出る場合は、ライブラリが正しくインストールされていないか、プログラムの誤りが原因です。
          正しくインストールされていれば、このエラーは出なくなります。
          ただ、Arduino標準ライブラリや、Arduino-ESP32ライブラリ以外で、同じ名前のライブラリがあれば、その場合はエラーが出るかもしれません。
          Arduino標準ライブラリと、Arduino core for the ESP32 のライブラリに限っては、同じライブラリ名があっても、正しくインストールされていればエラーは出ないようになっています。

          このエラーメッセージを見る限り、BOSCH純正ドライバライブラリがインストールされていないように見受けられます。
          まず、BOSCH純正ドライバライブラリが正しくインストールされているか、ご確認ください。
          この記事の2ページ目のところに、
          「BOSCH製 BME280 ドライバを Arduino IDE にインストールしておく」
          という項目があります。
          インストールしたら、必ず FLOAT を有効にしてください。

          これでもうまく動作しない場合は、またご連絡ください。

          • kuro より:

            mgo-tecさん、回答ありがとうございました。
            再インスト後のスケッチは、「M5Stack と BME680 でガス報知器(アラーム)および気圧・温湿度グラフで「熱中症」警告表示器を作ってみた」の記事のセンサー部分を「BME680 ⇒ BME280」に変更しただけだったので対応していなかったようです。
            次の部分をコメントアウトしたら無事に検証できました。
             ・75行目:bme_disp.initBme680Force( sda, scl, 100000, 28 ); //I2C周波数100kHz,
             ・95行目:bme_disp.getData();
            お手数をおかけしました。
            ありがとうございました。

          • mgo-tec mgo-tec より:

            kuroさん

            とりあえず、動いて良かったのですが、私は BME680 用のスケッチを BME280 で動くようには設計しておりません。
            BOSCH純正ドライバライブラリの BME680 用と BME280 用では構造が全く異なりますので、どこかしら不具合があると思われます。
            その辺はご理解のほどよろしくお願いいたします。。

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