ガイド · 読了まで22分

Blynk×ESP32入門:スマートフォンからLED、リレー、センサーを操作する

Blynk×ESP32の入門ガイドです。テンプレートとデータストリーム(V0、V1)の作成、認証トークンの取得、LEDとリレーの操作、センサーデータのグラフ化、通知の送信、BlynkTimerの使い方を解説します。

BlynkとESP32の組み合わせは、スマートフォンアプリを自分で作らずに、世界中どこからでもボードを操作できるいちばんの近道です。Blynk IoTには、ESP32が接続するクラウドサーバー(Blynk.Cloud)、ドラッグ&ドロップでダッシュボードを作れるモバイルアプリ、そしてWebダッシュボードがそろっています。スマートフォンでスイッチをタップすると、指令はまずクラウドへ、そこからESP32へ届きます。ESP32が測った温度も同じ道をたどって戻り、スマートフォンに数値とグラフで表示されます。スマートフォンとボードが同じ家にある必要はなく、スマートフォンがモバイルデータ通信を使っていても動きます。

このガイドでは、動くプロジェクトを一から作ります。Blynk.Cloudのアカウントを作り、テンプレートとデータストリーム(V0、V1、V2、V3)を定義し、デバイスの認証トークン(Auth Token)を取得し、ライブラリをインストールして、スマートフォンからLEDとリレーを操作し、DHT11センサーのデータをグラフにし、温度が上がったらスマートフォンに通知が届くようにします。さらに、delay()を使ってはいけない理由と、代わりにBlynkTimerが何をするのか、無料プランのメッセージ上限の計算方法、古いBlynkのコードがコンパイルできない理由、よくある接続エラーの直し方も学びます。

Blynk IoTでスマートフォンから操作するESP32開発ボード
ESP32はWi-Fiを内蔵しているので、Blynk.Cloudに直接つながります。追加の無線モジュールはいりません。

Blynk IoTとは?その仕組み

Blynkでは、ESP32とスマートフォンが直接つながることはありません。どちらもBlynk.Cloudに接続し、サーバーがメッセージを運びます。ESP32は起動するとWi-Fiに接続し、続いてBlynkのサーバーに接続して、認証トークンで自分の身元を示します。データは仮想ピン(V0〜V255)を通って流れます。仮想ピンはESP32の実際の足ではなく、コードとアプリの間にある番号付きのデータ通信路です。アプリのスイッチがV1に1を書き込むと、コードのBLYNK_WRITE(V1)関数がそれを受け取ってリレーをオンにします。コードでBlynk.virtualWrite(V2, 24.5)を実行すると、スマートフォンのメーターが更新されます。構成要素は次のとおりです。

概念役割このガイドでの例
テンプレート(Template)同じ種類のデバイスに共通する設計図。データストリーム、ダッシュボード、イベントを含むESP32 Home
データストリーム(Datastream)仮想ピンに結びついたデータ通信路。型と範囲が決まっているV2:温度、Double、0〜50 °C
デバイス(Device)テンプレートから作った実際のボード。それぞれが自分のデータを持つリビングのESP32
認証トークン(Auth Token)デバイスの秘密の身分証。コードはこれを使ってクラウドに接続するBLYNK_AUTH_TOKENの行
ウィジェット(Widget)スイッチ、メーター、グラフなどのダッシュボードの部品Button、Gauge、SuperChart
イベント(Event)通知を送り、タイムラインに記録されるアラートyuksek_sicaklik(トルコ語で「高温」)

古いBlynkと新しいBlynk IoTの違い

インターネット上のBlynkの動画やスケッチの多くは、もう動かない旧バージョン(Blynk Legacy)向けに作られています。新しいプラットフォームは2021年5月に始まり、旧アプリは2022年6月にストアから消え、旧クラウドサーバーは2022年12月31日に完全に停止しました。そのため、古いプロジェクトのトークンや、かつて購入したエナジーポイント、blynk-cloud.comのアドレスは今では役に立たず、プロジェクトを新しいプラットフォームで作り直す必要があります。良い知らせもあります。ESP32のコードの大部分(BLYNK_WRITE、virtualWrite、BlynkTimer)は変わっていません。

項目旧Blynk(Legacy)Blynk IoT(新)
プロジェクトはどこで設定する?すべてスマートフォンアプリ内のプロジェクトでテンプレートとデータストリームはBlynk.Console(Web)で、ダッシュボードはスマートフォンとWebで
認証トークンプロジェクトごとに1つ、メールで届くデバイスごとに1つ、デバイスのページに表示される
料金体系ウィジェットをエナジーポイントで購入デバイス数、メッセージ数、機能に上限のある月額プラン
スケッチの先頭char auth[]の行だけBLYNK_TEMPLATE_ID、BLYNK_TEMPLATE_NAME、BLYNK_AUTH_TOKENが必須
通知Blynk.notify()とBlynk.email()テンプレートでイベントを定義し、Blynk.logEvent()で発生させる
サーバーblynk-cloud.com、ポート80または8080(停止済み)blynk.cloud、ポート80またはSSLの443
Webダッシュボードなしあり(Blynk.Console)
ローカルサーバーオープンソースのJavaサーバーを自前で動かせた個人用のローカルサーバーはなし。旧サーバーはもう更新されていない
古いサンプルを新しいライブラリでコンパイルすると、典型的な問題が三つ起きます。BLYNK_DEVICE_NAMEを使うスケッチは「Please specify your BLYNK_TEMPLATE_ID and BLYNK_TEMPLATE_NAME」(テンプレートIDと名前を指定してください)で失敗し、Blynk.notify()を含むスケッチは「'class BlynkWifi' has no member named 'notify'」(notifyというメンバーがない)で止まります。そしてBlynk.begin()にblynk-cloud.comを指定しているスケッチ(たいていポート8080付き)は、コンパイルは通っても決して接続できません。

部品リストと配線

このプロジェクトでは、ESP32開発ボード、5 Vリレーモジュール、DHT11温湿度センサー、必要に応じてLEDと220 Ωの抵抗、ブレッドボード、ジャンパーワイヤーを使います。LEDはGPIO 2にあるボード内蔵の青色LEDで十分です。外付けのLEDを使う場合は、LED抵抗計算ツールで抵抗値を求められます。ボードのピン配置もピン配置ツールで確認してください。ボードによって5 VのピンはVINと書かれていたり、5Vと書かれていたりします。

ESP32
ESP32
リレーモジュール
リレーモジュール
DHT11
DHT11
LED
LED
ブレッドボード
ブレッドボード
ジャンパーワイヤー
ジャンパーワイヤー
部品部品のピンESP32のピンメモ
LED(任意)長い足(+)GPIO 2220 Ωの抵抗を通す。短い足はGNDへ
リレーモジュールVCCVIN / 5VUSB給電時、このピンには約5 Vが出ている
リレーモジュールGNDGND共通GND
リレーモジュールINGPIO 26アクティブLOWのモジュールならコードでROLE_AKTIF_LOW = trueにする
DHT11VCC3V33.3〜5.5 Vで動く
DHT11DATAGPIO 4センサー単体なら10 kΩのプルアップ抵抗が必要。モジュールには搭載済み
DHT11GNDGND共通GND
ESP32のピンの出力は3.3 Vです。5 Vリレーモジュールの多くはこの信号で切り替わりますが、アクティブLOWのモジュールでは3.3 VのHIGHでリレーが完全に戻らないことがあります。リレーがいつまでもオフにならない場合は、3.3 Vトリガーのモジュールを使うか、間にNPNトランジスタを入れてください。リレーで230 Vの商用電源の負荷を切り替える場合(日本の商用電源は100V(50/60Hz)です)、配線は必ずプラグを抜いた状態で行い、むき出しの導体を残さず、大人に手伝ってもらってください。詳しくはリレーモジュールとは?を参照してください。

ステップ1:Blynk.Cloudのアカウントとテンプレートを作る

  1. パソコンでblynk.cloudにアクセスし、メールアドレスで無料アカウントを登録して、届いたメールのリンクからパスワードを設定します。
  2. 左のメニューでDeveloper Zone > My Templatesを開き、+ New Templateをクリックします。
  3. テンプレートに名前を付け(たとえばESP32 Home)、ハードウェアにESP32、接続方式にWiFiを選んでテンプレートを作成します。
  4. テンプレートのページに表示されるBLYNK_TEMPLATE_IDとBLYNK_TEMPLATE_NAMEの値はコードに入れます。今は場所だけ確認しておきましょう。
  5. 登録時にQuickstartウィザードが表示されたら、スキップして構いません。このガイドでは、各設定が何のためにあるのかがわかるように、すべてのステップを手作業で進めます。

ステップ2:データストリーム(V0、V1、V2、V3)を定義する

データストリームは仮想ピンの身分証です。どのピンか、データの型(整数ならInteger、小数ならDouble、文字列ならString)、最小値と最大値、単位、表示する小数点以下の桁数を決めます。テンプレートを編集モードで開き、Datastreamsタブで+ New Datastream > Virtual Pinを選んで、次の四つの通信路を作ります。

仮想ピン名前データ型最小〜最大単位と小数桁ウィジェット
V0LEDInteger0 – 1なしButton / Switch
V1リレーInteger0 – 1なしButton / Switch
V2温度Double0 – 50°C, #.#Gauge, SuperChart
V3湿度Double0 – 100%, #Gauge, SuperChart
MinとMaxの欄は飾りではありません。Blynkは範囲外の値を上限・下限に切り詰めます。温度のデータストリームのMaxを1のままにしておくと、センサーが24.5 °Cを読んでいてもダッシュボードには1と表示されます。ボードが再起動したときにスイッチを最後の状態に戻したい場合は、コードのBLYNK_CONNECTED()の中でBlynk.syncVirtual()を使います。または、データストリームの詳細設定でSync with latest server value(サーバーの最新値と同期)をオンにして、Blynk.syncAll()を呼びます。変更するたびに、テンプレートのSaveをクリックするのを忘れないでください。

ステップ3:デバイスを作って認証トークンを取得する

テンプレートは設計図、デバイスはそこから作られる実際のボードです。左のメニューでDevicesを開き、+ New Deviceをクリックし、From templateでESP32 Homeテンプレートを選んで、デバイスに名前を付けます。デバイスができると、BLYNK_TEMPLATE_ID、BLYNK_TEMPLATE_NAME、BLYNK_AUTH_TOKENの3行の設定が表示されます。この3行をコピーしておきましょう。あとからデバイスのページのDevice Info欄でも確認できます(画面のバージョンによってはDeveloper Toolsという名前です)。

認証トークンはデバイスのパスワードです。トークンを含むコードをフォーラムや公開のGitHubリポジトリに載せないでください。トークンを手に入れた人なら誰でも、リレーをオン・オフできてしまいます。トークンが漏れたら、デバイスを削除して作り直し、新しいトークンを取得します。ボードごとに専用のデバイスとトークンが必要です。同じトークンを2台のESP32に書き込むと、お互いを何度もオフラインに追い出し合います。

ステップ4:Arduino IDEにBlynkライブラリをインストールする

  1. Arduino IDEにESP32のボードパッケージをまだ入れていない場合は、先にインストールします。手順はESP32とは?にあります。
  2. ライブラリマネージャを開き、検索欄にBlynkと入力して、Volodymyr Shymanskyyによる公式のBlynkライブラリをインストールします。依存ライブラリについて聞かれたら全てをインストールを選びます。
  3. センサー用に、同じ場所からAdafruitのDHT sensor libraryと、それに必要なAdafruit Unified Sensorライブラリをインストールします。うまくいかないときはArduinoにライブラリを追加する方法のガイドを参照してください。
  4. 「ツール」>「ボード」でESP32 Dev Moduleを選び、データ通信用ケーブルでボードをつないで、正しいポートを選びます。
  5. ライブラリには既製のサンプルが付いています。「ファイル」>「スケッチ例」> Blynk > Boards_WiFi > ESP32_WiFiが、下の最初のスケッチのいちばんシンプルな形です。

最初のスケッチ:スマートフォンからLEDをオン・オフする(V0)

下のコードでは、先頭の3行をデバイスのページからコピーしたものに、Wi-Fiの名前とパスワードを自分のものに置き換えてください。この3行の#defineは#includeの行より前に置く必要があります。ライブラリはコンパイル時にこれらの値を探し、見つからなければコンパイルエラーになります。

C++ (Arduino IDE)
1// Bu üç satırı Blynk.Console'daki cihaz sayfasından kopyala / copy these three lines from the device page in Blynk.Console
2#define BLYNK_TEMPLATE_ID   "TMPLxxxxxxxx"
3#define BLYNK_TEMPLATE_NAME "ESP32 Ev"
4#define BLYNK_AUTH_TOKEN    "CihazTokeniniBurayaYapistir"
5
6#define BLYNK_PRINT Serial          // bağlantı günlüğünü Seri Monitör'e yaz / print the connection log to the Serial Monitor
7
8#include <WiFi.h>
9#include <WiFiClient.h>
10#include <BlynkSimpleEsp32.h>
11
12char ssid[] = "AgAdi";              // Wi-Fi adın (yalnız 2,4 GHz) / your Wi-Fi name (2.4 GHz only)
13char pass[] = "Sifre123";           // Wi-Fi şifren / your Wi-Fi password
14
15const int LED_PIN = 2;              // çoğu DevKit'te dahili LED / onboard LED on most DevKits
16
17// Uygulama V0'a her değer yazdığında çalışır / runs every time the app writes a value to V0
18BLYNK_WRITE(V0) {
19  int deger = param.asInt();        // anahtar: 0 ya da 1 / switch: 0 or 1
20  digitalWrite(LED_PIN, deger);
21  Serial.print("V0 = ");
22  Serial.println(deger);
23}
24
25// Buluta her bağlanışta son V0 değerini iste / ask for the last V0 value on every connection
26BLYNK_CONNECTED() {
27  Blynk.syncVirtual(V0);
28}
29
30void setup() {
31  Serial.begin(115200);
32  pinMode(LED_PIN, OUTPUT);
33  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);   // Wi-Fi'ye ve Blynk.Cloud'a bağlan / connect to Wi-Fi and Blynk.Cloud
34}
35
36void loop() {
37  Blynk.run();                      // gelen komutları işler, bağlantıyı canlı tutar / handles commands, keeps the link alive
38}
行役割
BLYNK_PRINT Serialライブラリが接続の各段階をシリアルモニタに表示するようになる。トラブル解決にとても便利
BLYNK_WRITE(V0)アプリやWebダッシュボードがV0に値を送ると自動で実行される関数
param.asInt()受け取った値を整数に変換する。小数ならasFloat()、文字列ならasStr()を使う
BLYNK_CONNECTED()接続に成功するたびに1回実行される
Blynk.syncVirtual(V0)V0の最後の値をサーバーに問い合わせるので、再起動後もLEDが前の状態に戻る
Blynk.begin(...)Wi-FiとBlynk.Cloudに接続する。接続できるまで待つ
Blynk.run()届いたコマンドを処理し、接続を保つ。loopの中で待ち時間なしに呼び続ける必要がある

コードを書き込み、シリアルモニタを115200ボーで開くと、「Connecting to AgAdi」「Connected to WiFi」、IPアドレス、「Connecting to blynk.cloud:80」、最後に「Ready (ping: 45ms).」といった行がこの順に表示されるはずです。Readyの行が出ると、Blynk.ConsoleでデバイスがOnlineと表示されます。最初の接続では「Redirecting to」で始まる行が出ることもあります。これはライブラリがアカウントのある地域のサーバーへ自動で切り替えているだけで、正常な動作です。

スマートフォンとWebのダッシュボードを作る

コードができたので、ボタンを配置しましょう。Blynkでは、モバイルのダッシュボードとWebのダッシュボードを別々にデザインします。どちらも同じデータストリームを使うので、片方で行った変更はすぐにもう片方にも表示されます。

  1. スマートフォンにBlynk IoTアプリ(旧BlynkやBlynk Legacyではないもの)をインストールし、同じアカウントでログインします。
  2. プロフィールのページでDeveloper Mode(開発者モード)をオンにし、Developer ZoneでESP32 Homeテンプレートをタップします。
  3. 空のキャンバスをタップしてウィジェットを追加します。V0とV1にはそれぞれButtonかSwitch、V2とV3にはGaugeかLabeled Value、履歴にはSuperChartを使います。
  4. 各ウィジェットをタップし、設定で対応するデータストリームを選びます。SuperChartにはV2とV3をまとめて追加できます。変更は自動で保存されます。
  5. Webダッシュボードは、Blynk.Consoleでテンプレートを編集し、Web Dashboardタブでウィジェットをドラッグ&ドロップして、各ウィジェットの歯車アイコンからデータストリームを選び、Saveをクリックします。
  6. アプリでデバイス名をタップしてスイッチを試してみましょう。GPIO 2のLEDがすぐに点灯し、シリアルモニタに「V0 = 1」と表示されるはずです。
Buttonウィジェットには二つのモードがあります。Switchモードではタップするたびに1と0が切り替わり、Pushモードでは押している間は1を、離すと0を送ります。照明やコンセントにはSwitchを、ドアベルやガレージのシャッターのように短いパルスが必要な用途にはPushを使います。

リレーとセンサー:BlynkTimerでdelay()を使わずに読み取る

Blynkの鉄則は「loop()にはBlynk.run()とtimer.run()だけを書く」ことです。loopにdelay(2000)を入れると、その間ESP32はスマートフォンからのコマンドを受け取れず、スイッチの反応が遅れます。待ち時間がとても長いと、サーバーはデバイスがオフラインだと判断します。さらに悪いことに、Blynk.virtualWrite()をloopに直接書くと、ESP32は1秒間に何百ものメッセージを送ろうとします。サーバーはデバイスを制限し、毎月のメッセージ枠もすぐに使い切ってしまいます。解決策はmillis()の考え方で動くBlynkTimerです。選んだ関数を選んだ間隔で呼び出し、その間loopは空いたままになります。この考え方はArduinoのmillis()とdelay()の違いで詳しく解説しています。

下のコードはV1でリレーを操作し、60秒ごとにDHT11で読み取った温度をV2へ、湿度をV3へ送り、温度が30 °Cを超えると通知イベントを発生させます。センサーの仕組みはDHT11温湿度センサーを参照してください。

C++ (Arduino IDE)
1#define BLYNK_TEMPLATE_ID   "TMPLxxxxxxxx"
2#define BLYNK_TEMPLATE_NAME "ESP32 Ev"
3#define BLYNK_AUTH_TOKEN    "CihazTokeniniBurayaYapistir"
4#define BLYNK_PRINT Serial
5
6#include <WiFi.h>
7#include <WiFiClient.h>
8#include <BlynkSimpleEsp32.h>
9#include <DHT.h>
10
11char ssid[] = "AgAdi";
12char pass[] = "Sifre123";
13
14const int ROLE_PIN = 26;            // röle modülünün IN pini / relay module IN pin
15const int DHT_PIN  = 4;             // DHT11 veri pini / DHT11 data pin
16const bool ROLE_AKTIF_LOW = true;   // çoğu modül LOW'da çeker / most modules switch on with LOW
17
18DHT dht(DHT_PIN, DHT11);            // DHT22 kullanıyorsan DHT22 yaz / write DHT22 if you use a DHT22
19BlynkTimer timer;                   // delay() yerine zamanlayıcı / a timer instead of delay()
20bool alarmGitti = false;            // aynı bildirimin tekrarını önler / stops the same alert repeating
21
22void roleYaz(bool acik) {
23  if (ROLE_AKTIF_LOW) digitalWrite(ROLE_PIN, acik ? LOW : HIGH);
24  else                digitalWrite(ROLE_PIN, acik ? HIGH : LOW);
25}
26
27// V1: uygulamadaki röle anahtarı / relay switch in the app
28BLYNK_WRITE(V1) {
29  roleYaz(param.asInt() == 1);
30}
31
32// Elektrik gidip gelince rölenin son durumunu geri al / restore the relay state after a power cut
33BLYNK_CONNECTED() {
34  Blynk.syncVirtual(V1);
35}
36
37// Zamanlayıcının çağırdığı fonksiyon / the function called by the timer
38void sensorGonder() {
39  float sicaklik = dht.readTemperature();
40  float nem = dht.readHumidity();
41  if (isnan(sicaklik) || isnan(nem)) {
42    Serial.println("DHT okunamadi / DHT read failed");
43    return;
44  }
45  Blynk.virtualWrite(V2, sicaklik);   // V2: sıcaklık (°C) / temperature (°C)
46  Blynk.virtualWrite(V3, nem);        // V3: nem (%) / humidity (%)
47
48  // 30 °C'yi geçince tek bildirim, 28 °C'nin altında yeniden kur / one alert above 30 °C, re-arm below 28 °C
49  if (sicaklik > 30.0 && !alarmGitti) {
50    Blynk.logEvent("yuksek_sicaklik", String("Sicaklik / Temp: ") + sicaklik + " C");
51    alarmGitti = true;
52  } else if (sicaklik < 28.0) {
53    alarmGitti = false;
54  }
55}
56
57void setup() {
58  Serial.begin(115200);
59  pinMode(ROLE_PIN, OUTPUT);
60  roleYaz(false);                   // açılışta röle kapalı / relay off at boot
61  dht.begin();
62  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
63  timer.setInterval(60000L, sensorGonder);   // 60 saniyede bir ölç ve gönder / measure and send every 60 seconds
64}
65
66void loop() {
67  Blynk.run();
68  timer.run();                      // loop'ta delay() ya da virtualWrite olmasın / no delay() or virtualWrite in loop
69}

timer.setInterval(60000L, sensorGonder)の行は、60,000ミリ秒ごとに関数を呼び出します。末尾のLは、その数値がlong型であることを示します。一度だけの処理、たとえばリレーをオンにして5秒後にオフにするといった場合はtimer.setTimeout()を使います。BlynkTimerのオブジェクト1つで最大16個のタイマーを持てるので、ほとんどのプロジェクトには十分です。isnan()のチェックは、センサーを読み取れなかったときに意味のないNaNの値がクラウドへ送られるのを防ぎます。alarmGittiフラグと、30 °Cと28 °Cという二つのしきい値の差(ヒステリシス)によって、温度が30 °C前後をうろうろしている間に読み取りのたびに新しい通知が届くのを防いでいます。

センサーデータをグラフに表示する

グラフにデータがたまるには二つの条件があります。ESP32がvirtualWriteでデータを送ること、そしてデータストリームが履歴を保存することです。データストリームの設定で履歴にLast Value(最新値のみ)を選んでいると、サーバーは最新の値しか保存せず、グラフは描かれません。グラフには1分ごとの平均(1 Minute AVG)で十分です。無料プランでは履歴は1週間保存され、生データ(RAW)の保存は有料プラン限定です。SuperChartでは時間・日・週といった期間を切り替え、温度と湿度を同じグラフに2色で表示できます。データは60秒ごとに届くので、最初の点が出るまで数分かかります。待ちきれずに間隔を1秒にしないでください。その理由は無料プランの章でわかります。

通知を送る:イベントとBlynk.logEvent()

新しいBlynkでは、通知はイベントで動きます。まずテンプレートでイベントを定義し、コードでBlynk.logEvent()を使って発生させます。Blynkはイベントをデバイスのタイムラインに書き込み、設定に応じてスマートフォンにプッシュ通知かメールを送ります。イベントの説明文は最大300文字まで書けますが、ライブラリの送信バッファが小さいので、短くしておくのがおすすめです。

  1. テンプレートを編集モードで開き、Events & Notificationsタブに切り替えます。
  2. + Create Eventをクリックし、イベントに「High temperature」(高温)のような名前を付け、イベントコードをyuksek_sicaklikにします。コードに使えるのは英字、数字、アンダースコアだけで、スケッチ内の文字列と完全に一致している必要があります。
  3. イベントの種類はWarning(警告)を選びます。Info、Warning、Criticalでアラートの重要度が決まります。アプリにイベントが表示されるように、タイムラインのオプションがオンになっていることを確認してください。
  4. Notificationsタブで通知をオンにし、受信者に自分のアカウントを、チャンネルにプッシュとメールを選びます。必要なら、通知を1時間に1回までに制限します。
  5. テンプレートのSaveをクリックし、デバイスの更新を確認します。スマートフォンでBlynk IoTアプリの通知を許可するのも忘れないでください。
制限値
デバイス1台あたりの1日のイベント数(logEvent)100
同じ種類のイベントの間隔最低1秒
通知(プッシュ、メール)の間隔最低5秒
イベントの説明文最大300文字
デバイス1台あたりのリクエスト頻度最大で毎秒50回
String値の長さ最大1024バイト
Blynk.logEvent()をloop()の中や、フラグなしで読み取りのたびに実行される条件の中に置かないでください。温度がしきい値を超えている間、60秒ごとにイベントを送るコードは、1日100件のイベント上限を約100分で使い切り、その日はほかの通知が一切届かなくなります。上のコードのようなフラグを使うか、Notificationsタブの制限オプションをオンにしてください。

無料プランの上限:メッセージ数の計算方法

Blynkの無料プランは学習や小さなプロジェクトには十分ですが、上限を知らずに作ったプロジェクトは月の途中で黙り込むことがあります。2026年10月時点で、Blynkの料金ページには無料プランの値として次が載っています。デバイス5台、ユーザー1人、月100,000件のデバイスメッセージ、1週間のデータ履歴、テンプレート10個、テンプレートごとにイベント5個、Webhook 1個、オートメーション5個です。これらの上限はここ数年で何度も変わっています。長く使うプロジェクトを作る前に、Blynkの料金ページかアカウントのプラン設定で最新の値を確認してください。枠を最も消費するのは、デバイスが送るvirtualWrite、syncVirtual、logEventのコマンドで、virtualWriteは1回で1メッセージになります。1か月は約2,592,000秒なので、計算は簡単です。

送信間隔データストリーム1つ(30日)データストリーム2つ(30日)100,000件の上限に収まる?
2秒1,296,0002,592,000いいえ
10秒259,200518,400いいえ
30秒86,400172,800値1つなら収まるが、2つは収まらない
60秒43,20086,400収まるが、値が2つだと余裕は少ない
5分8,64017,280余裕で収まる
メッセージを節約する方法は三つあります。測定間隔を本当に必要な長さにすること(部屋の温度なら5分ごとの確認で十分です)、値が一定量変わったときだけ送ること(たとえば温度が0.5 °C変わったとき)、そして使っていないデータストリームにはデータを送らないことです。ライブラリ自身のサンプルも、1秒間に10個を超える値を送らないよう勧めています。

Wi-Fiがなくても止まらない接続

Blynk.begin()は手軽ですが、欠点があります。Wi-FiやBlynkへの接続が確立できないと、setup()の中で永遠に待ち続け、ボードのほかの処理がまったく動きません。サーモスタットや水やりシステムのように、インターネットが切れても動き続けなければならないプロジェクトでは、接続を自分で管理するべきです。下のひな形は、待たずにWi-Fiを開始し、Blynk.config()で設定だけを適用して、10秒ごとに接続を確認します。その間も、タイマーに追加したローカルの処理はインターネットと関係なく動き続けます。

C++ (Arduino IDE)
1#define BLYNK_TEMPLATE_ID   "TMPLxxxxxxxx"
2#define BLYNK_TEMPLATE_NAME "ESP32 Ev"
3#define BLYNK_AUTH_TOKEN    "CihazTokeniniBurayaYapistir"
4#define BLYNK_PRINT Serial
5
6#include <WiFi.h>
7#include <WiFiClient.h>
8#include <BlynkSimpleEsp32.h>
9
10char ssid[] = "AgAdi";
11char pass[] = "Sifre123";
12
13BlynkTimer timer;
14
15// Wi-Fi varsa ama Blynk bağlı değilse yeniden dene / retry Blynk when Wi-Fi is up but Blynk is not
16void baglantiKontrol() {
17  if (WiFi.status() == WL_CONNECTED && !Blynk.connected()) {
18    Serial.println("Blynk'e yeniden baglaniliyor / reconnecting to Blynk");
19    Blynk.connect(3000);            // en fazla 3 saniye bekle / wait at most 3 seconds
20  }
21}
22
23void setup() {
24  Serial.begin(115200);
25  WiFi.mode(WIFI_STA);
26  WiFi.begin(ssid, pass);           // beklemeden başlat / start without waiting
27  Blynk.config(BLYNK_AUTH_TOKEN);   // yalnız ayarla, bağlanmayı bekleme / configure only, don't block
28  timer.setInterval(10000L, baglantiKontrol);   // 10 saniyede bir kontrol / check every 10 seconds
29}
30
31void loop() {
32  if (Blynk.connected()) {
33    Blynk.run();
34  }
35  timer.run();                      // yerel işler internet yokken de çalışır / local tasks keep running offline
36}

ESP32は通信が切れると自分でWi-Fiに再接続しようとします。コードは、Wi-Fiが戻ってからBlynkに再接続するだけです。データを暗号化したい場合は、BlynkSimpleEsp32.hの代わりにBlynkSimpleEsp32_SSL.hをインクルードするだけです。接続はポート80ではなく443のTLSを使うようになり、一部の学校や会社のネットワークでのポート制限も通り抜けられます。Wi-Fiの情報をコードに直接書きたくない場合は、ライブラリのBlynk.Edgent > Edgent_ESP32のサンプルを使うと、スマートフォンのBlynk IoTアプリからネットワーク名とパスワードを入力できます。この方法ではデバイスを追加したときに認証トークンが自動で割り当てられ、コードも無線(OTA)で更新できます。同じコードはESP8266のボードでも動きます。NodeMCUなら、ESP8266WiFi.hとBlynkSimpleEsp8266.hを使うだけです。

Raspberry Pi Pico WとMicroPythonでBlynkを使う

BlynkはESP32専用ではありません。Raspberry Pi Pico WでMicroPythonを使っているなら、BlynkのPythonライブラリにある1ファイルだけのBlynkLib.pyを、ThonnyでPicoにコピーするだけで済みます。ただし、このライブラリはもう活発には開発されておらず、Blynkは新しいプロジェクトにはMQTT APIを勧めている点に注意してください。それでも、学習やシンプルなプロジェクトには十分役に立ちます。下のコードは、Pico Wの基板上のLEDをV0で操作し、チップ内蔵の温度センサーの値を1分に1回V2へ送ります。Blynk.ConsoleでPico W用に別のデバイスを作り、そのトークンを使ってください。MicroPythonが初めてなら、MicroPythonの基本から始めるのがおすすめです。

MicroPython
1import network, time
2from machine import Pin, ADC
3import BlynkLib                      # BlynkLib.py Pico'da olmalı / BlynkLib.py must be on the Pico
4
5WIFI_SSID = "AgAdi"
6WIFI_PASS = "Sifre123"
7BLYNK_AUTH = "PicoTokeniniBurayaYapistir"
8
9led = Pin("LED", Pin.OUT)            # Pico W dahili LED / Pico W onboard LED
10sensor = ADC(4)                      # yongadaki sıcaklık sensörü / on-chip temperature sensor
11
12wlan = network.WLAN(network.STA_IF)
13wlan.active(True)
14wlan.connect(WIFI_SSID, WIFI_PASS)
15while not wlan.isconnected():
16    time.sleep(0.5)
17print("IP:", wlan.ifconfig()[0])
18
19blynk = BlynkLib.Blynk(BLYNK_AUTH, insecure=True)   # 80 portu, TLS'siz / port 80, no TLS
20
21@blynk.on("V0")
22def v0_yazildi(value):               # uygulamadaki anahtar / switch in the app
23    led.value(int(value[0]))
24
25@blynk.on("connected")
26def baglandi(ping):
27    print("Blynk hazir / ready, ping:", ping, "ms")
28    blynk.sync_virtual(0)            # son V0 değerini iste / ask for the last V0 value
29
30son = time.ticks_ms()
31while True:
32    blynk.run()
33    if time.ticks_diff(time.ticks_ms(), son) >= 60000:   # 60 saniyede bir / every 60 seconds
34        son = time.ticks_ms()
35        volt = sensor.read_u16() * 3.3 / 65535
36        sicaklik = 27 - (volt - 0.706) / 0.001721
37        blynk.virtual_write(2, round(sicaklik, 1))      # V2: sıcaklık / temperature

この例ではinsecure=Trueで、ポート80の暗号化なしの接続を使います。メモリの使用量がいちばん少ない方法で、ESP32のBlynkSimpleEsp32.hと同じレベルです。このパラメーターを外すと、ライブラリはポート443のTLSを使おうとします。ループでtime.sleep()ではなくticks_msで時間を測っている理由はArduino側と同じです。blynk.run()を頻繁に呼ばないと、コマンドが遅れて接続が切れます。チップ内蔵の温度センサーは室温と数度ずれることがあります。正確に測るにはDHT11かDS18B20をつないでください。

Blynkを使ったプロジェクトアイデア

  • スマートプラグ:リレーを使い、デスクライトや扇風機を世界中どこからでもオン・オフします。リレーの配線はリレーモジュールとは?を参照してください。
  • 遠隔での植物の水やり:土壌水分センサーが土の乾燥を知らせたらポンプを動かし、水分量をグラフで確認します。
  • スマート温室:温度と湿度が上がったら換気扇を回し、値がしきい値を超えたら通知を受け取ります。詳しくはスマート温室プロジェクトで解説しています。
  • 防犯アラーム:PIR人感センサーが人を検知したら、logEventでスマートフォンに重要度の高い通知を送ります。
  • ガス漏れ警報:MQ-2ガスセンサーがしきい値を超えたら、ブザーを鳴らし、スマートフォンにも通知を届けます。
  • 気象ステーション:BME280の温度・湿度・気圧を週単位のグラフで比べます。
  • ドアと窓の見張り:リードスイッチで、ドアが開けっぱなしになっていないかをアプリで確認します。

よくあるエラーと対策

症状またはメッセージ原因対策
コンパイル時に「Please specify your BLYNK_TEMPLATE_ID and BLYNK_TEMPLATE_NAME」(テンプレートIDと名前を指定してください)行がない、#includeの後に書いている、または古いBLYNK_DEVICE_NAMEを使っている3行の#defineをインクルードより前、いちばん上に置く。DEVICE_NAMEをTEMPLATE_NAMEに変える
コンパイル時に「'class BlynkWifi' has no member named 'notify'」(notifyというメンバーがない)古いBlynkのコードにあるBlynk.notify()コマンドテンプレートでイベントを作り、Blynk.logEvent()を使う
シリアルモニタに「Invalid auth token」(無効な認証トークン)トークンがない、コピーを間違えた、デバイスを削除した、または旧Blynkのトークンを使っているデバイスのページからトークンをもう一度、前後に空白が入らないようにコピーする
「Connecting to AgAdi」の行のあと何も出ないボードがWi-Fiに接続できない。5 GHzのネットワーク、パスワードの間違い、電波が弱いなど2.4 GHzのネットワークを使う。詳しくはESP32のWi-Fiガイドを参照
「Connecting to blynk.cloud:80」が繰り返される、または「Login timeout」(ログインのタイムアウト)ネットワークがインターネットにつながっていない、または学校や会社のネットワークが接続をブロックしているスマートフォンのテザリングで試す。BlynkSimpleEsp32_SSL.hでポート443を使う
「Heartbeat timeout」が出て、デバイスがよくOfflineになるloopに長いdelay()や止まってしまうループがある、電源が弱い待ち時間をBlynkTimerに移し、品質のよいケーブルとACアダプターを使う
スイッチを押しても何も起きないウィジェットが別のデータストリームに結びついている、またはBLYNK_WRITEのピンが違うウィジェットの設定のピンとコードのVxを一致させる
メーターがいつも1を示す、またはグラフが空データストリームのMaxが1のまま、または履歴がLast ValueになっているMinとMaxをセンサーの範囲に直し、履歴の設定を変える
しばらくするとデータがまったく届かなくなる毎月のメッセージ枠を使い切った送信間隔を長くし、変化したときだけ送る
リレーの動作が逆、または戻らないアクティブLOWのモジュール、または3.3 Vの信号では足りないROLE_AKTIF_LOWを反転し、3.3 V対応のモジュールを使う
トラブル解決は順番を守って進めましょう。まずシリアルモニタでWi-Fiの接続を確認し、次に「Ready」の行を探し、それからウィジェットとデータストリームが一致しているかを確認します。Wi-Fiの段階でつまずいている場合はESP32がWi-Fiにつながらないときを、Wi-Fiがオンになるとボードが再起動する場合はESP32のブラウンアウトとGuru Meditationを読んでください。

Blynk、自作のWebサーバー、MQTTのどれを選ぶ?

方法長所短所選ぶべき場面
Blynk IoTアプリを作らずに既製のダッシュボードが使え、家の外からアクセスでき、通知も送れる無料プランの上限がある。クラウドに依存するすばやい試作と遠隔監視
ESP32のWebサーバー完全に無料で、インターネットなしでも動くたいてい同じネットワークからしか届かず、画面は自分で作る家の中で使う操作パネル
MQTTとHome Assistantメッセージ数に制限がなく、ローカルで動き、オートメーションが強力セットアップに時間がかかり、常時稼働のサーバーが必要長く使うスマートホームのシステム
Telegramボット無料で、アラートやコマンドに最適グラフやダッシュボードがないアラームとシンプルなコマンド

まとめると、Blynkは見栄えのよい既製のダッシュボードですばやく結果を出し、家の外からプロジェクトにアクセスするためのいちばん簡単な方法です。制限がなく完全にローカルなシステムがほしいならESP32のWebサーバーとWebSocketやESP32のMQTTとHome Assistantを、スマートフォンにアラートを送るだけでよければESP32のTelegramボットのガイドを読んでみてください。

もっと簡単な方法:BlueGrays IoT

Blynkは柔軟で強力なプラットフォームです。ただ、リレーをオン・オフしたい、センサーをスマホで見たいというだけなら、テンプレート、データストリーム、ウィジェット、認証トークン(Auth Token)を手作業で用意したくないかもしれません。BlueGrays IoTなら、これを用意されたテンプレートで行えます。マイ工房 › マイデバイス › 新しいデバイスを追加でテンプレートを1つ選ぶと、Ohmiがデバイスキー入りのコードを用意するので、BlueGraysIoTライブラリを使ってArduino IDEから1回書き込むだけです。ESP32とRaspberry Pi Pico Wで2.4 GHzのWi-Fiを使って動作し、最初のデバイスは無料です。詳しくはESP32をスマホから操作するガイドを参照してください。

テンプレート、データストリーム、認証トークンの三つを理解すれば、新しいESP32のプロジェクトをBlynkでスマートフォンにつなぐのは数分で済みます。ここで紹介したLED、リレー、センサーの例を組み合わせれば、自分だけのスマートホームシステムの第一歩になります。BlueGraysアプリには、LEDの点滅、Wi-Fiへの接続、DHT22での温度測定、スマート照明、植物の水やり、Telegramを使った人感アラームといったESP32のプロジェクトも、ステップごとの回路図とコード付きでそろっています。

よくある質問

Blynkは無料ですか?

はい、Blynkには個人向けの無料プランがあります。2026年10月時点で、デバイス5台、月100,000件のデバイスメッセージ、1週間のデータ履歴が使えます。もっと多くのデバイス、無制限のメッセージ、長期間のデータ保存が必要なら、有料の月額プランに移る必要があります。

Blynkの認証トークンはどこで確認できますか?

Blynk.ConsoleのDevicesからデバイスを開くと、Device InfoにBLYNK_TEMPLATE_ID、BLYNK_TEMPLATE_NAME、BLYNK_AUTH_TOKENの行が、コードに貼り付けられる形で表示されます。新しいBlynkではトークンはメールで届かなくなり、デバイスごとに専用のトークンがあります。

古いBlynkアプリはまだ使えますか?

いいえ。旧Blynk(Legacy)のアプリは2022年にストアから削除され、クラウドサーバーは2022年12月31日に停止しました。古いプロジェクトは、新しいBlynk IoTプラットフォームでテンプレートとデータストリームを使って作り直す必要があります。ESP32のコードの大部分は、少し手を加えれば再利用できます。

Blynkの仮想ピンとは何ですか?

仮想ピンは、アプリとコードの間にある番号付きのデータ通信路で、ボードの物理的な足には対応していません。V0からV255まで番号があり、アプリからの値はBLYNK_WRITE(Vx)で読み取り、ボードからの値はBlynk.virtualWrite(Vx, value)でアプリに送ります。これにより、届いた値を自由に処理したり、センサーのデータをダッシュボードに表示したりできます。

Blynkで自分のESP32がオフラインと表示されるのはなぜですか?

よくある原因は、認証トークンの間違いや入れ忘れ、ESP32が5 GHzのネットワークに接続しようとしていること、loop()の中の長いdelay()、電源の弱さです。シリアルモニタに「Ready」の行が出ないなら接続の問題です。出ているなら、アプリで正しいデバイスを見ているか確認してください。

Blynkはインターネットなしでも動きますか?

いいえ。Blynk IoTではコマンドもデータもBlynk.Cloudを経由するので、ESP32とスマートフォンの両方がインターネットにつながっている必要があります。インターネットなしで操作したい場合は、ESP32自身のWebサーバー、ESP-NOW、Bluetoothが使えます。

全プロジェクトを見る
ESP32でLEDを点滅
#103初級

ESP32でLEDを点滅

ESP32のGPIO出力の基本を学びます。デジタルピンからLEDを点灯・消灯させて、点滅させます。Arduino UNOの定番のLED点滅プロジェクトのESP32版です。Arduino環境で使う基本的な点滅コマンドは同じですが、ESP32のピン配置と3.3 VのGPIO電圧レベルはArduino UNOとは異なります。

4.7(37)
99
ESP32の内蔵LEDを点滅
#106初級

ESP32の内蔵LEDを点滅

ESP32 DevKit V1に内蔵された青色LEDを点滅させます。外付け部品は不要です!ESP32を購入したら、最初に試すプロジェクトです。GPIO 2が内蔵LEDにつながっています。

4.8(29)
53
ESP32とLDRモジュールで光の強さを読み取る
#113初級

ESP32とLDRモジュールで光の強さを読み取る

LDRモジュールの生のADC値と、暗い状態・明るい状態の基準値から計算した相対的な明るさの割合を、シリアルモニタでリアルタイムに確認します。この割合はルクスの測定値ではありません。モジュールの校正の仕組みを学べます。しきい値の決定に使うため、プロジェクト10の前に取り組むのが適しています。

4.6(36)
55
ESP32 Wi-Fi STA接続(LCDディスプレイ付き)
#127上級

ESP32 Wi-Fi STA接続(LCDディスプレイ付き)

このプロジェクトでは、ESP32をステーション(STA)モードで家庭のWi-Fiネットワークに接続し、安全で障害に強い接続を実現します。SSIDとパスワードを別のsecrets.hファイルに保存してGitへの流出を防ぎ、自動再接続の仕組みを実装します。RSSIによる信号強度とIPアドレスはI2C LCDディスプレイに表示します。内蔵LEDは状態表示に使います。実運用を想定した接続管理の仕組みです。

4.4(21)
34
ESP32 DHT22温湿度計(LCDディスプレイ付き)
#117中級

ESP32 DHT22温湿度計(LCDディスプレイ付き)

DHT22センサーで周囲の温度と湿度を測定し、16x2 I2C LCDにリアルタイムで表示するプロジェクトです。Adafruit DHTライブラリを使い、1本の信号線を使うプロトコルでセンサーからデータを読み取ります。IoT気象観測装置やスマートホームの自動化、温室の環境監視システムの基礎となります。ESP32のGPIO 4ピンを介してDHT22と通信します。

4.8(38)
56
ESP32スマート照明(PIR + LDR + リレー + OLED)
#141上級
プレミアム

ESP32スマート照明(PIR + LDR + リレー + OLED)

ESP32で廊下やトイレ、食品庫の照明をスマート化します!PIRモーションセンサー、LDR光センサー、リレーモジュールを使い、「暗い場所で動きを検知すると点灯する」定番の仕組みを作ります。周囲が明るければ動きを検知しても点灯しないため、日中の無駄な電力消費を抑えられます。照明は30秒間点灯し、動きが続くとタイマーがリセットされて点灯時間が延びます。SSD1306 OLEDには大きな文字で状態(ON / DAYTIME / WAITING)とカウントダウンを表示します。

4.3(6)
11
ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)
#145上級
プレミアム

ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)

PIRセンサーが動きを検知するとブザーとLEDを作動させ、同時にTelegramで持ち主に即座に通知するスマート防犯アラームです。アラームが繰り返される頻度を抑えるため、30秒のクールダウン(待ち時間)を設けています。この仕組みはPIRの検知が正しいかを確認したり、誤検知をなくしたりするものではありません。家の防犯、ガレージの監視、倉庫や作業部屋などに使えます。ESP32-CAMなら写真付きの通知を追加でき、通常のESP32 DevKit V1ではテキストで通知します。

0.0(0)
9