diff --git a/_build/html/.doctrees/environment.pickle b/_build/html/.doctrees/environment.pickle index f2f39d7..12e43fd 100644 --- a/_build/html/.doctrees/environment.pickle +++ b/_build/html/.doctrees/environment.pickle Binary files differ diff --git a/_build/html/.doctrees/week1.doctree b/_build/html/.doctrees/week1.doctree index 9ec093d..54a22d9 100644 --- a/_build/html/.doctrees/week1.doctree +++ b/_build/html/.doctrees/week1.doctree Binary files differ diff --git a/_build/html/.doctrees/week2.doctree b/_build/html/.doctrees/week2.doctree index a160060..946115b 100644 --- a/_build/html/.doctrees/week2.doctree +++ b/_build/html/.doctrees/week2.doctree Binary files differ diff --git a/_build/html/_sources/week1.rst.txt b/_build/html/_sources/week1.rst.txt index 0e5b181..e5b6e0f 100644 --- a/_build/html/_sources/week1.rst.txt +++ b/_build/html/_sources/week1.rst.txt @@ -1,3 +1,7 @@ +.. |br| raw:: html + +
+ 1週目 ======================== @@ -6,10 +10,10 @@ 電源の切り方・入れ方 ---------------------------------------- -- 電源を切るには、電源ボタン(M5と書かれたAボタンの左側面)を、6秒間長押しします。 - 電源を入れるには、電源ボタンを、2秒間長押しします。 -- `M5StickCガイド `_ の、4ページ目、ハードウェアの概要が参考になります。 - +- 電源を切るには、電源ボタン(M5と書かれたAボタンの左側面)を、6秒間長押しします。その際、プログラムによっては再スタートしたように見える場合がありますが、気にせずに長押し継続してください。 +- 動画をみる→ https://youtu.be/Lo1jZbAeT8Y +- `M5StickCガイド `_ の、4ページ目、ハードウェアの概要も参考になります。 プログラムの書き込み方 -------------------------------------- @@ -25,6 +29,7 @@ - ``#include `` は、M5StickC用のコードです。 **M5StickCPlus** では、``#include `` に変更しないと、表示がおかしくなることがあります。 - 大文字と小文字は厳密に区別されます。 - 画面をつかうプログラムを書き込んだあと、画面を使わないプログラムを書き込むと、前のプログラムの画面が残ることがあります。 +- スケッチブック(プログラムを構成する、複数のソースコードを含むファイル、他のIDEではプロジェクトと呼ぶ場合もある)をコピーしたいときは、内包するフォルダごとコピーしてください。その際、フォルダ名と、メインのソースコードファイル名(拡張子以外の部分)は、一致している必要があります。 Serial通信 --------------------------------------- @@ -108,7 +113,7 @@ :linenos: .. :emphasize-lines: 10-14 -.. note:: 参考:https://qiita.com/nnn112358/items/ea6b5e81623ba690343c +.. note:: `変数の型一覧 `_ uint16_t は unsigned int 16bit type の略です。 |br| 参考:`M5StackのLCDディスプレイの色をRGBで指定する。 `_ ブザー(Beep) @@ -147,7 +152,7 @@ 外部のLED等を接続 ----------------------------------------- -外部のLED等は、 G0, G25, G26 に接続します。 +外部のLED等は、 G0, G25, G26 に接続します。(GROVE端子のG32, G33も利用できます。) サンプルプログラムは、:numref:`led01` と同様です。PIN 番号を、0 / 25 / 26 に変更してください。 ブレッドボードに、抵抗とLEDを直列に接続します。 @@ -179,7 +184,7 @@ サーボモータ(サーボハット利用) ------------------------------------------------------------- -:numref:`servohat01` は、`サーボハット `_ のサーボモータを動かすサンプルです。サーボモータの制御はPWMですので、基本的に、上のPWMとやっていることは同じです。おまけとして、LEDも点灯させました。``map関数`` は、Arduinoで使える関数で、範囲に対応する値を変換するときに使います。ここでは、サーボ制御で用いる5〜33の値を、LED制御の値0〜256に変換しています。 +:numref:`servohat01` は、`サーボハット `_ のサーボモータを動かすサンプルです。サーボモータの制御はPWMですので、基本的に、上のPWMとやっていることは同じです。おまけとして、LEDも点灯させました。``map関数`` は、Arduinoで使える関数で、範囲に対応する値を変換するときに使います。ここでは、サーボ制御で用いる5〜33の値を、LED制御の値0〜256に変換しています。 .. literalinclude:: src/servohat01.ino :caption: @@ -190,13 +195,13 @@ -外部のセンサを接続 (ADC) +アナログセンサを接続 (ADC) ----------------------------------------- ADCは、Analog to Digital Converter の意味です。 ``analogRead(PIN)`` は、PIN番ピンの電圧(0~3.3V)を、0〜4095 の値で返します。一般に、抵抗値が変化するタイプのセンサは、この方法をつかって、読み取ることができます。 -.. warning:: `ADC `_ にかいてあるように、G26, G32, G33, G36のみ使えます。G26は、無線利用時には使えません。 +.. warning:: `ADC `_ にかいてあるように、G26, G32, G33, G36のみ使えます。G26は、無線利用時には使えません。 :numref:`cds01` はCdSセル(照度センサ) の値を読み取るサンプルです。 @@ -233,15 +238,17 @@ 信号の読み取り ~~~~~~~~~~~~~~~~~~~~~ -赤外線リモコン受信モジュールが必要です。ここでは、`GP1UXC41QS `_ を前提に、話をすすめます。 +赤外線リモコン受信モジュールが必要です。ここでは、`GP1UXC41QS `_ を前提に、話をすすめます。 また、準備として、ライブラリマネージャにて、IRremoteESP8266 をインストールします。ちなみに、テストしたバージョンは2.7.15でした。 +.. note:: ライブラリマネージャは、「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理…」で、ひらきます。 + ファイルメニュー → スケッチ例 → IRremoteESP8266 → IRrecvDumpV2 を選択します。 -ブレッドボードに、以下の図のように配線します。Pとかいてある面が、受光器が出っ張っている面です。47Ωの抵抗を、5Vとの間に入れます。 +ブレッドボードに、以下の図のように配線します。Pとかいてある面が、受光器が出っ張っている面だとおもってください。47Ωの抵抗を、5Vとの間に入れます。 赤外線リモコン受信モジュールに接続したピンを ``const uint16_t kRecvPin = 36;`` として設定します。 -受光器にリモコンを向けて、ボタンを押すと、シリアルモニタに情報が表示されます。ここでは、Protocol : NEC , Code 0x2FD48B7 (32 Bits) と表示されたとします。 +受光器にリモコンを向けて、ボタンを押すと、シリアルモニタに情報が表示されます。ここでは、Protocol : NEC , Code 0x2FD48B7 (32 Bits) と表示されたとします。この数値(uint32_t)を覚えておきます。 .. figure:: images/ir_sensor_47owm.png :scale: 60% @@ -254,6 +261,8 @@ 内蔵の赤外LED光はあまり強くないため、50cm程度まで近づかないと反応しない場合があります。 単体の赤外LEDを接続して用いると、距離を伸ばすことができます。 +なお、NECフォーマットではない赤外線リモコンの通信フォーマットについては、 `赤外線リモコンの通信フォーマット `_ や、スケッチ例を参考にしてください。 + .. literalinclude:: src/irsend01.ino :caption: :name: irsend01 @@ -282,25 +291,189 @@ .. :emphasize-lines: 6-7, 15,19 - - - Wifi 接続 -------------------------------------- +:numref:`wifi01` は、Wifi接続のサンプルです。``ssid`` と ``password`` には、環境にあわせたものを入力してください。接続すると、m5デバイスのIPアドレスを画面に表示します。本当にWifi接続できたかどうかを、PCのターミナルからpingを打つなどして、確認してみましょう。(Windowsの場合、コマンドプロンプトをひらき、ping のあとに、半角スペースと、確認したいIPアドレスを入れます) + +.. literalinclude:: src/wifi01.ino + :caption: + :name: wifi01 + :language: arduino + :linenos: + :emphasize-lines: 4-5,13-18 + +Wifi接続するだけでは、あまり意味がないので、Telnetサーバを起動する例を :numref:`telnet01` に示します。 +シリアルモニタを開いて、IPアドレスを確認したら、ターミナル(コマンドプロンプト)で、``telnet IPaddr`` と入力して、接続します。 +telnet から文字を入力すると、シリアルモニタに表示されます。 +逆に、シリアルモニタから文字を入力すると、Telnet接続しているターミナルに、文字が表示されます。 +``WiFiServer server(23)`` で、23番ポートで待ち受けるサーバを、作成しています。 +ちなみに、``WiFiMulti`` は、複数のアクセスポイントに対して、Wifi接続を試みることができる機能(クラス)です。ただし、最終的に繋がるのは1つのアクセスポイントになります。 + +.. note:: Telnet接続を切断するときは、まずControlキーをおしながら ``]`` をおしてください。プロンプトが ``telnet>`` と表示されますので、``quit`` と打ち込むと終了します。 ``Escape character is '^]'.`` の ``^`` は、Controlキーのことです。 + +.. literalinclude:: src/telnet01.ino + :caption: + :name: telnet01 + :language: arduino + :linenos: + :emphasize-lines: 29-30, 32 + NTPサーバ (Network Time Protocol) と時刻の取得 ----------------------------------------------------------------------------------------------------------------------------------- +M5StickCPlusには、システム時間(localTime)と、RTC(リアルタイムクロック:時計の機能を備えたICのこと)の2種類の時計があります。システム時間は、システムリセット(再起動)のたびに、時刻もリセットされますが、後者のRTCはリセットされません。 +:numref:`ntp01` に、NTPサーバを使ってシステム時間の修正をしたのち、システム時間を1秒ごとに取得して、シリアルモニタに表示する例を示します。こちらは、M5のライブラリは不要です。configTime()でNTPサーバを設定しておくと、1時間に1回、NTPサーバに接続して、時刻修正します。 + +.. literalinclude:: src/ntp01.ino + :caption: + :name: ntp01 + :language: arduino + :linenos: + :emphasize-lines: 13 + +.. warning:: configTime() を行わない状況で、システム時間(localTime)を取得しようとすると、取得に数秒ほど時間がかかります。 + +:numref:`rtc01` は、RTCの時刻を表示するサンプルです。なお、5行目で ``USE_NTP`` に 1 が設定してあれば、RTCに時刻を設定します。常時Wifiネットワークに接続できない場合は、RTCを利用することが望ましいです。 + +.. literalinclude:: src/rtc01.ino + :caption: + :name: rtc01 + :language: arduino + :linenos: + :emphasize-lines: 5 + +.. note:: RTCに一旦時刻を設定しておくと、初期状態で書き込まれているプログラムFactoryTest の「BMP8563 RTC Time」でも、その時刻が表示されるようになります。 WebClient --------------------------------------- +:numref:`httpclient01` は、HTTP通信で天気予報Web APIに接続するサンプルです。HTTPClientクラスを用いると、ブラウザでURLを指定してWebページを開くように、WebサーバにGETメソッドやPOSTメソッドでリクエストを送信して、ステータスコードやレスポンスを取得することができます。このサンプルでは、シリアルコンソールに、天気予報をJSON形式で表示します。JSON(ジェイソン)とは、Javascriptのオブジェクトの形式でデータを表現する記法です。 + + +.. literalinclude:: src/httpclient01.ino + :caption: + :name: httpclient01 + :language: arduino + :linenos: +.. :emphasize-lines: 5 + +.. warning:: https (SSL) 通信をする場合は、スケッチ例→HTTPClient→BasicHttpsClient を参照して、WiFiClientSecure クラスを使用してください。 + +Google Spreadsheet にデータを送信する +-------------------------------------------------------- + +HTTP通信で、サーバにデータを送信して格納したいとおもっても、適当なサーバを準備するのは手間がかかることがあります。 + +Google Apps Scriptを用いると、HTTP通信で Google Spreadsheet にデータを書き込んだり、読み取ったりするWebサービスを作成し、WebAPIとして公開することができます。 + +(Google Spreadsheetのメニューで) 拡張機能→Apps Script または、ツール→スクリプトエディタ で、:numref:`doget` を「コード.gs」に書き込みます。15行目で「シート1」の一番下の行に、配列array の要素を追加します。19行目のgetRange(1,3).getValue()は、スプレッドシートのC1(3列1行)の値を取得しています。ここに「=average(C2:C200)」のようにしておくと、データの平均値を取得することもできます。 + +作成した「コード.gs」について、「公開」→「ウェブアプリケーションとして導入...」で、Webアプリとして公開できます。(なお、「新しいエディタ」では表示が異なるため、できない可能性があります。) + +作成できたかどうかをパソコンから確認するには、コマンドラインから、以下のように入力します(ただし、curlが必要です。val1=10 と val2=20 のあいだは&記号ですので、シェルでバックグラウンド処理されないように、URLをシングルクォートで囲っています) :: + + curl -L 'https://script.google.com/macros/s/XxXxXxXxXx/exec?val1=10&val2=20' + + +.. literalinclude:: src/doget.js + :caption: + :name: doget + :language: javascript + :linenos: + :emphasize-lines: 14 + + WebServer ---------------------------------------- +すこし長いですが、:numref:`httpserver01` は、80番ポートでHTTPでの通信を待ち受け(listenし)て、クライアントからの接続情報(ヘッダ情報)を返すWebサーバのシンプルな例です。クライアント(ブラウザ)からのリクエスト行のうち、 ``GET`` または ``POST`` ではじまる行があれば、変数 ``meth`` に格納します。つまり、変数 ``meth`` には、ブラウザで発行したリクエストのURLが含まれることになります。POSTメソッドで送信されていれば、リクエストボディに記述されたデータを変数 ``post`` に格納します。 クライアント(ブラウザ)に返す「レスポンス」は、 ``client.println()`` で送信します。最後に、``client.stop()`` で、サーバ側から接続を切断します。 + +.. literalinclude:: src/httpserver01.ino + :caption: + :name: httpserver01 + :language: arduino + :linenos: + :emphasize-lines: 18,22,26,43,80 + +センサデータを返すだけなら問題ありませんが、クライアントからのデータを GET / POST で受信して処理する場合は、 ``key1=val1&key2=val2`` のような文字列を要素に分解する必要がでてきます。あまり深入りしませんが、正規表現で文字列を照合・抽出する ``Regexp`` や、抽出した結果をハッシュ/辞書として保存する ``Dictionary`` ライブラリを導入すると、複雑なリクエストやデータを扱いやすくなるでしょう。 +:numref:`regexp01` に、RGBの色指定文字列などのリクエスト文字列をパースして辞書に追加するプログラムの断片を示します。**注意:このプログラムは、単体では動作しません** + +.. literalinclude:: src/regexp01.ino + :caption: + :name: regexp01 + :language: arduino + :linenos: + + +MQTT +------------------------------------------- + +MQTT(Message Queue Telemetry Transport) は、センサデータをデバイス間で共有・流通させるときなどに使われる、軽量のメッセージ送受信プロトコルです。 +ここで、「軽量」とは、HTTPに比べて、ヘッダ部分のデータが少ない、という意味です。 +MQTTでは、サーバのことを「ブローカ」と呼びます。ここでは、データを送信するPublisherと、データを受信するSubscriberの2つのデバイスと、ブローカの3つの構成要素で説明します。 + +Publisherは、ブローカに接続しデータを送信します。このとき、 **「トピック」** と呼ばれる、データの登録先を文字列で指定します。また、retainデータとして送信するかどうかも指定します。retainとは「保持・維持」の意味で、最後に送ったデータをブローカに残しておきたい場合、rateinデータとします。 +Subscriberは、ブローカに接続し、トピックをサブスクライブ(購読)します。このとき、トピックに書き込まれているretainデータがあれば、最初にそのデータを受信します。retainデータがなければ、Publisherが新しいデータをトピックに送信したタイミングで、データを受信します。 +このような通信手段(プロトコル)を、パブリッシュ/サブスクライブモデル と呼びます。`参考サイト: +IoT初心者向け!「MQTT」について簡単にまとめてみる `_ + + +MQTT Publish +~~~~~~~~~~~~~~~~~~~~~~~~ + +:numref:`mqtt01pub` は、MQTT Publisherのサンプルです。実験用ブローカ(mqtt.istlab.info)に接続して、 ``office/temp`` というトピックにデータ(シリアルコンソールで送信した文字列)を書き込みます。 **パスワードはここには書けませんので、講義ポータル資料を参照してください。** + + +.. literalinclude:: src/mqtt01pub.ino + :caption: + :name: mqtt01pub + :language: arduino + :linenos: + + +MQTT Subscribe +~~~~~~~~~~~~~~~~~~~~~~~~ + +:numref:`mqtt01sub` は、MQTT Subscriberのサンプルです。実験用ブローカ(mqtt.istlab.info)に接続して、 ``office/temp`` というトピックを購読します。 **パスワードはここには書けませんので、講義ポータル資料を参照してください。** JSON形式のデータを処理するときは、ArduinoJsonをつかってパージング/deserialize すると便利です(78行目以降にサンプルがあります)。 + +.. literalinclude:: src/mqtt01sub.ino + :caption: + :name: mqtt01sub + :language: arduino + :linenos: + :emphasize-lines: 38-39 + +トピック名とワイルドカード +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +サブスクライブするときのトピック名には、ワイルドカードが指定できます。例えば、 ``office/+`` +と指定すると、 ``office/temp`` にも ``office/humid`` にもマッチします。`参考:MQTT の仕様 `_ + + +mosquitto コマンド例 +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +mosquitto は、オープンソースのMQTT Broker/Client 実装の1つです。参考までに、mosquitto クライアントを使用するコマンド例を示します。:: + + #(パブリッシュ。retainなし: -m "メッセージ" ) + mosquitto_pub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp -m "data or message" + #(パブリッシュ。retainあり: -r ) + mosquitto_pub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp -m "data or message" -r + #(retainデータを削除。-n : send a null (zero length) message.) + mosquitto_pub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp -n -r + #(サブスクライブ) + mosquitto_sub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp + +3つ目の例に示すように、長さ0の非retainデータを送信すると、retainデータを削除できます。 + + + +Bluetooth Serial Protocol Profile (SPP) +-------------------------------------------- Bluetooth Low Energy -------------------------------------- @@ -308,10 +481,6 @@ アドバータイズ -Bluetooth Serial Protocol Profile (SPP) --------------------------------------------- - - Preference ------------------------------------------- @@ -328,7 +497,3 @@ - RTC(BM8563) - OTA -参考リンク ------------------------------------------- - -- M5StickC非公式日本語リファレンス \ No newline at end of file diff --git a/_build/html/_sources/week2.rst.txt b/_build/html/_sources/week2.rst.txt index e0c1731..b454a9d 100644 --- a/_build/html/_sources/week2.rst.txt +++ b/_build/html/_sources/week2.rst.txt @@ -3,3 +3,15 @@ 1週目で学んだことを活かして、組み合わせてみましょう。 + +複数人で書いたプログラムを統合する +------------------------------------------------------------------------------ + +- Arduino IDEでは、プログラムを複数のファイル(たとえば、main.ino / sub.ino / hoge.cpp / hoge.h ) に分割して記述することができます。複数ファイルに分割することで、関数定義を機能別にまとめることができ、管理しやすくなります。 +- Arduino IDEでは、プログラムを構成する、複数のファイル(スケッチブック)を、1つのフォルダに入れて管理します。(スケッチブックのことを、他のIDEでは「プロジェクト」と呼ぶ場合もある) +- スケッチブックに別のファイル(hogehoge.ino) を追加するには、右上にあるシリアルモニタをひらくアイコンの、下の「▼」ボタンからメニューをひらき、「新規タブ」を選択し、ファイル名(拡張子.ino をのぞいた、hogehogeの部分のみ)を入力します。 +- スケッチブックをコピーしたいときは、内包するフォルダごとコピーしてください。**その際、フォルダ名と、メインのソースコードファイル名(拡張子以外の部分)は、一致している必要があります。** +- 複数のファイルを置いたときの挙動について: ``***.ino`` ファイルの内容は、単純にメインのタブ(フォルダ名と同じinoファイル)にマージされます。``***.cpp`` や ``***.c`` という拡張子でファイルを作成した場合は、``***.h`` を作成する必要があります。`参考:Properly using separate tabs with Arduino IDE `_ +- Git を利用すると、複数人で作業したファイルを統合しやすいです。 + + diff --git a/_build/html/index.html b/_build/html/index.html index 99ad9f6..9314baf 100644 --- a/_build/html/index.html +++ b/_build/html/index.html @@ -190,26 +190,30 @@
  • 文字列の扱い、16進数や10進数の変換
  • ブザー(Beep)
  • 内蔵LED(赤・赤外)
  • -
  • 外部のLED等を接続
  • +
  • 外部のLED等を接続
  • PWM (Pulse Width Modulation)
  • -
  • サーボモータ(サーボハット利用)
  • -
  • 外部のセンサを接続 (ADC)
  • -
  • 加速度センサ
  • +
  • サーボモータ(サーボハット利用)
  • +
  • アナログセンサを接続 (ADC)
  • +
  • 加速度センサ
  • 赤外(InfraRed)リモコン
  • スプライト表示(TFT_eSprite クラス)
  • Wifi 接続
  • NTPサーバ (Network Time Protocol) と時刻の取得
  • WebClient
  • +
  • Google Spreadsheet にデータを送信する
  • WebServer
  • -
  • Bluetooth Low Energy
  • +
  • MQTT
  • Bluetooth Serial Protocol Profile (SPP)
  • +
  • Bluetooth Low Energy
  • Preference
  • -
  • 電力制御
  • -
  • その他
  • -
  • 参考リンク
  • +
  • 電力制御
  • +
  • その他
  • -
  • 2週目
  • +
  • 2週目 +
  • diff --git a/_build/html/objects.inv b/_build/html/objects.inv index 9c927a4..5a365c6 100644 --- a/_build/html/objects.inv +++ b/_build/html/objects.inv Binary files differ diff --git a/_build/html/searchindex.js b/_build/html/searchindex.js index 3c6734f..313ee3a 100644 --- a/_build/html/searchindex.js +++ b/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["arduino","conclusion","index","intro","pre","tutorial","week1","week2"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},filenames:["arduino.rst","conclusion.rst","index.rst","intro.rst","pre.rst","tutorial.rst","week1.rst","week2.rst"],objects:{},objnames:{},objtypes:{},terms:{"#.":[],"#]":5,"#define":6,"#include":[0,6],"$date":5,"$revision":5,"%d":6,"%i":[],"&&":6,"')":6,"';":6,"']":6,"'a":6,"'c":6,"'s":5,"'z":6,"(&":6,"((":6,"()":[0,6],"(=":6,"(\"":[0,6],"(\u30d4\u30f3":6,"(analogread":6,"(bit":6,"(black":6,"(bm":6,"(buf":[],"(button":6,"(general":6,"(hex":6,"(hz":6,"(i":[5,6],"(infrared":2,"(int":[],"(kirled":6,"(lcd":6,"(link":[],"(ms":6,"(num":[],"(p":6,"(pin":[0,6],"(pwm":6,"(pwmch":[],"(rrggbb":6,"(sbuf":6,"(str":6,"(string":6,"(tmp":6,"(void":[],"(white":6,"(windows":[],"))":6,");":[0,6],")\"":[5,6],")\\":[],")\u300d":6,"){":[],"**":[],"*\"":5,"*]":5,"*p":6,"++":6,"+-":[0,6],"+\"":5,"+t":6,", \"":5,", and":5,", g":6,", gyrox":6,", num":6,", or":5,", r":6,",%":6,",\"":6,"-+":[0,6],"--":[0,6],"-\"":5,"-arduinoide":[],"-based":3,"-c":4,"-cn":3,"-dict":5,"-display":6,"-enumerated":5,"-esp":[],"-free":5,"-io":[0,6],"-left":5,"-level":5,"-literal":5,"-m":[],"-notes":5,"-numbered":5,"-numfig":5,"-o":5,"-pages":[],"-quote":5,"-rest":5,"-role":5,"-science":[3,4],"-shenzhen":3,"-ship":[0,3,6],"-specific":5,"-start":[],"-symbol":5,"-table":5,"-users":[1,5],"-xxxxx":[],"-xxxxxxxxxx":4,".)":5,"..":5,".\"":5,".\\":[],".\n#":[],".aliyuncs":3,".arduino":4,".available":6,".beep":6,".begin":6,".c":6,".cc":4,".charat":6,".color":6,".com":[0,3,4,6],".concat":6,".createsprite":6,".espressif":4,".fillrect":6,".fillscreen":6,".fillsprite":6,".ftdichip":4,".getacceldata":6,".getbtnpress":6,".getgyrodata":6,".githubusercontent":[],".gres":6,".h":[0,6],".htm":4,".html":[0,5,6],".info":5,".init":6,".ino":[0,1,6],".istlab":5,".jp":[0,1,5,6],".json":4,".length":6,".mongonta":[],".mute":6,".net":5,".org":5,".oss":3,".pdf":3,".png":5,".print":6,".printf":[0,6],".println":6,".pushsprite":6,".read":6,".sendnec":6,".setbeep":6,".setcolordepth":6,".setcursor":6,".setrotation":6,".settextcolor":6,".settextfont":6,".settextsize":6,".sf":5,".sourceforge":5,".storange":[0,6],".substring":6,".switch":[3,4],".toint":6,".tolowercase":6,".tone":6,".trim":6,".txt":5,".update":6,".usbserial":4,".wasreleased":6,".wasreleasefor":6,".zip":[],"//":[0,6],"/accgyro":6,"/adc":[0,6],"/analogread":0,"/arduino":[],"/blog":[0,6],"/button":6,"/catalog":[3,4],"/cdm":[],"/cds":6,"/class":[],"/cplus":[4,6],"/crc":0,"/cu":4,"/dev":4,"/directives":5,"/dl":4,"/docs":[3,5],"/download":[],"/drivers":4,"/ea":6,"/en":4,"/espressif":[],"/factorytest":0,"/howto":[],"/i":0,"/images":5,"/irsend":6,"/isprime":[],"/items":6,"/kitazaki":6,"/lcd":6,"/led":6,"/linux":[],"/m":[0,3,6],"/macos":[],"/main":4,"/nnn":6,"/numbering":5,"/o":6,"/package":4,"/pages":[],"/peripherals":[0,6],"/pjs":[],"/pwm":6,"/ref":5,"/reference":[0,3,6],"/resource":3,"/reverse":5,"/rmt":0,"/roles":5,"/rst":5,"/run":[],"/serial":6,"/servohat":6,"/sketch":[0,1],"/software":4,"/sound":6,"/sprite":6,"/str":6,"/unofficial":[0,3,6],"/vcp":4,"/work":[0,6],"0x":6,"0xxxxxxxxx":[],"10":6,"11":6,"14":6,"1\u30d0\u30a4\u30c8":6,"1\u56de":6,"1ce":6,"1s":6,"1uxc":6,"21":6,"2\u3064":6,"2d":0,"2f":6,"2fd":6,"2s":0,"3\u3064":6,"3d":0,"3v":[0,6],"5\u7cfb":6,"5bit":6,"5e":6,"5stack":[3,4],"5stick":[],"5stickc":[0,3,4,6],"5stickcplus":[0,3,6],"5v":6,"6b":6,"6bc":[],"6bit":6,"8bit":6,"8pixel":6,":/":[0,1,3,4,5,6],"::":5,":>":[3,6],":\"":5,":file":[],":numref":[],"; p":6,"< *":6,"< c":6,"<":[],">>":5,">`":[],"@python":5,"[0":6,"[6":6,"[a":6,"[b":6,"[c":6,"[cit":5,"[i":6,"[pos":6,"\")":6,"\",":[0,5,6],"\"..":5,"\":":5,"\";":6,"\\n":[0,6],"\u2026\u300d":4,"\u2192\u300c":4,"\u2192\u300d":4,"\u3001/":[],"\u3001:":[],"\u3001\u2714":4,"\u3001\u300c":4,"\u3001esp":3,"\u3001pc":6,"\u3002:":4,"\u3002\"":6,"\u3002\u300c":4,"\u3002\u3061":[4,6],"\u3002\u307b\u3052\u307b\u3052\u307b\u3052":5,"\u3002\u307e\u305f":[4,6],"\u3002\uff08":6,"\u3002arduino":4,"\u3002c":[],"\u3002color":[],"\u3002g":6,"\u3002gpio":6,"\u3002ide":4,"\u3002mac":4,"\u3002map":[],"\u3002p":6,"\u3002pc":6,"\u3002pin":6,"\u3002serial":6,"\u3002settextsize":6,"\u3002windows":4,"\u300chigh":6,"\u300cm":[],"\u300d\u2192":[4,6],"\u300d\uff09":3,"\u301cz":6,"\u3042\u3044":6,"\u3042\u3063":[],"\u3042\u3068":[4,6],"\u3042\u307e\u308a":6,"\u3042\u308a":[1,4,6],"\u3042\u308b":6,"\u3042\u308c":6,"\u3044\u3061\u3070\u3093":1,"\u3044\u308a":5,"\u3044\u308b":[1,3,4,6],"\u3044\u308c":4,"\u3046\u307e\u304f":3,"\u3046\u307e\u304f\u3044\u304b":3,"\u3048\u3089\u3076":4,"\u304a\u3044":6,"\u304a\u304b\u3057\u304f":6,"\u304a\u304d":6,"\u304a\u304d\u307e\u3057\u3087":6,"\u304a\u304d\u308b":6,"\u304a\u304f":6,"\u304a\u3051\u308b":3,"\u304a\u3057":6,"\u304a\u3059":4,"\u304a\u307e\u3051":6,"\u304a\u3082":4,"\u304a\u3088\u3073":3,"\u304a\u308a":3,"\u304b\u3048":[],"\u304b\u304b\u308a":6,"\u304b\u3051\u308b":3,"\u304b\u3064":[],"\u304b\u3069\u3046":3,"\u304b\u306a\u308a":[],"\u304b\u3084":[],"\u304b\u3089":[0,3,4,5,6],"\u304b\u308f\u308a":3,"\u304c\u3042\u308a":4,"\u304c\u304f\u308b":[],"\u304c\u3064\u304b\u3048":6,"\u304c\u3064\u304f":5,"\u304c\u3069":3,"\u304c\u308f\u304b\u308a":[],"\u304f\u3060":[4,6],"\u304f\u308a\u304b\u3048":6,"\u304f\u308c\u308b":6,"\u3053\u3053":[1,4,5,6],"\u3053\u3053\u306e":1,"\u3053\u3053\u306f":6,"\u3053\u3061\u3089":4,"\u3053\u3068":[3,4,6,7],"\u3053\u306e":[0,3,6],"\u3053\u308c":6,"\u3053\u308c\u3089":0,"\u3055\u3044":[4,6],"\u3055\u3044\u3054":6,"\u3055\u3089\u306b":5,"\u3057\u304b":5,"\u3057\u3057":6,"\u3057\u3066":6,"\u3057\u307e\u3057\u3087":6,"\u3059\u304e":[],"\u3059\u3050":6,"\u3059\u3053\u3057\u308f\u304b\u308a":4,"\u3059\u3059\u3081":[3,6],"\u3059\u3059\u3081\u304b":2,"\u3059\u3059\u3081\u308b":3,"\u3059\u3079":6,"\u3059\u3079\u3066":6,"\u3059\u308b":[1,3,5,6],"\u305a\u3064":6,"\u305b\u308b":[3,6],"\u305c\u3072\u3084\u3063":6,"\u305d\u3053\u306b\u5bfe\u3057":6,"\u305d\u306e":[2,3],"\u305d\u308c":6,"\u305d\u308c\u305e\u308c":6,"\u305f\u3044":[0,6],"\u305f\u3044\u304b":3,"\u305f\u3046\u3048":6,"\u305f\u304b":3,"\u305f\u3060\u3057":[4,6],"\u305f\u3081":[3,4,6],"\u305f\u3089":[4,6],"\u305f\u308a":[3,4,6],"\u305f\u308a\u3057":6,"\u3060\u3046\u3048":3,"\u3060\u3051":6,"\u3060\u3055\u3044":[4,6],"\u3060\u3068":5,"\u3061\u3089\u3064\u304d":6,"\u3064\u3044":5,"\u3064\u304b\u3044":6,"\u3064\u304b\u3046":6,"\u3064\u304b\u3063":6,"\u3064\u304f\u3088\u3046":5,"\u3064\u306a\u3044":6,"\u3064\u3076":6,"\u3064\u3076\u3059":6,"\u3066\u307f":6,"\u3066\u307f\u307e\u3057\u3087":7,"\u3067\u304d":[3,4,5,6],"\u3067\u304d\u308b":[3,4,6],"\u3067\u3057\u3087":6,"\u3067\u3059":[0,1,4,5,6],"\u3067\u307f\u308b":6,"\u3067\u3082":6,"\u3068\u3044\u3046":[4,6],"\u3068\u3044\u3063":6,"\u3068\u3048":0,"\u3068\u304b\u3044":6,"\u3068\u304d":[2,4,5],"\u3068\u304f":3,"\u3068\u3057":6,"\u3068\u3057\u3066":[3,5,6],"\u3068\u3059\u308b":6,"\u3068\u308b":3,"\u3069\u3046":[3,6],"\u3069\u3061\u3089":6,"\u306a\u3044":[4,5,6],"\u306a\u304b":6,"\u306a\u304b\u3063":3,"\u306a\u304c\u3089":[3,6],"\u306a\u304f":[4,6],"\u306a\u3057":[4,6],"\u306a\u3063":3,"\u306a\u3069":6,"\u306a\u306b":6,"\u306a\u306e":6,"\u306a\u307f":[4,6],"\u306a\u3081\u3089\u304b":6,"\u306a\u3089":6,"\u306a\u308a":[0,4,5,6],"\u306a\u308b":[3,6],"\u306b\u304b\u3044":6,"\u306b\u3057":[],"\u306b\u3059\u3059\u307f":4,"\u306b\u3059\u308c":5,"\u306b\u3064\u3044\u3066":[1,3,6],"\u306b\u3088\u3063":[],"\u306b\u3088\u308a":6,"\u306b\u3088\u308b":[1,3,5],"\u306b\u5bfe\u3057":6,"\u306b\u5bfe\u3059\u308b":[3,6],"\u306b\u5bfe\u5fdc":[],"\u306e\u3061\u3089\u3064\u304d":6,"\u306e\u3067":[4,6],"\u306e\u307b\u3046":6,"\u306e\u307f":[4,6],"\u306e\u3088\u3046":[0,4,5],"\u306f\u3058\u307e\u308b":6,"\u3072\u3068\u3064":6,"\u3072\u3089\u3044":6,"\u3072\u3089\u304d":4,"\u3072\u3089\u304f":[4,6],"\u3079\u304d":3,"\u307b\u3046":[0,6],"\u307b\u304b":6,"\u307b\u3052\u307b\u3052":[],"\u307b\u307c":6,"\u307e\u3057":[1,6],"\u307e\u3057\u3087":[],"\u307e\u3059":[0,1,4,5,6],"\u307e\u305a":[],"\u307e\u305b":6,"\u307e\u305f":6,"\u307e\u3063":1,"\u307e\u3067":[4,6],"\u307e\u3068":1,"\u307e\u3068\u3081":[],"\u307e\u3068\u3081\u3066":6,"\u307e\u3068\u3081\u308b":3,"\u307f\u3066":4,"\u307f\u308b":6,"\u3082\u3061":[],"\u3082\u3061\u3044\u308b":[],"\u3082\u3068":3,"\u3084\u3059":3,"\u3084\u3059\u304f":[3,4],"\u3084\u3063":6,"\u3084setbeep":6,"\u3088\u3044":6,"\u3088\u3046":[0,3,4,6],"\u3088\u304f":1,"\u3088\u308a":[4,6],"\u3089\u308c":3,"\u3089\u308c\u308b":3,"\u308c\u308b":[4,6],"\u308f\u304b\u308a":3,"\u3092\u304a\u3057":4,"\u3092\u3059\u308c":5,"\u3092\u3064\u304b\u3044":5,"\u30a2\u30a4\u30b3\u30f3":4,"\u30a2\u30a4\u30b3\u30f3\u30dc\u30bf\u30f3":[4,6],"\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9":[],"\u30a2\u30c9\u30d0\u30fc\u30bf\u30a4\u30ba":6,"\u30a2\u30c9\u30d0\u30fc\u30bf\u30a4\u30ba\u30e1\u30f3\u30c8":[],"\u30a2\u30c9\u30ec\u30b9":[1,5,6],"\u30a4\u30af\u30ea\u30d7\u30b9":4,"\u30a4\u30f3\u30af\u30eb\u30fc\u30c9":4,"\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb":[2,6],"\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8":3,"\u30a4\u30f3\u30c7\u30f3\u30c8":6,"\u30a4\u30f3\u30c8\u30ed\u30c0\u30af\u30b7\u30e7\u30f3":[],"\u30a4\u30f3\u30c8\u30ed\u30c0\u30af\u30b7\u30e7\u30f3intro":[],"\u30aa\u30af\u30bf\u30fc\u30d6":6,"\u30aa\u30d5\u30b9\u30af\u30ea\u30fc\u30f3":6,"\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u30de\u30a4\u30b3\u30f3":[],"\u30ab\u30a6\u30f3\u30bf":6,"\u30ab\u30e1\u30e9":6,"\u30ab\u30e9\u30fc":3,"\u30ac\u30a4\u30c9":[3,6],"\u30ad\u30e3\u30d7\u30b7\u30e7\u30f3":5,"\u30ae\u30b6\u30ae\u30b6":6,"\u30af\u30e9\u30b9":2,"\u30af\u30ea\u30c3\u30af":[1,5],"\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9":6,"\u30b0\u30e9\u30d5":6,"\u30b0\u30e9\u30f3\u30c9":6,"\u30b0\u30eb\u30fc\u30d7":3,"\u30b0\u30ed\u30fc\u30d0\u30eb":6,"\u30b1\u30fc\u30d6\u30eb":6,"\u30b3\u30d4\u30fc":[4,6],"\u30b3\u30e1\u30f3\u30c8":6,"\u30b3\u30f3\u30d1\u30a4\u30eb":4,"\u30b3\u30f3\u30d1\u30a4\u30eb\u30c6\u30b9\u30c8":5,"\u30b3\u30fc\u30c9":2,"\u30b3\u30fc\u30c9\u30a8\u30c7\u30a3\u30bf":[4,6],"\u30b5\u30a4\u30ba":6,"\u30b5\u30a4\u30c8":[1,5,6],"\u30b5\u30f3\u30d7\u30eb":6,"\u30b5\u30f3\u30d7\u30eb\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9":[],"\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0":[4,6],"\u30b5\u30fc\u30d0":[2,3],"\u30b5\u30fc\u30dc":6,"\u30b5\u30fc\u30dc\u30cf\u30c3\u30c8":2,"\u30b5\u30fc\u30dc\u30e2\u30fc\u30bf":[2,3],"\u30b5\u30fc\u30dc\u30e2\u30fc\u30bf\u30fc":[],"\u30b7\u30b9\u30c6\u30e0":[3,5],"\u30b7\u30d5\u30c8":6,"\u30b7\u30ea\u30a2\u30eb":[],"\u30b7\u30ea\u30a2\u30eb\u30d7\u30ed\u30c3\u30bf":6,"\u30b7\u30ea\u30a2\u30eb\u30e2\u30cb\u30bf":6,"\u30b7\u30ea\u30fc\u30ba":3,"\u30b7\u30f3\u30d7\u30eb":6,"\u30b8\u30e3\u30a4\u30ed\u30bb\u30f3\u30b5":6,"\u30b8\u30e3\u30a4\u30ed\u30c7\u30fc\u30bf":6,"\u30b8\u30e3\u30f3\u30d1\u30ef\u30a4\u30e4":6,"\u30b9\u30a4\u30c3\u30c1\u30b5\u30a4\u30a8\u30f3\u30b9":3,"\u30b9\u30ad\u30c3\u30d7":6,"\u30b9\u30af\u30ed\u30fc\u30eb":6,"\u30b9\u30b1\u30c3\u30c1":[4,6],"\u30b9\u30bf\u30fc\u30c8\u30e1\u30cb\u30e5\u30fc":4,"\u30b9\u30c6\u30c3\u30d7":4,"\u30b9\u30d7\u30e9\u30a4\u30c8":2,"\u30bb\u30f3\u30b5":[2,3],"\u30bb\u30f3\u30b5\u30fc":[],"\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9":[0,1,4,6],"\u30bf\u30a4\u30d7":6,"\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9":4,"\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u30b5\u30a4\u30c8":4,"\u30c0\u30d6\u30eb\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0":6,"\u30c1\u30a7\u30c3\u30af":4,"\u30c1\u30e3\u30f3\u30cd\u30eb":6,"\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb":5,"\u30c1\u30fc\u30e0":3,"\u30c4\u30fc\u30eb":[4,6],"\u30c6\u30ad\u30b9\u30c8":4,"\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2":[4,6],"\u30c6\u30b9\u30c8":[5,6],"\u30c7\u30a3\u30b9\u30d7\u30ec\u30a4":[2,3],"\u30c7\u30a3\u30b9\u30d7\u30ec\u30a4\u30b5\u30a4\u30ba":4,"\u30c7\u30d0\u30a4\u30b9":[4,6],"\u30c7\u30d0\u30a4\u30b9\u30de\u30cd\u30fc\u30b8\u30e3":4,"\u30c7\u30e5\u30fc\u30c6\u30a3\u30fc":6,"\u30c7\u30fc\u30bf":[3,6],"\u30c9\u30e9\u30a4\u30d0":4,"\u30ce\u30f3\u30d6\u30ed\u30c3\u30ad\u30f3\u30b0":6,"\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2":6,"\u30d0\u30c3\u30c6\u30ea":4,"\u30d0\u30fc\u30b8\u30e7\u30f3":[2,6],"\u30d1\u30cd\u30eb":3,"\u30d1\u30eb\u30b9":6,"\u30d2\u30f3\u30c8":2,"\u30d3\u30c3\u30c8":6,"\u30d3\u30c3\u30c8\u30ab\u30e9\u30fc":6,"\u30d3\u30fc\u30d7":6,"\u30d4\u30af\u30bb\u30eb":6,"\u30d4\u30af\u30bb\u30eb\u30d5\u30a9\u30f3\u30c8":6,"\u30d4\u30f3":6,"\u30d5\u30a1\u30a4\u30eb":[0,4,5],"\u30d5\u30a1\u30a4\u30eb\u30e1\u30cb\u30e5\u30fc":6,"\u30d5\u30a3\u30fc\u30eb\u30c9":4,"\u30d5\u30a9\u30f3\u30c8":6,"\u30d6\u30b6\u30fc":[2,4],"\u30d6\u30ec\u30c3\u30c9\u30dc\u30fc\u30c9":6,"\u30d6\u30ed\u30c3\u30af\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0":4,"\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0":3,"\u30d7\u30ed\u30b0\u30e9\u30e0":2,"\u30d9\u30fc\u30b9":4,"\u30da\u30fc\u30b8":[2,3,6],"\u30dc\u30bf\u30f3":[2,3,4],"\u30dc\u30bf\u30f3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8":6,"\u30dc\u30fc\u30c9":[],"\u30dc\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3":4,"\u30dc\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3\u30fc":[],"\u30dd\u30a4\u30f3\u30bf":6,"\u30dd\u30fc\u30c8":[4,6],"\u30de\u30a4\u30af\u30ed\u30d7\u30ed\u30bb\u30c3\u30b5":3,"\u30de\u30a4\u30b3\u30f3\u30dc\u30fc\u30c9":4,"\u30de\u30a4\u30b3\u30f3\u30e2\u30b8\u30e5\u30fc\u30eb":3,"\u30df\u30ea":6,"\u30e1\u30a4\u30f3":6,"\u30e1\u30bd\u30c3\u30c9":6,"\u30e2\u30b8\u30e5\u30fc\u30eb":6,"\u30e2\u30cb\u30bf":[],"\u30e2\u30fc\u30bf":6,"\u30e2\u30fc\u30c9":[0,6],"\u30e9\u30a4\u30d6\u30e9\u30ea":[],"\u30e9\u30a4\u30d6\u30e9\u30ea\u30de\u30cd\u30fc\u30b8\u30e3":[4,6],"\u30e9\u30f3\u30d7":6,"\u30ea\u30b9\u30c8":6,"\u30ea\u30bb\u30c3\u30c8":6,"\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9":[3,6],"\u30ea\u30e2\u30b3\u30f3":2,"\u30ea\u30f3\u30af":[0,1,2,4],"\u30eb\u30fc\u30d7":6,"\u30ec\u30d9\u30eb":3,"\u30ec\u30dd\u30fc\u30c8":3,"\u30fb\u65b9\u5411\u6027":3,"\u4e00\u756a\u5de6":4,"\u4e00\u822c":6,"\u4e00\u822c\u7684":3,"\u4e00\u8cab":3,"\u4e00\u8cab\u6027":[],"\u4e00\u90e8":6,"\u4e0a\u8a18":3,"\u4e0a\u90e8":6,"\u4e0b\u8a18":[],"\u4e0e\u3048":3,"\u4e21\u65b9":5,"\u4e88\u5099":3,"\u4e88\u7fd2":3,"\u4e8b\u524d":2,"\u4e8b\u8c61":6,"\u4e92\u63db":4,"\u4eba\u611f":[],"\u4eba\u6c17":[],"\u4ecb\u3057":6,"\u4ed5\u7d44":3,"\u4ed8\u4e0e":6,"\u4ee5\u4e0b":[3,4,6],"\u4ee5\u5916":6,"\u4ee5\u964d":[4,6],"\u4eee\u5b9a":6,"\u4eee\u60f3":6,"\u4f38\u3070":6,"\u4f38\u9577":[],"\u4f4d\u7f6e":6,"\u4f55\u500d":6,"\u4f59\u767d":6,"\u4f5c\u54c1":3,"\u4f5c\u6210":6,"\u4f5c\u696d":[3,4],"\u4f7f\u3044":6,"\u4f7f\u3046":6,"\u4f7f\u3048":6,"\u4f7f\u3048\u308b":6,"\u4f7f\u3063":4,"\u4f7f\u308f":[4,6],"\u4f7f\u7528":[3,4,6],"\u4f8b\u5916":6,"\u4fbf\u5229":6,"\u4fdd\u6301":6,"\u4fe1\u53f7":[],"\u500d\u6570":6,"\u500d\u7387":6,"\u5024\u3084":6,"\u5024\u4ee5":[],"\u505c\u3081":6,"\u505c\u6b62":6,"\u5099\u3048":[3,6],"\u50cd\u304d":3,"\u5148\u982d":6,"\u5165\u308a":6,"\u5165\u308c":2,"\u5165\u308c\u308b":6,"\u5165\u529b":[3,4,6],"\u5168\u3066":6,"\u5168\u54e1":6,"\u516c\u5f0f":6,"\u5171\u6709":3,"\u5185\u5074":6,"\u5185\u51e6":6,"\u5185\u5bb9":[3,6],"\u5185\u8535":6,"\u5185\u8535ir":[],"\u5185\u8535irled":[],"\u5185\u8535led":2,"\u5185\u90e8":0,"\u5186\u6ed1":[3,6],"\u518d\u73fe":3,"\u518d\u8d77\u52d5":4,"\u5199\u771f":3,"\u51e6\u7406":6,"\u51fa\u3059":[],"\u51fa\u3063\u5f35\u3063":6,"\u51fa\u529b":6,"\u5206\u62c5":[3,6],"\u5206\u89e3":6,"\u5206\u89e3\u80fd":6,"\u5207\u308a":6,"\u5207\u308a\u65b9":2,"\u5207\u308b":6,"\u521d\u5fc3":4,"\u521d\u5fc3\u8005":[],"\u5224\u5b9a":6,"\u5229\u7528":[2,4],"\u5236\u5fa1":2,"\u524a\u9664":6,"\u524d\u5f8c":6,"\u524d\u63d0":6,"\u5272\u5408":3,"\u5275\u9020":3,"\u52a0\u901f":6,"\u52a0\u901f\u5ea6":2,"\u52b9\u679c":[3,6],"\u52d5\u304b":3,"\u52d5\u304b\u3059":6,"\u52d5\u4f5c":3,"\u533a\u5225":[3,6],"\u5341\u5206":3,"\u5358\u4f53":6,"\u5358\u8a9e":3,"\u5371\u967a":6,"\u539f\u56e0":4,"\u53b3\u5bc6":6,"\u53c2\u7167":[0,5,6],"\u53c2\u8003":[1,2,3,4,5],"\u53c2\u8003url":2,"\u53cd\u5bfe":6,"\u53cd\u5fdc":6,"\u53d6\u308a\u9664\u304f":6,"\u53d6\u5f97":2,"\u53d7\u4fe1":6,"\u53d7\u5149":6,"\u53d7\u5149\u5668":6,"\u53ef\u5909\u9577":6,"\u53ef\u80fd":6,"\u53f3\u4e0a":[4,6],"\u5404\u6a5f":3,"\u5404\u81ea":3,"\u540c\u3058":6,"\u540c\u69d8":6,"\u5411\u304b\u3063":6,"\u5411\u304d":6,"\u5411\u3051":[3,4,6],"\u5411\u4e0a":4,"\u542b\u307e":[],"\u542b\u3080":3,"\u5468\u308a":6,"\u5468\u671f":6,"\u5468\u671ft":6,"\u5468\u6ce2":6,"\u5468\u6ce2\u6570":6,"\u547c\u3073":4,"\u547c\u3073\u51fa\u3057":6,"\u547c\u3073\u51fa\u305b\u308b":6,"\u547d\u4ee4":6,"\u554f\u984c":6,"\u56db\u89d2":4,"\u56de\u3059":6,"\u56de\u8def":6,"\u56f0\u96e3":6,"\u56f3\u3078":5,"\u56f3\u3084":3,"\u56f3\u8868":5,"\u5727\u529b":6,"\u57f7\u7b46":3,"\u57fa\u672c":[3,6],"\u57fa\u672c\u7684":[],"\u57fa\u6e96":2,"\u57fa\u790e":3,"\u5831\u544a":3,"\u5831\u544a\u66f8":3,"\u5834\u5408":[0,3,6],"\u5834\u6240":6,"\u5857\u308a":6,"\u5897\u3084\u3059":6,"\u5897\u52a0":4,"\u5909\u3048":6,"\u5909\u5316":6,"\u5909\u63db":2,"\u5909\u6570":6,"\u5909\u66f4":6,"\u5916\u5074":6,"\u5916\u90e8":2,"\u591a\u3044":6,"\u5927\u304d\u3044":6,"\u5927\u6587\u5b57":6,"\u5931\u6557":4,"\u59cb\u3081":4,"\u5b66\u3093":[3,7],"\u5b66\u7fd2":[],"\u5b89\u4fa1":3,"\u5b8c\u6210":3,"\u5b9a\u7fa9":6,"\u5b9f\u4e16":3,"\u5b9f\u4e16\u754c":3,"\u5b9f\u65bd":3,"\u5b9f\u753b":6,"\u5b9f\u884c":6,"\u5b9f\u9a13":2,"\u5ba3\u8a00":6,"\u5bb9\u91cf":4,"\u5bfe\u51e6":6,"\u5bfe\u5fdc":6,"\u5c0f\u3055":6,"\u5c0f\u3055\u304f":6,"\u5c0f\u578b":3,"\u5c0f\u6587\u5b57":6,"\u5c11\u306a\u3044":0,"\u5c11\u306a\u304f":3,"\u5de6\u5074":6,"\u5e45\u5909":6,"\u5f0f\u65e5\u672c\u8a9e":[3,6],"\u5f15\u304d\u4f38\u3070":6,"\u5f15\u6570":6,"\u5f15\u7528":[3,6],"\u5f31\u3044":[],"\u5f37\u304f":6,"\u5f37\u8abf":0,"\u5f62\u5f0f":3,"\u5f79\u5272":6,"\u5f85\u305f":6,"\u5f8c\u7d99":4,"\u5fc5\u305a":3,"\u5fc5\u8981":[3,4,6],"\u5fc5\u9808":6,"\u5fd8\u308c\u308b":6,"\u601d\u308f":0,"\u60c5\u5831":[2,3,6],"\u610f\u5473":6,"\u610f\u56f3":3,"\u6163\u6027":6,"\u6210\u679c\u7269":3,"\u6271\u3044":2,"\u6271\u3046":[],"\u6291\u5236":6,"\u62b5\u6297":[0,6],"\u62bc\u3059":[4,6],"\u62bd\u8c61":3,"\u62c5\u5f53":3,"\u62e1\u5927":[1,5],"\u62e1\u5f35":4,"\u6307\u5b9a":6,"\u6307\u6a19":[],"\u6307\u793a":[3,4],"\u633f\u3057":4,"\u633f\u3059\u9762":6,"\u63a5\u7d9a":[2,4],"\u63cf\u753b":6,"\u63db\u3048":3,"\u642d\u8f09":3,"\u6539\u884c":6,"\u6545\u969c":6,"\u6559\u54e1":3,"\u6570\u5909":[],"\u6570\u5b57":4,"\u6574\u5f62":6,"\u6574\u6570":6,"\u6587\u4f53":3,"\u6587\u5b57":6,"\u6587\u5b57\u5217":2,"\u6587\u6cd5":[],"\u6587\u732e":3,"\u65b9\u6cd5":6,"\u65e5\u672c\u8a9e":4,"\u660e\u5ea6":6,"\u660e\u5feb":[],"\u660e\u78ba":3,"\u660e\u8a18":3,"\u6620\u308a":6,"\u6642\u523b":2,"\u6642\u9593":6,"\u666e\u901a\u62bc":6,"\u66f2\u3052":6,"\u66f4\u65b0":6,"\u66f8\u3044":6,"\u66f8\u304b":6,"\u66f8\u304d":3,"\u66f8\u304d\u8fbc\u307f":2,"\u66f8\u304d\u8fbc\u3080":[4,6],"\u66f8\u304d\u8fbc\u3093":6,"\u66f8\u304f":2,"\u66f8\u5f0f":3,"\u66ff\u3048":6,"\u6700\u521d":6,"\u6700\u5927":6,"\u6700\u5f8c":6,"\u6700\u60aa":6,"\u6700\u65b0":[],"\u6700\u8fd1":4,"\u6709\u540d":4,"\u6709\u7528":3,"\u671f\u5f85":[],"\u671f\u9593":3,"\u672c\u4f53":[2,4],"\u672c\u5b9f\u9a13":4,"\u67d4\u8edf":4,"\u683c\u7d0d":6,"\u691c\u7d22":4,"\u6982\u8981":6,"\u69cb\u6210":6,"\u69cb\u7bc9":3,"\u6a5f\u5668":3,"\u6a5f\u80fd":[3,6],"\u6b62\u3081\u308b":6,"\u6b8b\u3057":6,"\u6b8b\u3059":3,"\u6b8b\u308a":6,"\u6b8b\u308b":6,"\u6bb5\u968e":4,"\u6c7a\u3081":3,"\u6ce8\u610f":[0,2,4],"\u6d17\u3044\u51fa\u3057":3,"\u6d3b\u304b\u3057":7,"\u6d3b\u52d5":3,"\u6db2\u6676":[2,3],"\u6df1\u3081\u308b":6,"\u6e08\u307f":[],"\u6e96\u3058\u308b":3,"\u6e96\u5099":[2,3,6],"\u6ea2\u308c\u308b":6,"\u6f14\u7b97":6,"\u70b9\u6ec5":6,"\u70b9\u706f":6,"\u7121\u7dda":[3,6],"\u7167\u5ea6":6,"\u7279\u6709":4,"\u72b6\u614b":6,"\u72b6\u6cc1":6,"\u72ec\u81ea":3,"\u73ed\u3068\u3057":3,"\u73ed\u3068\u3057\u3066":3,"\u7406\u7531":3,"\u7406\u89e3":6,"\u74b0\u5883":[2,3],"\u751f\u3058\u308b":6,"\u751f\u6210":6,"\u7528\u3044":[3,6],"\u7528\u3044\u308b":6,"\u7528\u8a9e":3,"\u7528\u9014":6,"\u753b\u50cf":1,"\u753b\u9762":[3,4,6],"\u756a\u30d4\u30f3":6,"\u756a\u53f7":[5,6],"\u767a\u4fe1":[],"\u767a\u58f2":4,"\u767a\u8868":3,"\u767a\u8868\u4f1a":3,"\u767a\u97f3":4,"\u767b\u5834":3,"\u76ee\u7684":[2,6],"\u76ee\u7acb\u3061":6,"\u76f4\u5217":6,"\u76f4\u63a5":[0,6],"\u76f4\u6d41":6,"\u7701\u7565":6,"\u77ed\u3044\u8db3":6,"\u77ed\u304f":6,"\u7834\u58ca":6,"\u7834\u88c2":6,"\u78ba\u8a8d":[3,6],"\u793a\u3055":3,"\u793a\u3057":[0,1,5,6],"\u793a\u3059":[3,4],"\u79d2\u5f85":6,"\u79d2\u6570":6,"\u79d2\u9593":6,"\u79d2\u9cf4\u3089":6,"\u79fb\u884c":6,"\u7a0b\u5ea6":[3,6],"\u7a2e\u985e":6,"\u7a7a\u767d":6,"\u7ba1\u7406":[4,6],"\u7bc4\u56f2":[3,6],"\u7c21\u5358":[3,4,6],"\u7c21\u6f54":6,"\u7d20\u6570":[],"\u7d22\u5f15":[],"\u7d42\u7aef":6,"\u7d44\u307f\u5408\u308f":7,"\u7d50\u5c40":6,"\u7d50\u679c":5,"\u7d50\u8ad6":0,"\u7d5e\u308a\u8fbc\u307f":4,"\u7d5e\u308a\u8fbc\u3093":4,"\u7d71\u4e00":3,"\u7d71\u5408":[3,4],"\u7d99\u7d9a":6,"\u7e70\u308a\u8fd4\u3057":6,"\u8003\u3048":6,"\u8003\u5bdf":3,"\u8033\u969c\u308a":6,"\u8089\u773c":6,"\u80cc\u666f":6,"\u811a\u6ce8":1,"\u81ea\u5206":4,"\u81ea\u52d5":[5,6],"\u866b\u773c":6,"\u884c\u3046":[3,4],"\u884c\u3048":3,"\u884c\u3048\u308b":3,"\u884c\u3063":6,"\u884c\u76ee":6,"\u8868\u73fe":6,"\u8868\u793a":[1,2,3,5],"\u8868\u8a18":[4,6],"\u88c5\u7f6e":6,"\u8907\u6570":6,"\u898b\u3048":6,"\u89e3\u50cf":4,"\u89e3\u6790":6,"\u89e3\u6c7a":3,"\u8a00\u8a9e":[4,6],"\u8a08\u6e2c":6,"\u8a08\u7b97":6,"\u8a18\u6cd5":6,"\u8a18\u8ff0":[3,4,6],"\u8a18\u9332":3,"\u8a2d\u5b9a":[0,2,6],"\u8a55\u4fa1":2,"\u8a66\u3059":6,"\u8a66\u9a13":3,"\u8a71\u3057\u5408\u3044":3,"\u8a71\u3057\u5408\u3063":3,"\u8a73\u3057\u3044":6,"\u8a73\u7d30":4,"\u8aac\u660e":3,"\u8aad\u307f":3,"\u8aad\u307f\u51fa\u3057":6,"\u8aad\u307f\u53d6\u3063":6,"\u8aad\u307f\u53d6\u308a":3,"\u8aad\u307f\u53d6\u308b":6,"\u8abf\u6574":6,"\u8abf\u67fb":3,"\u8b1b\u7fa9":[3,5],"\u8d64\u5916":2,"\u8d64\u5916\u5149":[],"\u8d64\u5916\u7dda":6,"\u8d64\u8272":6,"\u8d64led":[],"\u8d77\u304d\u308b":6,"\u8d77\u52d5":4,"\u8ddd\u96e2":6,"\u8fbc\u3080":0,"\u8fd1\u3044":[],"\u8fd1\u3065":6,"\u8fd1\u3065\u304b":[],"\u8fd1\u5e74":3,"\u8fd4\u3057":6,"\u8fd4\u3059":6,"\u8ffd\u52a0":6,"\u8ffd\u5b9f\u9a13":[],"\u9001\u4fe1":3,"\u901a\u4fe1":[2,3],"\u901a\u5e38":6,"\u901f\u5ea6":6,"\u9023\u643a":3,"\u9023\u7d50":6,"\u9023\u7d9a":6,"\u9031\u76ee":[2,3],"\u9032\u3081":3,"\u9032\u6570":2,"\u904e\u304e":6,"\u9053\u7b4b":3,"\u9069\u5207":3,"\u9069\u5408":4,"\u9069\u7528":6,"\u9078\u629e":6,"\u90e8\u5206":[3,6],"\u914d\u5217":6,"\u914d\u7dda":6,"\u91cd\u8981":6,"\u91cd\u8996":4,"\u9577\u3044":6,"\u9577\u5e74":4,"\u9577\u62bc":6,"\u9577\u62bc\u3057":6,"\u958b\u59cb":4,"\u958b\u767a":[2,3],"\u9593\u9055\u3044":0,"\u95a2\u6570":6,"\u9632\u6b62":6,"\u96fb\u529b":2,"\u96fb\u5727":6,"\u96fb\u6e90":2,"\u975e\u516c":[3,6],"\u975e\u516c\u5f0f":[],"\u9805\u76ee":[3,6],"\u9806\u6b21":3,"\u9806\u756a":6,"\u9818\u57df":6,"\u9ad8\u6027":3,"\u9ad8\u97f3":6,"\u9cf4\u3063":6,"\u9cf4\u3089":[4,6],"\u9cf4\u3089\u3059":6,"\uff08\u300c":3,"\uff08\u8aad\u307f\u53d6\u3063":6,"\uff08\u8d64":2,"\uff08arduino":2,"\uff08arduinoide":4,"\uff08iot":3,"\uff08m":6,"\uff08project":3,"\uff08tft":2,"\uff09\u3001":6,"\uff09\u3002":[4,6],"\uff09\u300d":4,"\uff09\u30ad\u30fc":6,"\uff1a<":4,"\uff1a\u300c":[],"\uff1ahttps":6,"\uff1am":3,"\uff1f\u3011":6,"\uff1f\uff09":[3,6],"\uff1f\uff1f":5,"])":[5,6],"];":6,"]\u301c":6,"`_":[],"``":4,"byte":6,"cds\u30bb\u30eb":[0,6],"char":6,"class":5,"const":6,"continue":6,"default":5,"double":0,"else":6,"false":6,"float":6,"for":[4,5,6],"if":[5,6],"in":5,"int":[0,6],"long":5,"new":5,"null":6,"pin\u30d4\u30f3":[],"return":6,"this":5,"true":6,"void":[0,6],"while":6,"with":5,"| (":6,"|br":[],"||":6,"};":6,_build:[],_ch:6,_control:6,_esp:4,_esprite:2,_factory:[],_factorytest:[],_feb:[0,1],_file:[],_guide:3,_ipconfig:5,_japanese:3,_m:[],_menu:[],_pm:0,_point:0,_select:[],_serialport:[],_sketchexample:[],_sprite:6,_str:6,_t:0,accgyro:[],adc:2,added:5,addresses:5,admonition:5,adornment:5,after:5,also:5,an:5,analog:[0,6],analogread:[0,6],and:5,anonymous:5,any:5,arduino:[1,2,6],arduinocds:[0,6],are:5,as:5,ascii:6,at:5,attention:5,attribute:5,author:5,auto:5,automatically:5,ax:6,axp:6,ay:6,az:6,ba:6,backslash:5,be:5,beep:2,before:5,begin:[0,5,6],between:5,bibliographic:5,bits:6,blank:5,bledevice:0,bleserver:0,bleutils:0,block:5,blocks:5,blue:6,bluetooth:2,body:[],book:5,bool:6,bps:6,brackets:5,breaks:5,btna:6,btnb:6,buf:6,bullet:5,but:5,by:5,can:5,cannot:5,caption:5,caution:5,cc:[],ccs:6,cd:6,cds:[],ch1:6,ch2:6,ch:6,character:5,cheat:[],cheatsheet:5,cit:5,citation:5,classifier:5,cm:6,co:6,code:[0,4,5,6],com:4,command:6,comment:5,comments:5,compound:5,conclusion:0,constrain:6,container:5,contents:[2,5],contexts:5,continuation:5,conversion:5,converter:6,cp2:[],create:5,csv:5,ctrl:6,custom:5,cyan:6,danger:5,data:5,date:5,david:5,dccc:[],dec:6,decorations:5,def:5,define:6,definition:5,definitions:5,defs:5,delay:[0,6],description:5,dev:[],development:4,device:4,digital:6,digitalwrite:6,directive:[],directly:5,display:6,divisor:[],dl:4,docinfo:5,docs:5,doctest:5,document:5,docutils:5,driver:[0,4],each:5,eclipse:4,element:5,elements:[],emphasis:5,empty:5,end:0,energy:2,enhancement:5,enumerated:5,environment:4,epigraph:5,equivalent:5,error:5,escapes:5,esp:0,etc:5,even:5,examples:5,explicit:5,external:5,fabf:6,factorytest:4,feb:5,felica:6,fft:0,field:5,fig:5,figure:5,file:[4,5],flush:5,font:6,footer:5,footnote:5,format:5,from:[5,6],ftdi:4,full:5,g0:6,g2:[0,6],generate:5,generates:5,generic:5,getcoloruint:6,gh:[],gnd:[0,6],goodger:5,gp:6,gpio:6,green:6,greenyellow:6,grid:5,gx:6,gyrox:6,gyroy:6,gyroz:6,header:5,heading:5,height:[],here:0,hex:6,hextodec:6,high:6,highlights:5,hint:5,hoge:0,html:5,http:5,https:[0,1,3,4,5,6],hyperlink:5,hz:6,ide:[2,6],iframe:[],image:5,images:[],important:5,imu:6,include:[0,5,6],indentation:5,indented:5,indents:5,index:4,inertial:6,info:5,informal:5,inline:[],ino:6,input:5,install:5,instead:5,integrated:4,internal:5,internet:5,interpreted:[],intro:[],introductory:5,ip:[1,5],ipconfig:[1,5],ir:6,irled:6,irrecvdumpv:6,irremoteesp:6,irsend:6,is:5,isalldigit:6,isdigit:6,isprime:[],it:5,items:[5,6],itself:5,java:4,jjyclock:6,kirled:6,krecvpin:6,labelled:5,lang:[0,3,6],latex:5,lcd:2,learning:3,least:5,lecattachpin:6,led:2,ledcattachpin:6,ledcsetup:6,ledcwrite:6,legend:5,like:5,line:[0,5],lines:5,list:5,lists:5,literal:5,longer:6,loop:[0,6],low:2,lpt:4,m5:6,m5stack:3,m5stick:4,m5stickc:3,m5stickcplus:[4,6],mac:6,magenta:6,magnify:6,main:0,make:0,manager:4,manually:5,many:5,map:6,markup:[],math:5,mathematical:5,measurement:6,meta:5,metadata:5,mg:6,mhigh:6,mi:5,microsoft:4,mini:5,mlow:6,modulation:2,mpu:6,ms:6,mute:6,name:5,named:5,nay:6,naz:6,nec:6,network:2,next:5,ngy:6,ngz:6,no:5,non:5,not:[],notation:5,note:5,notice:[],ntp:2,num:6,number:5,numbered:5,numref:5,object:6,of:5,on:5,once:0,option:5,optional:5,options:5,or:[5,6],orange:6,os:4,ota:6,output:6,overlined:5,paragraphs:5,parallel:5,parsed:5,passed:5,pbl:3,pc:[4,6],pep:5,picture:5,pin:[0,6],pinmode:[0,6],pip:5,pixel:6,pjs:[],please:5,plus:[3,4],point:0,port:4,pos:6,possible:5,power:6,preceded:5,preference:2,preserve:5,pressed:6,prime:[],print:[5,6],printf:6,println:6,processes:5,profile:2,proposal:5,protocol:2,pull:5,pulse:2,purpose:6,put:0,pwm:2,pwmch:[],python:5,qiita:6,qs:6,quick:[],quote:5,quoted:5,quotes:5,random:6,randomseed:6,raspberrypi:[],raw:5,rcs:6,read:5,reading:5,red:6,reference:[],reminders:[],repeatedly:0,replace:5,replacement:5,request:5,reset:6,rest:5,restructuredtext:[],result:[],revision:5,rfc:5,role:[],rom:0,rrggbb:6,rtc:6,rubric:5,run:0,sample:0,sbuf:6,scanf:[],section:[],sections:5,sectnum:5,see:5,separate:5,separated:5,serial:[0,2],set:5,setbeep:6,setcursor:6,setrotation:6,settextfont:6,setup:[0,4,6],sheet:[],sidebar:5,simple:5,source:5,spaces:5,specific:5,sphinx:[1,5],spp:2,sprite:6,spu:6,src:[0,1,6],ss:5,standalone:5,standard:5,start:0,stdio:[],store:4,str:6,string:6,strong:5,struct:0,structure:[],studio:4,sub:5,subscript:5,subsections:5,substitution:5,sup:5,superscript:5,syntax:[],table:5,tables:5,target:5,term:5,text:[],textfont:6,tft:6,than:6,the:[],time:2,tip:5,title:5,titled:5,titles:5,tmp:6,to:[0,5,6],today:5,tone:6,topic:5,toshiba:6,tutorial:[],tv:6,two:5,type:5,typedef:0,uiflow:4,uint:6,underlined:5,unicode:5,uniform:5,unit:6,uno:4,untouched:5,update:6,url:[],usb:[4,6],use:[5,6],used:5,useful:5,variation:5,vcp:4,ver:[],verse:5,version:5,virtual:4,visible:5,visual:4,warning:5,was:6,way:5,web:4,webclient:2,webserver:2,were:5,white:6,width:2,wifi:2,windows:[],wrapped:5,writer:5,www:[0,3,4,6],yellow:6,you:5,your:0},titles:["Arduino","Conclusion","IoT\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0","\u5b9f\u9a13\u306e\u76ee\u7684","\u4e8b\u524d\u6e96\u5099","Tutorial","1\u9031\u76ee","2\u9031\u76ee"],titleterms:{"'s":[],"(infrared":6,"5stickcplus":4,"\u3059\u3059\u3081\u304b":3,"\u3059\u308b":4,"\u305d\u306e":6,"\u3068\u304d":6,"\u307e\u3068\u3081":[],"\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb":4,"\u30a4\u30f3\u30c8\u30ed\u30c0\u30af\u30b7\u30e7\u30f3":[],"\u30a4\u30f3\u30c8\u30ed\u30c0\u30af\u30b7\u30e7\u30f3intro":[],"\u30af\u30e9\u30b9":6,"\u30b3\u30fc\u30c9":6,"\u30b5\u30f3\u30d7\u30eb\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9":4,"\u30b5\u30fc\u30d0":6,"\u30b5\u30fc\u30dc\u30cf\u30c3\u30c8":6,"\u30b5\u30fc\u30dc\u30e2\u30fc\u30bf":6,"\u30b7\u30ea\u30a2\u30eb\u30dd\u30fc\u30c8":4,"\u30b9\u30d7\u30e9\u30a4\u30c8":6,"\u30bb\u30f3\u30b5":6,"\u30c7\u30a3\u30b9\u30d7\u30ec\u30a4":6,"\u30d0\u30fc\u30b8\u30e7\u30f3":4,"\u30d2\u30f3\u30c8":6,"\u30d3\u30eb\u30c9":4,"\u30d6\u30b6\u30fc":6,"\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0":2,"\u30d7\u30ed\u30b0\u30e9\u30e0":[4,6],"\u30dc\u30bf\u30f3":6,"\u30dc\u30fc\u30c9":4,"\u30dc\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3\u30fc":4,"\u30e2\u30cb\u30bf":[],"\u30e9\u30a4\u30d6\u30e9\u30ea":4,"\u30ea\u30e2\u30b3\u30f3":6,"\u30ea\u30f3\u30af":6,"\u4e8b\u524d":4,"\u4fe1\u53f7":6,"\u5165\u308c":6,"\u5185\u8535led":6,"\u5207\u308a\u65b9":6,"\u5229\u7528":6,"\u5236\u5fa1":6,"\u52a0\u901f\u5ea6":6,"\u53c2\u8003":6,"\u53c2\u8003url":3,"\u53d6\u5f97":6,"\u57fa\u6e96":3,"\u5834\u5408":4,"\u5909\u63db":6,"\u5916\u90e8":6,"\u5b66\u7fd2":[],"\u5b9f\u9a13":3,"\u60c5\u5831":4,"\u6271\u3044":6,"\u6307\u6a19":[],"\u63a5\u7d9a":6,"\u6570\u5909":[],"\u6574\u6570":[],"\u6587\u5b57\u5217":6,"\u6642\u523b":6,"\u66f8\u304d\u8fbc\u307f":[4,6],"\u66f8\u304f":6,"\u672c\u4f53":6,"\u691c\u7d22":2,"\u6ce8\u610f":6,"\u6db2\u6676":6,"\u6e96\u5099":4,"\u74b0\u5883":4,"\u76ee\u7684":3,"\u78ba\u8a8d":4,"\u7d22\u5f15":2,"\u8868\u793a":[4,6],"\u8a2d\u5b9a":4,"\u8a55\u4fa1":3,"\u8aad\u307f\u53d6\u308a":6,"\u8d64\u5916":6,"\u8ffd\u52a0":4,"\u9001\u4fe1":6,"\u901a\u4fe1":6,"\u9031\u76ee":[6,7],"\u9032\u6570":6,"\u9078\u629e":4,"\u958b\u767a":4,"\u96fb\u529b":6,"\u96fb\u6e90":6,"\uff08\u8d64":6,"\uff08arduino":4,"\uff08tft":6,_esprite:6,adc:6,analogread:[],and:[],arduino:[0,4],beep:6,bluetooth:6,body:5,cheat:5,conclusion:1,directive:5,documentation:[],elements:5,energy:6,esp:4,ide:4,indices:[],inline:5,interpreted:5,iot:2,lcd:6,led:6,linux:4,low:6,macos:4,markup:5,modulation:6,network:6,ntp:6,preference:6,profile:6,protocol:6,pulse:6,pwm:6,quick:5,reference:5,reminders:5,restructuredtext:5,role:5,section:5,serial:6,sheet:5,spp:6,structure:5,syntax:5,tables:[],testrtp:[],text:5,the:5,time:6,to:[],tutorial:5,url:4,webclient:6,webserver:6,welcome:[],width:6,wifi:6,windows:4}}) \ No newline at end of file +Search.setIndex({docnames:["arduino","conclusion","index","intro","pre","tutorial","week1","week2"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},filenames:["arduino.rst","conclusion.rst","index.rst","intro.rst","pre.rst","tutorial.rst","week1.rst","week2.rst"],objects:{},objnames:{},objtypes:{},terms:{"!\"":6,"!\\":6,"#.":[],"#\uff08":6,"#]":5,"#define":6,"#include":[0,6],"$date":5,"$revision":5,"%d":6,"%i":[],"&&":6,"')":6,"'.":6,"';":6,"'\\n":6,"'\\r":6,"']":6,"'a":6,"'c":6,"'s":[5,6],"'z":6,"(&":6,"('":6,"('#":[],"((":6,"()":[0,6],"(=":6,"([":6,"(\"":[0,6],"(\\":[],"(\u30d4\u30f3":6,"(\u79d2":6,"(analogread":6,"(b":6,"(bit":6,"(black":6,"(blue":6,"(bm":6,"(body":[],"(buf":6,"(button":6,"(c":6,"(callback":6,"(char":6,"(clientid":6,"(contentservice":6,"(e":6,"(g":6,"(general":6,"(google":6,"(gotip":6,"(green":6,"(header":[],"(hex":6,"(httpcode":6,"(hz":6,"(i":[5,6],"(infrared":2,"(int":[],"(k":6,"(kirled":6,"(lcd":6,"(link":[],"(listen\u3057":6,"(localtime":6,"(loops":6,"(mac":6,"(message":6,"(meth":6,"(ms":6,"(n":6,"(now":6,"(num":[],"(orange":6,"(p":6,"(params":6,"(payload":6,"(pin":[0,6],"(post":6,"(pubtopic":6,"(pwm":6,"(pwmch":[],"(r":6,"(req":6,"(rrggbb":6,"(rval":[],"(sbuf":6,"(server":6,"(serverclients":6,"(sheet":6,"(sjdoc":6,"(ssid":6,"(str":6,"(string":6,"(struct":6,"(tmp":6,"(topic":6,"(true":6,"(uint":6,"(v":6,"(var":6,"(void":[],"(weatherapi":6,"(white":6,"(wifi":6,"(wificlient":6,"(windows":[],"))":6,"),":6,").":6,");":[0,6],")=":6,")\"":[5,6],")\\":[],")\u300d":6,")connecting":6,")payload":6,"){":6,"*)":6,"**":[6,7],"***":6,"*/":6,"*\"":[5,6],"*]":5,"*p":6,"++":6,"+-":[0,6],"+\"":[5,6],"+\\":[],"+]":[],"+t":6,", $":[],", \"":5,", and":5,", g":6,", gyrox":6,", match":6,", meth":6,", num":6,", or":5,", r":6,",%":6,",\"":6,"-+":[0,6],"--":[0,6],"->":6,"-\"":[5,6],"-arduinoide":[],"-based":3,"-c":4,"-chan":[],"-cn":3,"-dict":5,"-display":6,"-enumerated":5,"-esp":[],"-free":5,"-io":[0,6],"-left":5,"-level":5,"-literal":5,"-m":6,"-notes":5,"-numbered":5,"-numfig":5,"-o":5,"-pages":[],"-quote":5,"-r":6,"-rest":5,"-role":5,"-science":[3,4],"-shenzhen":3,"-ship":[0,3,6],"-specific":5,"-start":[],"-symbol":5,"-table":5,"-terminated":6,"-type":6,"-users":[1,5],"-xxxxx":[],"-xxxxxxxxxx":4,"-z":6,".)":5,".,":6,"..":5,"...":6,".\"":[5,6],".\\":[],".\n#":[],".\uff09":6,".addap":6,".aliyuncs":3,".appendrow":6,".arduino":4,".available":6,".be":6,".beep":6,".begin":6,".c":[6,7],".cc":4,".charat":6,".color":6,".com":[0,3,4,6],".concat":6,".connect":6,".connected":6,".cpp":7,".createsprite":6,".createtextoutput":6,".date":6,".end":6,".espressif":4,".fillrect":6,".fillscreen":6,".fillsprite":6,".ftdichip":4,".get":6,".getacceldata":6,".getactivespreadsheet":6,".getbtnpress":6,".getcapture":6,".getdata":6,".getgyrodata":6,".getlastrow":6,".getrange":6,".getsheetbyname":6,".getstring":6,".gettime":6,".githubusercontent":[],".globalmatch":6,".google":6,".gres":6,".gs":6,".h":[0,6,7],".hasclient":6,".hours":6,".htm":4,".html":[0,5,6],".info":[5,6],".init":6,".ino":[0,1,6,7],".istlab":[5,6],".jp":[0,1,5,6],".js":6,".json":4,".length":6,".localip":6,".log":[],".loop":6,".mimetype":6,".minutes":6,".mongonta":[],".month":6,".mute":6,".net":[5,6],".nict":6,".org":5,".oss":3,".pdf":3,".png":5,".print":6,".printf":[0,6],".println":6,".publish":6,".push":6,".pushsprite":6,".read":6,".readbytes":6,".restart":6,".run":6,".seconds":6,".sendnec":6,".setbeep":6,".setcallback":6,".setcolordepth":6,".setcursor":6,".setdata":6,".setmimetype":6,".setnodelay":6,".setrotation":6,".setserver":6,".settextcolor":6,".settextfont":6,".settextsize":6,".settime":6,".sf":5,".sourceforge":5,".startswith":6,".state":6,".status":6,".stop":6,".storange":[0,6],".stringify":6,".subscribe":6,".substring":6,".switch":[3,4],".text":6,".tm":6,".toint":6,".tolowercase":6,".tone":6,".trim":6,".tsukumijima":6,".txt":5,".update":6,".usbserial":4,".wasreleased":6,".wasreleasefor":6,".weekday":6,".write":6,".year":6,".zip":[],"/ #":6,"/ (":6,"/ \"":6,"/ \u4f8b":6,"/ \u6ce8":6,"/#":6,"/%":6,"/%s":6,"/*":[],"/+":6,"//":[0,6],"/\"":6,"/accgyro":6,"/adc":[0,6],"/analogread":0,"/api":6,"/arduino":[],"/blog":[0,6],"/button":6,"/catalog":[3,4],"/cdm":[],"/cds":6,"/city":6,"/class":[],"/client":6,"/cplus":[4,6],"/crc":0,"/cu":4,"/dev":4,"/directives":5,"/disconnected":6,"/dl":4,"/docs":[3,5],"/doget":6,"/download":[],"/drivers":4,"/ea":6,"/en":4,"/espressif":[],"/exec":6,"/factorytest":0,"/forecast":6,"/g":[],"/gi":[],"/howto":[],"/httpclient":6,"/httpserver":6,"/humid":6,"/i":0,"/images":5,"/ir":[],"/irsend":6,"/isprime":[],"/items":6,"/kitazaki":6,"/lcd":6,"/led":6,"/linux":[],"/lo":6,"/m":[0,3,6],"/macos":[],"/macros":6,"/main":4,"/mqtt":6,"/nnn":6,"/ntp":6,"/numbering":5,"/o":6,"/or":6,"/package":4,"/pages":[],"/peripherals":[0,6],"/pjs":[],"/plain":6,"/pwm":6,"/ref":5,"/reference":[0,3,6],"/regexp":6,"/resource":3,"/reverse":5,"/rmt":0,"/roles":5,"/rst":5,"/rtc":6,"/run":[],"/s":6,"/sensor":6,"/serial":6,"/servohat":6,"/sketch":[0,1],"/software":4,"/sound":6,"/sprite":6,"/str":6,"/telnet":6,"/temp":6,"/unofficial":[0,3,6],"/vcp":4,"/wifi":6,"/work":[0,6],"/xxxxxxxxxx":6,"0x":6,"0xxxxxxxxx":[],"10":6,"11":6,"14":6,"1\u3064":[6,7],"1\u30d0\u30a4\u30c8":6,"1\u56de":6,"1\u79d2":6,"1\u884c":6,"1ce":6,"1jzbaet":6,"1s":6,"1uxc":6,"21":6,"2\u3064":6,"2d":0,"2dict":6,"2f":6,"2fd":6,"2s":0,"3\u3064":6,"3d":0,"3v":[0,6],"5\u7cfb":6,"5bit":6,"5e":6,"5stack":[3,4,6],"5stick":[],"5stickc":[0,3,4,6],"5stickcplus":[0,3,6],"5v":6,"6b":6,"6bc":[],"6bit":6,"8bit":6,"8pixel":6,"8y":6,":%":6,":/":[0,1,3,4,5,6],"::":5,":>":3,":\"":5,":file":[],":numref":[],":text":6,"; p":6,";\"":[],";\\":[],"< *":6,"< c":6,"":[],"=\"":5,"=\\":[],"={":6,"><":[],">>":5,">\"":[],">`":[],"?val":6,"@python":5,"['":6,"[0":6,"[6":6,"[\"":6,"[a":6,"[b":6,"[c":6,"[cit":5,"[i":6,"[k":6,"[len":6,"[max":6,"[n":6,"[pos":6,"\"#":[],"\"$":[],"\"%":6,"\"([":6,"\")":6,"\"+":6,"\",":[0,5,6],"\"..":5,"\"/":[],"\":":5,"\";":6,"\"<":[],"\"":6,"\"\"":[],"\"]":6,"\"b":[],"\"g":[],"\"r":[],"\"}":[],"\\\"":[],"\\\"+":[],"\\n":[0,6],"\u2026\u300d":[4,6],"\u2192\u300c":4,"\u2192\u300d":4,"\u2192\u5024":6,"\u2192apps":6,"\u2192basichttpsclient":6,"\u2192httpclient":6,"\u3001*":6,"\u3001/":[],"\u3001:":[],"\u3001\u2714":4,"\u3001\u300c":[4,6,7],"\u3001`":[],"\u3001esp":3,"\u3001iot":[],"\u3001pc":6,"\u3002-":6,"\u3002:":[4,6],"\u3002\"":6,"\u3002\u300c":4,"\u3002\u3061":[4,6],"\u3002\u3064\u307e\u308a":6,"\u3002\u307b\u3052\u307b\u3052\u307b\u3052":5,"\u3002\u307e\u305f":[4,6],"\u3002\uff08":[6,7],"\u3002\uff09":6,"\u3002arduino":4,"\u3002c":[],"\u3002color":[],"\u3002configtime":6,"\u3002g":6,"\u3002gpio":6,"\u3002httpclient":6,"\u3002ide":4,"\u3002json":6,"\u3002mac":4,"\u3002map":[],"\u3002match":6,"\u3002p":6,"\u3002pc":6,"\u3002pin":6,"\u3002post\u30e1\u30bd\u30c3\u30c9":6,"\u3002retain":6,"\u3002serial":6,"\u3002settextsize":6,"\u3002val":6,"\u3002windows":4,"\u300c=":6,"\u300c\u25bc":7,"\u300c\u30d6\u30ed\u30fc\u30ab":6,"\u300cbmp":6,"\u300chigh":6,"\u300cm":[],"\u300d*":[],"\u300d\u2192":[4,6],"\u300d\uff09":3,"\u301cz":6,"\u3042\u3044":6,"\u3042\u3063":[],"\u3042\u3068":[4,6],"\u3042\u307e\u308a":6,"\u3042\u308a":[1,4,6,7],"\u3042\u308b":[6,7],"\u3042\u308c":6,"\u3042\u308f\u305b":6,"\u3044\u3061\u3070\u3093":1,"\u3044\u308a":5,"\u3044\u308b":[1,3,4,6,7],"\u3044\u308c":[4,6],"\u3046\u3061":6,"\u3046\u307e\u304f":3,"\u3046\u307e\u304f\u3044\u304b":3,"\u3048\u3089\u3076":4,"\u304a\u3044":6,"\u304a\u304b\u3057\u304f":6,"\u304a\u304d":6,"\u304a\u304d\u307e\u3057\u3087":6,"\u304a\u304d\u308b":6,"\u304a\u304f":6,"\u304a\u3051\u308b":3,"\u304a\u3057":6,"\u304a\u3059":4,"\u304a\u307e\u3051":6,"\u304a\u3082":4,"\u304a\u3082\u3063":6,"\u304a\u3088\u3073":3,"\u304a\u308a":3,"\u304b\u3048":[],"\u304b\u304b\u308a":6,"\u304b\u304b\u308b":6,"\u304b\u3051\u308b":3,"\u304b\u3064":[],"\u304b\u3069\u3046":[3,6],"\u304b\u306a\u308a":[],"\u304b\u3082":6,"\u304b\u3084":[],"\u304b\u3089":[0,3,4,5,6,7],"\u304b\u308f\u308a":3,"\u304c\u3042\u308a":4,"\u304c\u304f\u308b":[],"\u304c\u3064\u304b\u3048":6,"\u304c\u3064\u304f":5,"\u304c\u3069":3,"\u304c\u308b":[],"\u304c\u308f\u304b\u308a":[],"\u304f\u3060":[4,6,7],"\u304f\u308a\u304b\u3048":6,"\u304f\u308c\u308b":6,"\u3053\u3053":[1,4,5,6],"\u3053\u3053\u304c":6,"\u3053\u3053\u3067":6,"\u3053\u3053\u306b":6,"\u3053\u3053\u306e":1,"\u3053\u3053\u306f":6,"\u3053\u3061\u3089":[4,6],"\u3053\u3068":[3,4,6,7],"\u3053\u306e":[0,3,6],"\u3053\u308c":6,"\u3053\u308c\u3089":0,"\u3054\u3068":[6,7],"\u3055\u3044":[4,6,7],"\u3055\u3044\u3054":6,"\u3055\u3089\u306b":5,"\u3057\u304b":5,"\u3057\u3057":6,"\u3057\u3066":6,"\u3057\u307e\u3057\u3087":6,"\u3057\u307e\u3059":6,"\u3057\u307e\u305b":6,"\u3057\u3084\u3059\u3044":7,"\u3057\u3088":6,"\u3059\u304e":[],"\u3059\u3050":6,"\u3059\u3053\u3057":6,"\u3059\u3053\u3057\u308f\u304b\u308a":4,"\u3059\u3059\u3081":[3,6],"\u3059\u3059\u3081\u304b":2,"\u3059\u3059\u3081\u308b":3,"\u3059\u3079":6,"\u3059\u3079\u3066":6,"\u3059\u308b":[1,2,3,5],"\u3059\u308c":6,"\u305a\u3064":6,"\u305b\u308b":[3,6],"\u305c\u3072\u3084\u3063":6,"\u305d\u3046\u3044\u3046":[],"\u305d\u3053\u306b\u5bfe\u3057":6,"\u305d\u306e":[2,3,7],"\u305d\u308c":6,"\u305d\u308c\u305e\u308c":6,"\u305f\u3044":[0,6,7],"\u305f\u3044\u304b":3,"\u305f\u3046\u3048":6,"\u305f\u304b":[3,6],"\u305f\u3060\u3057":[4,6],"\u305f\u3068\u3048":6,"\u305f\u3073":6,"\u305f\u3081":[3,4,6],"\u305f\u3089":[4,6],"\u305f\u308a":[3,4,6],"\u305f\u308a\u3057":6,"\u3060\u3046\u3048":3,"\u3060\u3051":6,"\u3060\u3055\u3044":[4,6],"\u3060\u3068":5,"\u3060\u308a":6,"\u3061\u306a\u307f":6,"\u3061\u3089\u3064\u304d":6,"\u3064\u3044":5,"\u3064\u304b\u3044":6,"\u3064\u304b\u3046":6,"\u3064\u304b\u3063":6,"\u3064\u304f\u3088\u3046":5,"\u3064\u306a\u3044":6,"\u3064\u3076":6,"\u3064\u3076\u3059":6,"\u3066\u304f":6,"\u3066\u307f":6,"\u3066\u307f\u307e\u3057\u3087":7,"\u3067\u304d":[3,4,5,6,7],"\u3067\u304d\u308b":[3,4,6],"\u3067\u3057\u3087":6,"\u3067\u3059":[0,1,4,5,6,7],"\u3067\u307f\u308b":6,"\u3067\u3082":6,"\u3068\u3044\u3046":[4,6,7],"\u3068\u3044\u3063":6,"\u3068\u3048":[0,7],"\u3068\u304b\u3044":6,"\u3068\u304d":[2,4,5,7],"\u3068\u304f":3,"\u3068\u3057":6,"\u3068\u3057\u3066":[3,5,6],"\u3068\u3059\u308b":6,"\u3068\u308b":3,"\u3069\u3046":[3,6],"\u3069\u3061\u3089":6,"\u306a\u3044":[4,5,6],"\u306a\u304a":6,"\u306a\u304b":6,"\u306a\u304b\u3063":3,"\u306a\u304c\u3089":[3,6],"\u306a\u304f":[4,6],"\u306a\u3051\u308c":6,"\u306a\u3057":[4,6],"\u306a\u3063":3,"\u306a\u3069":6,"\u306a\u306b":6,"\u306a\u306e":6,"\u306a\u307f":[4,6],"\u306a\u3081\u3089\u304b":6,"\u306a\u3089":6,"\u306a\u308a":[0,4,5,6,7],"\u306a\u308b":[3,6],"\u306a\u3093":6,"\u306b\u304b\u3044":6,"\u306b\u3057":[],"\u306b\u3059\u3059\u307f":4,"\u306b\u3059\u308c":5,"\u306b\u305b":6,"\u306b\u3064\u3044\u3066":[1,3,6,7],"\u306b\u3082":6,"\u306b\u3088\u3063":[],"\u306b\u3088\u3063\u3066":6,"\u306b\u3088\u308a":6,"\u306b\u3088\u308b":[1,3,5],"\u306b\u5bfe\u3057":6,"\u306b\u5bfe\u3059\u308b":[3,6],"\u306b\u5bfe\u5fdc":[],"\u306e\u305e\u3044":7,"\u306e\u305e\u307e\u3057\u3044":6,"\u306e\u3061":6,"\u306e\u3061\u3089\u3064\u304d":6,"\u306e\u3067":[4,6],"\u306e\u307b\u3046":6,"\u306e\u307f":[4,6,7],"\u306e\u3088\u3046":[0,4,5,6],"\u306f\u3058\u307e\u308b":6,"\u3072\u3068\u3064":6,"\u3072\u3089\u3044":6,"\u3072\u3089\u304d":[4,6,7],"\u3072\u3089\u304f":[4,6,7],"\u3079\u304d":3,"\u307b\u3046":[0,6],"\u307b\u304b":6,"\u307b\u3052\u307b\u3052":[],"\u307b\u3069":6,"\u307b\u307c":6,"\u307e\u3057":[1,6],"\u307e\u3057\u3087":[],"\u307e\u3059":[0,1,4,5,6,7],"\u307e\u305a":6,"\u307e\u305b":6,"\u307e\u305f":6,"\u307e\u3060":6,"\u307e\u3063":1,"\u307e\u3067":[4,6],"\u307e\u3068":1,"\u307e\u3068\u3081":[],"\u307e\u3068\u3081\u3066":6,"\u307e\u3068\u3081\u308b":[3,7],"\u307e\u308b":[],"\u307f\u3066":4,"\u307f\u306a\u3057":[],"\u307f\u307e\u3057\u3087":6,"\u307f\u308b":6,"\u3082\u3061":[],"\u3082\u3061\u3044\u308b":[],"\u3082\u3068":3,"\u3082\u306e":6,"\u3084\u3059":3,"\u3084\u3059\u304f":[3,4,6,7],"\u3084\u3063":6,"\u3084setbeep":6,"\u3088\u3044":6,"\u3088\u3046":[0,3,4,6],"\u3088\u304f":1,"\u3088\u308a":[4,6],"\u3089\u308c":3,"\u3089\u308c\u308b":3,"\u308c\u307e\u305b":6,"\u308c\u308b":[4,6],"\u308f\u304b\u308a":3,"\u3092\u3044\u308c":6,"\u3092\u304a\u3057":[4,6],"\u3092\u3059\u308c":5,"\u3092\u3064\u304b\u3044":5,"\u30a2\u30a4\u30b3\u30f3":[4,7],"\u30a2\u30a4\u30b3\u30f3\u30dc\u30bf\u30f3":[4,6],"\u30a2\u30af\u30bb\u30b9\u30dd\u30a4\u30f3\u30c8":6,"\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9":[],"\u30a2\u30c9\u30d0\u30fc\u30bf\u30a4\u30ba":6,"\u30a2\u30c9\u30d0\u30fc\u30bf\u30a4\u30ba\u30e1\u30f3\u30c8":[],"\u30a2\u30c9\u30ec\u30b9":[1,5,6],"\u30a2\u30ca\u30ed\u30b0\u30bb\u30f3\u30b5":2,"\u30a2\u30d7\u30ea":6,"\u30a4\u30af\u30ea\u30d7\u30b9":4,"\u30a4\u30f3\u30af\u30eb\u30fc\u30c9":[4,6],"\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb":[2,6],"\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8":3,"\u30a4\u30f3\u30c7\u30f3\u30c8":6,"\u30a4\u30f3\u30c8\u30ed\u30c0\u30af\u30b7\u30e7\u30f3":[],"\u30a4\u30f3\u30c8\u30ed\u30c0\u30af\u30b7\u30e7\u30f3intro":[],"\u30a6\u30a7\u30d6\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3":6,"\u30a8\u30c7\u30a3\u30bf":6,"\u30aa\u30af\u30bf\u30fc\u30d6":6,"\u30aa\u30d5\u30b9\u30af\u30ea\u30fc\u30f3":6,"\u30aa\u30d6\u30b8\u30a7\u30af\u30c8":6,"\u30aa\u30ea\u30b8\u30ca\u30eb":6,"\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9":6,"\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u30de\u30a4\u30b3\u30f3":[],"\u30ab\u30a6\u30f3\u30bf":6,"\u30ab\u30e1\u30e9":6,"\u30ab\u30e9\u30fc":3,"\u30ac\u30a4\u30c9":[3,6],"\u30ad\u30e3\u30d7\u30b7\u30e7\u30f3":5,"\u30ad\u30fc":6,"\u30ae\u30b6\u30ae\u30b6":6,"\u30af\u30e9\u30a4\u30a2\u30f3\u30c8":6,"\u30af\u30e9\u30b9":2,"\u30af\u30ea\u30c3\u30af":[1,5],"\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9":6,"\u30b0\u30e9\u30d5":6,"\u30b0\u30e9\u30f3\u30c9":6,"\u30b0\u30eb\u30fc\u30d7":3,"\u30b0\u30ed\u30fc\u30d0\u30eb":6,"\u30b1\u30fc\u30d6\u30eb":6,"\u30b3\u30d4\u30fc":[4,6,7],"\u30b3\u30de\u30f3\u30c9":[],"\u30b3\u30de\u30f3\u30c9\u30d7\u30ed\u30f3\u30d7\u30c8":6,"\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3":6,"\u30b3\u30e1\u30f3\u30c8":6,"\u30b3\u30f3\u30d1\u30a4\u30eb":4,"\u30b3\u30f3\u30d1\u30a4\u30eb\u30c6\u30b9\u30c8":5,"\u30b3\u30fc\u30c9":2,"\u30b3\u30fc\u30c9\u30a8\u30c7\u30a3\u30bf":[4,6],"\u30b3\u30fc\u30eb\u30d0\u30c3\u30af":6,"\u30b5\u30a4\u30ba":6,"\u30b5\u30a4\u30c8":[1,5,6],"\u30b5\u30d6\u30b9\u30af\u30e9\u30a4\u30d6":6,"\u30b5\u30d6\u30b9\u30af\u30e9\u30a4\u30d6\u30e2\u30c7\u30eb":6,"\u30b5\u30de\u30fc\u30bf\u30a4\u30e0":6,"\u30b5\u30f3\u30d7\u30eb":6,"\u30b5\u30f3\u30d7\u30eb\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9":[],"\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0":[4,6],"\u30b5\u30fc\u30d0":[2,3],"\u30b5\u30fc\u30d3\u30b9":6,"\u30b5\u30fc\u30dc":6,"\u30b5\u30fc\u30dc\u30cf\u30c3\u30c8":2,"\u30b5\u30fc\u30dc\u30e2\u30fc\u30bf":[2,3],"\u30b5\u30fc\u30dc\u30e2\u30fc\u30bf\u30fc":[],"\u30b7\u30a7\u30eb":6,"\u30b7\u30b9\u30c6\u30e0":[3,5,6],"\u30b7\u30b9\u30c6\u30e0\u30ea\u30bb\u30c3\u30c8":6,"\u30b7\u30d5\u30c8":6,"\u30b7\u30ea\u30a2\u30eb":[],"\u30b7\u30ea\u30a2\u30eb\u30b3\u30f3\u30bd\u30fc\u30eb":6,"\u30b7\u30ea\u30a2\u30eb\u30d7\u30ed\u30c3\u30bf":6,"\u30b7\u30ea\u30a2\u30eb\u30e2\u30cb\u30bf":[6,7],"\u30b7\u30ea\u30fc\u30ba":3,"\u30b7\u30f3\u30b0\u30eb\u30af\u30a9\u30fc\u30c8":6,"\u30b7\u30f3\u30d7\u30eb":6,"\u30b7\u30fc\u30c8":6,"\u30b8\u30a7\u30a4\u30bd\u30f3":6,"\u30b8\u30e3\u30a4\u30ed\u30bb\u30f3\u30b5":6,"\u30b8\u30e3\u30a4\u30ed\u30c7\u30fc\u30bf":6,"\u30b8\u30e3\u30f3\u30d1\u30ef\u30a4\u30e4":6,"\u30b9\u30a4\u30c3\u30c1\u30b5\u30a4\u30a8\u30f3\u30b9":3,"\u30b9\u30ad\u30c3\u30d7":6,"\u30b9\u30af\u30ea\u30d7\u30c8\u30a8\u30c7\u30a3\u30bf":6,"\u30b9\u30af\u30ed\u30fc\u30eb":6,"\u30b9\u30b1\u30c3\u30c1":[4,6],"\u30b9\u30b1\u30c3\u30c1\u30d6\u30c3\u30af":[6,7],"\u30b9\u30bf\u30fc\u30c8":6,"\u30b9\u30bf\u30fc\u30c8\u30e1\u30cb\u30e5\u30fc":4,"\u30b9\u30c6\u30c3\u30d7":4,"\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9":6,"\u30b9\u30d7\u30e9\u30a4\u30c8":2,"\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8":6,"\u30b9\u30da\u30fc\u30b9":6,"\u30bb\u30f3\u30b5":[2,3],"\u30bb\u30f3\u30b5\u30c7\u30fc\u30bf":6,"\u30bb\u30f3\u30b5\u30fc":[],"\u30bd\u30b1\u30c3\u30c8":[],"\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9":[0,1,4,6],"\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u30d5\u30a1\u30a4\u30eb":[6,7],"\u30bf\u30a4\u30d7":6,"\u30bf\u30a4\u30df\u30f3\u30b0":6,"\u30bf\u30d6":7,"\u30bf\u30fc\u30df\u30ca\u30eb":6,"\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9":4,"\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u30b5\u30a4\u30c8":4,"\u30c0\u30d6\u30eb\u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0":6,"\u30c1\u30a7\u30c3\u30af":4,"\u30c1\u30e3\u30f3\u30cd\u30eb":6,"\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb":5,"\u30c1\u30fc\u30e0":3,"\u30c4\u30fc\u30eb":[4,6],"\u30c6\u30ad\u30b9\u30c8":4,"\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2":[4,6],"\u30c6\u30b9\u30c8":[5,6],"\u30c7\u30a3\u30b9\u30d7\u30ec\u30a4":[2,3],"\u30c7\u30a3\u30b9\u30d7\u30ec\u30a4\u30b5\u30a4\u30ba":4,"\u30c7\u30d0\u30a4\u30b9":[4,6],"\u30c7\u30d0\u30a4\u30b9\u30de\u30cd\u30fc\u30b8\u30e3":4,"\u30c7\u30d0\u30a4\u30b9p":[],"\u30c7\u30d0\u30a4\u30b9s":[],"\u30c7\u30e5\u30fc\u30c6\u30a3\u30fc":6,"\u30c7\u30fc\u30bf":[2,3],"\u30c8\u30d4\u30c3\u30af":[],"\u30c9\u30e9\u30a4\u30d0":4,"\u30cd\u30c3\u30c8\u30ef\u30fc\u30af":6,"\u30ce\u30f3\u30d6\u30ed\u30c3\u30ad\u30f3\u30b0":6,"\u30cf\u30c3\u30b7\u30e5":6,"\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2":6,"\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9":6,"\u30d0\u30c3\u30c6\u30ea":4,"\u30d0\u30fc\u30b8\u30e7\u30f3":[2,6],"\u30d1\u30b9\u30ef\u30fc\u30c9":6,"\u30d1\u30bd\u30b3\u30f3":6,"\u30d1\u30cd\u30eb":3,"\u30d1\u30d6\u30ea\u30c3\u30b7\u30e5":6,"\u30d1\u30eb\u30b9":6,"\u30d1\u30fc\u30b8\u30f3\u30b0":6,"\u30d1\u30fc\u30b9":6,"\u30d2\u30f3\u30c8":2,"\u30d3\u30c3\u30c8":6,"\u30d3\u30c3\u30c8\u30ab\u30e9\u30fc":6,"\u30d3\u30fc\u30d7":6,"\u30d4\u30af\u30bb\u30eb":6,"\u30d4\u30af\u30bb\u30eb\u30d5\u30a9\u30f3\u30c8":6,"\u30d4\u30f3":6,"\u30d5\u30a1\u30a4\u30eb":[0,4,5,6,7],"\u30d5\u30a1\u30a4\u30eb\u30e1\u30cb\u30e5\u30fc":6,"\u30d5\u30a3\u30fc\u30eb\u30c9":4,"\u30d5\u30a9\u30eb\u30c0":[6,7],"\u30d5\u30a9\u30f3\u30c8":6,"\u30d5\u30a9\u30fc\u30de\u30c3\u30c8":6,"\u30d6\u30b6\u30fc":[2,4],"\u30d6\u30e9\u30a6\u30b6":6,"\u30d6\u30ec\u30c3\u30c9\u30dc\u30fc\u30c9":6,"\u30d6\u30ed\u30c3\u30af\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0":4,"\u30d6\u30ed\u30fc\u30ab":6,"\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0":3,"\u30d7\u30ed\u30b0\u30e9\u30e0":2,"\u30d7\u30ed\u30b8\u30a7\u30af\u30c8":[6,7],"\u30d7\u30ed\u30c8\u30b3\u30eb":6,"\u30d7\u30ed\u30f3\u30d7\u30c8":6,"\u30d8\u30c3\u30c0":6,"\u30d9\u30fc\u30b9":4,"\u30da\u30fc\u30b8":[2,3,6],"\u30dc\u30bf\u30f3":[2,3,4,7],"\u30dc\u30bf\u30f3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8":6,"\u30dc\u30fc\u30c9":[],"\u30dc\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3":4,"\u30dc\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3\u30fc":[],"\u30dd\u30a4\u30f3\u30bf":6,"\u30dd\u30fc\u30bf\u30eb":6,"\u30dd\u30fc\u30c8":[4,6],"\u30de\u30a4\u30af\u30ed\u30d7\u30ed\u30bb\u30c3\u30b5":3,"\u30de\u30a4\u30b3\u30f3\u30dc\u30fc\u30c9":4,"\u30de\u30a4\u30b3\u30f3\u30e2\u30b8\u30e5\u30fc\u30eb":3,"\u30de\u30c3\u30c1":6,"\u30de\u30c3\u30c1\u30e3\u30fc":6,"\u30de\u30c3\u30c1\u30f3\u30b0":6,"\u30de\u30fc\u30b8":7,"\u30df\u30ea":6,"\u30e1\u30a4\u30f3":[6,7],"\u30e1\u30bd\u30c3\u30c9":6,"\u30e1\u30c3\u30bb\u30fc\u30b8":6,"\u30e1\u30cb\u30e5\u30fc":[6,7],"\u30e2\u30b8\u30e5\u30fc\u30eb":6,"\u30e2\u30cb\u30bf":[],"\u30e2\u30fc\u30bf":6,"\u30e2\u30fc\u30c9":[0,6],"\u30e9\u30a4\u30d6\u30e9\u30ea":6,"\u30e9\u30a4\u30d6\u30e9\u30ea\u30de\u30cd\u30fc\u30b8\u30e3":[4,6],"\u30e9\u30f3\u30d7":6,"\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30af\u30ed\u30c3\u30af":6,"\u30ea\u30af\u30a8\u30b9\u30c8":6,"\u30ea\u30af\u30a8\u30b9\u30c8\u30dc\u30c7\u30a3":6,"\u30ea\u30b9\u30c8":6,"\u30ea\u30bb\u30c3\u30c8":6,"\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9":[3,6],"\u30ea\u30e2\u30b3\u30f3":2,"\u30ea\u30f3\u30af":[0,1,4],"\u30eb\u30fc\u30d7":6,"\u30ec\u30b9\u30dd\u30f3\u30b9":6,"\u30ec\u30d9\u30eb":3,"\u30ec\u30dd\u30fc\u30c8":3,"\u30fb\u65b9\u5411\u6027":3,"\u4e00\u65e6":6,"\u4e00\u756a\u4e0b":6,"\u4e00\u756a\u5de6":4,"\u4e00\u81f4":[6,7],"\u4e00\u822c":6,"\u4e00\u822c\u7684":3,"\u4e00\u89a7":6,"\u4e00\u8cab":3,"\u4e00\u8cab\u6027":[],"\u4e00\u90e8":6,"\u4e0a\u8a18":[3,6],"\u4e0a\u90e8":6,"\u4e0b\u8a18":[],"\u4e0d\u8981":6,"\u4e0e\u3048":3,"\u4e21\u65b9":5,"\u4e88\u5099":3,"\u4e88\u5831":6,"\u4e88\u7fd2":3,"\u4e8b\u524d":2,"\u4e8b\u8c61":6,"\u4e92\u63db":4,"\u4eba\u611f":[],"\u4eba\u6c17":[],"\u4ecb\u3057":6,"\u4ed5\u69d8":6,"\u4ed5\u7d44":3,"\u4ed8\u4e0e":6,"\u4ee5\u4e0b":[3,4,6],"\u4ee5\u5916":[6,7],"\u4ee5\u964d":[4,6],"\u4eee\u5b9a":6,"\u4eee\u60f3":6,"\u4f38\u3070":6,"\u4f38\u9577":[],"\u4f4d\u7f6e":6,"\u4f55\u500d":6,"\u4f59\u767d":6,"\u4f5c\u54c1":3,"\u4f5c\u6210":[6,7],"\u4f5c\u696d":[3,4,7],"\u4f7f\u3044":6,"\u4f7f\u3046":6,"\u4f7f\u3048":6,"\u4f7f\u3048\u308b":6,"\u4f7f\u3063":[4,6],"\u4f7f\u308f":[4,6],"\u4f7f\u7528":[3,4,6],"\u4f8b\u3048":6,"\u4f8b\u5916":6,"\u4fbf\u5229":6,"\u4fdd\u5b58":6,"\u4fdd\u6301":6,"\u4fe1\u53f7":[],"\u4fee\u6b63":6,"\u500b\u5225":6,"\u500d\u6570":6,"\u500d\u7387":6,"\u5024\u3084":6,"\u5024\u4ee5":[],"\u505c\u3081":6,"\u505c\u6b62":6,"\u5099\u3048":[3,6],"\u50cd\u304d":3,"\u5148\u982d":6,"\u5165\u308a":6,"\u5165\u308c":[2,7],"\u5165\u308c\u308b":6,"\u5165\u529b":[3,4,6,7],"\u5168\u3066":6,"\u5168\u54e1":6,"\u516c\u5f0f":6,"\u516c\u958b":6,"\u5171\u6709":[3,6],"\u5185\u5074":6,"\u5185\u51e6":6,"\u5185\u5305":[6,7],"\u5185\u5bb9":[3,6,7],"\u5185\u8535":6,"\u5185\u8535ir":[],"\u5185\u8535irled":[],"\u5185\u8535led":2,"\u5185\u90e8":0,"\u5186\u6ed1":[3,6],"\u518d\u73fe":3,"\u518d\u8d77\u52d5":[4,6],"\u5199\u771f":3,"\u51e6\u7406":6,"\u51fa\u3059":[],"\u51fa\u3063\u5f35\u3063":6,"\u51fa\u529b":6,"\u5206\u5272":7,"\u5206\u62c5":[3,6],"\u5206\u89e3":6,"\u5206\u89e3\u80fd":6,"\u5207\u308a":6,"\u5207\u308a\u65b9":2,"\u5207\u308b":6,"\u5207\u65ad":6,"\u521d\u5fc3":[4,6],"\u521d\u5fc3\u8005":[],"\u521d\u671f":6,"\u5224\u5b9a":6,"\u5225\u7269":6,"\u5225\u95a2\u6570":6,"\u5229\u7528":[2,4,7],"\u5236\u5fa1":2,"\u524a\u9664":6,"\u524d\u5f8c":6,"\u524d\u63d0":6,"\u524d\u8005":[],"\u5272\u5408":3,"\u5275\u9020":3,"\u52a0\u901f":6,"\u52a0\u901f\u5ea6":2,"\u52b9\u679c":[3,6],"\u52d5\u304b":3,"\u52d5\u304b\u3059":6,"\u52d5\u4f5c":[3,6],"\u52d5\u753b":6,"\u533a\u5207\u308a":6,"\u533a\u5225":[3,6],"\u5341\u5206":3,"\u5343\u8449":6,"\u534a\u89d2":6,"\u5358\u4f53":6,"\u5358\u7d14":7,"\u5358\u8a9e":3,"\u5371\u967a":6,"\u539f\u56e0":4,"\u53b3\u5bc6":6,"\u53c2\u7167":[0,5,6],"\u53c2\u8003":[1,3,4,5,6,7],"\u53c2\u8003url":2,"\u53cd\u5bfe":6,"\u53cd\u5fdc":6,"\u53d6\u308a\u9664\u304f":6,"\u53d6\u5f97":2,"\u53d7\u4fe1":6,"\u53d7\u5149":6,"\u53d7\u5149\u5668":6,"\u53ef\u5909\u9577":6,"\u53ef\u80fd":6,"\u53f3\u4e0a":[4,6,7],"\u5404\u6a5f":3,"\u5404\u81ea":3,"\u540c\u3058":[6,7],"\u540c\u69d8":6,"\u5411\u304b\u3063":6,"\u5411\u304d":6,"\u5411\u3051":[3,4,6],"\u5411\u4e0a":4,"\u542b\u307e":6,"\u542b\u3080":[3,6],"\u5468\u308a":6,"\u5468\u671f":6,"\u5468\u671ft":6,"\u5468\u6ce2":6,"\u5468\u6ce2\u6570":6,"\u547c\u3070":6,"\u547c\u3073":[4,6],"\u547c\u3073\u51fa\u3057":6,"\u547c\u3073\u51fa\u305b\u308b":6,"\u547c\u3076":[6,7],"\u547d\u4ee4":6,"\u554f\u984c":6,"\u56db\u89d2":4,"\u56de\u3059":6,"\u56de\u8def":6,"\u56f0\u96e3":6,"\u56f2\u3063":6,"\u56f3\u3078":5,"\u56f3\u3084":3,"\u56f3\u8868":5,"\u5727\u529b":6,"\u57f7\u7b46":3,"\u57fa\u672c":[3,6],"\u57fa\u672c\u7684":[],"\u57fa\u6e96":2,"\u57fa\u790e":3,"\u5831\u544a":3,"\u5831\u544a\u66f8":3,"\u5834\u5408":[0,3,6,7],"\u5834\u6240":6,"\u5857\u308a":6,"\u5897\u3084\u3059":6,"\u5897\u52a0":4,"\u5909\u3048":6,"\u5909\u5316":6,"\u5909\u63db":2,"\u5909\u6570":6,"\u5909\u66f4":6,"\u5916\u5074":6,"\u5916\u90e8":2,"\u591a\u3044":6,"\u5927\u304d\u3044":6,"\u5927\u6587\u5b57":6,"\u5929\u6c17":6,"\u5931\u6557":4,"\u59cb\u3081":4,"\u5b66\u3093":[3,7],"\u5b66\u5185":6,"\u5b66\u5916":6,"\u5b66\u7fd2":[],"\u5b89\u4fa1":3,"\u5b8c\u4e86":6,"\u5b8c\u6210":3,"\u5b9a\u7fa9":[6,7],"\u5b9f\u4e16":3,"\u5b9f\u4e16\u754c":3,"\u5b9f\u65bd":3,"\u5b9f\u753b":6,"\u5b9f\u884c":6,"\u5b9f\u88c5":6,"\u5b9f\u9a13":[2,6],"\u5ba3\u8a00":6,"\u5bb9\u91cf":4,"\u5bfe\u51e6":6,"\u5bfe\u5fdc":6,"\u5c0e\u5165":6,"\u5c0f\u3055":6,"\u5c0f\u3055\u304f":6,"\u5c0f\u578b":3,"\u5c0f\u6587\u5b57":6,"\u5c11\u306a\u3044":[0,6],"\u5c11\u306a\u304f":3,"\u5de6\u5074":6,"\u5e38\u6642":6,"\u5e45\u5909":6,"\u5e73\u5747":6,"\u5f0f\u65e5\u672c\u8a9e":3,"\u5f15\u304d\u4f38\u3070":6,"\u5f15\u6570":6,"\u5f15\u7528":[3,6],"\u5f31\u3044":[],"\u5f37\u304f":6,"\u5f37\u8abf":0,"\u5f62\u5f0f":[3,6],"\u5f79\u5272":6,"\u5f85\u305f":6,"\u5f85\u3061\u53d7\u3051":6,"\u5f85\u3061\u53d7\u3051\u308b":6,"\u5f8c\u7d99":4,"\u5f8c\u8005":6,"\u5fc5\u305a":3,"\u5fc5\u8981":[3,4,6,7],"\u5fc5\u9808":6,"\u5fd8\u308c\u308b":6,"\u601d\u308f":0,"\u60c5\u5831":[2,3,6],"\u60f3\u5b9a":6,"\u610f\u5473":6,"\u610f\u56f3":3,"\u6163\u6027":6,"\u6210\u679c\u7269":3,"\u624b\u6bb5":6,"\u624b\u9593":6,"\u6253\u3061\u8fbc\u3080":6,"\u6253\u3064":6,"\u6271\u3044":2,"\u6271\u3046":[],"\u6291\u5236":6,"\u62b5\u6297":[0,6],"\u62bc\u3059":[4,6],"\u62bd\u51fa":6,"\u62bd\u8c61":3,"\u62c5\u5f53":3,"\u62e1\u5927":[1,5],"\u62e1\u5f35":[4,6],"\u62e1\u5f35\u5b50":[6,7],"\u6307\u5b9a":6,"\u6307\u6a19":[],"\u6307\u793a":[3,4],"\u6319\u52d5":7,"\u633f\u3057":4,"\u633f\u3059\u9762":6,"\u63a5\u7d9a":[2,4],"\u63cf\u753b":6,"\u63db\u3048":3,"\u63db\u3048\u308b":6,"\u642d\u8f09":3,"\u6539\u5909":6,"\u6539\u884c":6,"\u6545\u969c":6,"\u6559\u54e1":3,"\u6570\u5024":6,"\u6570\u5909":[],"\u6570\u5b57":4,"\u6570\u79d2":6,"\u6574\u5f62":6,"\u6574\u6570":6,"\u6587\u4f53":3,"\u6587\u5b57":6,"\u6587\u5b57\u5217":2,"\u6587\u6cd5":[],"\u6587\u732e":3,"\u65ad\u7247":6,"\u65b0\u3057\u3044":6,"\u65b0\u898f\u30bf\u30d6":7,"\u65b9\u6cd5":6,"\u65e5\u6642":6,"\u65e5\u672c\u8a9e":4,"\u660e\u5ea6":6,"\u660e\u5feb":[],"\u660e\u78ba":3,"\u660e\u8a18":3,"\u6620\u308a":6,"\u6642\u523b":2,"\u6642\u5dee":6,"\u6642\u8a08":6,"\u6642\u9593":6,"\u666e\u901a\u62bc":6,"\u66f2\u3052":6,"\u66f4\u65b0":6,"\u66f8\u3044":[2,6],"\u66f8\u304b":6,"\u66f8\u304d":3,"\u66f8\u304d\u8fbc\u307e":6,"\u66f8\u304d\u8fbc\u307f":2,"\u66f8\u304d\u8fbc\u3080":[4,6],"\u66f8\u304d\u8fbc\u3093":6,"\u66f8\u304f":2,"\u66f8\u3051":6,"\u66f8\u5f0f":3,"\u66ff\u3048":6,"\u6700\u521d":6,"\u6700\u5927":6,"\u6700\u5f8c":6,"\u6700\u60aa":6,"\u6700\u65b0":[],"\u6700\u7d42":6,"\u6700\u8fd1":4,"\u6709\u540d":4,"\u6709\u7528":3,"\u671b\u307e\u3057\u3044":6,"\u671f\u5f85":[],"\u671f\u9593":3,"\u672c\u4f53":[2,4],"\u672c\u5b9f\u9a13":4,"\u672c\u5f53":6,"\u67d4\u8edf":4,"\u683c\u7d0d":6,"\u691c\u7d22":4,"\u6982\u8981":6,"\u69cb\u6210":[6,7],"\u69cb\u7bc9":3,"\u69cb\u9020":6,"\u6a5f\u5668":3,"\u6a5f\u80fd":[3,6,7],"\u6b62\u3081\u308b":6,"\u6b63\u898f":6,"\u6b8b\u3057":6,"\u6b8b\u3059":3,"\u6b8b\u308a":6,"\u6b8b\u308b":6,"\u6bb5\u968e":4,"\u6bd4\u3079":6,"\u6c7a\u3081":3,"\u6ce8\u610f":[0,2,4],"\u6d17\u3044\u51fa\u3057":3,"\u6d3b\u304b\u3057":7,"\u6d3b\u52d5":3,"\u6d41\u901a":6,"\u6db2\u6676":[2,3],"\u6df1\u3081\u308b":6,"\u6df1\u5165\u308a":6,"\u6e08\u307f":[],"\u6e96\u3058\u308b":3,"\u6e96\u5099":[2,3,6],"\u6ea2\u308c\u308b":6,"\u6f14\u7b97":6,"\u70b9\u6ec5":6,"\u70b9\u706f":6,"\u7121\u7dda":[3,6],"\u7167\u5408":6,"\u7167\u5ea6":6,"\u7279\u6709":4,"\u72b6\u614b":6,"\u72b6\u6cc1":6,"\u72ec\u81ea":3,"\u73ed\u3068\u3057":3,"\u73ed\u3068\u3057\u3066":3,"\u73fe\u5728":[],"\u7406\u7531":3,"\u7406\u89e3":6,"\u74b0\u5883":[2,3,6],"\u751f\u3058\u308b":6,"\u751f\u6210":6,"\u7528\u3044":[3,6],"\u7528\u3044\u308b":6,"\u7528\u8a9e":3,"\u7528\u9014":6,"\u753b\u50cf":1,"\u753b\u9762":[3,4,6],"\u756a\u30d4\u30f3":6,"\u756a\u53f7":[5,6],"\u7570\u306a\u308b":6,"\u767a\u4fe1":[],"\u767a\u58f2":4,"\u767a\u884c":6,"\u767a\u8868":3,"\u767a\u8868\u4f1a":3,"\u767a\u97f3":4,"\u767b\u5834":3,"\u767b\u9332":6,"\u76ee\u4ee5\u964d":6,"\u76ee\u7684":[2,6],"\u76ee\u7acb\u3061":6,"\u76f4\u5217":6,"\u76f4\u63a5":[0,6],"\u76f4\u6d41":6,"\u7701\u7565":6,"\u77ed\u3044\u8db3":6,"\u77ed\u304f":6,"\u7834\u58ca":6,"\u7834\u88c2":6,"\u78ba\u8a8d":[3,6],"\u793a\u3055":3,"\u793a\u3057":[0,1,5,6],"\u793a\u3059":[3,4,6],"\u79d2\u5f85":6,"\u79d2\u6570":6,"\u79d2\u9593":6,"\u79d2\u9cf4\u3089":6,"\u79fb\u884c":6,"\u7a0b\u5ea6":[3,6],"\u7a2e\u985e":6,"\u7a7a\u767d":6,"\u7aef\u5b50":6,"\u7ba1\u7406":[4,6,7],"\u7bc4\u56f2":[3,6],"\u7c21\u5358":[3,4,6],"\u7c21\u6f54":6,"\u7d20\u6570":[],"\u7d22\u5f15":[],"\u7d42\u4e86":6,"\u7d42\u7aef":6,"\u7d44\u307f\u5408\u308f":7,"\u7d50\u5c40":6,"\u7d50\u679c":[5,6],"\u7d50\u8ad6":0,"\u7d5e\u308a\u8fbc\u307f":4,"\u7d5e\u308a\u8fbc\u3093":4,"\u7d71\u4e00":3,"\u7d71\u5408":[2,3,4],"\u7d99\u7d9a":6,"\u7dad\u6301":6,"\u7e4b\u304c\u308b":6,"\u7e70\u308a\u8fd4\u3057":6,"\u7f6e\u3044":7,"\u7f6e\u304d":6,"\u8003\u3048":6,"\u8003\u5bdf":3,"\u8005\u5411":6,"\u8033\u969c\u308a":6,"\u8089\u773c":6,"\u80cc\u666f":6,"\u811a\u6ce8":1,"\u81ea\u5206":4,"\u81ea\u52d5":[5,6],"\u8272\u6307\u5b9a":6,"\u866b\u773c":6,"\u884c\u3046":[3,4],"\u884c\u3048":3,"\u884c\u3048\u308b":3,"\u884c\u3063":6,"\u884c\u308f":6,"\u884c\u76ee":6,"\u8868\u73fe":6,"\u8868\u793a":[1,2,3,5],"\u8868\u8a18":[4,6],"\u88c5\u7f6e":6,"\u8907\u6570":[2,6],"\u8907\u96d1":6,"\u8981\u7d20":6,"\u898b\u3048":6,"\u898b\u3048\u308b":6,"\u899a\u3048":6,"\u89e3\u50cf":4,"\u89e3\u6790":6,"\u89e3\u6c7a":3,"\u8a00\u8a9e":[4,6],"\u8a08\u6e2c":6,"\u8a08\u7b97":6,"\u8a18\u53f7":6,"\u8a18\u6cd5":6,"\u8a18\u8ff0":[3,4,6,7],"\u8a18\u9332":3,"\u8a2d\u5b9a":[0,2,6],"\u8a55\u4fa1":2,"\u8a66\u3059":6,"\u8a66\u307f\u308b":6,"\u8a66\u9a13":3,"\u8a71\u3057\u5408\u3044":3,"\u8a71\u3057\u5408\u3063":3,"\u8a73\u3057\u3044":6,"\u8a73\u7d30":4,"\u8aac\u660e":[3,6],"\u8aad\u307f":3,"\u8aad\u307f\u51fa\u3057":6,"\u8aad\u307f\u53d6\u3063":6,"\u8aad\u307f\u53d6\u308a":3,"\u8aad\u307f\u53d6\u308b":6,"\u8abf\u6574":6,"\u8abf\u67fb":3,"\u8b1b\u7fa9":[3,5,6],"\u8cc7\u6599":6,"\u8cfc\u8aad":6,"\u8d64\u5916":2,"\u8d64\u5916\u5149":[],"\u8d64\u5916\u7dda":6,"\u8d64\u8272":6,"\u8d64led":[],"\u8d77\u304d\u308b":6,"\u8d77\u52d5":[4,6],"\u8ddd\u96e2":6,"\u8efd\u91cf":6,"\u8f9e\u66f8":6,"\u8fbc\u3080":0,"\u8fd1\u3044":[],"\u8fd1\u3065":6,"\u8fd1\u3065\u304b":[],"\u8fd1\u5e74":3,"\u8fd4\u3057":6,"\u8fd4\u3059":6,"\u8ffd\u52a0":[6,7],"\u8ffd\u5b9f\u9a13":[],"\u9001\u3063":6,"\u9001\u4fe1":[2,3],"\u9001\u53d7":6,"\u901a\u4fe1":[2,3],"\u901a\u5e38":6,"\u901f\u5ea6":6,"\u9023\u643a":3,"\u9023\u7d50":6,"\u9023\u7d9a":6,"\u9031\u76ee":[2,3],"\u9032\u3081":3,"\u9032\u3081\u308b":6,"\u9032\u6570":2,"\u904e\u304e":6,"\u9053\u7b4b":3,"\u9069\u5207":3,"\u9069\u5408":4,"\u9069\u5f53":6,"\u9069\u7528":6,"\u9078\u629e":[6,7],"\u90e8\u5206":[3,6,7],"\u914d\u5217":6,"\u914d\u7dda":6,"\u91cd\u8981":6,"\u91cd\u8996":4,"\u9577\u3044":6,"\u9577\u3055":6,"\u9577\u5e74":4,"\u9577\u62bc":6,"\u9577\u62bc\u3057":6,"\u958b\u3044":6,"\u958b\u304f":6,"\u958b\u59cb":[4,6],"\u958b\u767a":[2,3],"\u9593\u9055\u3044":0,"\u95a2\u6570":[6,7],"\u9632\u6b62":6,"\u96fb\u529b":2,"\u96fb\u5727":6,"\u96fb\u6e90":2,"\u975e\u516c":3,"\u975e\u516c\u5f0f":[],"\u9805\u76ee":[3,6],"\u9806\u6b21":3,"\u9806\u756a":6,"\u9818\u57df":6,"\u985e\u4f3c":[],"\u9ad8\u6027":3,"\u9ad8\u97f3":6,"\u9cf4\u3063":6,"\u9cf4\u3089":[4,6],"\u9cf4\u3089\u3059":6,"\uff01\u300c":6,"\uff01\uff01":6,"\uff08\u300c":3,"\uff08\u8aad\u307f\u53d6\u3063":6,"\uff08\u8d64":2,"\uff08arduino":2,"\uff08arduinoide":4,"\uff08iot":3,"\uff08m":6,"\uff08project":3,"\uff08tft":2,"\uff09:":[],"\uff09<":[],"\uff09\u3001":6,"\uff09\u3002":[4,6],"\uff09\u300d":4,"\uff09\u30ad\u30fc":6,"\uff13\u3064":6,"\uff1a<":4,"\uff1a\u300c":[],"\uff1aarduino":6,"\uff1ahttps":6,"\uff1ajson":6,"\uff1am":3,"\uff1amqtt":6,"\uff1aproperly":7,"\uff1awifi":6,"\uff1f\u3011":6,"\uff1f\uff09":[3,6],"\uff1f\uff1f":5,"])":[5,6],"]+":6,"],":6,"].":6,"];":6,"]\u301c":6,"^]":6,"`_":[],"``":4,"`adc":[],"`gp":[],"break":6,"byte":6,"cds\u30bb\u30eb":[0,6],"char":6,"class":5,"const":6,"continue":6,"control\u30ad\u30fc":6,"default":5,"double":0,"else":6,"false":6,"float":6,"for":[4,5,6],"function":6,"get\u30e1\u30bd\u30c3\u30c9":6,"if":[5,6],"in":[5,6],"int":[0,6],"long":5,"m5\u30c7\u30d0\u30a4\u30b9":6,"new":[5,6],"null":6,"pin\u30d4\u30f3":[],"post\u30e1\u30bd\u30c3\u30c9":6,"public":6,"return":6,"this":[5,6],"true":6,"try":6,"var":6,"void":[0,6],"while":6,"with":[5,6,7],"{\"":[],"| (":6,"|br":[],"||":6,"})":[],"};":6,_ap:6,_build:[],_callback:6,_ch:6,_clients:6,_code:6,_connected:6,_control:6,_datetypedef:6,_esp:4,_esprite:2,_factory:[],_factorytest:[],_feb:[0,1],_file:[],_for:6,_format:[],_from:6,_guide:3,_hour:6,_ipconfig:5,_japanese:3,_json:6,_m:[],_mac:6,_mday:6,_menu:[],_min:6,_mon:6,_ntp:6,_ok:6,_on:6,_password:6,_pm:0,_point:0,_pub:6,_read:6,_sec:6,_select:[],_serialport:[],_sketchexample:[],_sprite:6,_srv:6,_sta:6,_str:6,_sub:6,_subscribe:6,_t:[0,6],_timetypedef:6,_url:6,_wday:6,_wifi:6,_wlx:[],_year:6,able:6,accgyro:[],action:[],adc:2,add:6,added:5,address:6,addresses:5,admonition:5,adornment:5,after:5,akizukidenshi:[],all:6,along:6,also:5,an:5,analog:[0,6],analogread:[0,6],and:[5,6],anonymous:5,any:[5,6],anything:6,api:6,app:[],apps:6,arduino:[1,2,6,7],arduinocds:[0,6],arduinojson:6,are:[5,6],array:6,arrived:6,as:[5,6],ascii:6,at:[5,6],attention:5,attribute:5,author:5,auto:5,automatically:5,available:6,average:6,ax:6,axp:6,ay:6,az:6,ba:6,backslash:5,be:[5,6],beep:2,before:5,begin:[0,5,6],between:5,bgcolor:6,bibliographic:5,bit:6,bits:6,blank:5,bledevice:0,bleserver:0,bleutils:0,block:5,blocks:5,blue:6,bluetooth:2,body:6,book:5,bool:6,boston:6,bps:6,br:[],brackets:5,breaks:5,broken:6,broker:6,btna:6,btnb:6,buf:6,bullet:5,but:[5,6],bval:[],by:[5,6],bytes:6,callback:6,can:[5,6],cannot:5,caption:5,captures:6,carriage:6,caution:5,cbuf:6,cc:[],ccs:6,cd:6,cds:[],ch1:6,ch2:6,ch:6,character:[5,6],cheat:[],cheatsheet:5,check:6,cit:5,citation:5,citics:[],classifier:5,client:6,clientid:6,clients:6,close:6,cm:6,co:6,code:[0,4,5,6],com:4,command:6,comment:5,comments:5,compound:5,conclusion:0,configtime:6,connect:6,connected:6,connecting:6,connection:6,console:[],constrain:6,container:5,content:6,contents:[2,5],contentservice:6,contexts:5,continuation:5,conversion:5,converter:6,copy:6,copyright:6,cp2:[],cpp:7,crange:[],create:5,csv:5,ctrl:6,curl:6,currentline:6,custom:5,cyan:6,danger:5,data:[5,6],date:[5,6],datestruct:6,david:5,dccc:[],dec:6,decorations:5,def:5,define:6,definition:5,definitions:5,defs:5,delay:[0,6],description:5,deserialize:6,deserializejson:6,details:6,dev:[],development:4,device:4,dict:6,dictionary:6,digital:6,digitalwrite:6,directive:[],directly:5,disconnected:6,display:6,distributed:6,divisor:[],dl:4,docinfo:5,docs:5,doctest:5,document:5,docutils:5,doget:6,done:[],dopost:[],drawclock:[],driver:[0,4],each:5,eclipse:4,either:6,element:5,elements:[],elm:[],emphasis:5,empty:5,end:[0,6],energy:2,enhancement:5,enough:6,enumerated:5,environment:[4,6],epigraph:5,equivalent:5,error:5,escape:6,escapes:5,esp:[0,6],etc:5,even:[5,6],ex1:6,example:6,examples:5,explicit:5,external:5,fabf:6,factorytest:[4,6],failed:6,feb:5,felica:6,fft:0,field:5,fifth:6,fig:5,figure:5,file:[4,5,6],find:6,fitness:6,floor:6,flush:5,font:6,footer:5,footnote:5,form:[],format:5,foundation:6,franklin:6,free:6,from:[5,6],ftdi:4,full:5,g0:6,g2:[0,6],general:6,generate:5,generates:5,generic:5,get:6,getcoloruint:6,getlocaltime:6,getrange:6,getrtc:6,getvalue:6,gh:[],git:7,gmt:6,gnd:[0,6],gnu:6,gochkov:6,goodger:5,google:2,got:6,gotip:6,gp:6,gpio:6,gr:[],green:6,greenyellow:6,grid:5,groupxx:6,grove:6,gval:[],gx:6,gyrox:6,gyroy:6,gyroz:6,have:6,header:[5,6],heading:5,height:[],here:0,hex:6,hextodec:6,high:6,highlights:5,hint:5,hoge:[0,7],hogehoge:7,hold:6,hope:6,how:6,hristo:6,html:5,http:[5,6],httpclient:6,httpcode:6,https:[0,1,3,4,5,6],hyperlink:5,hz:6,ic:6,id:[],ide:[2,6,7],iframe:[],image:5,images:[],implied:6,important:5,imu:6,inc:6,include:[0,5,6],indentation:5,indented:5,indents:5,index:4,inertial:6,info:5,informal:5,inline:[],ino:[6,7],input:5,insert:6,install:5,instead:5,integrated:4,internal:5,internet:5,interpreted:[],intro:[],introductory:5,intval:6,iot:6,ip:[1,5,6],ipaddr:6,ipconfig:[1,5],ir:6,irled:6,irrecvdumpv:6,irremoteesp:6,irsend:6,is:[5,6],isalldigit:6,isdigit:6,isprime:[],it:[5,6],items:[5,6],itself:5,java:4,javascript:6,jjyclock:6,jquery:[],json:6,key:6,kirled:6,krecvpin:6,labelled:5,lang:[0,3,6],large:6,lastrow:6,later:6,latex:5,lcd:2,learning:3,least:5,lecattachpin:6,led:2,ledcattachpin:6,ledcsetup:6,ledcwrite:6,legend:5,len:6,length:6,lesser:6,library:6,license:6,like:5,line:[0,5],lines:5,list:5,lists:5,literal:5,localtime:6,longer:6,loop:[0,6],loops:6,low:2,lpt:4,lt:6,m5:6,m5stack:3,m5stick:4,m5stickc:3,m5stickcplus:[4,6],ma:6,mac:6,magenta:6,magnify:6,main:[0,7],make:0,manager:4,manually:5,many:[5,6],map:6,markup:[],match:6,matching:6,matchstate:6,math:5,mathematical:5,max:6,mbuf:6,measurement:6,merchantability:6,message:6,meta:5,metadata:5,meth:6,method:[],mg:6,mhigh:6,mi:5,microsoft:4,min:[],mini:5,miura:[],mlow:6,modify:6,modulation:2,more:6,mpu:6,mqpass:6,mqtt:2,mqttclient:6,mquser:6,ms:6,must:6,mute:6,name:5,named:5,nay:6,naz:6,nconnecting:6,nec:6,network:2,newline:6,next:5,ngy:6,ngz:6,no:[5,6],non:5,nopen:6,not:6,notation:5,note:5,notice:[],now:6,ntp:2,ntpserver:6,num:6,number:5,numbered:5,numref:5,object:6,of:[5,6],office:6,ok:6,on:5,once:0,onchange:[],onin:[],option:[5,6],optional:5,options:5,or:[5,6],orange:6,os:4,ota:6,output:6,overlined:5,paragraphs:5,parallel:5,param:6,parameter:6,params:6,parsed:5,parsing:6,part:6,particular:6,pass:6,passed:5,password:6,payload:6,pbl:3,pc:[4,6],pep:5,picture:5,pin:[0,6],ping:6,pinmode:[0,6],pip:5,pixel:6,pjs:[],please:5,plus:[3,4],point:0,port:[4,6],pos:6,possible:5,post:6,power:6,preceded:5,preference:2,preserve:5,pressed:6,prime:[],print:[5,6],printf:6,println:6,processes:5,profile:2,proposal:5,protocol:2,pub:6,published:6,publisher:6,pubsubclient:6,pubtopic:6,pull:5,pulse:2,purpose:6,push:6,put:0,pwm:2,pwmch:[],px:[],python:5,qiita:6,qs:6,queue:6,quick:[],quit:6,quote:5,quoted:5,quotes:5,random:6,randomseed:6,range:[],raspberrypi:[],ratein:6,raw:5,rcs:6,re:6,read:[5,6],reading:5,ready:6,received:6,reconnect:6,red:6,redistribute:6,reference:[],regexp:6,reject:6,reminders:[],remoteip:6,repeatedly:0,replace:5,replacement:5,req:6,request:[5,6],reserved:6,reset:6,response:6,rest:5,restructuredtext:[],result:[],ret:6,retain:6,retained:6,revision:5,rfc:5,rgb:6,rgbf:[],rights:6,role:[],rom:0,rr:[],rrggbb:6,rtc:6,rubric:5,run:0,rval:[],sample:0,sbuf:6,scanf:[],script:6,search:6,section:[],sections:5,sectnum:5,secure:[],see:[5,6],send:6,sent:[],separate:[5,7],separated:5,serial:[0,2],serialize:[],server:6,serverclients:6,set:5,setbeep:6,setcursor:6,setrgb:[],setrotation:6,setrtcfromlt:6,settextfont:6,setup:[0,4,6],sheet:6,should:6,sidebar:5,simple:5,size:6,sjdoc:6,so:6,software:6,source:5,spaces:5,specific:5,sphinx:[1,5],spot:6,spp:2,spreadsheet:2,spreadsheetapp:6,sprintf:6,sprite:6,spu:6,src:[0,1,6],ss:5,ssid:6,ssl:6,st:6,standalone:5,standard:5,start:[0,6],state:6,staticjsondocument:6,stdio:[],step:[],stop:6,store:4,str:6,string:6,strong:5,struct:[0,6],structure:[],studio:4,style:[],sub:[5,6,7],submit:[],subscriber:6,subscript:5,subsections:5,substitution:5,sup:5,superscript:5,syntax:[],table:5,tables:5,tabs:7,target:5,telemetry:6,telnet:6,term:5,terms:6,text:[],textfont:6,tft:6,than:6,that:6,the:6,then:6,there:6,time:2,timestruct:6,tip:5,title:5,titled:5,titles:5,tm:6,tmp:6,to:[0,5,6],today:5,toint:6,tone:6,topic:[5,6],toshiba:6,tostring:6,transparent:6,transport:6,tutorial:[],tv:6,two:5,type:[5,6],typedef:0,uart:6,uiflow:4,uint:6,under:6,underlined:5,unicode:5,uniform:5,unit:6,uno:4,unsigned:6,untouched:5,update:6,url:6,usa:6,usb:[4,6],use:[5,6],used:5,useful:[5,6],using:7,val:6,value:6,variation:5,vcp:4,ver:[],verse:5,version:[5,6],virtual:4,visible:5,visual:4,warning:5,warranty:6,was:6,way:5,weather:6,weatherapi:6,web:[4,6],webapi:6,webclient:2,webserver:2,were:5,white:6,width:2,wifi:2,wificlient:6,wificlientsecure:6,wifimulti:6,wifiserver:6,wifitelnettoserial:6,will:6,windows:6,without:6,wl:6,wrapped:5,write:6,writer:5,www:[0,3,4,6],yellow:6,you:[5,6],your:[0,6],youtu:6,zero:6},titles:["Arduino","Conclusion","IoT\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0","\u5b9f\u9a13\u306e\u76ee\u7684","\u4e8b\u524d\u6e96\u5099","Tutorial","1\u9031\u76ee","2\u9031\u76ee"],titleterms:{"'s":[],"(infrared":6,"5stickcplus":4,"\u3059\u3059\u3081\u304b":3,"\u3059\u308b":[4,6,7],"\u305d\u306e":6,"\u3068\u304d":6,"\u307e\u3068\u3081":[],"\u30a2\u30ca\u30ed\u30b0\u30bb\u30f3\u30b5":6,"\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb":4,"\u30a4\u30f3\u30c8\u30ed\u30c0\u30af\u30b7\u30e7\u30f3":[],"\u30a4\u30f3\u30c8\u30ed\u30c0\u30af\u30b7\u30e7\u30f3intro":[],"\u30af\u30e9\u30b9":6,"\u30b3\u30de\u30f3\u30c9":6,"\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3":[],"\u30b3\u30fc\u30c9":6,"\u30b5\u30f3\u30d7\u30eb\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9":4,"\u30b5\u30fc\u30d0":6,"\u30b5\u30fc\u30dc\u30cf\u30c3\u30c8":6,"\u30b5\u30fc\u30dc\u30e2\u30fc\u30bf":6,"\u30b7\u30ea\u30a2\u30eb\u30dd\u30fc\u30c8":4,"\u30b9\u30d7\u30e9\u30a4\u30c8":6,"\u30bb\u30f3\u30b5":6,"\u30c7\u30a3\u30b9\u30d7\u30ec\u30a4":6,"\u30c7\u30fc\u30bf":6,"\u30c8\u30d4\u30c3\u30af":6,"\u30d0\u30fc\u30b8\u30e7\u30f3":4,"\u30d2\u30f3\u30c8":6,"\u30d3\u30eb\u30c9":4,"\u30d6\u30b6\u30fc":6,"\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0":2,"\u30d7\u30ed\u30b0\u30e9\u30e0":[4,6,7],"\u30dc\u30bf\u30f3":6,"\u30dc\u30fc\u30c9":4,"\u30dc\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3\u30fc":4,"\u30e2\u30cb\u30bf":[],"\u30e9\u30a4\u30d6\u30e9\u30ea":4,"\u30ea\u30e2\u30b3\u30f3":6,"\u30ea\u30f3\u30af":[],"\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9":6,"\u4e8b\u524d":4,"\u4fe1\u53f7":6,"\u5165\u308c":6,"\u5185\u8535led":6,"\u5207\u308a\u65b9":6,"\u5229\u7528":6,"\u5236\u5fa1":6,"\u52a0\u901f\u5ea6":6,"\u53c2\u8003":[],"\u53c2\u8003url":3,"\u53d6\u5f97":6,"\u57fa\u6e96":3,"\u5834\u5408":4,"\u5909\u63db":6,"\u5916\u90e8":6,"\u5b66\u7fd2":[],"\u5b9f\u9a13":3,"\u60c5\u5831":4,"\u6271\u3044":6,"\u6307\u6a19":[],"\u63a5\u7d9a":6,"\u6570\u5909":[],"\u6574\u6570":[],"\u6587\u5b57\u5217":6,"\u6642\u523b":6,"\u66f8\u3044":7,"\u66f8\u304d\u8fbc\u307f":[4,6],"\u66f8\u304f":6,"\u672c\u4f53":6,"\u691c\u7d22":2,"\u6ce8\u610f":6,"\u6db2\u6676":6,"\u6e96\u5099":4,"\u74b0\u5883":4,"\u76ee\u7684":3,"\u78ba\u8a8d":4,"\u7d22\u5f15":2,"\u7d71\u5408":7,"\u8868\u793a":[4,6],"\u8907\u6570":7,"\u8a2d\u5b9a":4,"\u8a55\u4fa1":3,"\u8aad\u307f\u53d6\u308a":6,"\u8d64\u5916":6,"\u8ffd\u52a0":4,"\u9001\u4fe1":6,"\u901a\u4fe1":6,"\u9031\u76ee":[6,7],"\u9032\u6570":6,"\u9078\u629e":4,"\u958b\u767a":4,"\u96fb\u529b":6,"\u96fb\u6e90":6,"\uff08\u8d64":6,"\uff08arduino":4,"\uff08tft":6,_esprite:6,adc:6,analogread:[],and:[],arduino:[0,4],beep:6,bluetooth:6,body:5,cheat:5,conclusion:1,directive:5,documentation:[],elements:5,energy:6,esp:4,google:6,ide:4,indices:[],inline:5,interpreted:5,iot:2,lcd:6,led:6,linux:4,low:6,macos:4,markup:5,modulation:6,mosquitto:6,mqtt:6,network:6,ntp:6,preference:6,profile:6,protocol:6,publish:6,pulse:6,pwm:6,quick:5,reference:5,reminders:5,restructuredtext:5,role:5,section:5,serial:6,sheet:5,spp:6,spreadsheet:6,structure:5,subscribe:6,syntax:5,tables:[],testrtp:[],text:5,the:5,time:6,to:[],tutorial:5,url:4,webclient:6,webserver:6,welcome:[],width:6,wifi:6,windows:4}}) \ No newline at end of file diff --git a/_build/html/week1.html b/_build/html/week1.html index d90fcfa..3dbc731 100644 --- a/_build/html/week1.html +++ b/_build/html/week1.html @@ -105,27 +105,34 @@
  • 文字列の扱い、16進数や10進数の変換
  • ブザー(Beep)
  • 内蔵LED(赤・赤外)
  • -
  • 外部のLED等を接続
  • +
  • 外部のLED等を接続
  • PWM (Pulse Width Modulation)
  • -
  • サーボモータ(サーボハット利用)
  • -
  • 外部のセンサを接続 (ADC)
  • -
  • 加速度センサ
  • +
  • サーボモータ(サーボハット利用)
  • +
  • アナログセンサを接続 (ADC)
  • +
  • 加速度センサ
  • 赤外(InfraRed)リモコン
  • スプライト表示(TFT_eSprite クラス)
  • Wifi 接続
  • NTPサーバ (Network Time Protocol) と時刻の取得
  • WebClient
  • +
  • Google Spreadsheet にデータを送信する
  • WebServer
  • -
  • Bluetooth Low Energy
  • +
  • MQTT +
  • Bluetooth Serial Protocol Profile (SPP)
  • +
  • Bluetooth Low Energy
  • Preference
  • -
  • 電力制御
  • -
  • その他
  • -
  • 参考リンク
  • +
  • 電力制御
  • +
  • その他
  • 2週目
  • @@ -205,9 +212,10 @@

    電源の切り方・入れ方

      -
    • 電源を切るには、電源ボタン(M5と書かれたAボタンの左側面)を、6秒間長押しします。
    • 電源を入れるには、電源ボタンを、2秒間長押しします。
    • -
    • M5StickCガイド の、4ページ目、ハードウェアの概要が参考になります。
    • +
    • 電源を切るには、電源ボタン(M5と書かれたAボタンの左側面)を、6秒間長押しします。その際、プログラムによっては再スタートしたように見える場合がありますが、気にせずに長押し継続してください。
    • +
    • 動画をみる→ https://youtu.be/Lo1jZbAeT8Y
    • +
    • M5StickCガイド の、4ページ目、ハードウェアの概要も参考になります。
    @@ -222,6 +230,7 @@
  • #include <M5StickC.h> は、M5StickC用のコードです。 M5StickCPlus では、#include <M5StickCPlus.h> に変更しないと、表示がおかしくなることがあります。
  • 大文字と小文字は厳密に区別されます。
  • 画面をつかうプログラムを書き込んだあと、画面を使わないプログラムを書き込むと、前のプログラムの画面が残ることがあります。
  • +
  • スケッチブック(プログラムを構成する、複数のソースコードを含むファイル、他のIDEではプロジェクトと呼ぶ場合もある)をコピーしたいときは、内包するフォルダごとコピーしてください。その際、フォルダ名と、メインのソースコードファイル名(拡張子以外の部分)は、一致している必要があります。
  • @@ -620,7 +629,7 @@
    @@ -742,9 +751,9 @@
    -
    -

    外部のLED等を接続

    -

    外部のLED等は、 G0, G25, G26 に接続します。 +

    +

    外部のLED等を接続

    +

    外部のLED等は、 G0, G25, G26 に接続します。(GROVE端子のG32, G33も利用できます。) サンプルプログラムは、リスト 7 と同様です。PIN 番号を、0 / 25 / 26 に変更してください。

    ブレッドボードに、抵抗とLEDを直列に接続します。 LEDの長い足のほうに、G0 (or G25 or G26) をジャンパワイヤで接続し、反対側(短い足)のほうを、GND (グランド)に接続します。 @@ -815,9 +824,9 @@

    ソースコードのコメントにも書いていますが、周波数を小さくする(20〜30程度)と、どうなるでしょうか?ぜひやってみてください。

    -
    -

    サーボモータ(サーボハット利用)

    -

    リスト 9 は、サーボハット のサーボモータを動かすサンプルです。サーボモータの制御はPWMですので、基本的に、上のPWMとやっていることは同じです。おまけとして、LEDも点灯させました。map関数 は、Arduinoで使える関数で、範囲に対応する値を変換するときに使います。ここでは、サーボ制御で用いる5〜33の値を、LED制御の値0〜256に変換しています。

    +
    +

    サーボモータ(サーボハット利用)

    +

    リスト 9 は、サーボハット のサーボモータを動かすサンプルです。サーボモータの制御はPWMですので、基本的に、上のPWMとやっていることは同じです。おまけとして、LEDも点灯させました。map関数 は、Arduinoで使える関数で、範囲に対応する値を変換するときに使います。ここでは、サーボ制御で用いる5〜33の値を、LED制御の値0〜256に変換しています。

    リスト 9 src/servohat01.ino
     1
    @@ -880,12 +889,12 @@
     
    -

    外部のセンサを接続 (ADC)

    +

    アナログセンサを接続 (ADC)

    ADCは、Analog to Digital Converter の意味です。 analogRead(PIN) は、PIN番ピンの電圧(0~3.3V)を、0〜4095 の値で返します。一般に、抵抗値が変化するタイプのセンサは、この方法をつかって、読み取ることができます。

    警告

    -

    ADC にかいてあるように、G26, G32, G33, G36のみ使えます。G26は、無線利用時には使えません。

    +

    ADC にかいてあるように、G26, G32, G33, G36のみ使えます。G26は、無線利用時には使えません。

    リスト 10 はCdSセル(照度センサ) の値を読み取るサンプルです。

    @@ -907,7 +916,8 @@ 15 16 17 -18
    int PIN = 26;
    +18
    +19
    int PIN = 26;
     
     // +--- 15kΩ抵抗 --+-- CdSセル --+
     // |              |             |
    @@ -917,6 +927,7 @@
     // 注意点: https://lang-ship.com/reference/unofficial/M5StickC/Peripherals/ADC/
     
     void setup() {
    +  Serial.begin(115200);
       pinMode(PIN, ANALOG); // PINのモード設定
       // https://lang-ship.com/blog/work/m5stickc-io/
     }
    @@ -930,8 +941,8 @@
     

    圧力センサや、曲げセンサも、同様の方法で利用することができます。

    -
    -

    加速度センサ

    +
    +

    加速度センサ

    リスト 11 は、内蔵されている加速度センサ(MPU6886) の値を表示するサンプルです。ちなみに、IMUとは、Inertial Measurement Unit: 慣性計測装置 の略です。 「ツール」→「シリアルプロッタ」をひらくと、値をグラフでみることができます。 ジャイロセンサの値も取得可能です。

    @@ -996,23 +1007,28 @@

    赤外(InfraRed)リモコン

    -
    -

    信号の読み取り

    -

    赤外線リモコン受信モジュールが必要です。ここでは、GP1UXC41QS を前提に、話をすすめます。

    +
    +

    信号の読み取り

    +

    赤外線リモコン受信モジュールが必要です。ここでは、GP1UXC41QS を前提に、話をすすめます。

    また、準備として、ライブラリマネージャにて、IRremoteESP8266 をインストールします。ちなみに、テストしたバージョンは2.7.15でした。

    +
    +

    注釈

    +

    ライブラリマネージャは、「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理…」で、ひらきます。

    +

    ファイルメニュー → スケッチ例 → IRremoteESP8266 → IRrecvDumpV2 を選択します。

    -

    ブレッドボードに、以下の図のように配線します。Pとかいてある面が、受光器が出っ張っている面です。47Ωの抵抗を、5Vとの間に入れます。 +

    ブレッドボードに、以下の図のように配線します。Pとかいてある面が、受光器が出っ張っている面だとおもってください。47Ωの抵抗を、5Vとの間に入れます。 赤外線リモコン受信モジュールに接続したピンを const uint16_t kRecvPin = 36; として設定します。 -受光器にリモコンを向けて、ボタンを押すと、シリアルモニタに情報が表示されます。ここでは、Protocol : NEC , Code 0x2FD48B7 (32 Bits) と表示されたとします。

    +受光器にリモコンを向けて、ボタンを押すと、シリアルモニタに情報が表示されます。ここでは、Protocol : NEC , Code 0x2FD48B7 (32 Bits) と表示されたとします。この数値(uint32_t)を覚えておきます。

    _images/ir_sensor_47owm.png
    -
    -

    信号の送信

    +
    +

    信号の送信

    内蔵の赤外LEDを用いて、信号を送信する例を リスト 12 に示します。 内蔵の赤外LED光はあまり強くないため、50cm程度まで近づかないと反応しない場合があります。 単体の赤外LEDを接続して用いると、距離を伸ばすことができます。

    +

    なお、NECフォーマットではない赤外線リモコンの通信フォーマットについては、 赤外線リモコンの通信フォーマット や、スケッチ例を参考にしてください。

    リスト 12 src/irsend01.ino
     1
    @@ -1141,31 +1157,1294 @@
     

    Wifi 接続

    +

    リスト 14 は、Wifi接続のサンプルです。ssidpassword には、環境にあわせたものを入力してください。接続すると、m5デバイスのIPアドレスを画面に表示します。本当にWifi接続できたかどうかを、PCのターミナルからpingを打つなどして、確認してみましょう。(Windowsの場合、コマンドプロンプトをひらき、ping のあとに、半角スペースと、確認したいIPアドレスを入れます)

    +
    +
    リスト 14 src/wifi01.ino
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    #include <M5StickCPlus.h>
    +#include <WiFi.h>
    +
    +const char* ssid = "**********";
    +const char* password = "**********";
    +
    +void setup() {
    +  M5.begin();
    +  M5.Lcd.setRotation(3);
    +  M5.Lcd.fillScreen(ORANGE);
    +  M5.Lcd.setCursor(10, 50, 4);
    +
    +  WiFi.begin(ssid, password); // 接続開始
    +  while (WiFi.status() != WL_CONNECTED) { // 接続中...
    +    M5.Beep.tone(2000);  delay(200);
    +    M5.Beep.mute();  delay(300);
    +    M5.Lcd.print(".");
    +  }
    +  // 接続完了!!
    +  M5.Beep.tone(4000); 
    +  M5.Lcd.fillScreen(GREEN);
    +  M5.Lcd.setCursor(0, 40, 4);
    +  M5.Lcd.setTextColor(BLACK, GREEN);
    +  M5.Lcd.print("  Wifi Connected!\n  ");
    +  String gotip = WiFi.localIP().toString(); // m5デバイスのIPアドレス
    +  M5.Lcd.println(gotip);
    +  delay(1500);
    +  M5.Beep.mute();
    +}
    +
    +void loop() {
    +}
    +
    +
    +
    +

    Wifi接続するだけでは、あまり意味がないので、Telnetサーバを起動する例を リスト 15 に示します。 +シリアルモニタを開いて、IPアドレスを確認したら、ターミナル(コマンドプロンプト)で、telnet IPaddr と入力して、接続します。 +telnet から文字を入力すると、シリアルモニタに表示されます。 +逆に、シリアルモニタから文字を入力すると、Telnet接続しているターミナルに、文字が表示されます。 +WiFiServer server(23) で、23番ポートで待ち受けるサーバを、作成しています。 +ちなみに、WiFiMulti は、複数のアクセスポイントに対して、Wifi接続を試みることができる機能(クラス)です。ただし、最終的に繋がるのは1つのアクセスポイントになります。

    +
    +

    注釈

    +

    Telnet接続を切断するときは、まずControlキーをおしながら ] をおしてください。プロンプトが telnet> と表示されますので、quit と打ち込むと終了します。 Escape character is '^]'.^ は、Controlキーのことです。

    +
    +
    +
    リスト 15 src/telnet01.ino
    +
      1
    +  2
    +  3
    +  4
    +  5
    +  6
    +  7
    +  8
    +  9
    + 10
    + 11
    + 12
    + 13
    + 14
    + 15
    + 16
    + 17
    + 18
    + 19
    + 20
    + 21
    + 22
    + 23
    + 24
    + 25
    + 26
    + 27
    + 28
    + 29
    + 30
    + 31
    + 32
    + 33
    + 34
    + 35
    + 36
    + 37
    + 38
    + 39
    + 40
    + 41
    + 42
    + 43
    + 44
    + 45
    + 46
    + 47
    + 48
    + 49
    + 50
    + 51
    + 52
    + 53
    + 54
    + 55
    + 56
    + 57
    + 58
    + 59
    + 60
    + 61
    + 62
    + 63
    + 64
    + 65
    + 66
    + 67
    + 68
    + 69
    + 70
    + 71
    + 72
    + 73
    + 74
    + 75
    + 76
    + 77
    + 78
    + 79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    +126
    +127
    +128
    +129
    +130
    // オリジナルのWifiTelnetToSerial を、改変しました。
    +/*
    +  WiFiTelnetToSerial - Example Transparent UART to Telnet Server for ESP32
    +
    +  Copyright (c) 2017 Hristo Gochkov. All rights reserved.
    +  This file is part of the ESP32 WiFi library for Arduino environment.
    +
    +  This library is free software; you can redistribute it and/or
    +  modify it under the terms of the GNU Lesser General Public
    +  License as published by the Free Software Foundation; either
    +  version 2.1 of the License, or (at your option) any later version.
    +
    +  This library is distributed in the hope that it will be useful,
    +  but WITHOUT ANY WARRANTY; without even the implied warranty of
    +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    +  Lesser General Public License for more details.
    +
    +  You should have received a copy of the GNU Lesser General Public
    +  License along with this library; if not, write to the Free Software
    +  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    +*/
    +#include <WiFi.h>
    +#include <WiFiMulti.h>
    +
    +WiFiMulti wifiMulti;
    +
    +//how many clients should be able to telnet to this ESP32
    +#define MAX_SRV_CLIENTS 3
    +const char* ssid = "**********";
    +const char* password = "**********";
    +
    +WiFiServer server(23);
    +WiFiClient serverClients[MAX_SRV_CLIENTS];
    +
    +void setup() {
    +  Serial.begin(115200);
    +  Serial.println("\nConnecting");
    +
    +  wifiMulti.addAP(ssid, password);
    +  //  wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
    +  //  wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");
    +
    +  Serial.println("Connecting Wifi ");
    +  for (int loops = 10; loops > 0; loops--) {
    +    if (wifiMulti.run() == WL_CONNECTED) {
    +      Serial.println("");
    +      Serial.print("WiFi connected ");
    +      Serial.print("IP address: ");
    +      Serial.println(WiFi.localIP());
    +      break;
    +    }
    +    else {
    +      Serial.println(loops);
    +      delay(1000);
    +    }
    +  }
    +  if (wifiMulti.run() != WL_CONNECTED) {
    +    Serial.println("WiFi connect failed");
    +    delay(1000);
    +    ESP.restart();
    +  }
    +
    +  //start UART and the server
    +  //  Serial2.begin(9600);
    +  server.begin();
    +  server.setNoDelay(true);
    +
    +  Serial.print("Ready! Use 'telnet ");
    +  Serial.print(WiFi.localIP());
    +  Serial.println(" 23' to connect");
    +}
    +
    +void loop() {
    +  uint8_t i;
    +  if (wifiMulti.run() == WL_CONNECTED) {
    +    //check if there are any new clients
    +    if (server.hasClient()) {
    +      for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    +        //find free/disconnected spot
    +        if (!serverClients[i] || !serverClients[i].connected()) {
    +          if (serverClients[i]) serverClients[i].stop();
    +          serverClients[i] = server.available();
    +          if (!serverClients[i]) Serial.println("available broken");
    +          Serial.print("New client: ");
    +          Serial.print(i); Serial.print(' ');
    +          Serial.println(serverClients[i].remoteIP());
    +          break;
    +        }
    +      }
    +      if (i >= MAX_SRV_CLIENTS) {
    +        //no free/disconnected spot so reject
    +        server.available().stop();
    +      }
    +    }
    +    //check clients for data
    +    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    +      if (serverClients[i] && serverClients[i].connected()) {
    +        if (serverClients[i].available()) {
    +          //get data from the telnet client and push it to the UART
    +          while (serverClients[i].available()) Serial.write(serverClients[i].read());
    +        }
    +      }
    +      else {
    +        if (serverClients[i]) {
    +          serverClients[i].stop();
    +        }
    +      }
    +    }
    +    //check ==UART== => Serial for data
    +    if (Serial.available()) {
    +      size_t len = Serial.available();
    +      uint8_t sbuf[len];
    +      Serial.readBytes(sbuf, len);
    +      //push UART data to all connected telnet clients
    +      for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    +        if (serverClients[i] && serverClients[i].connected()) {
    +          serverClients[i].write(sbuf, len);
    +          delay(1);
    +        }
    +      }
    +    }
    +  }
    +  else {
    +    Serial.println("WiFi not connected!");
    +    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    +      if (serverClients[i]) serverClients[i].stop();
    +    }
    +    delay(1000);
    +  }
    +}
    +
    +
    +

    NTPサーバ (Network Time Protocol) と時刻の取得

    +

    M5StickCPlusには、システム時間(localTime)と、RTC(リアルタイムクロック:時計の機能を備えたICのこと)の2種類の時計があります。システム時間は、システムリセット(再起動)のたびに、時刻もリセットされますが、後者のRTCはリセットされません。

    +

    リスト 16 に、NTPサーバを使ってシステム時間の修正をしたのち、システム時間を1秒ごとに取得して、シリアルモニタに表示する例を示します。こちらは、M5のライブラリは不要です。configTime()でNTPサーバを設定しておくと、1時間に1回、NTPサーバに接続して、時刻修正します。

    +
    +
    リスト 16 src/ntp01.ino
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    #include <WiFi.h>
    +
    +const char* ssid = "**********";
    +const char* password = "**********";
    +
    +void setup() {
    +  Serial.begin(115200);
    +  WiFi.begin(ssid, password);
    +  while (WiFi.status() != WL_CONNECTED) { // 接続中...
    +    Serial.print(".");
    +  }
    +  char* ntpserver = "10.64.7.184"; // 学外なら、たとえば "ntp.nict.jp"
    +  configTime(9 * 3600, 0, ntpserver);//GMTとの時差(秒), サマータイムで進める時間(秒)
    +}
    +
    +void loop() {
    +  struct tm localTime;
    +  char buf[30];
    +  getLocalTime(&localTime);
    +  sprintf(buf, ">> %04d/%02d/%02d  %02d:%02d:%02d",
    +          localTime.tm_year + 1900,
    +          localTime.tm_mon + 1,
    +          localTime.tm_mday,
    +          localTime.tm_hour,
    +          localTime.tm_min,
    +          localTime.tm_sec
    +         );
    +  Serial.println(buf);
    +  delay(1000);
    +}
    +
    +
    +
    +
    +

    警告

    +

    configTime() を行わない状況で、システム時間(localTime)を取得しようとすると、取得に数秒ほど時間がかかります。

    +
    +

    リスト 17 は、RTCの時刻を表示するサンプルです。なお、5行目で USE_NTP に 1 が設定してあれば、RTCに時刻を設定します。常時Wifiネットワークに接続できない場合は、RTCを利用することが望ましいです。

    +
    +
    リスト 17 src/rtc01.ino
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    +60
    +61
    +62
    +63
    +64
    #include <M5StickCPlus.h>
    +#include <WiFi.h>
    +// #include "time.h"
    +
    +#define USE_NTP 0   // NTPからRTCに時刻設定するなら1
    +
    +void setRTCfromLT(struct tm lt) {
    +  RTC_DateTypeDef DateStruct;
    +  DateStruct.Year = lt.tm_year + 1900;
    +  DateStruct.Month = lt.tm_mon + 1;
    +  DateStruct.Date = lt.tm_mday;
    +  DateStruct.WeekDay = lt.tm_wday;
    +  M5.Rtc.SetData(&DateStruct);
    +
    +  RTC_TimeTypeDef TimeStruct;
    +  TimeStruct.Hours   = lt.tm_hour;
    +  TimeStruct.Minutes = lt.tm_min;
    +  TimeStruct.Seconds = lt.tm_sec+1;
    +  M5.Rtc.SetTime(&TimeStruct);
    +}
    +
    +void getRTC(char* buf) {
    +  RTC_DateTypeDef DateStruct;
    +  RTC_TimeTypeDef TimeStruct;
    +  M5.Rtc.GetData(&DateStruct);
    +  M5.Rtc.GetTime(&TimeStruct);
    +  sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d",
    +          DateStruct.Year,  DateStruct.Month,   DateStruct.Date,
    +          TimeStruct.Hours, TimeStruct.Minutes, TimeStruct.Seconds
    +         );
    +}
    +
    +void setup() {
    +  M5.begin();
    +  M5.Lcd.setRotation(3);
    +  Serial.begin(115200);
    +
    +  if (USE_NTP) {
    +    const char* ssid = "**********";
    +    const char* password = "**********";
    +    const char* ntpserver = "10.64.7.184"; // "ntp.nict.jp"
    +    WiFi.begin(ssid, password);
    +    while (WiFi.status() != WL_CONNECTED) { // 接続中...
    +      Serial.print(".");
    +    }
    +    configTime(9 * 3600, 0, ntpserver);
    +
    +    struct tm localTime;
    +    while (localTime.tm_year < 80) {
    +      getLocalTime(&localTime); delay(50);
    +    }
    +    setRTCfromLT(localTime);
    +  }
    +}
    +
    +void loop() {
    +  char buf[30];
    +  getRTC(buf); // bufに、日時文字列を書き込む
    +  Serial.println(buf);
    +  M5.Lcd.fillScreen(BLUE);
    +  M5.Lcd.setCursor(0, 50, 4);
    +  M5.Lcd.println(buf);
    +  delay(1000);
    +}
    +
    +
    +
    +
    +

    注釈

    +

    RTCに一旦時刻を設定しておくと、初期状態で書き込まれているプログラムFactoryTest の「BMP8563 RTC Time」でも、その時刻が表示されるようになります。

    +

    WebClient

    +

    リスト 18 は、HTTP通信で天気予報Web APIに接続するサンプルです。HTTPClientクラスを用いると、ブラウザでURLを指定してWebページを開くように、WebサーバにGETメソッドやPOSTメソッドでリクエストを送信して、ステータスコードやレスポンスを取得することができます。このサンプルでは、シリアルコンソールに、天気予報をJSON形式で表示します。JSON(ジェイソン)とは、Javascriptのオブジェクトの形式でデータを表現する記法です。

    +
    +
    リスト 18 src/httpclient01.ino
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    #include <WiFi.h>
    +#include <HTTPClient.h>
    +
    +const char* ssid = "**********";
    +const char* password = "**********";
    +
    +// 天気予報API https://weather.tsukumijima.net/ から、千葉の天気を取得 
    +const char* weatherapi_url = "http://weather.tsukumijima.net/api/forecast/city/120010";
    +
    +void setup() {
    +  Serial.begin(115200);
    +  WiFi.begin(ssid, password);
    +  while (WiFi.status() != WL_CONNECTED) { // 接続中...
    +    delay(50);
    +    Serial.print(".");
    +  }
    +  delay(1000);
    +  
    +  HTTPClient http;
    +  http.begin(weatherapi_url); //HTTPでサーバに接続
    +  int httpCode = http.GET();
    +  if (httpCode > 0) {
    +      Serial.println(httpCode);
    +    if (httpCode == HTTP_CODE_OK) {
    +      String payload = http.getString();
    +      Serial.println(payload);
    +    }
    +  }
    +  http.end();
    +}
    +
    +void loop() {
    +}
    +
    +
    +
    +
    +

    警告

    +

    https (SSL) 通信をする場合は、スケッチ例→HTTPClient→BasicHttpsClient を参照して、WiFiClientSecure クラスを使用してください。

    +
    +
    +
    +

    Google Spreadsheet にデータを送信する

    +

    HTTP通信で、サーバにデータを送信して格納したいとおもっても、適当なサーバを準備するのは手間がかかることがあります。

    +

    Google Apps Scriptを用いると、HTTP通信で Google Spreadsheet にデータを書き込んだり、読み取ったりするWebサービスを作成し、WebAPIとして公開することができます。

    +

    (Google Spreadsheetのメニューで) 拡張機能→Apps Script または、ツール→スクリプトエディタ で、リスト 19 を「コード.gs」に書き込みます。15行目で「シート1」の一番下の行に、配列array の要素を追加します。19行目のgetRange(1,3).getValue()は、スプレッドシートのC1(3列1行)の値を取得しています。ここに「=average(C2:C200)」のようにしておくと、データの平均値を取得することもできます。

    +

    作成した「コード.gs」について、「公開」→「ウェブアプリケーションとして導入...」で、Webアプリとして公開できます。(なお、「新しいエディタ」では表示が異なるため、できない可能性があります。)

    +

    作成できたかどうかをパソコンから確認するには、コマンドラインから、以下のように入力します(ただし、curlが必要です。val1=10 と val2=20 のあいだは&記号ですので、シェルでバックグラウンド処理されないように、URLをシングルクォートで囲っています)

    +
    curl -L  'https://script.google.com/macros/s/XxXxXxXxXx/exec?val1=10&val2=20'
    +
    +
    +
    +
    リスト 19 src/doget.js
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    function doGet(e) {
    +  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    +  var sheet = spreadsheet.getSheetByName('シート1');
    +  var now = new Date();
    +  var array = [];
    +  array.push(now);
    +  
    +  for(var k in e['parameter']) {
    +    array.push(k);
    +    array.push(e['parameter'][k]);
    +  }
    +  var params = JSON.stringify(e);
    +  array.push(params);
    +  sheet.appendRow( array );
    +  
    +  var lastRow = sheet.getLastRow();
    +
    +  var output = ContentService.createTextOutput(sheet.getRange(1,3).getValue()+" "+lastRow);
    +  output.setMimeType(ContentService.MimeType.TEXT);
    +  return output;
    +}
    +
    +
    +

    WebServer

    +

    すこし長いですが、リスト 20 は、80番ポートでHTTPでの通信を待ち受け(listenし)て、クライアントからの接続情報(ヘッダ情報)を返すWebサーバのシンプルな例です。クライアント(ブラウザ)からのリクエスト行のうち、 GET または POST ではじまる行があれば、変数 meth に格納します。つまり、変数 meth には、ブラウザで発行したリクエストのURLが含まれることになります。POSTメソッドで送信されていれば、リクエストボディに記述されたデータを変数 post に格納します。 クライアント(ブラウザ)に返す「レスポンス」は、 client.println() で送信します。最後に、client.stop() で、サーバ側から接続を切断します。

    +
    +
    リスト 20 src/httpserver01.ino
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    +60
    +61
    +62
    +63
    +64
    +65
    +66
    +67
    +68
    +69
    +70
    +71
    +72
    +73
    +74
    +75
    +76
    +77
    +78
    +79
    +80
    +81
    +82
    +83
    +84
    #include <WiFi.h>
    +
    +const char* ssid = "**********";
    +const char* password = "**********";
    +
    +WiFiServer server(80);
    +
    +void setup() {
    +  Serial.begin(115200);
    +  WiFi.begin(ssid, password);
    +  while (WiFi.status() != WL_CONNECTED) { // 接続中...
    +    delay(50);
    +    Serial.print(".");
    +  }
    +  String ip = WiFi.localIP().toString(); // m5デバイスのIPアドレス
    +  Serial.printf("\nopen http://%s\n\n", ip.c_str() );
    +
    +  server.begin(); // Webサーバを開始
    +}
    +
    +void loop() {
    +  WiFiClient client = server.available();
    +  if (client) {
    +    String req = "" ;
    +    String tmp = "" , meth = "" ;
    +    while (client.connected()) {            // loop while the client's connected
    +      if (client.available()) {             // if there's bytes to read from the client,
    +        char c = client.read();             // read a byte, then
    +        req += c;
    +        if (c == '\n') {                    // if the byte is a newline character
    +          if (tmp.length() == 0) {  // end of request, break while loop
    +            break;
    +          } else { //まだ継続
    +            if (tmp.startsWith("GET ") || tmp.startsWith("POST ") ) {
    +              meth = tmp;
    +            }
    +            tmp = "";
    +          }
    +        } else if (c != '\r') {  // if you got anything else but a carriage return character,
    +          tmp += c;      // add it to the end of the currentLine
    +        }
    +      }
    +    } // end of while
    +
    +    Serial.println(meth);
    +    if ( meth.startsWith("GET /") ) {
    +      client.println("HTTP/1.1 200 OK"); // header (with response code)
    +      client.println("Content-Type:text/plain");
    +      client.println(""); // HTTPでは、header と body の区切りは改行
    +      client.println(meth);
    +      client.println("-- request --");
    +      client.println(req);
    +    }
    +
    +    if ( meth.startsWith("POST ") ) {
    +      String post = "";
    +      char buf[257];
    +      int n;
    +      while ((n = client.available()) > 0) {
    +        if (n < 256) {
    +          client.readBytes(buf, n) ;
    +          buf[n] = 0 ;
    +        } else {
    +          client.readBytes(buf, 256) ;
    +          buf[256] = 0 ;
    +        }
    +      }
    +      post += buf ;
    +
    +      client.println("HTTP/1.1 200 OK");
    +      client.println("Content-Type:text/plain");
    +      client.println(""); // HTTPでは、header と body の区切りは改行
    +      client.println(meth);
    +      client.println("-- request --");
    +      client.println(req);
    +      client.println("-- post data --");
    +      client.println(post);
    +    }
    +    // close the connection:
    +    client.stop();
    +    Serial.println(" --- Client Disconnected.");
    +  }
    +  delay(100);
    +}
    +
    +
    +
    +

    センサデータを返すだけなら問題ありませんが、クライアントからのデータを GET / POST で受信して処理する場合は、 key1=val1&key2=val2 のような文字列を要素に分解する必要がでてきます。あまり深入りしませんが、正規表現で文字列を照合・抽出する Regexp や、抽出した結果をハッシュ/辞書として保存する Dictionary ライブラリを導入すると、複雑なリクエストやデータを扱いやすくなるでしょう。 +リスト 21 に、RGBの色指定文字列などのリクエスト文字列をパースして辞書に追加するプログラムの断片を示します。注意:このプログラムは、単体では動作しません

    +
    +
    リスト 21 src/regexp01.ino
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    #include <Regexp.h>
    +#include <Dictionary.h>
    +
    +Dictionary *dict = new Dictionary(); // 辞書/ハッシュ。キー文字列→値 を保持するデータ構造
    +
    +void match_callback  (const char * match,         // matching string (not null-terminated)
    +                      const unsigned int length,  // length of matching string
    +                      const MatchState & ms)      // MatchState in use (to get captures)
    +{
    +  char k [10];   // size must be large enough to hold captures
    +  char v [10];   // size must be large enough to hold captures
    +  ms.GetCapture(k, 0);
    +  ms.GetCapture(v, 1);
    +  dict->insert(k, v); // 辞書に追加 (たとえば、 red→120 を追加)
    +}  // end of match_callback
    +
    +// たとえば、*cbuf = "red=120&green=255&blue=9" のような文字列を想定する
    +void param2dict(char *cbuf){
    +      MatchState ms (cbuf); //正規表現マッチャーの作成
    +      ms.GlobalMatch ("([a-z]+)=([0-9]+)", match_callback); // (key)=(value) で複数回マッチングする。match_callback は別関数。
    +      int r = dict->search("red").toInt(); // 辞書 dict
    +      int g = dict->search("green").toInt();
    +      int b = dict->search("blue").toInt();
    +      int32_t bgcolor = (int(r * 31 / 255) << 11) | (int(g * 63 / 255) << 5) | (int(b * 31 / 255));
    +}
    +
    +
    +
    +
    +
    +

    MQTT

    +

    MQTT(Message Queue Telemetry Transport) は、センサデータをデバイス間で共有・流通させるときなどに使われる、軽量のメッセージ送受信プロトコルです。 +ここで、「軽量」とは、HTTPに比べて、ヘッダ部分のデータが少ない、という意味です。 +MQTTでは、サーバのことを「ブローカ」と呼びます。ここでは、データを送信するPublisherと、データを受信するSubscriberの2つのデバイスと、ブローカの3つの構成要素で説明します。

    +

    Publisherは、ブローカに接続しデータを送信します。このとき、 「トピック」 と呼ばれる、データの登録先を文字列で指定します。また、retainデータとして送信するかどうかも指定します。retainとは「保持・維持」の意味で、最後に送ったデータをブローカに残しておきたい場合、rateinデータとします。 +Subscriberは、ブローカに接続し、トピックをサブスクライブ(購読)します。このとき、トピックに書き込まれているretainデータがあれば、最初にそのデータを受信します。retainデータがなければ、Publisherが新しいデータをトピックに送信したタイミングで、データを受信します。 +このような通信手段(プロトコル)を、パブリッシュ/サブスクライブモデル と呼びます。参考サイト: +IoT初心者向け!「MQTT」について簡単にまとめてみる

    +
    +

    MQTT Publish

    +

    リスト 22 は、MQTT Publisherのサンプルです。実験用ブローカ(mqtt.istlab.info)に接続して、 office/temp というトピックにデータ(シリアルコンソールで送信した文字列)を書き込みます。 パスワードはここには書けませんので、講義ポータル資料を参照してください。

    +
    +
    リスト 22 src/mqtt01pub.ino
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    +60
    +61
    +62
    +63
    +64
    +65
    +66
    +67
    +68
    +69
    +70
    // MQTT Publisher example 
    +//#include <M5StickCPlus.h>
    +#include <WiFi.h>
    +// ライブラリで PubSubClient をいれておく
    +#include <PubSubClient.h>
    +
    +const char* ssid = "**********";
    +const char* password = "**********";
    +
    +const char* server = "mqtt.istlab.info";
    +const int   port     = 1883;
    +// 注:学内ネットワークからは上記ポート番号に接続できない。
    +const char* pubTopic = "office/temp"; //"ex1/groupXX/sensor";
    +const char* mquser   = "ex1";
    +const char* mqpass   = "***PASSWORD***";
    +WiFiClient wifiClient;
    +char* clientid = "m5stickc01_00000001"; //デバイス個別に設定すればなんでもよい
    +PubSubClient mqttClient(wifiClient); // MQTT Client
    +
    +void setup() {
    +  // M5.begin();
    +  Serial.begin(115200);
    +  WiFi.begin(ssid, password);
    +  while (WiFi.status() != WL_CONNECTED) { // 接続中...
    +    Serial.print(".");
    +    delay(200);
    +  }
    +  Serial.println( WiFi.localIP().toString() ); //取得したIPアドレス
    +  // 参考:WiFiデバイスのMACアドレスを取得し、clientid として用いる
    +  // (18行目のclientidの定義を変更し、char clientid[20]とするのがのぞましい)
    +  //  uint8_t mac[6];
    +  //  esp_read_mac(mac, ESP_MAC_WIFI_STA);
    +  //  sprintf(clientid, "%02X:%02X:%02X:%02X:%02X:%02X",
    +  //          mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] );
    +  mqttClient.setServer(server, port);
    +
    +  if (!mqttClient.connected()) {
    +    Serial.println("Try (re)connecting...");
    +    reconnect();
    +  }
    +}
    +
    +void loop() {
    +  // シリアルコンソールから書き込みがあれば, publishする
    +  byte mbuf[100];  int pos = 0;
    +  while (Serial.available()) { // ノンブロッキング
    +    mbuf[pos]  = Serial.read();
    +    pos++;
    +  }
    +  if (pos > 0) {
    +    mbuf[pos-1] = 0; //改行をNULLに置き換える
    +    Serial.println((char*)mbuf);
    +    // ブローカにデータを送信する。最後のfalse を true にすると、retained になる。
    +    bool ret = mqttClient.publish(pubTopic, mbuf, pos-1, false); 
    +    if (!ret){
    +      Serial.println("publish failed.");
    +    }
    +  }
    +  delay(10);
    +}
    +
    +void reconnect() {
    +  while (!mqttClient.connected()) {
    +    if (mqttClient.connect(clientid, mquser, mqpass)) {
    +      Serial.println("Connected to MQTT Broker.");
    +    } else {
    +      Serial.printf("Connect Failed. state=%d", mqttClient.state());
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +

    MQTT Subscribe

    +

    リスト 23 は、MQTT Subscriberのサンプルです。実験用ブローカ(mqtt.istlab.info)に接続して、 office/temp というトピックを購読します。 パスワードはここには書けませんので、講義ポータル資料を参照してください。 JSON形式のデータを処理するときは、ArduinoJsonをつかってパージング/deserialize すると便利です(78行目以降にサンプルがあります)。

    +
    +
    リスト 23 src/mqtt01sub.ino
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    +60
    +61
    +62
    +63
    +64
    +65
    +66
    +67
    +68
    +69
    +70
    +71
    +72
    +73
    +74
    +75
    +76
    +77
    +78
    +79
    +80
    +81
    +82
    +83
    // MQTT Subscriber example 
    +// #include <M5StickCPlus.h>
    +#include <WiFi.h>
    +// ライブラリで PubSubClient をいれておく
    +#include <PubSubClient.h>
    +// ライブラリで ArduinoJson v6.xをいれておく。
    +//        (注意:Arduino_Json v0.1.0 は別物)
    +#include <ArduinoJson.h>
    +
    +const char* ssid = "**********";
    +const char* password = "**********";
    +
    +const char* server = "mqtt.istlab.info";
    +const int   port     = 1883;
    +// 注:学内ネットワークからは上記ポート番号に接続できない。
    +const char* pubTopic = "office/temp"; // 例: ex1/groupXX/sensor 
    +const char* mquser   = "ex1";
    +const char* mqpass   = "***PASSWORD***";
    +WiFiClient wifiClient;
    +char* clientid = "m5stickc01_00000001"; //デバイス個別に設定すればなんでもよい
    +PubSubClient mqttClient(wifiClient); // MQTT Client
    +
    +void setup() {
    +//  M5.begin();
    +  Serial.begin(115200);
    +  WiFi.begin(ssid, password);
    +  while (WiFi.status() != WL_CONNECTED) { // 接続中...
    +    Serial.print(".");
    +    delay(200);
    +  }
    +  Serial.println( WiFi.localIP().toString() ); //取得したIPアドレス
    +  // 参考:WiFiデバイスのMACアドレスを取得し、clientid として用いる
    +  // (18行目のclientidの定義を変更し、char clientid[20]とするのがのぞましい)
    +  //  uint8_t mac[6];
    +  //  esp_read_mac(mac, ESP_MAC_WIFI_STA);
    +  //  sprintf(clientid, "%02X:%02X:%02X:%02X:%02X:%02X",
    +  //          mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] );
    +  mqttClient.setServer(server, port);
    +  mqttClient.setCallback(callback_on_subscribe);
    +
    +  if (!mqttClient.connected()) {
    +    Serial.println("Try (re)connecting...");
    +    reconnect();
    +  }
    +  mqttClient.subscribe(pubTopic);
    +
    +}
    +
    +void loop() {
    +
    +  mqttClient.loop(); // データがpublishされたら、callback_on_subscribe が呼ばれる
    +
    +  delay(100);
    +}
    +
    +void reconnect() {
    +  while (!mqttClient.connected()) {
    +    if (mqttClient.connect(clientid, mquser, mqpass)) {
    +      Serial.println("Connected to MQTT Broker.");
    +    } else {
    +      Serial.printf("Connect Failed. state=%d", mqttClient.state());
    +    }
    +  }
    +}
    +
    +// データがPublishされたら、ここが実行される。(39行目でコールバック関数を設定しているため)
    +void callback_on_subscribe(char* topic, byte* payload, unsigned int len) {
    +  char buf[100];
    +  Serial.print("Message arrived [");
    +  Serial.print(topic);
    +  Serial.print("] ");
    +  for (int i = 0; i < len ; i++) {
    +    buf[i] = (char)payload[i];
    +  }
    +  buf[len] = 0;
    +  Serial.println(buf);
    +  return;
    +  //  参考:JSON Parsing example
    +  //  StaticJsonDocument<200> sjdoc;
    +  //  deserializeJson(sjdoc, buf);
    +  //  int intval = sjdoc["intval"];
    +  //  const char* str = sjdoc["string"];
    +}
    +
    +
    +
    +
    +
    +

    トピック名とワイルドカード

    +

    サブスクライブするときのトピック名には、ワイルドカードが指定できます。例えば、 office/+ +と指定すると、 office/temp にも office/humid にもマッチします。参考:MQTT の仕様

    +
    +
    +

    mosquitto コマンド例

    +

    mosquitto は、オープンソースのMQTT Broker/Client 実装の1つです。参考までに、mosquitto クライアントを使用するコマンド例を示します。:

    +
    #(パブリッシュ。retainなし: -m "メッセージ" )
    +   mosquitto_pub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp -m "data or message"
    +#(パブリッシュ。retainあり: -r )
    +   mosquitto_pub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp -m "data or message" -r
    +#(retainデータを削除。-n : send a null (zero length) message.)
    +   mosquitto_pub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp -n -r
    +#(サブスクライブ)
    +   mosquitto_sub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp
    +
    +
    +

    3つ目の例に示すように、長さ0の非retainデータを送信すると、retainデータを削除できます。

    +
    +
    +
    +

    Bluetooth Serial Protocol Profile (SPP)

    Bluetooth Low Energy

    アドバータイズ

    -
    -

    Bluetooth Serial Protocol Profile (SPP)

    -

    Preference

    -
    -

    電力制御

    +
    +

    電力制御

    -
    -

    その他

    +
    +

    その他

    • CO2 (CCS811)
    • RCS-620S (Felica)
    • @@ -1174,12 +2453,6 @@
    • OTA
    -
    -

    参考リンク

    - -
    diff --git a/_build/html/week2.html b/_build/html/week2.html index 396d742..8720a6b 100644 --- a/_build/html/week2.html +++ b/_build/html/week2.html @@ -92,9 +92,13 @@ @@ -165,6 +169,17 @@

    2週目

    1週目で学んだことを活かして、組み合わせてみましょう。

    +
    +

    複数人で書いたプログラムを統合する

    +
      +
    • Arduino IDEでは、プログラムを複数のファイル(たとえば、main.ino / sub.ino / hoge.cpp / hoge.h ) に分割して記述することができます。複数ファイルに分割することで、関数定義を機能別にまとめることができ、管理しやすくなります。
    • +
    • Arduino IDEでは、プログラムを構成する、複数のファイル(スケッチブック)を、1つのフォルダに入れて管理します。(スケッチブックのことを、他のIDEでは「プロジェクト」と呼ぶ場合もある)
    • +
    • スケッチブックに別のファイル(hogehoge.ino) を追加するには、右上にあるシリアルモニタをひらくアイコンの、下の「▼」ボタンからメニューをひらき、「新規タブ」を選択し、ファイル名(拡張子.ino をのぞいた、hogehogeの部分のみ)を入力します。
    • +
    • スケッチブックをコピーしたいときは、内包するフォルダごとコピーしてください。その際、フォルダ名と、メインのソースコードファイル名(拡張子以外の部分)は、一致している必要があります。
    • +
    • 複数のファイルを置いたときの挙動について: ***.ino ファイルの内容は、単純にメインのタブ(フォルダ名と同じinoファイル)にマージされます。***.cpp***.c という拡張子でファイルを作成した場合は、***.h を作成する必要があります。参考:Properly using separate tabs with Arduino IDE
    • +
    • Git を利用すると、複数人で作業したファイルを統合しやすいです。
    • +
    +
    diff --git a/src/cds01.ino b/src/cds01.ino index 25b5a3b..539570c 100644 --- a/src/cds01.ino +++ b/src/cds01.ino @@ -8,6 +8,7 @@ // 注意点: https://lang-ship.com/reference/unofficial/M5StickC/Peripherals/ADC/ void setup() { + Serial.begin(115200); pinMode(PIN, ANALOG); // PINのモード設定 // https://lang-ship.com/blog/work/m5stickc-io/ } diff --git a/src/doget.js b/src/doget.js new file mode 100644 index 0000000..83d7899 --- /dev/null +++ b/src/doget.js @@ -0,0 +1,21 @@ +function doGet(e) { + var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); + var sheet = spreadsheet.getSheetByName('シート1'); + var now = new Date(); + var array = []; + array.push(now); + + for(var k in e['parameter']) { + array.push(k); + array.push(e['parameter'][k]); + } + var params = JSON.stringify(e); + array.push(params); + sheet.appendRow( array ); + + var lastRow = sheet.getLastRow(); + + var output = ContentService.createTextOutput(sheet.getRange(1,3).getValue()+" "+lastRow); + output.setMimeType(ContentService.MimeType.TEXT); + return output; +} \ No newline at end of file diff --git a/src/httpclient01.ino b/src/httpclient01.ino new file mode 100644 index 0000000..e2f9a83 --- /dev/null +++ b/src/httpclient01.ino @@ -0,0 +1,33 @@ +#include +#include + +const char* ssid = "**********"; +const char* password = "**********"; + +// 天気予報API https://weather.tsukumijima.net/ から、千葉の天気を取得 +const char* weatherapi_url = "http://weather.tsukumijima.net/api/forecast/city/120010"; + +void setup() { + Serial.begin(115200); + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { // 接続中... + delay(50); + Serial.print("."); + } + delay(1000); + + HTTPClient http; + http.begin(weatherapi_url); //HTTPでサーバに接続 + int httpCode = http.GET(); + if (httpCode > 0) { + Serial.println(httpCode); + if (httpCode == HTTP_CODE_OK) { + String payload = http.getString(); + Serial.println(payload); + } + } + http.end(); +} + +void loop() { +} \ No newline at end of file diff --git a/src/httpserver01.ino b/src/httpserver01.ino new file mode 100644 index 0000000..1d6e808 --- /dev/null +++ b/src/httpserver01.ino @@ -0,0 +1,84 @@ +#include + +const char* ssid = "**********"; +const char* password = "**********"; + +WiFiServer server(80); + +void setup() { + Serial.begin(115200); + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { // 接続中... + delay(50); + Serial.print("."); + } + String ip = WiFi.localIP().toString(); // m5デバイスのIPアドレス + Serial.printf("\nopen http://%s\n\n", ip.c_str() ); + + server.begin(); // Webサーバを開始 +} + +void loop() { + WiFiClient client = server.available(); + if (client) { + String req = "" ; + String tmp = "" , meth = "" ; + while (client.connected()) { // loop while the client's connected + if (client.available()) { // if there's bytes to read from the client, + char c = client.read(); // read a byte, then + req += c; + if (c == '\n') { // if the byte is a newline character + if (tmp.length() == 0) { // end of request, break while loop + break; + } else { //まだ継続 + if (tmp.startsWith("GET ") || tmp.startsWith("POST ") ) { + meth = tmp; + } + tmp = ""; + } + } else if (c != '\r') { // if you got anything else but a carriage return character, + tmp += c; // add it to the end of the currentLine + } + } + } // end of while + + Serial.println(meth); + if ( meth.startsWith("GET /") ) { + client.println("HTTP/1.1 200 OK"); // header (with response code) + client.println("Content-Type:text/plain"); + client.println(""); // HTTPでは、header と body の区切りは改行 + client.println(meth); + client.println("-- request --"); + client.println(req); + } + + if ( meth.startsWith("POST ") ) { + String post = ""; + char buf[257]; + int n; + while ((n = client.available()) > 0) { + if (n < 256) { + client.readBytes(buf, n) ; + buf[n] = 0 ; + } else { + client.readBytes(buf, 256) ; + buf[256] = 0 ; + } + } + post += buf ; + + client.println("HTTP/1.1 200 OK"); + client.println("Content-Type:text/plain"); + client.println(""); // HTTPでは、header と body の区切りは改行 + client.println(meth); + client.println("-- request --"); + client.println(req); + client.println("-- post data --"); + client.println(post); + } + // close the connection: + client.stop(); + Serial.println(" --- Client Disconnected."); + } + delay(100); +} \ No newline at end of file diff --git a/src/mqtt01pub.ino b/src/mqtt01pub.ino new file mode 100644 index 0000000..9a23cbb --- /dev/null +++ b/src/mqtt01pub.ino @@ -0,0 +1,70 @@ +// MQTT Publisher example +//#include +#include +// ライブラリで PubSubClient をいれておく +#include + +const char* ssid = "**********"; +const char* password = "**********"; + +const char* server = "mqtt.istlab.info"; +const int port = 1883; +// 注:学内ネットワークからは上記ポート番号に接続できない。 +const char* pubTopic = "office/temp"; //"ex1/groupXX/sensor"; +const char* mquser = "ex1"; +const char* mqpass = "***PASSWORD***"; +WiFiClient wifiClient; +char* clientid = "m5stickc01_00000001"; //デバイス個別に設定すればなんでもよい +PubSubClient mqttClient(wifiClient); // MQTT Client + +void setup() { + // M5.begin(); + Serial.begin(115200); + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { // 接続中... + Serial.print("."); + delay(200); + } + Serial.println( WiFi.localIP().toString() ); //取得したIPアドレス + // 参考:WiFiデバイスのMACアドレスを取得し、clientid として用いる + // (18行目のclientidの定義を変更し、char clientid[20]とするのがのぞましい) + // uint8_t mac[6]; + // esp_read_mac(mac, ESP_MAC_WIFI_STA); + // sprintf(clientid, "%02X:%02X:%02X:%02X:%02X:%02X", + // mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] ); + mqttClient.setServer(server, port); + + if (!mqttClient.connected()) { + Serial.println("Try (re)connecting..."); + reconnect(); + } +} + +void loop() { + // シリアルコンソールから書き込みがあれば, publishする + byte mbuf[100]; int pos = 0; + while (Serial.available()) { // ノンブロッキング + mbuf[pos] = Serial.read(); + pos++; + } + if (pos > 0) { + mbuf[pos-1] = 0; //改行をNULLに置き換える + Serial.println((char*)mbuf); + // ブローカにデータを送信する。最後のfalse を true にすると、retained になる。 + bool ret = mqttClient.publish(pubTopic, mbuf, pos-1, false); + if (!ret){ + Serial.println("publish failed."); + } + } + delay(10); +} + +void reconnect() { + while (!mqttClient.connected()) { + if (mqttClient.connect(clientid, mquser, mqpass)) { + Serial.println("Connected to MQTT Broker."); + } else { + Serial.printf("Connect Failed. state=%d", mqttClient.state()); + } + } +} \ No newline at end of file diff --git a/src/mqtt01sub.ino b/src/mqtt01sub.ino new file mode 100644 index 0000000..cce725d --- /dev/null +++ b/src/mqtt01sub.ino @@ -0,0 +1,83 @@ +// MQTT Subscriber example +// #include +#include +// ライブラリで PubSubClient をいれておく +#include +// ライブラリで ArduinoJson v6.xをいれておく。 +// (注意:Arduino_Json v0.1.0 は別物) +#include + +const char* ssid = "**********"; +const char* password = "**********"; + +const char* server = "mqtt.istlab.info"; +const int port = 1883; +// 注:学内ネットワークからは上記ポート番号に接続できない。 +const char* pubTopic = "office/temp"; // 例: ex1/groupXX/sensor +const char* mquser = "ex1"; +const char* mqpass = "***PASSWORD***"; +WiFiClient wifiClient; +char* clientid = "m5stickc01_00000001"; //デバイス個別に設定すればなんでもよい +PubSubClient mqttClient(wifiClient); // MQTT Client + +void setup() { +// M5.begin(); + Serial.begin(115200); + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { // 接続中... + Serial.print("."); + delay(200); + } + Serial.println( WiFi.localIP().toString() ); //取得したIPアドレス + // 参考:WiFiデバイスのMACアドレスを取得し、clientid として用いる + // (18行目のclientidの定義を変更し、char clientid[20]とするのがのぞましい) + // uint8_t mac[6]; + // esp_read_mac(mac, ESP_MAC_WIFI_STA); + // sprintf(clientid, "%02X:%02X:%02X:%02X:%02X:%02X", + // mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] ); + mqttClient.setServer(server, port); + mqttClient.setCallback(callback_on_subscribe); + + if (!mqttClient.connected()) { + Serial.println("Try (re)connecting..."); + reconnect(); + } + mqttClient.subscribe(pubTopic); + +} + +void loop() { + + mqttClient.loop(); // データがpublishされたら、callback_on_subscribe が呼ばれる + + delay(100); +} + +void reconnect() { + while (!mqttClient.connected()) { + if (mqttClient.connect(clientid, mquser, mqpass)) { + Serial.println("Connected to MQTT Broker."); + } else { + Serial.printf("Connect Failed. state=%d", mqttClient.state()); + } + } +} + +// データがPublishされたら、ここが実行される。(39行目でコールバック関数を設定しているため) +void callback_on_subscribe(char* topic, byte* payload, unsigned int len) { + char buf[100]; + Serial.print("Message arrived ["); + Serial.print(topic); + Serial.print("] "); + for (int i = 0; i < len ; i++) { + buf[i] = (char)payload[i]; + } + buf[len] = 0; + Serial.println(buf); + return; + // 参考:JSON Parsing example + // StaticJsonDocument<200> sjdoc; + // deserializeJson(sjdoc, buf); + // int intval = sjdoc["intval"]; + // const char* str = sjdoc["string"]; +} \ No newline at end of file diff --git a/src/ntp01.ino b/src/ntp01.ino new file mode 100644 index 0000000..1c32b99 --- /dev/null +++ b/src/ntp01.ino @@ -0,0 +1,30 @@ +#include + +const char* ssid = "**********"; +const char* password = "**********"; + +void setup() { + Serial.begin(115200); + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { // 接続中... + Serial.print("."); + } + char* ntpserver = "10.64.7.184"; // 学外なら、たとえば "ntp.nict.jp" + configTime(9 * 3600, 0, ntpserver);//GMTとの時差(秒), サマータイムで進める時間(秒) +} + +void loop() { + struct tm localTime; + char buf[30]; + getLocalTime(&localTime); + sprintf(buf, ">> %04d/%02d/%02d %02d:%02d:%02d", + localTime.tm_year + 1900, + localTime.tm_mon + 1, + localTime.tm_mday, + localTime.tm_hour, + localTime.tm_min, + localTime.tm_sec + ); + Serial.println(buf); + delay(1000); +} \ No newline at end of file diff --git a/src/regexp01.ino b/src/regexp01.ino new file mode 100644 index 0000000..5ac99bf --- /dev/null +++ b/src/regexp01.ino @@ -0,0 +1,25 @@ +#include +#include + +Dictionary *dict = new Dictionary(); // 辞書/ハッシュ。キー文字列→値 を保持するデータ構造 + +void match_callback (const char * match, // matching string (not null-terminated) + const unsigned int length, // length of matching string + const MatchState & ms) // MatchState in use (to get captures) +{ + char k [10]; // size must be large enough to hold captures + char v [10]; // size must be large enough to hold captures + ms.GetCapture(k, 0); + ms.GetCapture(v, 1); + dict->insert(k, v); // 辞書に追加 (たとえば、 red→120 を追加) +} // end of match_callback + +// たとえば、*cbuf = "red=120&green=255&blue=9" のような文字列を想定する +void param2dict(char *cbuf){ + MatchState ms (cbuf); //正規表現マッチャーの作成 + ms.GlobalMatch ("([a-z]+)=([0-9]+)", match_callback); // (key)=(value) で複数回マッチングする。match_callback は別関数。 + int r = dict->search("red").toInt(); // 辞書 dict + int g = dict->search("green").toInt(); + int b = dict->search("blue").toInt(); + int32_t bgcolor = (int(r * 31 / 255) << 11) | (int(g * 63 / 255) << 5) | (int(b * 31 / 255)); +} diff --git a/src/rtc01.ino b/src/rtc01.ino new file mode 100644 index 0000000..0d40192 --- /dev/null +++ b/src/rtc01.ino @@ -0,0 +1,64 @@ +#include +#include +// #include "time.h" + +#define USE_NTP 0 // NTPからRTCに時刻設定するなら1 + +void setRTCfromLT(struct tm lt) { + RTC_DateTypeDef DateStruct; + DateStruct.Year = lt.tm_year + 1900; + DateStruct.Month = lt.tm_mon + 1; + DateStruct.Date = lt.tm_mday; + DateStruct.WeekDay = lt.tm_wday; + M5.Rtc.SetData(&DateStruct); + + RTC_TimeTypeDef TimeStruct; + TimeStruct.Hours = lt.tm_hour; + TimeStruct.Minutes = lt.tm_min; + TimeStruct.Seconds = lt.tm_sec+1; + M5.Rtc.SetTime(&TimeStruct); +} + +void getRTC(char* buf) { + RTC_DateTypeDef DateStruct; + RTC_TimeTypeDef TimeStruct; + M5.Rtc.GetData(&DateStruct); + M5.Rtc.GetTime(&TimeStruct); + sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d", + DateStruct.Year, DateStruct.Month, DateStruct.Date, + TimeStruct.Hours, TimeStruct.Minutes, TimeStruct.Seconds + ); +} + +void setup() { + M5.begin(); + M5.Lcd.setRotation(3); + Serial.begin(115200); + + if (USE_NTP) { + const char* ssid = "**********"; + const char* password = "**********"; + const char* ntpserver = "10.64.7.184"; // "ntp.nict.jp" + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { // 接続中... + Serial.print("."); + } + configTime(9 * 3600, 0, ntpserver); + + struct tm localTime; + while (localTime.tm_year < 80) { + getLocalTime(&localTime); delay(50); + } + setRTCfromLT(localTime); + } +} + +void loop() { + char buf[30]; + getRTC(buf); // bufに、日時文字列を書き込む + Serial.println(buf); + M5.Lcd.fillScreen(BLUE); + M5.Lcd.setCursor(0, 50, 4); + M5.Lcd.println(buf); + delay(1000); +} \ No newline at end of file diff --git a/src/telnet01.ino b/src/telnet01.ino new file mode 100644 index 0000000..2576bfb --- /dev/null +++ b/src/telnet01.ino @@ -0,0 +1,130 @@ +// オリジナルのWifiTelnetToSerial を、改変しました。 +/* + WiFiTelnetToSerial - Example Transparent UART to Telnet Server for ESP32 + + Copyright (c) 2017 Hristo Gochkov. All rights reserved. + This file is part of the ESP32 WiFi library for Arduino environment. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#include +#include + +WiFiMulti wifiMulti; + +//how many clients should be able to telnet to this ESP32 +#define MAX_SRV_CLIENTS 3 +const char* ssid = "**********"; +const char* password = "**********"; + +WiFiServer server(23); +WiFiClient serverClients[MAX_SRV_CLIENTS]; + +void setup() { + Serial.begin(115200); + Serial.println("\nConnecting"); + + wifiMulti.addAP(ssid, password); + // wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); + // wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); + + Serial.println("Connecting Wifi "); + for (int loops = 10; loops > 0; loops--) { + if (wifiMulti.run() == WL_CONNECTED) { + Serial.println(""); + Serial.print("WiFi connected "); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); + break; + } + else { + Serial.println(loops); + delay(1000); + } + } + if (wifiMulti.run() != WL_CONNECTED) { + Serial.println("WiFi connect failed"); + delay(1000); + ESP.restart(); + } + + //start UART and the server + // Serial2.begin(9600); + server.begin(); + server.setNoDelay(true); + + Serial.print("Ready! Use 'telnet "); + Serial.print(WiFi.localIP()); + Serial.println(" 23' to connect"); +} + +void loop() { + uint8_t i; + if (wifiMulti.run() == WL_CONNECTED) { + //check if there are any new clients + if (server.hasClient()) { + for (i = 0; i < MAX_SRV_CLIENTS; i++) { + //find free/disconnected spot + if (!serverClients[i] || !serverClients[i].connected()) { + if (serverClients[i]) serverClients[i].stop(); + serverClients[i] = server.available(); + if (!serverClients[i]) Serial.println("available broken"); + Serial.print("New client: "); + Serial.print(i); Serial.print(' '); + Serial.println(serverClients[i].remoteIP()); + break; + } + } + if (i >= MAX_SRV_CLIENTS) { + //no free/disconnected spot so reject + server.available().stop(); + } + } + //check clients for data + for (i = 0; i < MAX_SRV_CLIENTS; i++) { + if (serverClients[i] && serverClients[i].connected()) { + if (serverClients[i].available()) { + //get data from the telnet client and push it to the UART + while (serverClients[i].available()) Serial.write(serverClients[i].read()); + } + } + else { + if (serverClients[i]) { + serverClients[i].stop(); + } + } + } + //check ==UART== => Serial for data + if (Serial.available()) { + size_t len = Serial.available(); + uint8_t sbuf[len]; + Serial.readBytes(sbuf, len); + //push UART data to all connected telnet clients + for (i = 0; i < MAX_SRV_CLIENTS; i++) { + if (serverClients[i] && serverClients[i].connected()) { + serverClients[i].write(sbuf, len); + delay(1); + } + } + } + } + else { + Serial.println("WiFi not connected!"); + for (i = 0; i < MAX_SRV_CLIENTS; i++) { + if (serverClients[i]) serverClients[i].stop(); + } + delay(1000); + } +} \ No newline at end of file diff --git a/src/wifi01.ino b/src/wifi01.ino new file mode 100644 index 0000000..dde2180 --- /dev/null +++ b/src/wifi01.ino @@ -0,0 +1,32 @@ +#include +#include + +const char* ssid = "**********"; +const char* password = "**********"; + +void setup() { + M5.begin(); + M5.Lcd.setRotation(3); + M5.Lcd.fillScreen(ORANGE); + M5.Lcd.setCursor(10, 50, 4); + + WiFi.begin(ssid, password); // 接続開始 + while (WiFi.status() != WL_CONNECTED) { // 接続中... + M5.Beep.tone(2000); delay(200); + M5.Beep.mute(); delay(300); + M5.Lcd.print("."); + } + // 接続完了!! + M5.Beep.tone(4000); + M5.Lcd.fillScreen(GREEN); + M5.Lcd.setCursor(0, 40, 4); + M5.Lcd.setTextColor(BLACK, GREEN); + M5.Lcd.print(" Wifi Connected!\n "); + String gotip = WiFi.localIP().toString(); // m5デバイスのIPアドレス + M5.Lcd.println(gotip); + delay(1500); + M5.Beep.mute(); +} + +void loop() { +} \ No newline at end of file diff --git a/week1.rst b/week1.rst index 0e5b181..e5b6e0f 100755 --- a/week1.rst +++ b/week1.rst @@ -1,3 +1,7 @@ +.. |br| raw:: html + +
    + 1週目 ======================== @@ -6,10 +10,10 @@ 電源の切り方・入れ方 ---------------------------------------- -- 電源を切るには、電源ボタン(M5と書かれたAボタンの左側面)を、6秒間長押しします。 - 電源を入れるには、電源ボタンを、2秒間長押しします。 -- `M5StickCガイド `_ の、4ページ目、ハードウェアの概要が参考になります。 - +- 電源を切るには、電源ボタン(M5と書かれたAボタンの左側面)を、6秒間長押しします。その際、プログラムによっては再スタートしたように見える場合がありますが、気にせずに長押し継続してください。 +- 動画をみる→ https://youtu.be/Lo1jZbAeT8Y +- `M5StickCガイド `_ の、4ページ目、ハードウェアの概要も参考になります。 プログラムの書き込み方 -------------------------------------- @@ -25,6 +29,7 @@ - ``#include `` は、M5StickC用のコードです。 **M5StickCPlus** では、``#include `` に変更しないと、表示がおかしくなることがあります。 - 大文字と小文字は厳密に区別されます。 - 画面をつかうプログラムを書き込んだあと、画面を使わないプログラムを書き込むと、前のプログラムの画面が残ることがあります。 +- スケッチブック(プログラムを構成する、複数のソースコードを含むファイル、他のIDEではプロジェクトと呼ぶ場合もある)をコピーしたいときは、内包するフォルダごとコピーしてください。その際、フォルダ名と、メインのソースコードファイル名(拡張子以外の部分)は、一致している必要があります。 Serial通信 --------------------------------------- @@ -108,7 +113,7 @@ :linenos: .. :emphasize-lines: 10-14 -.. note:: 参考:https://qiita.com/nnn112358/items/ea6b5e81623ba690343c +.. note:: `変数の型一覧 `_ uint16_t は unsigned int 16bit type の略です。 |br| 参考:`M5StackのLCDディスプレイの色をRGBで指定する。 `_ ブザー(Beep) @@ -147,7 +152,7 @@ 外部のLED等を接続 ----------------------------------------- -外部のLED等は、 G0, G25, G26 に接続します。 +外部のLED等は、 G0, G25, G26 に接続します。(GROVE端子のG32, G33も利用できます。) サンプルプログラムは、:numref:`led01` と同様です。PIN 番号を、0 / 25 / 26 に変更してください。 ブレッドボードに、抵抗とLEDを直列に接続します。 @@ -179,7 +184,7 @@ サーボモータ(サーボハット利用) ------------------------------------------------------------- -:numref:`servohat01` は、`サーボハット `_ のサーボモータを動かすサンプルです。サーボモータの制御はPWMですので、基本的に、上のPWMとやっていることは同じです。おまけとして、LEDも点灯させました。``map関数`` は、Arduinoで使える関数で、範囲に対応する値を変換するときに使います。ここでは、サーボ制御で用いる5〜33の値を、LED制御の値0〜256に変換しています。 +:numref:`servohat01` は、`サーボハット `_ のサーボモータを動かすサンプルです。サーボモータの制御はPWMですので、基本的に、上のPWMとやっていることは同じです。おまけとして、LEDも点灯させました。``map関数`` は、Arduinoで使える関数で、範囲に対応する値を変換するときに使います。ここでは、サーボ制御で用いる5〜33の値を、LED制御の値0〜256に変換しています。 .. literalinclude:: src/servohat01.ino :caption: @@ -190,13 +195,13 @@ -外部のセンサを接続 (ADC) +アナログセンサを接続 (ADC) ----------------------------------------- ADCは、Analog to Digital Converter の意味です。 ``analogRead(PIN)`` は、PIN番ピンの電圧(0~3.3V)を、0〜4095 の値で返します。一般に、抵抗値が変化するタイプのセンサは、この方法をつかって、読み取ることができます。 -.. warning:: `ADC `_ にかいてあるように、G26, G32, G33, G36のみ使えます。G26は、無線利用時には使えません。 +.. warning:: `ADC `_ にかいてあるように、G26, G32, G33, G36のみ使えます。G26は、無線利用時には使えません。 :numref:`cds01` はCdSセル(照度センサ) の値を読み取るサンプルです。 @@ -233,15 +238,17 @@ 信号の読み取り ~~~~~~~~~~~~~~~~~~~~~ -赤外線リモコン受信モジュールが必要です。ここでは、`GP1UXC41QS `_ を前提に、話をすすめます。 +赤外線リモコン受信モジュールが必要です。ここでは、`GP1UXC41QS `_ を前提に、話をすすめます。 また、準備として、ライブラリマネージャにて、IRremoteESP8266 をインストールします。ちなみに、テストしたバージョンは2.7.15でした。 +.. note:: ライブラリマネージャは、「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理…」で、ひらきます。 + ファイルメニュー → スケッチ例 → IRremoteESP8266 → IRrecvDumpV2 を選択します。 -ブレッドボードに、以下の図のように配線します。Pとかいてある面が、受光器が出っ張っている面です。47Ωの抵抗を、5Vとの間に入れます。 +ブレッドボードに、以下の図のように配線します。Pとかいてある面が、受光器が出っ張っている面だとおもってください。47Ωの抵抗を、5Vとの間に入れます。 赤外線リモコン受信モジュールに接続したピンを ``const uint16_t kRecvPin = 36;`` として設定します。 -受光器にリモコンを向けて、ボタンを押すと、シリアルモニタに情報が表示されます。ここでは、Protocol : NEC , Code 0x2FD48B7 (32 Bits) と表示されたとします。 +受光器にリモコンを向けて、ボタンを押すと、シリアルモニタに情報が表示されます。ここでは、Protocol : NEC , Code 0x2FD48B7 (32 Bits) と表示されたとします。この数値(uint32_t)を覚えておきます。 .. figure:: images/ir_sensor_47owm.png :scale: 60% @@ -254,6 +261,8 @@ 内蔵の赤外LED光はあまり強くないため、50cm程度まで近づかないと反応しない場合があります。 単体の赤外LEDを接続して用いると、距離を伸ばすことができます。 +なお、NECフォーマットではない赤外線リモコンの通信フォーマットについては、 `赤外線リモコンの通信フォーマット `_ や、スケッチ例を参考にしてください。 + .. literalinclude:: src/irsend01.ino :caption: :name: irsend01 @@ -282,25 +291,189 @@ .. :emphasize-lines: 6-7, 15,19 - - - Wifi 接続 -------------------------------------- +:numref:`wifi01` は、Wifi接続のサンプルです。``ssid`` と ``password`` には、環境にあわせたものを入力してください。接続すると、m5デバイスのIPアドレスを画面に表示します。本当にWifi接続できたかどうかを、PCのターミナルからpingを打つなどして、確認してみましょう。(Windowsの場合、コマンドプロンプトをひらき、ping のあとに、半角スペースと、確認したいIPアドレスを入れます) + +.. literalinclude:: src/wifi01.ino + :caption: + :name: wifi01 + :language: arduino + :linenos: + :emphasize-lines: 4-5,13-18 + +Wifi接続するだけでは、あまり意味がないので、Telnetサーバを起動する例を :numref:`telnet01` に示します。 +シリアルモニタを開いて、IPアドレスを確認したら、ターミナル(コマンドプロンプト)で、``telnet IPaddr`` と入力して、接続します。 +telnet から文字を入力すると、シリアルモニタに表示されます。 +逆に、シリアルモニタから文字を入力すると、Telnet接続しているターミナルに、文字が表示されます。 +``WiFiServer server(23)`` で、23番ポートで待ち受けるサーバを、作成しています。 +ちなみに、``WiFiMulti`` は、複数のアクセスポイントに対して、Wifi接続を試みることができる機能(クラス)です。ただし、最終的に繋がるのは1つのアクセスポイントになります。 + +.. note:: Telnet接続を切断するときは、まずControlキーをおしながら ``]`` をおしてください。プロンプトが ``telnet>`` と表示されますので、``quit`` と打ち込むと終了します。 ``Escape character is '^]'.`` の ``^`` は、Controlキーのことです。 + +.. literalinclude:: src/telnet01.ino + :caption: + :name: telnet01 + :language: arduino + :linenos: + :emphasize-lines: 29-30, 32 + NTPサーバ (Network Time Protocol) と時刻の取得 ----------------------------------------------------------------------------------------------------------------------------------- +M5StickCPlusには、システム時間(localTime)と、RTC(リアルタイムクロック:時計の機能を備えたICのこと)の2種類の時計があります。システム時間は、システムリセット(再起動)のたびに、時刻もリセットされますが、後者のRTCはリセットされません。 +:numref:`ntp01` に、NTPサーバを使ってシステム時間の修正をしたのち、システム時間を1秒ごとに取得して、シリアルモニタに表示する例を示します。こちらは、M5のライブラリは不要です。configTime()でNTPサーバを設定しておくと、1時間に1回、NTPサーバに接続して、時刻修正します。 + +.. literalinclude:: src/ntp01.ino + :caption: + :name: ntp01 + :language: arduino + :linenos: + :emphasize-lines: 13 + +.. warning:: configTime() を行わない状況で、システム時間(localTime)を取得しようとすると、取得に数秒ほど時間がかかります。 + +:numref:`rtc01` は、RTCの時刻を表示するサンプルです。なお、5行目で ``USE_NTP`` に 1 が設定してあれば、RTCに時刻を設定します。常時Wifiネットワークに接続できない場合は、RTCを利用することが望ましいです。 + +.. literalinclude:: src/rtc01.ino + :caption: + :name: rtc01 + :language: arduino + :linenos: + :emphasize-lines: 5 + +.. note:: RTCに一旦時刻を設定しておくと、初期状態で書き込まれているプログラムFactoryTest の「BMP8563 RTC Time」でも、その時刻が表示されるようになります。 WebClient --------------------------------------- +:numref:`httpclient01` は、HTTP通信で天気予報Web APIに接続するサンプルです。HTTPClientクラスを用いると、ブラウザでURLを指定してWebページを開くように、WebサーバにGETメソッドやPOSTメソッドでリクエストを送信して、ステータスコードやレスポンスを取得することができます。このサンプルでは、シリアルコンソールに、天気予報をJSON形式で表示します。JSON(ジェイソン)とは、Javascriptのオブジェクトの形式でデータを表現する記法です。 + + +.. literalinclude:: src/httpclient01.ino + :caption: + :name: httpclient01 + :language: arduino + :linenos: +.. :emphasize-lines: 5 + +.. warning:: https (SSL) 通信をする場合は、スケッチ例→HTTPClient→BasicHttpsClient を参照して、WiFiClientSecure クラスを使用してください。 + +Google Spreadsheet にデータを送信する +-------------------------------------------------------- + +HTTP通信で、サーバにデータを送信して格納したいとおもっても、適当なサーバを準備するのは手間がかかることがあります。 + +Google Apps Scriptを用いると、HTTP通信で Google Spreadsheet にデータを書き込んだり、読み取ったりするWebサービスを作成し、WebAPIとして公開することができます。 + +(Google Spreadsheetのメニューで) 拡張機能→Apps Script または、ツール→スクリプトエディタ で、:numref:`doget` を「コード.gs」に書き込みます。15行目で「シート1」の一番下の行に、配列array の要素を追加します。19行目のgetRange(1,3).getValue()は、スプレッドシートのC1(3列1行)の値を取得しています。ここに「=average(C2:C200)」のようにしておくと、データの平均値を取得することもできます。 + +作成した「コード.gs」について、「公開」→「ウェブアプリケーションとして導入...」で、Webアプリとして公開できます。(なお、「新しいエディタ」では表示が異なるため、できない可能性があります。) + +作成できたかどうかをパソコンから確認するには、コマンドラインから、以下のように入力します(ただし、curlが必要です。val1=10 と val2=20 のあいだは&記号ですので、シェルでバックグラウンド処理されないように、URLをシングルクォートで囲っています) :: + + curl -L 'https://script.google.com/macros/s/XxXxXxXxXx/exec?val1=10&val2=20' + + +.. literalinclude:: src/doget.js + :caption: + :name: doget + :language: javascript + :linenos: + :emphasize-lines: 14 + + WebServer ---------------------------------------- +すこし長いですが、:numref:`httpserver01` は、80番ポートでHTTPでの通信を待ち受け(listenし)て、クライアントからの接続情報(ヘッダ情報)を返すWebサーバのシンプルな例です。クライアント(ブラウザ)からのリクエスト行のうち、 ``GET`` または ``POST`` ではじまる行があれば、変数 ``meth`` に格納します。つまり、変数 ``meth`` には、ブラウザで発行したリクエストのURLが含まれることになります。POSTメソッドで送信されていれば、リクエストボディに記述されたデータを変数 ``post`` に格納します。 クライアント(ブラウザ)に返す「レスポンス」は、 ``client.println()`` で送信します。最後に、``client.stop()`` で、サーバ側から接続を切断します。 + +.. literalinclude:: src/httpserver01.ino + :caption: + :name: httpserver01 + :language: arduino + :linenos: + :emphasize-lines: 18,22,26,43,80 + +センサデータを返すだけなら問題ありませんが、クライアントからのデータを GET / POST で受信して処理する場合は、 ``key1=val1&key2=val2`` のような文字列を要素に分解する必要がでてきます。あまり深入りしませんが、正規表現で文字列を照合・抽出する ``Regexp`` や、抽出した結果をハッシュ/辞書として保存する ``Dictionary`` ライブラリを導入すると、複雑なリクエストやデータを扱いやすくなるでしょう。 +:numref:`regexp01` に、RGBの色指定文字列などのリクエスト文字列をパースして辞書に追加するプログラムの断片を示します。**注意:このプログラムは、単体では動作しません** + +.. literalinclude:: src/regexp01.ino + :caption: + :name: regexp01 + :language: arduino + :linenos: + + +MQTT +------------------------------------------- + +MQTT(Message Queue Telemetry Transport) は、センサデータをデバイス間で共有・流通させるときなどに使われる、軽量のメッセージ送受信プロトコルです。 +ここで、「軽量」とは、HTTPに比べて、ヘッダ部分のデータが少ない、という意味です。 +MQTTでは、サーバのことを「ブローカ」と呼びます。ここでは、データを送信するPublisherと、データを受信するSubscriberの2つのデバイスと、ブローカの3つの構成要素で説明します。 + +Publisherは、ブローカに接続しデータを送信します。このとき、 **「トピック」** と呼ばれる、データの登録先を文字列で指定します。また、retainデータとして送信するかどうかも指定します。retainとは「保持・維持」の意味で、最後に送ったデータをブローカに残しておきたい場合、rateinデータとします。 +Subscriberは、ブローカに接続し、トピックをサブスクライブ(購読)します。このとき、トピックに書き込まれているretainデータがあれば、最初にそのデータを受信します。retainデータがなければ、Publisherが新しいデータをトピックに送信したタイミングで、データを受信します。 +このような通信手段(プロトコル)を、パブリッシュ/サブスクライブモデル と呼びます。`参考サイト: +IoT初心者向け!「MQTT」について簡単にまとめてみる `_ + + +MQTT Publish +~~~~~~~~~~~~~~~~~~~~~~~~ + +:numref:`mqtt01pub` は、MQTT Publisherのサンプルです。実験用ブローカ(mqtt.istlab.info)に接続して、 ``office/temp`` というトピックにデータ(シリアルコンソールで送信した文字列)を書き込みます。 **パスワードはここには書けませんので、講義ポータル資料を参照してください。** + + +.. literalinclude:: src/mqtt01pub.ino + :caption: + :name: mqtt01pub + :language: arduino + :linenos: + + +MQTT Subscribe +~~~~~~~~~~~~~~~~~~~~~~~~ + +:numref:`mqtt01sub` は、MQTT Subscriberのサンプルです。実験用ブローカ(mqtt.istlab.info)に接続して、 ``office/temp`` というトピックを購読します。 **パスワードはここには書けませんので、講義ポータル資料を参照してください。** JSON形式のデータを処理するときは、ArduinoJsonをつかってパージング/deserialize すると便利です(78行目以降にサンプルがあります)。 + +.. literalinclude:: src/mqtt01sub.ino + :caption: + :name: mqtt01sub + :language: arduino + :linenos: + :emphasize-lines: 38-39 + +トピック名とワイルドカード +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +サブスクライブするときのトピック名には、ワイルドカードが指定できます。例えば、 ``office/+`` +と指定すると、 ``office/temp`` にも ``office/humid`` にもマッチします。`参考:MQTT の仕様 `_ + + +mosquitto コマンド例 +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +mosquitto は、オープンソースのMQTT Broker/Client 実装の1つです。参考までに、mosquitto クライアントを使用するコマンド例を示します。:: + + #(パブリッシュ。retainなし: -m "メッセージ" ) + mosquitto_pub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp -m "data or message" + #(パブリッシュ。retainあり: -r ) + mosquitto_pub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp -m "data or message" -r + #(retainデータを削除。-n : send a null (zero length) message.) + mosquitto_pub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp -n -r + #(サブスクライブ) + mosquitto_sub -h mqtt.istlab.info -u ex1 -P PASS -t office/temp + +3つ目の例に示すように、長さ0の非retainデータを送信すると、retainデータを削除できます。 + + + +Bluetooth Serial Protocol Profile (SPP) +-------------------------------------------- Bluetooth Low Energy -------------------------------------- @@ -308,10 +481,6 @@ アドバータイズ -Bluetooth Serial Protocol Profile (SPP) --------------------------------------------- - - Preference ------------------------------------------- @@ -328,7 +497,3 @@ - RTC(BM8563) - OTA -参考リンク ------------------------------------------- - -- M5StickC非公式日本語リファレンス \ No newline at end of file diff --git a/week2.rst b/week2.rst index e0c1731..b454a9d 100755 --- a/week2.rst +++ b/week2.rst @@ -3,3 +3,15 @@ 1週目で学んだことを活かして、組み合わせてみましょう。 + +複数人で書いたプログラムを統合する +------------------------------------------------------------------------------ + +- Arduino IDEでは、プログラムを複数のファイル(たとえば、main.ino / sub.ino / hoge.cpp / hoge.h ) に分割して記述することができます。複数ファイルに分割することで、関数定義を機能別にまとめることができ、管理しやすくなります。 +- Arduino IDEでは、プログラムを構成する、複数のファイル(スケッチブック)を、1つのフォルダに入れて管理します。(スケッチブックのことを、他のIDEでは「プロジェクト」と呼ぶ場合もある) +- スケッチブックに別のファイル(hogehoge.ino) を追加するには、右上にあるシリアルモニタをひらくアイコンの、下の「▼」ボタンからメニューをひらき、「新規タブ」を選択し、ファイル名(拡張子.ino をのぞいた、hogehogeの部分のみ)を入力します。 +- スケッチブックをコピーしたいときは、内包するフォルダごとコピーしてください。**その際、フォルダ名と、メインのソースコードファイル名(拡張子以外の部分)は、一致している必要があります。** +- 複数のファイルを置いたときの挙動について: ``***.ino`` ファイルの内容は、単純にメインのタブ(フォルダ名と同じinoファイル)にマージされます。``***.cpp`` や ``***.c`` という拡張子でファイルを作成した場合は、``***.h`` を作成する必要があります。`参考:Properly using separate tabs with Arduino IDE `_ +- Git を利用すると、複数人で作業したファイルを統合しやすいです。 + +