46yomu が 2021年02月28日08時46分02秒 に編集
実装方法の説明を詳細にしました。
記事種類の変更
製作品
本文の変更
概要 - 電車の運行状況を鉄道会社のホームページから取得し、通勤ルートの電車が通常運行なのか、遅延している可能性があるのかをLEDの色で判断できるようにする。 ![キャプションを入力できます](https://camo.elchika.com/5358b2344614efd6bee3414ea651b981f4b7178e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f31643238303130372d663332352d346662302d386165332d3361303033656362356238372f38626437633837342d306437662d346336662d613733342d613661383030343232303862/) 作ったきっかけ - 毎朝、スマホで電車の運行状況を見る手間をなくしたい。 朝起きて、家を出るまでに電車の遅延情報がLEDで分かり(チラッ👀とLED💡を見るだけ!)、電車が遅れていることがあらかじめ分かっていれば、少し早く1本前の電車に乗るなど予定変更ができる。 と考えました。 機能 - ・JR九州のホームページにある運行状況を読み取り、通勤ルートの情報が掲載されたら、LEDの色を変える。 ※🚃通勤ルートは鹿児島本線 門司港~久留米間としています。 ・乗車する駅と降車する駅が遅延情報記載の区間であった場合、赤色LEDを発光させる。(遅延の可能性:大) ・乗車する駅と降車する駅が遅延情報記載の区間に1つでも含まれる場合、黄色LEDを発光させる。(遅延の可能性:中) ・乗車する駅と降車する駅が遅延情報がない場合は緑色LEDを発光させる。(通常運行) ・5分間隔で、情報更新する。 工夫したところ - ・ホームページにある遅延情報は九州全域の路線が含まれるため、通勤ルートに影響ある情報のみに絞れるようにしました。 部品 - ・ESP32-WROOM-32D開発ボード(ESP32-DevKitC-V4 ) ・ブレッドボード(EIC-803) ・LED(赤、黄、緑) ・抵抗220Ω x3 ・ジャンパ線 ・USBケーブル(TypeB micro) 開発環境 - PC:Windows10 開発ソフト:Arduino Software (IDE) (ESP32 ボードを追加しています)
回路図
実装方法・回路図
-
写真と回路図を示します。
ブレッドボードに開発ボード(ESP32-DevKitC-V4)をさして、実装します。3色のLEDと抵抗を回路図通りにジャンパ線で結線します。ESP32-DevKitC-V4はUSBで電源供給(スマホの充電器を使用)しています。実装した写真と回路図を示します。
![キャプションを入力できます](https://camo.elchika.com/6fe3fc5c1b686762d78a271ff31466d4046c6822/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f31643238303130372d663332352d346662302d386165332d3361303033656362356238372f63346433393236622d643863302d346638302d393730312d323466663137303035613034/) プログラムの説明 - プログラムのフローチャートと処理の内容を説明します。 ![フローチャート](https://camo.elchika.com/e3623b11b6525c8dabbd14a658f39683fdc988d3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f31643238303130372d663332352d346662302d386165332d3361303033656362356238372f35343032643766302d393666612d343765382d396565652d623832613731623036373330/) ①設定 LEDを光らせるため、デジタルピンを割り当てます。 5 : 赤色LED 17:黄色LED 16:緑色LED ②WiFi接続 Wifi.begin()でアクセスポイントに接続します。 WiFi.status()で、接続するまで、待ちます。 待つ間、黄色LEDを点滅させて、接続がうまく行くかの状態がわかるようにしています。 ③HTTPClient(HTML取得) http.begin(url)でURLを登録します。 その後、http.GET()でGETリクエスト送信します。 ※エラーの場合は負の値が返ってくるのでエラー処理 http.getString()でHTMLの内容をStringの変数に格納します。 ④WiFi切断 Wifi.disconnect()でWiFi接続を切断します。 ⑤遅延情報の検索 Stringの関数を使い、遅延情報の箇所のみを切り出します。 .indexOfで遅延情報が記載される【】をの文字の位置を得ます。 .substringで文字の位置を指定し、切り出し、配列listに格納します。 [例] HTMLにある遅延情報 ・・・いろんな情報が含まれている・・・ ●鹿児島本線(上下線)運休及び遅延 【遅延:小倉 から 博多】 ・・・いろんな情報が含まれている・・・ であれば、「【遅延:小倉 から 博多」を探します。 ⑥通勤ルートへの影響を検索 遅延情報を格納した配列listに、通勤ルートに影響する駅名がないかを検索します。 例:【遅延:小倉 から 博多 であれば、 遅延情報を切り出した文字列に対象の駅名(遅延発生区間の起点駅)がないかを探します。(例:小倉) その後、遅延情報を切り出した文字列に対象の駅名(遅延発生区間の終点駅)がないかを探します。(例:博多) 遅延の可能性(中):遅延発生区間の始点、終点内に、通勤ルートの対象駅が1つ含まれる 遅延の可能性(大):遅延発生区間の始点、終点内に、通勤ルートの対象駅が2つ含まれる としています。変数k,nがその影響度を示しています。 ⑦通勤ルートへの影響をLEDで表示 遅延の可能性(大):赤色LED 遅延の可能性(中):黄色LED 通常運行 :緑色LED ⑧5分待ち delay()で待ちます。 コード - ```arduino:unkou_check.ino #include <WiFi.h> #include <HTTPClient.h> /*LED出力ピン番号*/ #define LED_RED 5 #define LED_YELLOW 17 #define LED_GREEN 16 /*Wi-Fi接続先*/ char ssid[] = "WiFi接続先名"; char password[] = "WiFi接続先パスワード"; String list[40] = {"\0"}; /*分割された文字列を格納する配列*/ /*駅名(遅延、運休が発生した時、通勤ルートの電車に影響がでる駅名)*/ /*[例] ●鹿児島本線(上下線)運休及び遅延 【遅延:小倉 から 博多】 のように運行情報がホームページに掲載されるので、遅延発生区間に駅名(station)があるかを検索する */ String station[49] = {"門司港","小森江","門司","小倉","西小倉","九州工大前","戸畑","枝光","スペースワールド", "八幡","黒崎","陣原","折尾","水巻","遠賀川","海老津","教育大前","赤間","東郷","東福間", "福間","千鳥","古賀","ししぶ","新宮中央","福工大前","九産大前","香椎","千早","箱崎","吉塚", "博多","竹下","笹原","南福岡","春日","大野城","水城","都府楼南","二日市","天拝山","原田", "けやき台","基山","弥生が丘","田代","鳥栖","肥前旭","久留米"}; void setup() { pinMode(LED_RED, OUTPUT); /*赤色LED 出力ピン設定*/ pinMode(LED_YELLOW, OUTPUT); /*黄色LED 出力ピン設定*/ pinMode(LED_GREEN, OUTPUT); /*緑色LED 出力ピン設定*/ /*起動時のLED点滅*/ digitalWrite(LED_RED, LOW); digitalWrite(LED_YELLOW, LOW); digitalWrite(LED_GREEN, LOW); delay(1000); digitalWrite(LED_RED, HIGH); digitalWrite(LED_YELLOW, HIGH); digitalWrite(LED_GREEN, HIGH); delay(1000); digitalWrite(LED_RED, LOW); digitalWrite(LED_YELLOW, LOW); digitalWrite(LED_GREEN, LOW); } void loop() { int split_start; int split_end; int serach; int i; HTTPClient http; char url[] = "https://www.jrkyushu.co.jp/trains/unkou.php"; /*ホームページのURL*/ /*WiFi接続*/ WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { /*接続完了するまで、黄色LEDを点滅させる*/ digitalWrite(LED_YELLOW, HIGH); delay(500); digitalWrite(LED_YELLOW, LOW); } digitalWrite(LED_YELLOW, LOW); /*接続完了後、黄色LEDを消灯*/ http.begin(url); /* URLの登録 */ int httpCode = http.GET(); /* GETリクエスト送信 */ String payload = ""; if (httpCode < 0) { /* HTTPのリターンコードがエラーの場合は負の値 */ payload = http.errorToString(httpCode); } else{ payload = http.getString(); /*htmlの内容を変数に格納する*/ } http.end(); /* WiFi切断 */ WiFi.disconnect(); split_end = 1; split_start = 1; memset(list, '\0', sizeof(list)); /*格納する初期化*/ /*運行状況で遅延が発生している駅の区間を切り出し、list[i]に格納する*/ for( i=1; ((split_start > 0) and (split_end > 0)); i++){ /*切り出す文字【、】がない場合はfor文を抜ける*/ list[i] = (payload.substring((split_start), (split_end))); split_start = payload.indexOf("【", split_end); split_end = payload.indexOf("】", split_start); } /*切り出した文字列の中に、通勤ルートに影響がある駅名がないかを探す*/ int k = 0; int n = 0; for(serach = 1; serach < i; serach++){ for(k=0; k<49; k++){ if(list[serach].indexOf(station[k]) > 0){ /*遅延情報を切り出した文字列に対象の駅名(遅延発生区間の起点駅)がないかを探す*/ list[serach] = list[serach] + "HIT1"; for(k=k+1;k<49;k++){ if(list[serach].indexOf(station[k]) > 0){ /*遅延情報を切り出した文字列に対象の駅名(遅延発生区間の終点駅)がないかを探す*/ list[serach] = list[serach] + "HIT2"; } } } } } /*通勤ルートへの影響を検索*/ k = 0; n = 0; for(serach=1; serach < i; serach++){ if(list[serach].indexOf("HIT1") > 0){ /*遅延発生区間の始点、終点内に、通勤ルートの対象駅が1つ含まれる:遅延の可能性:中*/ k = 1; } else{ if(list[serach].indexOf("HIT2") > 0){ /*遅延発生区間の始点、終点内に、通勤ルートの対象駅が2つ含まれる:遅延の可能性大*/ n = 2; } } } /*結果をLEDで表示*/ /*いったんすべて消灯*/ digitalWrite(LED_RED, LOW); digitalWrite(LED_YELLOW, LOW); digitalWrite(LED_GREEN, LOW); i = k + n; if(i == 3){ digitalWrite(LED_RED, HIGH); /*遅延の可能性:大 → 赤色LED点灯*/ } if(i == 2){ digitalWrite(LED_RED, HIGH); /*遅延の可能性:大 → 赤色LED点灯*/ } if(i == 1){ digitalWrite(LED_YELLOW, HIGH); /*遅延の可能性:中 → 黄色LED点灯*/ } if(i == 0){ digitalWrite(LED_GREEN, HIGH); /*正常運行 → 緑色LED点灯*/ } delay(60000*5); /*5分待ち*/ } ``` おわりに - スマホで、ネットに接続してもあたりまえと思ってしまいますが、自分が作ったArduino(ESP32)がネットにつながり、処理してくれ、LEDでお知らせしてくれるだけで、嬉しく思いました。 スマホをインターフェースにするよりも、LEDの方が、瞬時に判断できるので、その他の情報もお知らせできると面白いかなと思います。 参考 - ESP32の使い方について、参考にさせて頂きました。ありがとうございます。 [Arduino(ESP32)ライブラリリファレンス](https://garretlab.web.fc2.com/arduino/esp32/reference/libraries/WiFi/)