「IoTって面白そうだけど、ArduinoとPythonをどうつなげばいいのかよくわからない…」
そんなモヤモヤを感じたことはありませんか?実は、ArduinoとPythonの連携は思っているよりずっとシンプルです。今回は、温湿度センサーを使ったIoTモニタリングシステムをゼロから一緒に作っていきましょう! 🌡️
センサーで取ったデータをリアルタイムでPythonに渡して表示する、という「IoTの基本の流れ」がしっかり体験できる内容になっています。
この記事の対象読者と難易度

📋 こんな方におすすめです
- Arduinoを触ったことがある(またはこれから触る)初〜中級者
- Pythonの基礎がなんとなくわかる方
- IoTや電子工作に興味があるけど何から始めればいいか迷っている方
難易度は★★☆☆☆(初〜中級者向け)です。電子工作が初めてでも、手順通りに進めれば必ず動かせます。
今回作るものの全体像
まず、ざっくりとした流れをつかんでおきましょう。
- DHT11センサーで温度・湿度を計測(Arduino側)
- シリアル通信でデータをPCに送信
- PythonがそのデータをリアルタイムでUSB経由で受信
- ターミナルやグラフでデータを表示
イメージとしては、Arduinoが「センサー係」、Pythonが「データ処理係」という役割分担です。この二つがシリアル通信(USBケーブル)という橋でつながっている、と思ってもらえればOKです 😊
必要なもの(材料リスト)
🛒 ハードウェア
- Arduino Uno(または互換機)
- DHT11 温湿度センサー
- ブレッドボード
- ジャンパワイヤー(数本)
- 10kΩ 抵抗(1本)
- USBケーブル(Arduino〜PC接続用)
💻 ソフトウェア
- Arduino IDE
- Python 3.x
- Pythonライブラリ:
pyserial、matplotlib
DHT11センサーは数百円で購入できるので、コスパ最高の電子工作入門パーツです。
STEP 1:配線をしよう
まずはDHT11センサーをArduinoに接続します。配線の確認をしておきましょう。
- DHT11のVCC → Arduino の5V
- DHT11のGND → Arduino のGND
- DHT11のDATA → Arduino のデジタルピン2番
- DATAピンと5Vの間に10kΩ抵抗を挟む(プルアップ抵抗)
プルアップ抵抗は「信号を安定させるための保険」みたいなものです。省略すると誤動作することがあるので、必ず入れておいてください!
STEP 2:Arduinoのスケッチを書こう
次に、Arduinoがセンサーからデータを読み取ってシリアル通信で送り出すプログラムを書きます。
Arduino IDEのライブラリマネージャーから「DHT sensor library by Adafruit」をインストールしておいてください。
// DHT11から温湿度を読み取り、シリアルで送信するスケッチ
#include <DHT.h>
#define DHTPIN 2 // センサーのデータピン
#define DHTTYPE DHT11 // DHT11を使用
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600); // シリアル通信を9600bpsで開始
dht.begin(); // センサーを初期化
}
void loop() {
delay(2000); // 2秒ごとに計測(DHT11の仕様上、最低2秒必要)
float humidity = dht.readHumidity(); // 湿度を取得
float temperature = dht.readTemperature(); // 温度を取得(摂氏)
// センサーの読み取りに失敗した場合はスキップ
if (isnan(humidity) || isnan(temperature)) {
Serial.println("ERROR");
return;
}
// 「温度,湿度」の形式でシリアルに送信
Serial.print(temperature);
Serial.print(",");
Serial.println(humidity);
}
ポイントをまとめるとこんな感じです:
Serial.begin(9600)でPC側と通信速度を合わせています(後でPython側も同じ速度を指定します)- データは
温度,湿度のカンマ区切りで送るので、Python側でパースしやすい形式です isnan()でセンサーエラーを検知しています。これ、地味に大事なポイントです 🔍
書けたら、ArduinoをPCにつないでスケッチをアップロードしましょう。シリアルモニターを開いて、数値が流れてきたらArduino側の準備は完了です!
STEP 3:Pythonでデータを受信しよう
次はいよいよPythonの出番です。まずは必要なライブラリをインストールしておきましょう。
pip install pyserial matplotlib
インストールできたら、以下のスクリプトを作成してください。
import serial
import time
# ポート名はOSによって異なります
# Windows: 'COM3' など / Mac・Linux: '/dev/ttyUSB0' や '/dev/cu.usbmodem...' など
PORT = '/dev/cu.usbmodem14101' # ← ご自身の環境に合わせて変更してください
BAUD_RATE = 9600 # Arduinoと同じ通信速度
def read_sensor_data():
"""Arduinoから温湿度データを受信して表示する"""
try:
# シリアルポートを開く
ser = serial.Serial(PORT, BAUD_RATE, timeout=1)
print(f"接続成功: {PORT}")
print("データ受信を開始します... (Ctrl+C で停止)")
print("-" * 40)
while True:
# Arduinoからの1行を読み取る
line = ser.readline().decode('utf-8').strip()
if line == "ERROR" or line == "":
print("センサーエラー or データなし")
continue
# 「温度,湿度」の形式をパース
values = line.split(',')
if len(values) == 2:
temperature = float(values[0])
humidity = float(values[1])
# タイムスタンプと一緒に表示
timestamp = time.strftime("%H:%M:%S")
print(f"[{timestamp}] 🌡 温度: {temperature:.1f}°C 💧 湿度: {humidity:.1f}%")
except serial.SerialException as e:
print(f"ポートに接続できませんでした: {e}")
print("ポート名と接続を確認してください")
except KeyboardInterrupt:
print("\n\n受信を終了しました。")
finally:
if 'ser' in locals() and ser.is_open:
ser.close()
print("シリアルポートを閉じました")
if __name__ == '__main__':
read_sensor_data()
ここが重要です:
- ポート名は環境によって違います。Windowsなら「デバイスマネージャー」、Mac/Linuxなら
ls /dev/cu.*やls /dev/tty*で確認してください .decode('utf-8').strip()で受信バイト列を文字列に変換していますtry / exceptでエラーを丁寧に拾っているので、接続失敗時も親切なメッセージが出ます 😊
STEP 4:実行してみよう
では、実際に動かしてみましょう!Arduino IDEのシリアルモニターは閉じてから実行してください(ポートの競合が起きます)。
python temperature_monitor.py
うまくいくと、こんな感じでデータが流れてきます 🎉
ターミナルにデータがリアルタイムで表示されたら成功です!センサーに手を当てると温度や湿度が変わるのが確認できるはずです。「むずかしそう」が「できそう」に変わった瞬間ですよね 😄
応用:データをCSVに保存しよう
データを取り続けるだけでなく、ログとして保存しておくとあとで分析できて便利です。先ほどのスクリプトに少し追加するだけでOKです。
import serial
import time
import csv
from datetime import datetime
PORT = '/dev/cu.usbmodem14101'
BAUD_RATE = 9600
CSV_FILE = 'temperature_log.csv' # 保存先ファイル名
def read_and_save_data():
"""温湿度データを受信してCSVに保存する"""
with open(CSV_FILE, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['timestamp', 'temperature', 'humidity']) # ヘッダー行
try:
ser = serial.Serial(PORT, BAUD_RATE, timeout=1)
print(f"ログ保存開始 → {CSV_FILE}")
while True:
line = ser.readline().decode('utf-8').strip()
if ',' not in line:
continue
values = line.split(',')
if len(values) == 2:
temperature = float(values[0])
humidity = float(values[1])
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# CSVに書き込む
writer.writerow([timestamp, temperature, humidity])
f.flush() # 即座にディスクへ書き出す
print(f"[{timestamp}] {temperature:.1f}°C / {humidity:.1f}% → 保存済")
except KeyboardInterrupt:
print("\n保存を終了しました。")
finally:
if 'ser' in locals() and ser.is_open:
ser.close()
if __name__ == '__main__':
read_and_save_data()
f.flush() を入れているのがポイントです。これがないと、プログラムを途中で止めたときにデータが保存されていないことがあります。細かいですが、大事な一工夫ですよ 👍
まとめ
今回は、ArduinoとPythonを使ったIoT温湿度モニタリングシステムをゼロから作りました。
- ✅ DHT11センサーからデータをArduinoで読み取る
- ✅ シリアル通信でPythonにリアルタイム送信
- ✅ PythonでデータをCSVログとして保存
「ArduinoとPythonって何となく別物」と感じていた方も、シリアル通信という橋でつながるという感覚がつかめたんじゃないでしょうか。
次のステップとしては、matplotlibでリアルタイムグラフを表示したり、データが一定値を超えたらLINEに通知を送ったりと、アイデア次第でどんどん発展させられます。ぜひ、あなた自身のIoTプロジェクトに応用してみてください! 🚀
質問や詰まったところがあれば、お気軽にコメント欄で教えてください。一緒に学んでいきましょう!
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。





