ESP-WROOM-02 と Blynk でLEDコントロール
過去に試しにやったものですが、完全に忘れてたので再度実施して備忘録を残したく候う。。。
ESP-WROOM-02 + #Blynk pic.twitter.com/S2OIQ8d6x9
— HomeMadeGarbage (@H0meMadeGarbage) 2016年2月10日
今回試したのは暗くなるとLEDが点滅して、色はスマホからコントロールできるものです。
CdSセルで光を感知してLED(Neopixel)の輝度をコントロールし、LED色はBlynkを用いてWiFi介してスマホから指定します。WiFiマイコンとしてESP-WROOM-02開発ボードを使用。
目次
ESP-WROOM-02開発ボード
人気のESP8266 WiFiモジュールとUSBシリアル変換ICが載った、まさに開発にうってつけの使いやすい基板です!
Arduino IDE環境設定方法
こちらの通りですので割愛w
Blynk
IoTでややこしくてネックになるサーバー設定や通信方式を意識しなくても色々出来てしまうのです(現状お父ちゃんはこのへんはお母ちゃんに丸投げです。。。)
基本フリーソフトですがプロジェクトにウィジェットを追加するたびBlynk Energyというものが減り0になった場合はプロジェクトやウィジェットを削除するか、課金してBlynk Energyを購入する必要があります。
設定方法
こちらの公式ページの通り
- スマホにアプリをインストール
- アプリ立上げログイン登録
- 以下でBlynk用ライブラリをダウンロードしArduinoのライブラリ保管場所に解凍
https://github.com/blynkkk/blynk-library/releases/tag/v0.3.4
これでArduino IDEメニュー[ファイル]->[スケッチの例]の中に”Blynk”が追加され開発が可能になりました。
Blynkアプリでプロジェクトを作成
- アプリを起動しCreate New Projectで新規プロジェクト作成
- Project Name指定(ここでは”ESP LED “)
- HARDWARE MODEL: “ESP8266″を選択
- AUTH TOKENをひかえる。E-mailタップで登録したアドレスにAUTH TOKENが届きます。
- Createクリックで初期設定終了
- 画面をタップしウィジェットを配置
ここではLEDの輝度を表示するValue Displayと色を指定するzeRGBaを配置
zeRGBaはシマウマをタップするとその部位の色のRGB値を返すウィジェットです。
ESP-WROOM-02の設定
LEDテープNeopixelは独自の1線シリアル方式で連なった各LEDのRGB値を設定し光らせます。
Arduino IDE用ライブラリは以下にあります。
https://github.com/adafruit/Adafruit_NeoPixel
ここでは20個のLEDを使用して色をBlynkで指定します。また乱数を用いてチラチラと瞬くようにしました。
CdSセルは光が当たると抵抗が減少する素子です。3.3Vを抵抗(5.1kohm)とCdSセルで分圧してアナログ入力できるTOUTピンに接続します。
以下のサイトの”ESP-WROOM-02でアナログ入力をするには”の通りTOUTピンには1V以上は入力できないため、1V以上にならないよう抵抗分圧してます。
Arduino IDE用コード
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 |
#define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <Adafruit_NeoPixel.h> //参考:http://deviceplus.jp/hobby/entry034/ //ESP-WROOM-02でアナログ入力をするために必要 extern "C" { #include "user_interface.h" } //Blynkアプリで取得したAuth Tokenを入力 char auth[] = "xxxxxx"; //WiFiのSSID、パスワード指定 char ssid[] = "xxxxxx"; char pass[] = "xxxxxx"; #define PIN 2 #define NUMPIXELS 20 Adafruit_NeoPixel pixels(NUMPIXELS, PIN); int ledR = 0; int ledG = 0; int ledB = 0; int bright; //LEDを乱数でチラチラさせる int lumMin = 30; float lum[20] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; unsigned long interval = 0; void setup() { Serial.begin(115200); Blynk.begin(auth, ssid, pass); pixels.begin(); pixels.setBrightness(45); pixels.show(); } //ZeRGBa入力時に実行される BLYNK_WRITE(V0) { ledR = param[0].asInt(); ledG = param[1].asInt(); ledB = param[2].asInt(); } void loop() { Blynk.run(); //光センスしLED全体の輝度指定 int val = system_adc_read(); //ここでTOUT(~1V)の値を取得 Serial.print("value: "); Serial.print(val); bright = map(val, 300, 1023, 0, 100); Serial.print( "bright: "); Serial.println(bright); pixels.setBrightness(bright); //輝度表示 Blynk.virtualWrite(V1, bright); //50msec毎に乱数で各LEDの輝度生成 if (millis() - interval > 50) { interval = millis(); for(int i=0;i<NUMPIXELS;i++){ lum[i] = (float)(random(lumMin, 101)/100.0); } } //LED表示 for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(ledR * lum[i], ledG * lum[i], ledB * lum[i])); //pixels.setPixelColor(i, pixels.Color(ledR, ledG, ledB)); } pixels.show(); } |
実行
Blynkアプリの再生ボタンをクリックでプロジェクト実行!
これ 別にわざわざWiFiじゃなくてBLEで十分なんだけど。。。
クリスマスになんかできそうかな 🙄 ?
まぁBlynk超便利ということで!
Blynkさん早くBLEも対応して—!!
追記(16/9/25)
現状まだベータ版ですがついにBLE対応されました!
これでスマホアプリ用コード書かなくても簡単にBLE搭載マイコンやラズパイを制御できます!
以下、試しに作ったものです。
Flood Error
loop内でデータ書き込みをすると接続エラーが出ることがあるらしい。1秒に10以上データをBlynkサーバーにあげないでほしいとのこと。
http://docs.blynk.cc/#troubleshooting-flood-error
悪い例
loop内でヴァーチャルピンにデータ送信をしており、大量にBlynkサーバにデータが送られofflineエラーになる可能性がある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> /Blynkアプリで取得したAuth Tokenを入力 char auth[] = "xxxxxx"; //WiFiのSSID、パスワード指定 char ssid[] = "xxxxxx"; char pass[] = "xxxxxx"; int i = 0; void setup() { Serial.begin(115200); Blynk.begin(auth, ssid, pass); } void loop() { Blynk.virtualWrite(V1, i++); //ヴァーチャルピン1にデータ送信 Blynk.run(); } |
良い例
delay()で遅延させてデータ量を制限するのは有効ではなく、改善するには BlynkTimer を使うべきらしい
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 |
#define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> BlynkTimer timer; //Blynkアプリで取得したAuth Tokenを入力 char auth[] = "xxxxxx"; //WiFiのSSID、パスワード指定 char ssid[] = "xxxxxx"; char pass[] = "xxxxxx"; int i = 0; void myTimerEvent() { // Please don't send more that 10 values per second. Blynk.virtualWrite(V1, i++); //ヴァーチャルピン1にデータ送信 } void setup() { Serial.begin(115200); Blynk.begin(auth, ssid, pass); //1秒ごとにデータ送信 timer.setInterval(1000L, myTimerEvent); } void loop() { Blynk.run(); timer.run(); } |
例では1秒(1000msec)にタイマーを設定しているがエラーが起きない程度に早めて使用するよう推奨されています。
ボードの設定はどのようにしましたか
以下のリンクのとおりにしました。
http://trac.switch-science.com/wiki/esp_dev_arduino_ide
blynkを実行するとdisconnectedになるのですが、Arduino IDE用コードそのままで実行できますか?
コメントありがとうございます。
古い記事なので心配になり試してみました。
Blynkスマホアプリ (Android): ver. 2.26.7
Blynk Arduinoライブラリ:ver 0.5.3
で記事内コードそのまま実行しましたが問題なく動作しました。
Blynkアプリで取得したAuth Tokenなどは正しくコードに記載されてますでしょうか?
確認ありがとうざいます。
コードは正しく記載しており、コネクトはするのですが、すぐにTrouble detected: http://docs.blynk.cc/#troubleshooting-flood-error
このようなエラーがシリアルモニターに表示をされつながったり切れたりしてしまいます。
このエラーからサイトに飛ぶと解決方法が記載されているのですがうまく組み込めずできていません。
もし解決方法をご存知でしたらお教えください。
ご教示ありがとうございます。
どうやらloop内でデータ送信を行わないほうが良いようですね。
このページにFlood Error テストの節を追加して、データ送信の悪い例と良い例を追記しました。
データ送信の際にはBlynkTimerを使用してサーバに大量にデータを送らないようにするべきのようです。
しかし、私の環境ではloop内でデータ書き込んでもエラーは再現できませんでした。
BlynkTimerの使用で改善ご確認いただければ幸いです。
追記していただきありがとうございます。
無事に通信することができました。
本当にありがとうございます。
これからも参考にさせていただきます。
ご確認ありがとうございます。
こちらこそ勉強になりました!
今後共宜しくお願い致します。