「Arduinoで取ったセンサーのデータ、なんとかグラフで見られないかな…」
そう思ったことはありませんか?せっかく電子工作でセンサーをつないでも、シリアルモニターに流れる数字を眺めるだけじゃちょっともったいないですよね。
今回は、ArduinoとPythonを連携させて、センサーデータをリアルタイムにグラフ表示するIoTシステムを一緒に作っていきます。難しそうに聞こえるかもしれませんが、仕組みはシンプルです。ぜひ最後まで読んでみてください! 🚀
この記事で作るもの・対象読者

作るもの: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側のスケッチを書く

まずは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に保存してさらに分析する方法も紹介予定です。お楽しみに 🙌

📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。
📚 関連記事
- Arduino入門|電子工作初心者が最初に作るべきLEDプロジェクト5選— Arduino初心者向けの基礎知識補完
- Arduino×Pythonでシリアル通信!センサーデータをリアルタイムにグラフ表示する方法【初心者向け】— 同一テーマの別バージョン記事
- Raspberry Pi+PythonでDHT11温湿度センサーを動かすIoT入門ガイド— センサー可視化の応用例紹介
- Pythonのライブラリをコマンドプロンプトでインストールする手順— pyserial・matplotlib導入手順の詳細




