IoT

ArduinoとPythonで作る入門IoTシステム|センサーデータをリアルタイム可視化する方法

「Arduinoで取ったセンサーのデータ、なんとかグラフで見られないかな…」

そう思ったことはありませんか?せっかく電子工作でセンサーをつないでも、シリアルモニターに流れる数字を眺めるだけじゃちょっともったいないですよね。

今回は、ArduinoとPythonを連携させて、センサーデータをリアルタイムにグラフ表示するIoTシステムを一緒に作っていきます。難しそうに聞こえるかもしれませんが、仕組みはシンプルです。ぜひ最後まで読んでみてください! 🚀

この記事で作るもの・対象読者

arduino sensor electronics
arduino sensor electronics / Photo by Lisha Dunlap via Pexels

作るもの:Arduinoで取得した温度センサー(LM35)のデータをシリアル通信でPythonに送り、matplotlibでリアルタイムにグラフ表示するシステムです。

対象読者:

  • ✅ Arduinoを触ったことがある(Lチカ程度でOK)
  • ✅ Pythonの基礎を少し知っている
  • ✅ 電子工作とプログラミングをつなげてみたい初〜中級者

必要なもの:

  • Arduino Uno(互換機でもOK)
  • LM35温度センサー(または任意のアナログセンサー)
  • USBケーブル、ジャンパワイヤ、ブレッドボード
  • Python 3.x がインストールされたPC

全体の仕組みをざっくり理解しよう






まずイメージを掴んでおきましょう。システム全体の流れはこうです。

センサー → Arduino → シリアル通信(USB)→ Python → グラフ表示

つまり、ArduinoはセンサーからデータをAD変換して読み取り、それをUSBケーブル経由でPCに送り続けます。PC側ではPythonが受け取ったデータを解析して、リアルタイムにグラフを更新し続ける、という仕組みです。

シリアル通信というのは、データを1ビットずつ順番に送る通信方式のことで、ArduinoとPCをつなぐUSBが、まさにこのシリアル通信の役割を担っています。難しく考えなくて大丈夫です 😊

STEP 1:Arduino側のスケッチを書く

IoT data visualization
IoT data visualization / Photo by Jakub Zerdzicki via Pexels

まずはArduino側のコードを準備します。LM35センサーはA0ピンに接続しておいてください。LM35はVCC・OUT・GNDの3ピン構成で、OUTをArduinoのA0につなぐだけでOKです。

ポイントをまとめるとこんな感じです:

  • アナログ値(0〜1023)を電圧に変換し、LM35の特性(10mV/℃)で温度を計算
  • Serial.println() で改行付きで送信するのがPython側で受け取りやすくなるコツ
  • 200msごとに送信することでPython側の処理が追いつきやすくなる
// LM35センサーの値をシリアル通信でPCに送るスケッチ

void setup() {
  Serial.begin(9600); // シリアル通信を9600bpsで開始
}

void loop() {
  int rawValue = analogRead(A0); // アナログ値を読み取り(0〜1023)

  // 電圧(mV)に変換 → LM35は10mV/℃なので温度を計算
  float voltage = rawValue * (5000.0 / 1023.0); // 単位: mV
  float temperature = voltage / 10.0;           // 単位: ℃

  Serial.println(temperature); // 温度をシリアルポートに送信

  delay(200); // 200ms待機
}

Arduino IDEでこのスケッチを書き込んだら、シリアルモニターを開いて温度の数値が流れてくるか確認しておきましょう。ここで数値が出ていればArduino側はバッチリです ✅

STEP 2:Pythonのライブラリをインストールする

Python側では2つのライブラリを使います。インストールしていない場合は以下のコマンドを実行してください。

pip install pyserial matplotlib
  • pyserial:Pythonからシリアルポートにアクセスするためのライブラリ
  • matplotlib:グラフ描画の定番ライブラリ。リアルタイム更新にも使えます

インストールが完了したら次のステップへ進みましょう!

STEP 3:Pythonでリアルタイムグラフを描画する

いよいよメインのPythonコードです。ここが少し長めですが、コメントを丁寧に入れているので順番に読んでみてください。

ここが重要です:

  • animation.FuncAnimation を使うことで、一定間隔で自動的にグラフを更新できます
  • COMポートの番号はお使いの環境に合わせて変更してください(Macなら/dev/tty.usbmodem...など)
  • データを deque(デック)で管理することで、表示件数を自動的に最新100件に保てます
import serial
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from collections import deque
import time

# ---- 設定 ----
PORT = 'COM3'       # 環境に合わせて変更(Mac: '/dev/tty.usbmodemXXXX')
BAUD_RATE = 9600    # Arduino側と同じボーレートに揃える
MAX_POINTS = 100    # グラフに表示するデータ点数

# シリアルポートに接続
ser = serial.Serial(PORT, BAUD_RATE, timeout=1)
time.sleep(2)  # Arduino起動待ちのために少し待機

# データ格納用のdeque(最大100件で自動的に古いものを削除)
temperatures = deque(maxlen=MAX_POINTS)

# グラフの初期設定
fig, ax = plt.subplots(figsize=(10, 5))
line, = ax.plot([], [], 'r-', linewidth=2)  # 赤い折れ線グラフ
ax.set_xlim(0, MAX_POINTS)
ax.set_ylim(0, 50)   # 温度の表示範囲(0〜50℃)
ax.set_title('リアルタイム温度モニター', fontsize=14)
ax.set_xlabel('サンプル数')
ax.set_ylabel('温度 (℃)')
ax.grid(True, alpha=0.3)

def update(frame):
    """FuncAnimationから繰り返し呼ばれる更新関数"""
    if ser.in_waiting > 0:  # 受信データがあれば処理
        try:
            raw = ser.readline().decode('utf-8').strip()  # 1行読み取り
            temp = float(raw)  # 文字列を数値に変換
            temperatures.append(temp)  # データを追加
            print(f"温度: {temp:.1f} ℃")  # コンソールにも表示
        except ValueError:
            pass  # 変換に失敗したデータは無視

    # グラフのデータを更新
    line.set_data(range(len(temperatures)), list(temperatures))
    return line,

# 200msごとにupdate関数を呼び出してグラフを更新
ani = animation.FuncAnimation(fig, update, interval=200, blit=True)

plt.tight_layout()
plt.show()

ser.close()  # ウィンドウを閉じたらシリアルポートを解放

このコード、実行前にCOMポートの番号だけ確認しておきましょう。Windowsなら「デバイスマネージャー」、Macなら ls /dev/tty.* コマンドで確認できます。

STEP 4:実行してみよう

Arduinoにスケッチを書き込んでUSB接続した状態で、Pythonスクリプトを実行します。

python realtime_sensor.py

うまくいくと、ウィンドウが開いて温度データがリアルタイムにグラフに追加されていきます 🎉

コンソールにも「温度: 25.3 ℃」のように数値が流れてくるはずです。センサーを指で温めると数値が上がるのを確認してみてください。「むずかしそう」が「できそう」に変わる瞬間です!

うまく動かないときのチェックリスト






もし動かなかった場合は、以下を順番に確認してみてください。

  • ✅ COMポート番号(PORT変数)は合っているか
  • ✅ Arduino IDEのシリアルモニターを閉じているか(同時に開けない)
  • ✅ ボーレートがArduinoスケッチと一致しているか(両方9600)
  • ✅ LM35の配線はVCC・OUT・GNDの順で正しいか
  • pip install pyserial matplotlib が成功しているか

一つひとつ確認していけば、ざっくりとした流れがつかめるはずです 😊

まとめ

今回は、ArduinoとPythonをシリアル通信でつなぎ、センサーデータをリアルタイムにグラフ表示するIoTシステムを作りました。

  • Arduino側:センサー値を読んで Serial.println() で送信
  • Python側:pyserial で受け取り、matplotlib でリアルタイム描画
  • この2つをつなぐのがシリアル通信という仕組み

一度この仕組みを理解すると、温度センサーをCO2センサーや照度センサーに変えるだけで、いろいろな計測システムに応用が広がりますよ。ぜひ自分のセンサーで試してみてください!

次回は、取得したデータをCSVに保存してさらに分析する方法も紹介予定です。お楽しみに 🙌

Pythonスクリプトの実行結果(コンソール出力)
Pythonスクリプトの実行結果(コンソール出力)

📡 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を用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です