スケッチの入力
今回は FRISK ケースを作ることが目的だったので、スケッチはザッと作った感じです。
いろいろ穴だらけだと思いますので、動作は保証しません。
ただ、不具合等があったらコメント投稿等でご連絡いただけると助かります。
解説も省略させていただきます。
いろいろ無駄が多いと思いますが、ご容赦ください。
因みに、ご自分の地域の天気予報に変えたい場合は以下のリンクから、URL を探し当てて修正してください。
https://weather.yahoo.co.jp/weather/rss/
また、ESP32_WebGet ライブラリは beta ver 1.13 を使って下さい。
(2018/07/14)
【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)
#include <WiFi.h> #include "TimeLib.h" //Arduino time library ver1.5 #include "ESP32_SPIFFS_SSD1331_Gadgets.h" //beta ver 1.1 #include "ESP32_SPIFFS_ShinonomeFNT.h" //beta ver 1.32 #include "ESP32_SPIFFS_UTF8toSJIS.h" //beta ver 1.2 #include "ESP32_SSD1331.h" //beta ver 1.71 #include "ESP32_I2C_SSD1306.h" //mgo-tec library beta ver 1.20 #include "ESP32_WebGet.h" //beta ver 1.13 const char* ssid = "xxxxxxxx"; //ご自分のルーターのSSIDに書き換えてください const char* password = "xxxxxxxx"; //ご自分のルーターのパスワードに書き換えてください 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 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 = 21; //OLED DC(Data/Command) const uint8_t RST_OLED = 4; //OLED Reset const uint8_t ADDRES_OLED = 0x3C; const int sda = 5; const int scl = 26; const uint8_t Horizontal_pixel = 128; const uint8_t Vertical_pixel = 64; ESP32_SPIFFS_SSD1331_Gadgets ESSG; ESP32_I2C_SSD1306 ssd1306(ADDRES_OLED, sda, scl, Horizontal_pixel, Vertical_pixel); ESP32_SSD1331 _ssd1331(SCLK_OLED, MISO_OLED, MOSI_OLED, CS_OLED, DC_OLED, RST_OLED); ESP32_SPIFFS_ShinonomeFNT _SFR; ESP32_WebGet _EWG; enum { MaxTxtByte = 500, Disp_Max_Num = 2, Disp_txt = 16}; uint8_t news_sj_txt[Disp_Max_Num][MaxTxtByte] = {}; //Shift_JIS コード文字列を格納 uint16_t news_sj_length[Disp_Max_Num]; //Shift_JIS コード文字列長 //-----ニュース記事文字列スクロール変数の初期化-------- uint16_t Scrolle_speed[Disp_Max_Num] = {10, 0}; //文字列スクロールインターバル時間 uint8_t font_buf[Disp_Max_Num][2][16] = {}; //スクロール時に投入するフォント1文字のバッファ uint8_t disp_buf[Disp_Max_Num][Disp_txt][16] = {}; //実際にディスプレイに表示するフォントバッファ uint16_t sj_cnt[Disp_Max_Num] = {}; //Shift_JISコード半角文字数カウント uint8_t Zen_or_Han[Disp_Max_Num] = {}; //全角か半角かを判断する変数 uint32_t SclTime[Disp_Max_Num] = {}; boolean scl_reset[Disp_Max_Num] = {false, false}; uint8_t H_size[Disp_Max_Num] = {1, 2}; //OLED SSD1306文字横幅サイズアップ uint8_t V_size[Disp_Max_Num] = {1, 4}; //OLED SSD1306文字縦幅サイズアップ uint8_t X0 = 0, X1 = 95, Y0 = 0, Y1 = 63; //SSD1331 ディスプレイ表示座標位置 //SSD1331 256color, Max red=7, green=7, blue=3 uint8_t red = 0, green = 7, blue = 0; uint8_t disp_number; //-----NTP時刻GET設定--------- uint32_t NTP_LastTime = 0; //-----Yahoo記事取得引数初期化------------------------- uint64_t NewsGetLastTime = 0; uint64_t WeatherGetLastTime = 0; bool News_first_get = true; bool Weather_first_get = true; bool News_get = false; bool Weather_get = false; String weather_str; //*****************セットアップ****************************** void setup() { Serial.begin(115200); Serial.println(); Serial.print(F("Connecting to ")); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(1000); _ssd1331.SSD1331_Init(); //OLED SSD1331 初期化 _SFR.SPIFFS_Shinonome_Init3F(UTF8SJIS_file, Shino_Half_Font_file, Shino_Zen_Font_file); //ライブラリ初期化。3ファイル同時に開く ESSG.Gadgets_MyFont_Init(MyFont_file); //自作フォント初期化 delay(10); _EWG.EWG_NTP_TimeLib_init(9, "time.windows.com"); //NTPサーバー取得初期化 _EWG.NTP_OtherServerSelect(9); //NTPサーバーと接続できなかった場合、他のNTPサーバーと接続できるか試す関数 ssd1306.SSD1306_Init(400000); //I2C Max=400kHz ssd1306.Display_Clear_All(); YahooNewsGET(0, 180000); //180秒毎に天気取得 YahooWeatherGET(48, 180000); //180秒毎に天気取得 SclTime[0] = millis(); SclTime[1] = millis(); TaskHandle_t th; //マルチタスクハンドル定義 xTaskCreatePinnedToCore(Task1, "Task1", 8192, NULL, 5, &th, 0); //マルチタスク実行 } //************* メインループ **************************************** void loop() { disp_number = 0; ESSG.Scroll_1_line(0, disp_number, red, green, blue, Scrolle_speed[disp_number], news_sj_txt[disp_number], news_sj_length[disp_number], &News_get); ESSG.ShinonomeClock_YMD(0, 16, 3, 3, 3); //東雲フォント年月日表示 ESSG.MyFontClock_Weekday(80, 16, 7, 7, 3); //自作フォント曜日表示 ESSG.Shinonome_Sec_Clock(80, 32, 'H', 'V', 0, 0, 15, 7, 0, 1); //東雲フォント秒表示 ESSG.MyFont_HM_Clock(0, 32, 'H', 'V', 'H', 'V', 0, 0, 1, 1, 50, 7, 0, 1); //自作フォント時分表示 if(Weather_get){ //サーバーから天気予報取得できたら、OLED表示を更新 ESSG.YahooJ_Weather_TodayTomorrow(48, weather_str); Weather_get = false; } disp_number = 1; if(millis() - SclTime[disp_number] > Scrolle_speed[disp_number]){ if(ssd1306.Scroller_Font8x16_PageReplace(&scl_reset[disp_number], Disp_txt/H_size[disp_number], 0, Zen_or_Han[disp_number], font_buf[disp_number], disp_buf[disp_number])){ Zen_or_Han[disp_number] = _SFR.Sjis_inc_FntRead_Rot(&sj_cnt[disp_number], -90, 0, disp_number, news_sj_txt[disp_number], news_sj_length[disp_number], font_buf[disp_number]); } ssd1306.SizeUp_8x16_Font_DisplayOut(H_size[disp_number], V_size[disp_number], Disp_txt/H_size[disp_number], 0, 0, disp_buf[disp_number]); SclTime[disp_number] = millis(); } } //************* マルチタスク **************************************** void Task1(void *pvParameters){ while(1){ YahooNewsGET(0, 180000); //180秒毎に天気取得 YahooWeatherGET(48, 180000); //180秒毎に天気取得 _EWG.NTP_Get_Interval(180000); //180秒毎にNTPサーバーから時刻取得 delay(1); //これは絶対必要 } } //************** Yahoo RSS ニュースガジェット ************************ void YahooNewsGET(uint8_t y0, uint32_t get_interval){ if((News_first_get == true) || ((millis() - NewsGetLastTime) > get_interval)){ char web_get_time[6]; sprintf(web_get_time, "%02d:%02d", hour(), minute()); //ゼロを空白で埋める場合は%2dとする String news_str = "◆ " + String(web_get_time) + " "; news_str += _EWG.EWG_https_Web_Get("news.yahoo.co.jp", "/rss/topics/sports.xml", '\n', "</rss>", "<title>", "</title>", "◆ "); Serial.print("News Get[0] = "); Serial.println( news_str ); Serial.flush(); //シリアル出力が終わるまで待つ disp_number = 0; news_sj_length[disp_number] = _SFR.UTF8toSJIS_convert(news_str, news_sj_txt[disp_number]); news_str = "◆ " + String(web_get_time) + " "; news_str += _EWG.EWG_https_Web_Get("news.yahoo.co.jp", "/rss/topics/top-picks.xml", '\n', "</rss>", "<title>", "</title>", "◆ "); Serial.print("News Get[1] = "); Serial.println( news_str ); Serial.flush(); //シリアル出力が終わるまで待つ disp_number = 1; news_sj_length[disp_number] = _SFR.UTF8toSJIS_convert(news_str, news_sj_txt[disp_number]); NewsGetLastTime = millis(); News_first_get = false; News_get = true; disp_number = 0; sj_cnt[disp_number] = 0; Zen_or_Han[disp_number] = _SFR.Sjis_inc_FntRead(&sj_cnt[disp_number], disp_number, news_sj_txt[disp_number], news_sj_length[disp_number], font_buf[disp_number]); scl_reset[disp_number] = true; disp_number = 1; sj_cnt[disp_number] = 0; Zen_or_Han[disp_number] = _SFR.Sjis_inc_FntRead_Rot(&sj_cnt[disp_number], -90, 0, disp_number, news_sj_txt[disp_number], news_sj_length[disp_number], font_buf[disp_number]); scl_reset[disp_number] = true; } } //************** Yahoo RSS 天気予報ガジェット ************************* void YahooWeatherGET(uint8_t y0, uint32_t get_interval){ if((Weather_first_get == true) || ((millis() - WeatherGetLastTime) > get_interval)){ //東京の天気予報 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); Serial.flush(); //シリアル出力が終わるまで待つ WeatherGetLastTime = millis(); Weather_get = true; Weather_first_get = false; } }
コンパイル書き込み実行
最初に述べたように、2018/01/24時点の最新版 Arduino core for ESP32 で、フォントが上手く読み込めない場合は、サンプルスケッチの SPIFFS_Test をコンパイルしてから、先のスケッチをコンパイルしてみてください。
最初の動画のように表示されればOKです。
ただ、もう一つ、重要な注意点があります。
※裏側の基板の放熱が必要なので、長い間動作させる場合は、ケースを浮かせてください!
終わりに
どうでしょうか?
上手く動作しましたでしょうか。
今回は FRISK ケース加工が目的でしたので、ライブラリやプログラムの説明は大幅省略させていただきました。
実はそれの編集が一番大変なので、今後省略する方向にもっていきたいと思っています。
本当は 3D プリンターを使った方が綺麗に仕上がりますが、最近はまったく使っていないので、手軽に入手できる FRISK ケースにしてみました。
3D プリンターは一旦離れてしまうと、使い始めるのに億劫になってしまいますね。
今回の FRISK ケース加工では、いろいろなデバイスに置き換えることが簡単にできて便利です。
ただ、先にも述べたように接触不良しやすいので注意が必要です。
ケースから取り出して使いまわしたりしないのであれば、ハンダ付けして固定した方が良いですね。
ということで、今回はここまでです。
ではまた・・・。
コメント
こんにちわ
動作完全にいたしました。
自作フォントを自作しようと思ってます(´・ω・`;)
7セグ風にしたく思いました。
他人に見せたいのですが、SSID、Passwの再設定がやっかいで
実現できてません。
プログラムの書き換え以外の方法はないでしょうか?
マッキーさん
いつも記事ご覧いただき、ありがとうございます。
無事、動作して安心しました。
重ねてご報告ありがとうございます。
自作フォントは是非やってみてください。
多分、感動すると思いますよ!
他人に見せたいということですが、なぜ SSID とパスワードの再設定が必要なのですか?
ちょっと意味が分かりません。
外に持ち出して、外部のルーターを使うということでしょうか?
もし、事前に SSID とパスワードが分かっていれば、WiFiMulti ライブラリを使って、複数のアクセスポイントを入力することができます。
Arduino IDE の「スケッチ例」で、複数のアクセスポイントを入力した例がありますので、参照してみてください。
こんにちわ
よそのお宅に行った場合、wifi設定はもちろんなんですけど、証明書の再収得とかが必要とかではないかと想像しています。
フリスク等の小型ケースに収納したらお出かけしたくなるんです。
ノートPC持ってけばすむことですが・・・
あとディスプレイをもっと大きいものなども実験してください。
ILI9341ドライバーあたりが一般的ですが、機会があればよろしくお願い申し上げます。
マッキーさん
なるほど、そういうことだったんですね。
証明書は、ルートCA証明書のことでしょうか?
もし、そうならば、これの再取得は不要です。
私もあまり詳しくないのですが、ルートCA証明書は、Yahoo Japan さんが契約している、Baltimore CyberTrust から発行されていて、Yahoo Japan RSS ユーザー全てに共通です。
必要な時期に更新されているようで、頻繁に更新されるようなものではありません。
数年単位だと思います。
そうしたら、その時に変えれば良いようです。
要するに、ユーザーが Yahoo Japan にアクセスしたところが偽物サイトでないことを証明するものですので、どこからアクセスしようが、証明書は同じです。
あと、WiFi利用の件ですが、スマホを持っていらっしゃったら、デザリングを利用して、他のお宅で通信されてみてはいかがでしょうか?
要するに、ご自分のスマホがネットに接続された Wi-Fiルーターアクセスポイントになるわけです。
又は、モバイルルーターを使うという手もあります。
よそのお宅のルーターを使うとか、公衆 Wi-Fi を使う場合は、やっぱりプログラム設定が必要になります。
その場合は、スマホと連携したプログラムを組むしかありません。
スマホブラウザのHTMLテキストボックスに、SSID と パスワードを入力するようなプログラムをご自分で組む必要があります。
私もいつかトライしたいと思います。
あと、大き目のディスプレイですね。
これもいつかチャレンジしたいと思いますが、大きいディスプレイにしてしまうと、「スマホみたい・・・」と感じてしまうので敬遠してました。
いつか試してみようと思ってはいます。
mgo-tecさん、初めまして…
初めて投稿させて頂きます。
これまで、Raspberrypie、Arduino、micro:bit等を弄ってきましたが、電子工作として多少物足りなさを感じておりました。
そこで、GW明けに遅ればせながらESP32dev(HiLet製)を手に入れ、関連記事をWeb検索中にこのblogに辿り着き、ここ1週間程、貴殿の非常に興味深くかつ内容豊富で懇切丁寧な製作記事を拝見し、秀逸なスケッチ群を何とか摸写(?笑)してみたいと思い、その後BM280や互換品のSSD1331&1306、microSDカードアダプタ等を手に入れ、日々(摸写に)励んでいるところです…
ところで、「2連ディスプレイ搭載可能なESP32のFRISKケースを作ってみた」の記事にて、先ずブレッドボードで組立て動作確認をしたところ、以下のエラーメッセージが出てWebゲットが出来ませんでした。
「wifi:esp-wifi-scan-start(*** )wifi not start. 」
これをクグッてみたところ、gethubに同様のトラブル報告(#1330)があり、その対策コメントが’sticilface’氏から発せられているのを見つけ、「Add SYSTEM_EVENT_WIFI_READY call back+WiFiMode fixes」(#1332)との指示に従い、「libraries/WiFi/src/WiFiGeneric.cpp」を修正(17行追加、6行削除)し再コンパイルしたところ、Wifiに無事接続して正常動作できましたので、既知情報かも知れませんが一応報告させて頂きます。
尚、現在はP板にヘッドソケットを立て、ハンドスピナーが入っていた窓付缶を追加工して、ついでにLIPO電池(860mAh)、充電&昇圧回路、電源SWを追加内臓してみました。
お陰様でESP32を使ったとてもハンディーなIOT機器を完成することができました。
貴殿の貴重な製作情報と秀逸なスケッチ公開に改めて感謝致します。
H.W さん
ブログをご覧いただき、ありがとうございます。
ハンディーなIOT機器、いいですねぇ。
私はまだバッテリー回路を組んだことが無いので、羨ましいですね。
嬉しいご報告ありがとうございます。
m(_ _)m
さて、WiFi Multi の件ですが、確かに最新版 Arduino – ESP32 ( Commits on May 26, 2018 ) で WiFiMuti ライブラリでは接続できませんでした。
GitHub の Issue #1330 から辿ったのですが、#1332 は見つかりませんでした。
#1322 の間違いではないでしょうか?
でも、これを読んでもイマイチ良く分かりませんでした。
結局のところ、このバグは
Commits on May 23, 2018
で修正されたようなことが書いてあるように読み取れたのですが、勘違いでしょうかね???
でも、最新版にアップデートしてもダメでした。
結局、私の場合、こちらの記事の9番にあるように、wifiMulti.addAP関数の前に
WiFi.disconnect(true);
を置くと、正常に接続されました。
でも、結局のところ、必要に迫られない限り、WiFiMultiは使わない方が良いかと思いました。
ということで、この記事のソースコードを普通の WiFi 関数に修正しました。
しばらく M5stack を弄っていて WiFiMulti関数を使っていなかったので、こんなことになっているとは気づきませんでした。
重要な情報感謝いたします。
m(_ _)m
mgo-tecさん、
早速の確認対応有難うございます。
githubの対策コメント番号は#1322の誤りでした。申し訳ありません。
mgo-tecさんのスケッチやライブラリ側の問題ではなく、元のWiFiGeneric.cppを直接弄らなくてはならず、今回は敢えてやってみましたが、編集リスクも伴いこの対処法は決して万人向けではないでしょうね…
尚、早速更新されたスケッチを使ってみましたが、残念ながら、元のWiFiGeneric.cppに
戻してもシリアルモニターには「…..」が出続けてWifiに繋がりませんでした…
尚、元のスケッチに戻すと1発で繋がります。(再現性あり。。。)
( 根本原因は別のところにあるのでしょうか…?)
ところで、上記ハンドスピナー缶にBME280もSPI接続で実装したので、「ESP32のWiFiのみOFFおよび温度・湿度・気圧センサーBME280の再調整など」の記事を参考に、SSD1306の4倍角文字を小さくして、空いたスペースに温度・湿度・気圧センサー情報を表示したいと思い、チャレンジしてみたのですが、上記記事のスケッチが見当たらず、上手くできませんでした。
スケッチの公開、もしくは何かアドバイスを頂けると幸いです。
あれ?
おかしいですねぇ・・・。
WiFi.begin(ssid, password);
が接続できないとなると、Arduino – ESP32 のバージョン違いによるものか、環境の違いによるものでしょうか?
謎ですねぇ・・・。
こちらの記事でも述べてますが、私の場合、2週間くらい前、ESP32 ( ESP-WROOM-32 )が WiFi に急に繋がらなくなる症状が出ました。
Arduino – ESP32 を最新版にしても、旧版に戻しても変化ありませんでした。
ESP32 のフラッシュに元々ある WiFiセッティング領域メモリを破壊してしまったのかと思い、故障したと思いました。
でも、GitHub issue #653 にあったように、スケッチ上で
WiFi.disconnect(true);
を置いてから、
WiFi.begin(ssid, password);
や
wifiMulti.addAP(ssid, password)
を実行すると、WiFi が繋がるようになりました。
それからは、スケッチ上に WiFi.disconnect(true); を置かなくても通常の
WiFi.begin(ssid, password);
は問題無く接続できています。
WiFiGeneric.cpp
は修正しても良いのですが、バージョンアップする度に編集することになるので、これは Issue に投げかけた方が良いですね。
でも、修正されたようなことが書いてありますが何なんでしょうね?
謎ですね。
また、以下の記事
ESP32 の Wi-Fi のみ OFF および温度・湿度・気圧センサー BME280 の再調整など
のスケッチは公開しておりません。
自分自身も実験中のもので、いつか公開しようと思いつつ、M5stack を購入してしまい、そっちにのめり込んでしまって開発中断しています。
公開する予定は未定でございます。
スイマセン。
m(_ _)m
(追伸: それには、SSD1331 を2つ、BME280 は SPI ではなく、I2C で接続しました)
mgo-tecさん、
早速の応答有難うございます。
元の「WiFiGeneric.cpp」に戻した状態で、以下ご指摘の様に「WiFi.disconnect(true);」を追加すると接続できるようになることは再現性を含めて確認できました。(コメントアウトすると再度接続できなくなる。。)
「WiFi.disconnect(true);
delay(1000);
wifiMulti.addAP(ssid, password);」
但し、更新されたスケッチでは、「WiFi.begin(ssid,password);」の前に「WiFi.disconnect(true);」を追加しても、シリアルモニターでは「・・・・・・」を継続し、結局WiFi接続することができませんでした…(これも再現性あり。。)
当該スケッチの公開未定の件は了解致しました。
過去の類似スケッチを参考に摸写デッサンに取り組みたいと思います。
(それができてから、M5stackにも手を伸ばしてみようと思います。)
(p.s): mgo-tecとM5stack、何処となく音が似てますね…(笑)
そうですかぁ・・・。
謎ですね。
同じ最新版 Arduino – ESP32 でもそういう現象が起きるのは納得いかないですね。
バージョンアップに期待するしかなさそうですね。
因みに、私のライブラリやスケッチは素人コードでまだまだ勉強不足で無駄が多いです。
他の方々のコードを模写された方が、よっぽど参考になると思います。
私自身も昔のコードを見て、「なんじゃこりゃ!」状態で、お恥ずかしい限りです。
追伸:確かに、M5 と mgo 似てました。今気づきました(^^)
H.W さん
新しい M5stack を別途購入して、WiFi.begin を試してみたところ、H.W さんのおっしゃる通り、繋がりませんでした。
wifiMulti に変えて、その前に WiFi.disconnect(true); を置くと接続できました。
まだ、WiFiGeneric.cpp の修正は試していませんが、これを修正するのは現実的ではありません。
このブログでは最新版をインストールされた方が見る場合が多いので、その都度修正を促すのは難しいです。
ですから、応急処置として、WiFi.disconnect(true); と wifiMulti を使う方法で考えていきたいと思います。
あとは Issue に投げるか、バージョンアップを待つかにしたいと思います。
mgo-tecさん、
応答が遅れて申し訳ありません。
>「WiFi.begin(ssid,password);」の前に
「WiFi.disconnect(true);」
>を追加しても、シリアルモニターでは「・・・・・・」を継続し、
>結局WiFi接続することができませんでした…
上記がそちらでも再現されましたか…?!
当方のWiFi環境のせいではなかった模様で一安心しましたが、何かスッキリとしませんね…
その後の状況ですが、とりあえず注文しておいたM5stack(Gray)が先日届いてしまったので、この’5cm四方美人'(?)にちょっと浮気して弄り始めました…
(世のオヤジ連中がハマってしまう理由が分かりますね…笑)
とりあえず、「yahoo!ニュース4記事同時スクロール」と最新記事の「変な漢数字時計…」についてはWiFi接続も含めて元スケッチのままで無事動作致しました。
(タクトSWとの連携も含め、操作感触はとても素晴らしいです。。。)
尚、ついでに、紹介されてたマグネット付きUSBケーブル(の類似品: 敢えてL字型のmicroUSB、TypeC、Lighteningの3種チップ付)を買ってみました。
一本のUSBケーブルでAndroidスマホ、M5stack、iPadの充電&通信が付け替え共有できてとても便利です。
今後、M5stack関係については、別途該当記事にて質問させて頂きたいと思います。
H.Wさん
お返事ありがとうございます。
残念ながら再現してしまいました。
今後のバージョンアップで様子見です。
M5stack スケッチを試していただき有難うございます。
因みに、「変な漢数字時計」のスケッチは本日、一行だけ修正しました。
不意に再起動してしまう場合がありました。
でも、動作してホッとしました。
ありがとうございます。
マグネット付きUSBケーブルのL字型、確かに便利そうで安いですね。
これはよさげですねぇ。
無断コピー品でなければ良いのですが、買って試してみようと思います。
情報ありがとうございます。
m(_ _)m
H.W さんから素晴らしいアレンジ工作写真を頂戴しましたので紹介させてください。
見事に BME280 から、Lipo バッテリーまでケースに収めておられます。
これは私には出来ないですね。
ただ、これだと ESP32 の発熱やバッテーリーの熱に BME280 が影響を受けると思いますが、それを理解した上で敢えてそうされているとのことです。
確かに、バッテリーの熱監視としても使えるかも知れません。
素晴らしい!!!
ご無沙汰しております。楽しませていただいてます。
最近「Git-Hub」サイトでライブラリーをダウンロードする時ボタンが「Code」のみでZIPファイルをダウンロードできませんが手法があればご指導宜しくお願いします。
安達さん
ご無沙汰しております。そして、コメント投稿ありがとうございました。
因みに、メールアドレスを記述されていたので、勝手ながら削除させていただきました。
コメント投稿欄に記載してしまうと、公開されてしまいますので、載せないようにしてくださいね。
GitHubですが、最近Microsoftに買収されて、デザインも変わりましたね。
ちょっと使い辛いですが、使い方は今までと変わらないようです。
要するに「Code」アイコンボタンの中の右側の小さい▼をクリックすると、プルダウンメニューが出てくるので、それにZIPダウンロードがあります。
何でそこを「Code」に変えたのか、意味が良く解らないですね。