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

差分

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

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

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
public:理数研究ラボ2018補助教材 [2018/08/23 15:35]
suda [Arduinoを利用したフィジカルコンピューティング基礎]
public:理数研究ラボ2018補助教材 [2018/08/23 23:41] (現在)
suda [ESP8266を利用したネットワークプログラミング]
行 73: 行 73:
 </WRAP> </WRAP>
  
-**フィジカルコンピューティング**とは,センサやアクチュエータ出力部品を使って,私たちの身の回りの物理的な世界と,コンピュータ上にあるような情報の世界をつなぐことです.+<WRAP center round important 60%> 
 +復習用に追記を行いました8/23 
 +</WRAP>
  
-今回は,Fujichanデバイスをベースに,日常の中で自然に情報提示する**アンビエントメディア**を制作します.LEDやスピーカーを使って,光や音といった環境の情報をコントロールします. 
  
------+**フィジカルコンピューティング**とは,センサやアクチュエータ(出力部品)を使って,私たちの身の回りの物理的な世界と,コンピュータ上にあるような情報の世界をつなぐことです.今回は,Fujichanデバイスをベースに,日常の中で自然に情報提示する**アンビエントメディア**を制作します.LEDやスピーカーを使って,光や音といった環境の情報をコントロールします.
  
 **Arduino**は,エンジニアだけでなく,デザイナーやアーティストでも,マイクロコントローラ(小さなコンピュータ)を簡単に使えるように作られた汎用マイコンボードです.PC上でプログラムを記述し,それをUSBケーブルで接続されたボードに転送すると,ボード上のマイクロコントローラがプログラム通りに動作します.組み込みと呼ばれる,PCを利用しない小さなデバイスでは,一般的な開発手法です. **Arduino**は,エンジニアだけでなく,デザイナーやアーティストでも,マイクロコントローラ(小さなコンピュータ)を簡単に使えるように作られた汎用マイコンボードです.PC上でプログラムを記述し,それをUSBケーブルで接続されたボードに転送すると,ボード上のマイクロコントローラがプログラム通りに動作します.組み込みと呼ばれる,PCを利用しない小さなデバイスでは,一般的な開発手法です.
行 83: 行 84:
 https://www.arduino.cc/ https://www.arduino.cc/
  
-Arduinoには,性能や大きさによって様々な種類がありますが,このワークショップでは最も一般的なArduino Unoを使います.Arduino IDEは,[[https://www.arduino.cc/en/Main/Software|こちら]]からダウンロードできます.<wrap lo>(8/23追記)</wrap>+Arduinoには,性能や大きさによって様々な種類がありますが,このワークショップでは最も一般的なArduino Unoを使います.購入する場合は,周辺機器が揃っている[[https://www.switch-science.com/catalog/181/|Arduinoをはじめようキット - SWITCH-SCIENCE]]などがおすすめです.Arduino IDEは,[[https://www.arduino.cc/en/Main/Software|こちら]]からダウンロードできます.<wrap lo>(8/23追記)</wrap>
  
 {{ :public:arduino_uno_ide.png?nolink |}} {{ :public:arduino_uno_ide.png?nolink |}}
  
-さっそく、以下のプログラムを書き込んでみましょう. +**LEDをチカチカさせるプログラム(Lチカ)**
- +
-<wrap em>LEDをチカチカさせるプログラム(Lチカ)</wrap>+
  
 <code cpp sketch_blink.ino> <code cpp sketch_blink.ino>
行 108: 行 107:
 </code> </code>
  
-<html> +プログラムを書き込むとき,ボードとシリアルポートが正しく選択されているか注意!
-<details><summary>プログラムを書き込むとき,ボードとシリアルポートが正しく選択されているか注意!</summary> +
-</html> +
- +
-**Arduino Unoの場合**+
  
 {{ :public:arduino_board.png?nolink |}} {{ :public:arduino_board.png?nolink |}}
  
 {{ :public:arduino_port.png?nolink |}} {{ :public:arduino_port.png?nolink |}}
- 
-<html> 
-</details> 
-</html> 
  
 ----- -----
行 126: 行 117:
   * プログラミングに使える文字は,半角の英数字と記号です.   * プログラミングに使える文字は,半角の英数字と記号です.
   * プログラムは基本的に,上から順番に実行されていきます.   * プログラムは基本的に,上から順番に実行されていきます.
-  * ''setup()''の''{ }''の中は最初に一度だけ実行され,''loop()''の''{ }''の中は繰り返し実行されます.+  * Arduinoのプログラムには,必ず''setup()''と''loop()''が一つずつ必要です.''setup()''の''{ }''の中は最初に一度だけ実行され,''loop()''の''{ }''の中は繰り返し実行されます.
   * ''%%//%%''で始まる行は**コメント**といい,その行はそこから改行されるまで無視されます.   * ''%%//%%''で始まる行は**コメント**といい,その行はそこから改行されるまで無視されます.
  
行 138: 行 129:
  
 **電子工作** **電子工作**
 +
 +Arduinoのピンに様々な電子部品を差し込んで,プログラムで制御できる電子回路を組むことができます.ブレッドボードやジャンプワイヤを使って,半田づけをする必要なく,電子回路を試すことができます.プログラムでも電子回路でも,何度も試作を繰り返して,物を作っていく手法を**プロトタイピング**といいます.
  
 {{ :public:risukenlab180820_01_bb.png?nolink |}} {{ :public:risukenlab180820_01_bb.png?nolink |}}
  
-  * [[https://www.switch-science.com/catalog/181/|Arduinoをはじめようキット - SWITCH-SCIENCE]] 
   * [[https://www.switch-science.com/catalog/472/|圧電スピーカー - SWITCH-SCIENCE]]   * [[https://www.switch-science.com/catalog/472/|圧電スピーカー - SWITCH-SCIENCE]]
   * [[https://www.switch-science.com/catalog/1398/|フルカラーシリアルLEDモジュール - SWITCH-SCIENCE]]   * [[https://www.switch-science.com/catalog/1398/|フルカラーシリアルLEDモジュール - SWITCH-SCIENCE]]
  
 ----- -----
- +<html><details><summary>音を鳴らすプログラム</summary></html>
-<wrap em>tone()関数を使って音を鳴らす</wrap>+
 <code cpp speaker.ino> <code cpp speaker.ino>
 int speaker = 9;    // スピーカーをつないだピンは9番 int speaker = 9;    // スピーカーをつないだピンは9番
行 176: 行 167:
 } }
 </code> </code>
 +<html></details></html>
 ----- -----
  
-<wrap em>フルカラーLEDモジュールを使う</wrap>+**フルカラーLEDモジュールを使う**
  
 フルカラーLEDモジュールを使うには,ライブラリを読み込む必要があります.ライブラリの追加方法などは以下を参照してみてください. フルカラーLEDモジュールを使うには,ライブラリを読み込む必要があります.ライブラリの追加方法などは以下を参照してみてください.
行 197: 行 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);
行 210: 行 202:
  
 {{ :public:risukenlab180820_02_rgb.png?nolink |}} {{ :public:risukenlab180820_02_rgb.png?nolink |}}
- 
------ 
- 
  
  
-**ふわっと光らせるしくみ**+<html><details><summary>ふわっと光らせるしくみ</summary></html>
 <code cpp fade2.ino> <code cpp fade2.ino>
 #include <Adafruit_NeoPixel.h> #include <Adafruit_NeoPixel.h>
行 240: 行 229:
 } }
 </code> </code>
 +<html></details></html>
  
------ +**for文**は,繰り返し処理の書き方です.''( )''の中で変化する値の初期値,繰り返しを続ける条件,値の変化のしかたの3つを設定し,条件が満たされている間''{ }''の中を実行します.
- +
-  * **for文**は,繰り返し処理の書き方です.''( )''の中で変化する値の初期値,繰り返しを続ける条件,値の変化のしかたの3つを設定し,条件が満たされている間''{ }''の中を実行します.+
  
 ----- -----
行 272: 行 260:
 </code> </code>
 <html></details></html> <html></details></html>
 +
 ----- -----
  
行 299: 行 288:
     funkaLevel = val; // 受け取ったデータを噴火警戒レベルに設定     funkaLevel = val; // 受け取ったデータを噴火警戒レベルに設定
  
-    if(funkaLevel >= 4){               // もし噴火警戒レベルが4以上+    if(funkaLevel >= 4){               // もし噴火警戒レベルが4以上に設定された
       for(int i=0; i<funkaLevel; i++){ // 噴火警戒レベルの数だけ警告音を鳴らす       for(int i=0; i<funkaLevel; i++){ // 噴火警戒レベルの数だけ警告音を鳴らす
         tone(speaker, 500);         tone(speaker, 500);
行 311: 行 300:
 </code> </code>
  
------ +**if文**という条件に応じた処理の書き方を使って,「もし新しいデータが届いていたら」行う処理を書いています.''if''で始まる文は,''( )''で囲った条件が満たされたとき,''{ }''で囲われた部分の処理を実行します.
- +
-  * **if文**という条件に応じた処理の書き方を使って,「もし新しいデータが届いていたら」行う処理を書ます.''if''で始まる文は,''( )''で囲った条件が満たされたとき,''{ }''で囲われた部分の処理を実行します.+
  
 ----- -----
  
-アンビエントメディアとしてのデバイスをデザインするとき,次のようなことをどう設計するかが重要です.+アンビエントメディアとしてのデバイスをデザインするとき,たとえば次のようなことをどう設計するかが重要です.
  
-  * <wrap hi>気温によって,LEDがどんな色に変化するか.</wrap>+  * <wrap hi>気温によって,LEDがどんな色にるか.</wrap>
   * <wrap hi>データが更新されたとき,どんな変化をするか.</wrap>   * <wrap hi>データが更新されたとき,どんな変化をするか.</wrap>
-  * <wrap hi>ゆるやかな情報提示と,緊急の情報提示.</wrap> 
  
-下のプログラムは,シリアル通信を使って,気温,噴火警戒レベル,降水量を設定できるようにしてあります.+下のプログラムは,シリアル通信を使って,気温,噴火警戒レベル,降水量を設定できるようにしてあります(いくつか外部ファイルを読み込んでいますが,プログラムの流れは上のプログラムと同じです)
   * 0 ~ : 気温[°C]   * 0 ~ : 気温[°C]
   * 1000~1005 : 噴火警戒レベル(0~5)   * 1000~1005 : 噴火警戒レベル(0~5)
行 329: 行 315:
   * 4001 : LEDもスピーカーもOFF   * 4001 : LEDもスピーカーもOFF
  
-このプログラムを使って,ここまでにやった,LEDやスピーカーを制御するプログラムを使って,データに応じて情報を提示するプログラムを書いてみます.まずは,<wrap em>気温データを使ってLEDの色を変化させるプログラム</wrap>を書いてみましょう. +このプログラムを使って,データに応じて情報を提示するプログラムを書いてみます.まずは,これまでにやった,LEDを制御するプログラムの書き方を参考に,<wrap em>気温データを使ってLEDの色を変化させるプログラム</wrap>を書いてみましょう.噴火警報レベルは,レベル4以上のときレベルの数だけ警報を鳴らすプログラム,降水量は,Fujichan用の雨音を鳴らすプログラムが,あらかじめ動くようにしてあります.
-噴火警報レベルは,レベル4以上のときレベルの数だけ警報を鳴らすプログラム,降水量は,Fujichan用の雨音を鳴らすプログラムが動くようにしてあります.+
  
 {{ :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制御プログラム
行 355: 行 341:
   if ( Serial.available() > 0 ) {    // もしデータが届いていたら   if ( Serial.available() > 0 ) {    // もしデータが届いていたら
     float val = Serial.parseFloat(); // 変数を用意して取り出す     float val = Serial.parseFloat(); // 変数を用意して取り出す
-     
     if ( val < 1000 ) {  // 受け取ったデータが1000より小さいなら     if ( val < 1000 ) {  // 受け取ったデータが1000より小さいなら
       temperature = val; // 受け取ったデータを気温に設定       temperature = val; // 受け取ったデータを気温に設定
行 404: 行 389:
 } }
 </code> </code>
 +<html></details></html>
  
------ +if文をいくつかの条件に分岐させるときは,**else文**を使います.最初のif文の後に,''else if( )''のようにif文と組み合わせて書くことで,別の条件が決められます.一つのif文で「〜かつ〜」や「〜または〜」のような複数の条件を判定したい場合は,''( )''の中の条件を''&&''(かつ)や''||''(または)で区切ります.
- +
-  * if文をいくつかの条件に分岐させるときは,最初のif文のの後に,**else文**を使います.''else if( )''のようにif文と組み合わせて,別の条件が決められます. +
-  * 一つのif文で「〜かつ〜」や「〜または〜」のような複数の条件を判定したい場合は,''( )''の中の条件を''&&''(かつ)や''||''(または)で区切ります.+
 ====== ESP8266を利用したネットワークプログラミング ====== ====== ESP8266を利用したネットワークプログラミング ======
  
行 417: 行 400:
 </WRAP> </WRAP>
  
-**ESP8266**は,小型で安価なWi-Fiモジュールです単体インターネットに接続することができ,Arduinoのプログラムを書き込むこもでで,IoTの制作最適です+<WRAP center round important 60%> 
 +復習用に追記しました自宅でプログラムを書き換えるときなど参考してください(8/23) 
 +</WRAP>
  
-[[https://www.switch-science.com/catalog/2500/|ESPr® Developer(ESP-WROOM-02開発ボド) - スッチサイエス]] +**ESP8266**は,小型で安価なWi-Fiモジュルです.単体でインターネットに接続することができ,Arduinoのプログラムを書き込むこともので,IoTの制作に最適です.電源供給や,プログラムの書き換えにはmicroBタイプのUSBケーブルが必要です.
-[[http://trac.switch-science.com/wiki/esp_dev_arduino_ide|Arduino IDE開発す方法]]+
  
 +  * [[https://www.switch-science.com/catalog/2500/|ESPr® Developer(ESP-WROOM-02開発ボード) - スイッチサイエンス]]
 +  * [[https://www.switch-science.com/catalog/1035/|USB2.0ケーブル(A-microBタイプ)50cm - スイッチサイエンス]]
  
 ----- -----
  
-**取得したい場所2つURL取得する**+<wrap lo>ESP8266は,Wi-Fi通信を用い様々な使方があります.Arduinoにも,メニューバー[ファイル]から開ける[スケッチ例]に,サンプルプログラムが非常に多く用意されています.Fujichanような使い方の,基本的なプログラムは[ESP8266WiFi]の中の[WiFiClient]というサンプル参照してください.</wrap>
  
-データを取得するプログラムはすでにウェブ上に準備してあり,ESP8266からアクセスすることで,気温,噴火警戒レベル,降水量を取得することができます.ただし場所にって降水量が取得できもあるでご注意ください.気温,降水量はtenki.jpのアメダスから,噴火レベルはtenki.jpの火山情報から取得します.ESP8266に書き込むArduinoのプログラムの中に,取得したい場所のURLを記述するので,Webブラウザから+**Wi-Fiに接続するには** 
 + 
 +普段から,インターネットを使うとき,Wi-Fiに接続することが多いと思います.Wi-Fiに接続するには,**SSID**というネットワークの名前と,接続するための**パスワード**が必要です.今回は,プログラムの中にこの2つを直接記述します.ワークショップでは,研究室のWi-Fiに接続しましたが,自宅のWi-Fiに接続する場合は,この2つを変更する必要があります. 
 + 
 +**Webから情報を取得するには** 
 + 
 +普段,ChromeやSafariなどのWebブラウザからウェブ上の情報を取得するとき,**URL**というウェブ上の場所を特定する文字列によって,アクセスを行っています.IoTデバイスから,ウェブ上の情報を取得するときも同様で,今回は,プログラムの中で必要なURLを作ります.データを取得するプログラムはすでにウェブ上にプログラムが準備してあり,ESP8266からアクセスすることで,気温,噴火警戒レベル,降水量を取得することができます. 
 + 
 +プログラムのURL:%%http://tetsuakibaba.jp/test/fuji-chan.php%% 
 + 
 +**取得たい場所の2つのURLを用意する** 
 + 
 +準備したウェブ上のプログラムは,取得したい場所のURLを送って,特定の場所の情報が取得できるようにしてあります.取得した所のURLは,気温,降水量はtenki.jpのアメダスから,噴火レベルはtenki.jpの火山情報からそれぞれ取得します.Webブラウザから
  
 https://tenki.jp/ https://tenki.jp/
  
-にアクセスし,自分の取得したい場所を選択しましょう.例として,さいたま市のアメダスページにしてみます.次に噴火情報に関してはさいたま市に関しては特に近くに情報を持つ山がないので,デフォルトの富士山のままにしておきます(この情報は使いません).まとめると以下の2つです.+にアクセスし,自分の取得したい場所を選択しましょう.場所によって降水量が取得できない箇所もあるのでご注意ください. 
 +例として,さいたま市のアメダスページにしてみます.次に噴火情報に関してはさいたま市は特に近くに情報を持つ山がないので,デフォルトの富士山のままにしておきます(この情報は使いません).まとめると,数字部分だけが異なる以下の2つのようなURLが用意できていればOKです.
  
-  * <アメダスurl>:https://tenki.jp/amedas/3/14/43241.html +<アメダスurl>:https://tenki.jp/amedas/3/14/43241.html\\ 
-  <火山情報url>:http://www.tenki.jp/bousai/volcano/detail-53.html+<火山情報url>:http://www.tenki.jp/bousai/volcano/detail-53.html
  
-プログラムに書く前に正しくデータが取得できるかはPCのブラウザからでも確認できます.以下のURLはクリックすると,さいたま市の気温,富士山の噴火警戒レベル,さいたま市の降水量が確認できます.自分の取得したい場所に置き換えて,Webブラウザのアドレスバーに入力してアクセスしてみましょう.+プログラムに記述する前に正しくデータが取得できるかはPCのブラウザからでも確認できます.以下のURLはクリックすると,さいたま市の気温,富士山の噴火警戒レベル,さいたま市の降水量が確認できます.自分の取得したい場所に置き換えて,Webブラウザのアドレスバーに入力してアクセスしてみましょう.
  
 http://tetsuakibaba.jp/test/fuji-chan.php?url_temp=https://tenki.jp/amedas/3/14/43241.html&url_vol=http://www.tenki.jp/bousai/volcano/detail-53.html http://tetsuakibaba.jp/test/fuji-chan.php?url_temp=https://tenki.jp/amedas/3/14/43241.html&url_vol=http://www.tenki.jp/bousai/volcano/detail-53.html
行 446: 行 445:
 ----- -----
  
-**ESP8266に書き込む**+**ESP8266に書き込むプログラム**
  
-<wrap em>最終ファイルこれです!</wrap> +<wrap em>最終ファイル</wrap>{{ :public:sketch_final.zip |}}
-{{ :public:sketch_final.zip |}}+
  
-このプログラム以下の部分を自分の取得したい地域のアメダスurl,火山情報urlに書き換えます.''url_temp''はアメダスurl,''url_vol''は火山情報urlです.+このプログラムをダウンロードしてsketch_final.ino開いたら,fujichanClient.hというタブを選択してください. 
 + 
 +{{ :public:final_tab.png?nolink |}} 
 + 
 +以下の,Wi-Fiネットワーク設定と,取得したい場所のアメダス火山情報のURLの部分を,上で確認したものに書き換えます.
  
 <code cpp> <code cpp>
 +// Wi-Fiネットワーク設定
 +const char* ssid = "********";
 +const char* pass = "********";
 +
 +// Webサーバ上のプログラムのURL
 +const char* host = "tetsuakibaba.jp";
 +const char* path = "/test/fuji-chan.php";
 +
 // 取得したい場所のアメダス・火山情報のURL // 取得したい場所のアメダス・火山情報のURL
 const char* url_temp = "https://tenki.jp/amedas/5/25/50066.html"; // Mt.Fuji const char* url_temp = "https://tenki.jp/amedas/5/25/50066.html"; // Mt.Fuji
行 459: 行 469:
 </code> </code>
  
-**ESP8266書き込み設定**+このプログラムでは,指定したSSIDとパスワードを使ってWi-Fiへ接続する''connect()''という関数と,指定したURLを使ってWebサーバからデータを更新する''update()''という関数を用意しています.''update()''では,**HTTP**というウェブでの情報のやり取りに広く使われている通信の処理を,プログラム上で記述しています. 
 + 
 +<html><details><summary>fujichanClient.h</summary></html> 
 +<code cpp> 
 +#include "Arduino.h" 
 +#include <ESP8266WiFi.h> 
 +#include "myNeoPixel.h" 
 +#include "rain.h" 
 +#include "temperature2Color.h" 
 + 
 +myNeoPixel led = myNeoPixel(1, 4); 
 + 
 +// Wi-Fiネットワーク設定 
 +const char* ssid = "********"; 
 +const char* pass = "********"; 
 + 
 +// Webサーバ上のプログラムのURL 
 +const char* host = "tetsuakibaba.jp"; 
 +const char* path = "/test/fuji-chan.php"; 
 + 
 +// 取得したい場所のアメダス・火山情報のURL 
 +const char* url_temp = "https://tenki.jp/amedas/5/25/50066.html"; // Mt.Fuji 
 +const char* url_vol = "http://tenki.jp/bousai/volcano/314/index.html"; // Mt.Fuji 
 + 
 +// Wi-Fiへ接続する関数 
 +void connect() { 
 +  Serial.println(); 
 +  Serial.println(); 
 +  Serial.print("Connecting to "); 
 +  Serial.println(ssid); 
 +  WiFi.begin(ssid, pass); 
 +  while (WiFi.status() != WL_CONNECTED) { 
 +    //delay(500); 
 +    led.fadeIn(50, 50, 50, 500); 
 +    led.fadeOut(500); 
 +    Serial.print("."); 
 +  } 
 +  Serial.println(); 
 +  Serial.print("WiFi connected ( IP address: "); 
 +  Serial.print(WiFi.localIP()); 
 +  Serial.println(" )"); 
 +
 + 
 +// Webサーバからデータを取得する関数 
 +void update(float* _temperature, int* _funkaLevel, float* _precipitation) { 
 +  // (1)Webサーバーに接続する(TCP接続) 
 +  Serial.println(); 
 +  Serial.print("connecting to "); 
 +  Serial.println(host); 
 +  WiFiClient client; 
 +  const int httpPort = 80; // HTTP通信のポート番号は80 
 +  if (!client.connect(host, httpPort)) { 
 +    Serial.println("connection failed"); 
 +    return; 
 +  } 
 +  // (2)要求するファイルのURLを用意する 
 +  String url = path; 
 +  url += "?url_temp="; 
 +  url += url_temp; 
 +  url += "&url_vol="; 
 +  url += url_vol; 
 +  Serial.print("Requesting URL: "); 
 +  Serial.println(url); 
 +  // (3)HTTPリクエストをWebサーバーに送信する 
 +  client.print(String("GET ") + url + " HTTP/1.1\r\n"
 +               "Host: " + host + "\r\n"
 +               "Connection: close\r\n\r\n"); 
 +  unsigned long timeout = millis(); 
 +  while (client.available() == 0) { 
 +    if (millis() - timeout > 5000) { 
 +      Serial.println(">>> Client Timeout !"); 
 +      client.stop(); 
 +      return; 
 +    } 
 +  } 
 +  // (4)HTTPレスポンスから必要なデータを取り出す 
 +  while (client.available()) { 
 +    String line = client.readStringUntil('\r'); 
 +    //Serial.print(line); // この行を有効にするとHTTPレスポンスの全体が確認できます。 
 +    // 気温、噴火レベル、降水量の順番で並んでおり、カンマで区切られています。 
 +    int commaIndex = line.indexOf(",");          // 行の先頭から何文字目に 
 +    int lastCommmaIndex = line.lastIndexOf(","); // 最初のカンマと2つめのカンマがあるか 
 +    if (commaIndex >= 0) { 
 +      *_temperature = line.substring(0, commaIndex).toFloat(); 
 +      *_funkaLevel = line.substring(commaIndex + 1).toInt(); 
 +      *_precipitation = line.substring(lastCommmaIndex + 1).toFloat(); 
 +    } 
 +  } 
 +  Serial.println(); 
 +  Serial.println("closing connection"); 
 + 
 +  Serial.print("temperature: "); 
 +  Serial.println(*_temperature); 
 +  Serial.print("volcano warning level: "); 
 +  Serial.println(*_funkaLevel); 
 +  Serial.print("precipitation: "); 
 +  Serial.println(*_precipitation); 
 +   
 +  Serial.println(">>> Fuji-chan updated!"); 
 +
 +</code> 
 +<html></details></html> 
 + 
 +プログラムが変更できたら,メニューバーの[ツール]を開いて,ボードやシリアルポートの設定が以下のようになっているか確認して,ESP8266にArduinoプログラムの書き込みを行いましょう.Arduino Unoよりも時間がかかるので注意してください.
  
 {{ :public:esp8266_upload.png?nolink&600 |}} {{ :public:esp8266_upload.png?nolink&600 |}}
  
-シリアルモニターを開いて,インターネットから情報が取得できていればOKです. +シリアルモニターを開いて,インターネットから取得した,気温,噴火警戒レベル,降水量の情報が表示されればOKです.この情報を,先ほど作ったデータに応じた音や光変化の処理反映させしょう(スピカーのピン番号が9から16に変わっています.直接ピン番号を指定する場合は注意)
-データの更新はデフォルトだと5分おき行われ +
-シリアルモニターから「3001」を送ると,手動で更新できます.+
  
 ----- -----
  
-**プログラムを合わせて成さる**+**プログラムを一つにまとめる** 
 + 
 +ダウンロードしたプログラム(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プログラムを書き換える必要があるので,参考にしてください. 
 + 
 +  - macOSの場合はメニューバーの[Arduino]から[Preference],Windowsの場合はメニューバーの[ファイル]から[環境設定]を開いて,[追加のボードマネージャのURL]に,以下のURLを入力して[OK]を押します.''%%http://arduino.esp8266.com/stable/package_esp8266com_index.json%%'' 
 +  - メニューバーの[ツール]から[ボード]の中にある[ボードマネージャ]を開いて,検索バーに「ESP8266」と入力し,該当するものを[インストール]します.選択できるボードの一覧に「ESP8266 Modules」が出ていれば,環境構築は完了です.※出ない場合は,一度Arduino IDEを終了すると反映されます. 
 + 
 +{{ :public:esp8266_1.png?nolink |}} 
 + 
 +{{ :public:esp8266_2.png?nolink |}} 
 + 
 +参考リンク:[[http://trac.switch-science.com/wiki/esp_dev_arduino_ide|Arduino IDEで開発する方法]] 
 + 
 +-----
  
-先ほど作ったデータに応じた音や光変化(sketch_simpleFujichanDev)をインタネットからデータを取得するプログラムsketch_simpleFujichanに移動させれば,プログラムは完成です.+気軽にメルなどで質問してください.\\ 
 +9192hs@gmail.com須田)\\ 
 +studio@tetsuakibaba.jp(研究室
 ====== 撮影 ====== ====== 撮影 ======
 担当:石曽根 担当:石曽根
  • public/理数研究ラボ2018補助教材.1535006115.txt.gz
  • 最終更新: 2018/08/23 15:35
  • by suda