編集履歴一覧に戻る
46yomuのアイコン画像

46yomu が 2021年02月27日22時14分00秒 に編集

部品名、回路図を修正しました。

本文の変更

概要 - 電車の運行状況を鉄道会社のホームページから取得し、通勤ルートの電車が通常運行なのか、遅延している可能性があるのかをLEDの色で判断できるようにする。 ![キャプションを入力できます](https://camo.elchika.com/5358b2344614efd6bee3414ea651b981f4b7178e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f31643238303130372d663332352d346662302d386165332d3361303033656362356238372f38626437633837342d306437662d346336662d613733342d613661383030343232303862/) 作ったきっかけ -  毎朝、スマホで電車の運行状況を見る手間をなくしたい。 朝起きて、家を出るまでに電車の遅延情報がLEDで分かり(チラッ👀とLED💡を見るだけ!)、電車が遅れていることがあらかじめ分かっていれば、少し早く1本前の電車に乗るなど予定変更ができる。 と考えました。 機能 - ・JR九州のホームページにある運行状況を読み取り、通勤ルートの情報が掲載されたら、LEDの色を変える。  ※🚃通勤ルートは鹿児島本線 門司港~久留米間としています。 ・乗車する駅と降車する駅が遅延情報記載の区間であった場合、赤色LEDを発光させる。(遅延の可能性:大) ・乗車する駅と降車する駅が遅延情報記載の区間に1つでも含まれる場合、黄色LEDを発光させる。(遅延の可能性:中) ・乗車する駅と降車する駅が遅延情報がない場合は緑色LEDを発光させる。(通常運行) ・5分間隔で、情報更新する。 工夫したところ -  ・ホームページにある遅延情報は九州全域の路線が含まれるため、通勤ルートに影響ある情報のみに絞れるようにしました。 部品 -

-

・ESP32-DevKitC-32D

+

・ESP32-WROOM-32D開発ボード(ESP32-DevKitC-V4 )

・ブレッドボード(EIC-803) ・LED(赤、黄、緑) ・抵抗220Ω x3 ・ジャンパ線 ・USBケーブル(TypeB micro) 開発環境 - PC:Windows10 開発ソフト:Arduino Software (IDE)

+

(ESP32 ボードを追加しています)

回路図 - 写真と回路図を示します。

-

![写真と回路図](https://camo.elchika.com/14a1795c34b896188db6d18d6a64dbf474c2b327/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f31643238303130372d663332352d346662302d386165332d3361303033656362356238372f39633734663631302d643238642d343836392d393635392d643632333336373337613431/)

+

![キャプションを入力できます](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:電車の運行状況をLEDでお知らせ

+

```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/)