ArduinoとESP-01でLINE通知IoTを作る!センサー値をスマホに飛ばす格安通知システムの作り方
「Arduinoで測った温度、スマホに飛ばせたら便利なのに…」そう思ったこと、ありませんか?🤔
実はこれ、数百円のWi-Fiモジュール「ESP-01」を足すだけで実現できます。今回はArduino UNOをセンサー担当、ESP-01を通信担当に分けた役割分担アーキテクチャで、LINEにセンサー値を通知するIoTシステムを作ります。
難易度は中級(★★★☆☆)。Arduinoでセンサーを動かしたことがある方なら問題なく進められます。
最初に重要な注意:LINE Notifyは終了しています

「LINE Notify(ラインノーティファイ)でIoT通知」という記事、ネット上にたくさんありますよね。しかしLINE Notifyは2025年3月末でサービス提供が終了しています。今から作る場合、古い記事のコードをそのまま写しても動きません。
そこで本記事では、現在も使えるLINE Messaging APIを使います。仕組みはほぼ同じで、やることはHTTPSでJSONをPOSTするだけ。イメージとしては「LINEのサーバーに手紙を送ると、自分のスマホに転送してくれる」という感じです。
準備するもの
- Arduino UNO(センサー読み取り担当)
- ESP-01(ESP8266搭載Wi-Fiモジュール・数百円)
- USB-TTL変換アダプタ(ESP-01書き込み用)
- DHT11などの温湿度センサー
- 3.3V用レギュレータ(AMS1117など)と抵抗2本(分圧用)
ここが一番の落とし穴です。ESP-01は3.3V動作で、Arduinoの5Vピンに直結すると壊れます。しかも瞬間的に300mA近く流れるので、Arduino内蔵の3.3Vピン(最大50mA程度)では電力が足りず、通信中に再起動を繰り返します。必ず外部の3.3V電源を用意しましょう⚡
配線のポイント
- ESP-01 VCC / CH_PD → 3.3V電源(ArduinoとGNDは共通にする)
- ESP-01 TX → Arduino D10(受信)
- Arduino D11(送信)→ 抵抗で分圧 → ESP-01 RX
- 書き込み時のみ GPIO0 を GND に落とす
STEP1:LINE側の準備
LINE Developersコンソールでチャネル(Messaging API)を作り、チャネルアクセストークン(長期)を発行します。作ったBotを自分のLINEで友だち追加しておけば準備完了です。
今回は宛先IDを意識しなくていいbroadcast(友だち全員に送信)を使います。自分だけが友だちなら、実質「自分専用通知」になります。
STEP2:ESP-01側のスケッチ(通信担当)
ESP-01はArduino IDEで直接プログラムを書き込めます(ボードマネージャでESP8266のボード定義を追加し、「ツール→ボード」で「Generic ESP8266 Module」を選択)。ポイントをまとめるとこんな感じです。
- Wi-Fi接続は
WiFi.begin()→ 接続待ちループ - HTTPSなので
WiFiClientSecureを使う - 証明書検証は
setInsecure()で省略(学習用途) - Arduinoからのデータはシリアルで受け取る
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
const char* SSID = "あなたのSSID";
const char* PASS = "あなたのパスワード";
const char* TOKEN = "チャネルアクセストークン";
const char* HOST = "api.line.me";
void sendLine(String msg) {
WiFiClientSecure client;
client.setInsecure(); // 証明書検証を省略(学習用)
client.setTimeout(10000);
if (!client.connect(HOST, 443)) {
Serial.println("[ERR] connect failed");
return;
}
// JSON本文を組み立てる
String body = "{\"messages\":[{\"type\":\"text\",\"text\":\"" + msg + "\"}]}";
client.print(String("POST /v2/bot/message/broadcast HTTP/1.1\r\n") +
"Host: " + HOST + "\r\n" +
"Authorization: Bearer " + TOKEN + "\r\n" +
"Content-Type: application/json\r\n" +
"Content-Length: " + body.length() + "\r\n\r\n" + body);
// レスポンスの1行目だけ表示(200 OKなら成功)
String status = client.readStringUntil('\n');
Serial.println("[LINE] " + status);
client.stop();
}
void setup() {
Serial.begin(9600);
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASS);
Serial.print("[WiFi] connecting");
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println();
Serial.print("[WiFi] IP = ");
Serial.println(WiFi.localIP());
sendLine("ESP-01 起動しました");
}
void loop() {
// Arduinoから "MSG:本文" の形式で受信したら送信
if (Serial.available()) {
String line = Serial.readStringUntil('\n');
line.trim();
if (line.startsWith("MSG:")) {
sendLine(line.substring(4));
}
}
}

これでESP-01は「文字列を受け取ってLINEに投げるだけの箱」になりました。役割をシンプルに切り分けるのが、動かないときのデバッグを楽にするコツです✨
STEP3:Arduino側のスケッチ(センサー担当)
Arduino UNOはセンサーを読み、しきい値を超えたときだけESP-01にメッセージを渡します。ここで大事なのが通知の連打防止。温度が境界線上で揺れると、1分間に何十通も届いて地獄を見ます😅
#include <SoftwareSerial.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
SoftwareSerial esp(10, 11); // RX, TX
const float TEMP_LIMIT = 28.0; // 通知するしきい値
const float HYSTERESIS = 1.0; // 復帰用の余裕(ばたつき防止)
const unsigned long COOLDOWN = 600000UL; // 10分に1回まで
bool alerted = false;
bool everSent = false; // 一度でも送信したか(初回はクールダウン免除)
unsigned long lastSent = 0;
void setup() {
Serial.begin(9600);
esp.begin(9600);
dht.begin();
}
void loop() {
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
Serial.println("センサー読み取り失敗");
delay(2000);
return;
}
Serial.print("温度: "); Serial.print(t);
Serial.print(" / 湿度: "); Serial.println(h);
unsigned long now = millis();
// しきい値超え かつ 未通知 かつ クールダウン経過(初回は待たずに送信)
if (t >= TEMP_LIMIT && !alerted && (!everSent || now - lastSent > COOLDOWN)) {
String msg = "⚠️室温が上昇しています 温度:";
msg += String(t, 1);
msg += "C 湿度:";
msg += String(h, 0);
msg += "%";
esp.print("MSG:" + msg + "\n");
Serial.println("→ ESP-01へ送信: " + msg);
alerted = true;
everSent = true;
lastSent = now;
}
// しきい値より十分下がったら通知フラグを解除
if (t < TEMP_LIMIT - HYSTERESIS) {
alerted = false;
}
delay(5000);
}
ポイントは3つです。
- ヒステリシス:28℃で通知、27℃未満で解除。境界のばたつきを吸収します
- クールダウン:millis()で最低10分の間隔を確保(初回だけは待たずに送信)
- 状態フラグ:一度通知したら復帰するまで黙る
この3点セットを入れるだけで、通知システムの実用度が一気に上がります📱
つながらないときのチェックリスト
ESP-01は「動かない原因が電源」というケースが本当に多いです。以下を上から順に確認しましょう。
- 3.3Vは外部電源から供給しているか(Arduinoの3.3Vピンは非推奨)
- CH_PDピンを3.3Vにプルアップしているか(ここ忘れがち!)
- ArduinoとESP-01のGNDを共通にしているか
- SoftwareSerialのボーレートは9600にしているか(115200は取りこぼします)
- Wi-Fiは2.4GHz帯か(ESP-01は5GHz非対応)
応用アイデア
センサーを入れ替えるだけで用途が一気に広がります。
- 土壌水分センサー → 植物の水やりアラート🌱
- ドア開閉センサー(リードスイッチ) → 帰宅・不在通知
- 水位センサー → 加湿器の給水タイマー
- 電流センサー → 洗濯機の運転終了通知
まとめ
ArduinoとESP-01を組み合わせれば、Arduino本体に1000円台の部品を足すだけでスマホ通知つきIoTシステムが作れます。ポイントは「センサーはArduino、通信はESP-01」と役割をきっぱり分けること。そして電源とGNDを甘く見ないことです。
LINE Notifyが終了した今でも、Messaging APIを使えばやることはほとんど変わりません。まずは起動メッセージが届くところまで確認して、そこからセンサーをつないでいきましょう。「むずかしそう」が「できそう」に変わるはずです。ぜひ試してみてください!🚀
こちらも読まれています
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。
Arduinoロボット入門のおすすめコース・部品を見る →📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。





