「Arduinoで測った温度、スマホに飛ばせたら便利なのに…」そう思ったこと、ありませんか?🤔

実はこれ、数百円のWi-Fiモジュール「ESP-01」を足すだけで実現できます。今回はArduino UNOをセンサー担当、ESP-01を通信担当に分けた役割分担アーキテクチャで、LINEにセンサー値を通知するIoTシステムを作ります。

難易度は中級(★★★☆☆)。Arduinoでセンサーを動かしたことがある方なら問題なく進められます。

最初に重要な注意:LINE Notifyは終了しています

arduino wifi module
arduino wifi module / Photo by Bmonster Lab via Pexels

「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側シリアルモニタの出力
ESP-01側シリアルモニタの出力

これで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ロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る
徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。