public:理数研究ラボ2018補助教材

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
public:理数研究ラボ2018補助教材 [2018/08/23 18:57]
suda [Arduinoを利用したフィジカルコンピューティング基礎]
public:理数研究ラボ2018補助教材 [2018/08/23 23:41] (現在)
suda [ESP8266を利用したネットワークプログラミング]
行 138: 行 138:
  
 ----- -----
- +<html><details><summary>音を鳴らすプログラム</summary></html>
-**音を鳴らすプログラム**+
 <code cpp speaker.ino> <code cpp speaker.ino>
 int speaker = 9;    // スピーカーをつないだピンは9番 int speaker = 9;    // スピーカーをつないだピンは9番
行 168: 行 167:
 } }
 </code> </code>
 +<html></details></html>
 ----- -----
  
行 189: 行 189:
  
 void loop() { void loop() {
-  led.setPixelColor(0, led.Color(50,0,0)); // 1つめのLED(0番)を赤色に設定.+  led.setPixelColor(0, led.Color(50,0,0)); // 1つめのLED(0番)を赤色に設定.各色の最大値は255
   led.show(); // 設定を反映させる   led.show(); // 設定を反映させる
   delay(duration);   delay(duration);
行 204: 行 204:
  
  
-**ふわっと光らせるしくみ**+<html><details><summary>ふわっと光らせるしくみ</summary></html>
 <code cpp fade2.ino> <code cpp fade2.ino>
 #include <Adafruit_NeoPixel.h> #include <Adafruit_NeoPixel.h>
行 229: 行 229:
 } }
 </code> </code>
 +<html></details></html>
  
 **for文**は,繰り返し処理の書き方です.''( )''の中で変化する値の初期値,繰り返しを続ける条件,値の変化のしかたの3つを設定し,条件が満たされている間''{ }''の中を実行します. **for文**は,繰り返し処理の書き方です.''( )''の中で変化する値の初期値,繰り返しを続ける条件,値の変化のしかたの3つを設定し,条件が満たされている間''{ }''の中を実行します.
行 234: 行 235:
 ----- -----
  
-**Fujichan用の色と時間を指定してLEDをふわっと光らせるプログラム**+<html><details><summary>Fujichan用の色と時間を指定してLEDをふわっと光らせるプログラム</summary></html>
  
 Fujichanのプログラムでは,色と時間を指定してLEDをふわっと光らせるプログラムを用意しています.''Adafruit_NeoPixel''としていたところが,''myNeoPixel''になっているのは,読み込んだ別ファイルで機能を追加しているからです. Fujichanのプログラムでは,色と時間を指定してLEDをふわっと光らせるプログラムを用意しています.''Adafruit_NeoPixel''としていたところが,''myNeoPixel''になっているのは,読み込んだ別ファイルで機能を追加しているからです.
行 258: 行 259:
 } }
 </code> </code>
 +<html></details></html>
 +
 ----- -----
  
行 316: 行 319:
 {{ :public:sketch_simplefujichandev.zip |}} {{ :public:sketch_simplefujichandev.zip |}}
  
 +<html><details><summary>sketch_simplefujichandev.ino</summary></html>
 <code cpp> <code cpp>
 #include "myNeoPixel.h"        // Fujichan用のLED制御プログラム #include "myNeoPixel.h"        // Fujichan用のLED制御プログラム
行 385: 行 389:
 } }
 </code> </code>
 +<html></details></html>
  
 if文をいくつかの条件に分岐させるときは,**else文**を使います.最初のif文の後に,''else if( )''のようにif文と組み合わせて書くことで,別の条件が決められます.一つのif文で「〜かつ〜」や「〜または〜」のような複数の条件を判定したい場合は,''( )''の中の条件を''&&''(かつ)や''||''(または)で区切ります. if文をいくつかの条件に分岐させるときは,**else文**を使います.最初のif文の後に,''else if( )''のようにif文と組み合わせて書くことで,別の条件が決められます.一つのif文で「〜かつ〜」や「〜または〜」のような複数の条件を判定したい場合は,''( )''の中の条件を''&&''(かつ)や''||''(または)で区切ります.
行 396: 行 401:
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-復習用に追記しました.自宅でプログラムを書き換えるときの参考にしてください.(8/23)+復習用に追記しました.自宅でプログラムを書き換えるときなどの参考にしてください.(8/23)
 </WRAP> </WRAP>
  
行 405: 行 410:
  
 ----- -----
 +
 +<wrap lo>ESP8266は,Wi-Fi通信を用いた様々な使い方があります.Arduinoにも,メニューバーの[ファイル]から開ける[スケッチ例]に,サンプルプログラムが非常に多く用意されています.Fujichanのような使い方の,基本的なプログラムは[ESP8266WiFi]の中の[WiFiClient]というサンプルを参照してください.</wrap>
  
 **Wi-Fiに接続するには** **Wi-Fiに接続するには**
  
-普段から,インターネットを使うとき,Wi-Fiに接続することが多いと思います.Wi-Fiに接続するには,**SSID**というネットワークの名前と,接続するための**パスワード**が必要です.ワークショップでは,研究室のWi-Fiに接続しましたが,自宅のWi-Fiに接続する場合は,この2つを変更する必要があります.+普段から,インターネットを使うとき,Wi-Fiに接続することが多いと思います.Wi-Fiに接続するには,**SSID**というネットワークの名前と,接続するための**パスワード**が必要です.今回は,プログラムの中にこの2つを直接記述します.ワークショップでは,研究室のWi-Fiに接続しましたが,自宅のWi-Fiに接続する場合は,この2つを変更する必要があります.
  
 **Webから情報を取得するには** **Webから情報を取得するには**
  
-ChromeやSafariなどのWebブラウザからウェブ上の情報を取得するとき,**URL**というウェブ上の場所を特定する文字列必要す.データを取得するプログラムはすでにウェブ上にプログラムが準備してあり,ESP8266からアクセスすることで,気温,噴火警戒レベル,降水量を取得することができます.+普段,ChromeやSafariなどのWebブラウザからウェブ上の情報を取得するとき,**URL**というウェブ上の場所を特定する文字列によって,アクセスを行っています.IoTデバイスから,ウェブ上の情報を取得するときも同様で,今回は,プログラムの中で必要なURLを作ります.データを取得するプログラムはすでにウェブ上にプログラムが準備してあり,ESP8266からアクセスすることで,気温,噴火警戒レベル,降水量を取得することができます.
  
 プログラムのURL:%%http://tetsuakibaba.jp/test/fuji-chan.php%% プログラムのURL:%%http://tetsuakibaba.jp/test/fuji-chan.php%%
行 423: 行 430:
  
 にアクセスし,自分の取得したい場所を選択しましょう.場所によって降水量が取得できない箇所もあるのでご注意ください. にアクセスし,自分の取得したい場所を選択しましょう.場所によって降水量が取得できない箇所もあるのでご注意ください.
-例として,さいたま市のアメダスページにしてみます.次に噴火情報に関してはさいたま市は特に近くに情報を持つ山がないので,デフォルトの富士山のままにしておきます(この情報は使いません).まとめると以下の2つで,数字部分だけが異なるURLが用意できていればOKです.+例として,さいたま市のアメダスページにしてみます.次に噴火情報に関してはさいたま市は特に近くに情報を持つ山がないので,デフォルトの富士山のままにしておきます(この情報は使いません).まとめると,数字部分だけが異なる以下の2つのようなURLが用意できていればOKです.
  
 <アメダスurl>:https://tenki.jp/amedas/3/14/43241.html\\ <アメダスurl>:https://tenki.jp/amedas/3/14/43241.html\\
行 446: 行 453:
 {{ :public:final_tab.png?nolink |}} {{ :public:final_tab.png?nolink |}}
  
-以下の部分を,上で確認したものに書き換えます.+以下の,Wi-Fiネットワーク設定と,取得したい場所のアメダス・火山情報のURLの部分を,上で確認したものに書き換えます.
  
 <code cpp> <code cpp>
行 462: 行 469:
 </code> </code>
  
-このプログラムでは,指定したSSIDやURLなどを使ってWi-Fiへ接続する''connect()''という関数と,Webサーバからデータを更新する''update()''という関数を用意しています.''update()''では,**HTTP**というウェブでの情報のやり取りに広く使われている通信の処理を,プログラム上で記述しています.+このプログラムでは,指定したSSIDとパスワードを使ってWi-Fiへ接続する''connect()''という関数と,指定したURLを使ってWebサーバからデータを更新する''update()''という関数を用意しています.''update()''では,**HTTP**というウェブでの情報のやり取りに広く使われている通信の処理を,プログラム上で記述しています. 
 <html><details><summary>fujichanClient.h</summary></html> <html><details><summary>fujichanClient.h</summary></html>
 <code cpp> <code cpp>
行 568: 行 576:
 {{ :public:esp8266_upload.png?nolink&600 |}} {{ :public:esp8266_upload.png?nolink&600 |}}
  
-シリアルモニターを開いて,インターネットから取得した,気温,噴火警戒レベル,降水量の情報が表示されればOKです.この情報を,先ほど作ったデータに応じた音や光の変化に反映させましょう.+シリアルモニターを開いて,インターネットから取得した,気温,噴火警戒レベル,降水量の情報が表示されればOKです.この情報を,先ほど作ったデータに応じた音や光の変化の処理に反映させましょう.(スピーカーのピン番号が9から16に変わっています.直接ピン番号を指定する場合は注意)
  
 ----- -----
  
 +**プログラムを一つにまとめる**
  
 +ダウンロードしたプログラム(sketch_final)の大部分は,先ほどシリアルモニターでデータを送ったプログラム(sketch_simpleFujichanDev)と同じです.<wrap hi>先ほど作ったデータに応じた音や光の変化の処理を,プログラムの同じ場所に移動させましょう.</wrap>
 +
 +''setup()''の最後で,fujichanClient.hに用意されている,Wi-Fiに接続する''connect()''関数を実行しています.接続中はLEDが白色に点滅します.接続に成功すると,Webサーバからデータを取得する''update()''関数を実行して,気温,噴火警戒レベル,降水量のデータを更新しています.''update2()''は,インターネットから取得したデータをLEDやスピーカーへ反映するプログラムです.<wrap hi>下の方に''update2()''関数の本体があるので,この中にも,先ほど作ったデータに応じた音や光の変化の処理を書きます.</wrap>
 +
 +<code cpp>
 +#include "FujichanClient.h"
 +
 +#define UPDATE_INTERVAL 60*5 // 更新間隔[秒]
 +
 +float temperature   = 0; // 気温(単位は[°C])
 +int   funkaLevel    = 0; // 噴火警戒レベル
 +float precipitation = 0; // 降水量(単位は[mm/h])
 +
 +void setup() {
 +  led.setup();             // LEDの初期設定
 +  Serial.begin(115200);    // シリアル通信を開始する
 +  Serial.println("START"); // シリアルモニターに"START"と表示
 +
 +  // Wi-Fiへ接続する関数
 +  connect();
 +  // Webサーバからデータを取得する関数
 +  update(&temperature, &funkaLevel, &precipitation); // 情報を更新します
 +  update2();                                         // LEDやスピーカーへ反映します
 +}
 +
 +void loop() {
 +  
 +  ~中略~
 +
 +  if ( metro(UPDATE_INTERVAL) == true ) {              // 更新時間が来たら
 +    update(&temperature, &funkaLevel, &precipitation); // 情報を更新します
 +    update2();                                         // LEDやスピーカーへ反映します
 +  }
 +}
 +
 +void update2(){
 +  /* 気温が更新された時の処理.ここから */
 +      
 +
 +  /* ここまで */
 +}
 +
 +// 更新時間を教えてくれる関数
 +static unsigned long int time = 0;
 +bool metro(int seconds) {
 +  if ( (millis() - time) > seconds * 1000 ) {
 +    time = millis();
 +    return true;
 +  }
 +  else {
 +    return false;
 +  }
 +}
 +</code>
  
 ----- -----
  
-**補足資料:開発環境を整える**+**補足:データ更新の間隔** 
 + 
 +データ更新の間隔は,一番下の更新時間を教えてくれる関数で管理しています.''loop()''の最後で,''metro()''関数を呼び出して,更新時間が来ていれば,''update()''と''update2()''を行います.更新間隔はプログラム冒頭の以下の行で設定できます. 
 + 
 +<code> 
 +#define UPDATE_INTERVAL 60*5 // 更新間隔[秒] 
 +</code> 
 + 
 +手動で情報更新する場合は,シリアルモニターから「3001」を送信します. 
 + 
 +----- 
 + 
 +**補足:開発環境を整える**
  
 Arduino IDEでESP8266を開発するためには,以下の作業が必要です.自宅のWi-Fiに接続するにはArduinoプログラムを書き換える必要があるので,参考にしてください. Arduino IDEでESP8266を開発するためには,以下の作業が必要です.自宅のWi-Fiに接続するにはArduinoプログラムを書き換える必要があるので,参考にしてください.
行 594: 行 669:
 9192hs@gmail.com(須田)\\ 9192hs@gmail.com(須田)\\
 studio@tetsuakibaba.jp(研究室) studio@tetsuakibaba.jp(研究室)
- 
 ====== 撮影 ====== ====== 撮影 ======
 担当:石曽根 担当:石曽根
  • public/理数研究ラボ2018補助教材.1535018247.txt.gz
  • 最終更新: 2018/08/23 18:57
  • by suda