{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"オリジナルの作成:2015/11/03\n",
"\n",
"注意! ESP8266を単体で使うと、初期に書き込まれているプログラムを上書きし、ATコマンドが使えなくなります。 WiFiを使う場合には、ESP8266のWiFi用APIを使用することになります。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 0R-ESP8266を単体で使う\n",
"## ESP8266の使い方\n",
"ESP-WROOM-02に搭載されているESP8266は、単体としてもArduinoと同じように 使えることが以下のサイトに紹介されていました。\n",
"\n",
"- [技適済み格安高性能Wi-FiモジュールESP8266をArduinoIDEを使ってIoT開発する為の環境準備を10分でやる方法](http://qiita.com/azusa9/items/264165005aefaa3e8d7d)\n",
"\n",
"これに習って開発環境を整えてみます。\n",
"\n",
"### ArduinoIDEを整備\n",
"esp8266をArduinoIDEで開発できるようにコミュニティが活動されています。\n",
"\n",
"- https://github.com/esp8266/Arduino\n",
"\n",
"esp8266の開発には1.6.4のArduino IDEを使いました。\n",
"\n",
"- https://www.arduino.cc/en/Main/OldSoftwareReleases#previous\n",
"\n",
"開発環境には少し古い1.6.4-673-g8cd3697(2015/05/22版)のバージョンを使用します。 Arduino IDEを起動し、Arduino Preferrencesを起動し、 Additional Boards Manager URLs: に以下のURLをコピーしてください。\n",
"\n",
"```\n",
"http://arduino.esp8266.com/versions/1.6.4-673-g8cd3697/package_esp8266com_index.json\n",
"```\n",
"\n",
"ツール→Boards Managerを選択し、スクロールするとesp8266が表示されるので、 これをクリックし、Installボタンを押します。\n",
"\n",
"\n",
"\n",
"これで、ボードメニューの下に「Generic ESP8266 Module」が表示されますので、これを選択します。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ブレッドボードでLチカを試す\n",
"ESP8266のピン配置をCerevo TechBlogさんのブログから再度引用します。\n",
"\n",
"\n",
"\n",
"JP1は、GNDとIO0をショートさせてUART DownLoad Modeにします。 \n",
"\n",
"シリアルモジュールと USBシリアルモジュール との接続は、以下の通りです。RSTとシリアルのDTRの間に0.1μFのコンデンサーを入れ、 ArduinoIDEの書き込み時にリセットが掛かるようにします。\n",
"\n",
" | ESP-WROOM-02\t | USBシリアル | \n",
" |---|---|\n",
" | 12 TXD\t | RXD | \n",
" | 11 RXD\t | TXD | \n",
" | 15 RST | 0.1μF経由\tDTR | \n",
" \n",
"\n",
"\n",
"\n",
"### ESP8266のピン配置\n",
"ねむいさんのブログからESP-WROOM-02のピンの仕様を引用します。\n",
"\n",
"\n",
"\n",
"ESP8266用のArduinoについては、以下のマニュアルを参照できます。\n",
"\n",
"- https://github.com/esp8266/Arduino/blob/master/doc/reference.md\n",
"\n",
"ユーザが利用可能なピンは以下の通りです。\n",
"\n",
" | ESP-WROOM-02\t | Name\t | I/O\t | ArduinoIDE | \n",
" |---|---|---|---|\n",
" | 4\t | IO12\t | INPUT, OUTPUT, INPUT_PULLUP, PWM, SDA\t | 12 | \n",
" | 5\t | IO13\t | INPUT, OUTPUT, INPUT_PULLUP, PWM\t | 13 | \n",
" | 10\t | IO4\t | INPUT, OUTPUT, INPUT_PULLUP, PWM\t | 4 | \n",
" | 14\t | IO5\t | INPUT, OUTPUT, INPUT_PULLUP, PWM, SCL\t | 5 | \n",
" | 16\t | TOUT\t | AnalogIn (0 - 1.0V)\t | A0 | \n",
" | 17\t | IO16\t | INPUT, OUTPUT, INPUT_PULLDOWN_16,PWM\t | 16 | \n",
"\n",
"### バージョン1.6.5ではコンパイルできない\n",
"バージョンではMac OSX10.7.5でコンパイルすると以下の様なエラーがでましたので、 Arduino IDE1.6.4とesp8266の開発環境も1.6.4を使用します。\n",
"\n",
"\n",
"\n",
"```\n",
"/Users/ユーザ名/Library/Arduino15/packages/esp8266/tools/esptool/0.4.5/esptoolが139を返しました。\n",
"コンパイル時にエラーが発生しました。\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 定番LチカでI/Oをチェック\n",
"LEDと抵抗470Ωを直結してGNDに接続し、ESP-WROOM-02の5番ピン(Arduinoの13)に接続します。\n",
"\n",
"これで、サンプルプログラムBlinkをアップロードすれば、Lチカの完成です。\n",
"\n",
"上手く行ったら、以下のピンでも試してみてください。\n",
"\n",
"- 4: Arduinoの12\n",
"- 5: Arduinoの13(最初に確認済み)\n",
"- 10: Arduinoの4\n",
"- 14: Arduinoの5\n",
"- 17: Arduinoの16\n",
"\n",
"### 温度を測る\n",
"ESP-WROOM-02でのアナログリードについて、以下のサイトを参考にさせて頂きました。\n",
"\n",
"- http://qiita.com/azusa9/items/26e74e4e0d5773ce9c41\n",
"\n",
"注意:最初にリセットの配線をしていると、以下のSerialが正常に動作しません。 一度、LED点滅のテストが修了したら、リセットに使った配線は外して下さい。\n",
"\n",
"USBシリアルのリセットを外したので、スケッチを書き込む時には一度 USBシリアルを外してから行ってください。\n",
"\n",
"以下のスケッチでアナログ入力の値をみてみましょう。\n",
"\n",
"```C++\n",
"#include \n",
"extern \"C\" {\n",
"#include \"user_interface.h\"\n",
"}\n",
"\n",
"void setup() {\n",
" Serial.begin(9600);\n",
" Serial.println(\"start\");\n",
"}\n",
"\n",
"void loop() {\n",
" delay(1000);\n",
" int val = system_adc_read(); //analogRead(A0);\n",
" Serial.println(val);\n",
"}\n",
"```\n",
"\n",
"analogRead(A0)を使うと外れた値(918)が返ってきました。 これを上記サイトのsystem_adc_read()に替えると、実測値に近い値(259)が テスターの値が245.8mVで259/1023x1.0V=0.253Vと近い値が返されます。\n",
"\n",
"\n",
"\n",
"\n",
"### タクトスイッチを追加\n",
"次に、タクトスイッチを追加して、ボタンを押したときだけ温度を測るように 修正します。\n",
"\n",
"ブレッドボードに以下の様にタクトスイッチを追加します。 抵抗値は10KΩ、ESP-WROOM-02の10ピン(IO4)に接続します。\n",
"\n",
"\n",
"\n",
"タクトスイッチを押すと、シリアルモニタにLM35の読み取り値が表示されます。\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## IFTTTに温度を送る\n",
"準備が整ったで、LM35で読み取った温度をIFTTTに送ってみます。\n",
"\n",
"スケッチは、以下の通りです。\n",
"\n",
"```C++\n",
"#include \n",
"extern \"C\" {\n",
"#include \"user_interface.h\"\n",
"}\n",
"\n",
"#define ST_SSID \"SSID名\"\n",
"#define ST_PASSWD \"SSIDのパスワード\"\n",
"#define SERVER_NAME \"maker.ifttt.com\" \n",
"#define SERVER_PORT 80\n",
"\n",
"#define EVENT \"RecordLM35\"\n",
"#define SECRET_KEY \"ここにSECRET_KEYを入れてください\"\n",
"\n",
"int sw_pin = 4;\n",
"int led_pin = 13;\n",
"int lm35_value;\n",
"char buf[128];\n",
"WiFiClient client;\n",
"\n",
"void setup() {\n",
" Serial.begin(9600);\n",
" Serial.println(\"start\");\n",
" // ピンの初期設定\n",
" pinMode(sw_pin, INPUT);\n",
" pinMode(led_pin, OUTPUT);\n",
" digitalWrite(led_pin, LOW);\n",
" // WiFiの設定\n",
" // WiFiクライアントモードに設定\n",
" WiFi.mode(WIFI_STA);\n",
" // WiFiへの接続\n",
" WiFi.begin(ST_SSID, ST_PASSWD);\n",
" // 接続が完了するまで、LEDを点滅\n",
" while (WiFi.status() != WL_CONNECTED) {\n",
" digitalWrite(led_pin, HIGH);\n",
" delay(500);\n",
" digitalWrite(led_pin, LOW);\n",
" delay(500);\n",
" }\n",
" // 接続が完了したら、LEDを点灯\n",
" digitalWrite(led_pin, HIGH);\n",
"}\n",
"\n",
"void loop() {\n",
" if (digitalRead(sw_pin) == LOW) {\n",
" Serial.println(\"SW pressed\");\n",
" // チャタリング防止\n",
" Serial.println(500);\n",
" lm35_value = system_adc_read(); //analogRead(A0);\n",
" int temp10 = (int)((lm35_value*1.0)/1023.0*1000); // 温度を0.1度までの整数に変換\n",
" sprintf(buf, \"temp=%d.%df\", temp10/10, temp10%10);\n",
" Serial.println(buf);\n",
" // \n",
" if (client.connect(SERVER_NAME, SERVER_PORT)) {\n",
" Serial.println(\"connected\");\n",
" // makerのIFTTTにイベントを送る\n",
" sprintf(buf, \"GET /trigger/%s/with/key/%s?value1=%d.%d HTTP/1.1\", EVENT, SECRET_KEY, temp10/10, temp10%10);\n",
" client.println(buf);\n",
" client.println(\"Host: maker.ifttt.com\");\n",
" client.println(\"Accept: */*\"); \n",
" client.println();\n",
" Serial.println(\"Request has sent!\");\n",
" } \n",
" } \n",
"}\n",
"```\n",
"\n",
"ルータへの接続確認のために、LEDも付けました。 単独で動かすときには、JP1の2と3ピンにジャンパーをセットします。 \n",
"\n",
"\n",
"\n",
"iPhoneには、IFTのイベントが発行されたとの通知が無事届きました。\n",
"\n",
""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 0
}