前へ⇒ 熱中症・火災を防ぐ!Raspberry Piでつくる温度監視システム
※当サイトは、アフィリエイトプログラムを利用して商品を紹介しています。
近年は線状降水帯による豪雨や水害、猛暑による熱中症、さらには空き巣や不審者といった防犯リスクが増えています。こうした災害・防犯対策を1台で実現できるのが、Raspberry Piを活用した「オールインワン防災システム」です。

Raspberry Piの電子工作は、まず「センサーを1つずつ試す」ことから始めるのが一般的です。しかし慣れてきたら、複数のセンサーを組み合わせることで、ぐっと実用性が高まります。
これまで紹介してきた電子工作、超音波センサーで水位を計測、温度センサーで気温を監視、さらにカメラで自動撮影を行う仕組みを1つに統合します。初心者でも成果を実感しやすいのが特徴です。
災害や防犯対策を強化したい家庭に最適な、実用性の高い電子工作です。
1. 必要なもの
- Raspberry Pi
- 超音波センサー HC-SR04
- 温度センサー ADT7410
- Raspberry Piカメラ Raspberry Pi Camera Module 3
- 専用カメラケーブル(Raspberry Pi 5対応)
- 抵抗(2.2kΩ、3.3kΩ:ECHOピンの分圧用)
- ジャンパーワイヤー(オス-メス)
- ブレッドボード
ラズベリーパイを始めるならこれ!本体・モニター・センサー類の商品リスト
2. 配線のポイント
Raspberry Pi 5 GPIOピン配置
3.3V (1) (2) 5V
GPIO2 (3) (4) 5V
GPIO3 (5) (6) GND
GPIO4 (7) (8) GPIO14
GND (9) (10) GPIO15
GPIO17(11)(12) GPIO18
GPIO27(13)(14) GND
GPIO22(15)(16) GPIO23
3.3V (17)(18) GPIO24
GPIO10(19)(20) GND
GPIO9 (21)(22) GPIO25
GPIO11(23)(24) GPIO8
GND (25)(26) GPIO7
ID_SD (27)(28) ID_SC
GPIO5 (29)(30) GND
GPIO6 (31)(32) GPIO12
GPIO13(33)(34) GND
GPIO19(35)(36) GPIO16
GPIO26(37)(38) GPIO20
GND (39)(40) GPIO21
HC-SR04(距離センサー)

- VCC → 5V(Pin 2)
- TRIG → GPIO24(Pin 18)
- ECHO → 分圧回路(2.2kΩ + 3.3kΩ)を通して GPIO23(Pin 16)、GNDは(Pin 9)
- GND → GND(Pin 6)
ECHOは5V出力なので、必ず抵抗で分圧して3.3Vに落としてから接続します。

ご不明な点がございましたら、豪雨・洪水対策!Raspberry Piで作る家庭用水位センサー をご参照ください。
ADT7410(温度センサー)

- VCC → 3.3V(Pin 1)
- SCL → GPIO3(Pin 5)
- SDA → GPIO2(Pin 3)
- GND → GND(Pin 9)(ブレッドボードを使用した場合、HC-SR04(距離センサー)のGNDと共通 Pin 6)
I2Cを有効にする必要があります。
sudo raspi-config
# Interfacing Options → I2C → Enable
確認は
ls /dev/i2c-*
に /dev/i2c-1
があればOKです。
ご不明な点がございましたら、熱中症・火災を防ぐ!Raspberry Piでつくる温度監視システム をご参照ください。
Raspberry Piカメラ

- Raspberry Pi Camera Module 3をCSIポートに専用ケーブルで接続
ご不明な点がございましたら、 防犯・災害対策に!Raspberry Piで作るセンサー連動自動撮影カメラシステム をご参照ください。

3. Pythonプログラム
プログラムの仕組み
- HC-SR04で 水位 を測定
- ADT7410で 温度 を計測
- カメラで 写真を撮影
- Tkinterで GUIに表示
それぞれをスレッドで繰り返し実行し、リアルタイムに更新します。
Pythonプログラム
ターミナルを開きます。Ctrl + Alt + T
を同時に押す。
ターミナルで nano shikoshiko.py
と入力し、新しいファイルを作成。
nano shikoshiko.py
次に、以下のプログラムを入力します。「#」から始まる行は、コメントとして扱われ、プログラムとしての意味はありませんので不要でも構いません。
from gpiozero import DistanceSensor
import smbus2
import tkinter as tk
import threading
from time import sleep
from datetime import datetime
from picamera2 import Picamera2
import os
# ---------------- センサー設定 ----------------
MAX_DISTANCE = 5.0
sensor = DistanceSensor(echo=23, trigger=24, max_distance=MAX_DISTANCE)
I2C_ADDR = 0x48
I2C_CH = 1
bus = smbus2.SMBus(I2C_CH)
# ---------------- カメラ設定 ----------------
camera = Picamera2()
camera.configure(camera.create_still_configuration())
SAVE_DIR = os.path.expanduser("~/pictures")
os.makedirs(SAVE_DIR, exist_ok=True)
def capture_image():
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
filename = os.path.join(SAVE_DIR, f"capture_{timestamp}.jpg")
camera.start()
sleep(1) # カメラの準備時間
camera.capture_file(filename)
camera.stop()
# ---------------- 温度取得関数 ----------------
def read_temperature():
try:
data = bus.read_i2c_block_data(I2C_ADDR, 0x00, 2)
raw = (data[0] << 8) | data[1]
raw = raw >> 3
if raw & 0x1000:
raw -= 1 << 13
return raw * 0.0625
except Exception as e:
print("通信エラー:", e)
return None
# ---------------- GUI設定 ----------------
root = tk.Tk()
root.title("現在の水位と温度(+ カメラ)")
root.geometry("500x250")
label = tk.Label(root, text="測定中...", font=("Helvetica", 20))
label.pack(pady=60)
# ---------------- 測定スレッド ----------------
def measure_loop():
while True:
distances = []
temps = []
for _ in range(10):
actual_distance = sensor.distance * MAX_DISTANCE
reversed_distance = max(0.0, MAX_DISTANCE - actual_distance)
distances.append(reversed_distance)
temp = read_temperature()
if temp is not None:
temps.append(temp)
sleep(1)
avg_distance = sum(distances) / len(distances)
avg_temp = sum(temps) / len(temps) if temps else None
capture_image()
display_text = f"水位: {avg_distance * 100:.1f} cm\n"
if avg_temp is not None:
display_text += f"温度: {avg_temp:.2f} ℃"
else:
display_text += "温度: 測定エラー"
label.after(0, lambda text=display_text: label.config(text=text))
# ---------------- 実行開始 ----------------
threading.Thread(target=measure_loop, daemon=True).start()
root.mainloop()


保存は Ctrl + O
→ Enter、終了は Ctrl + X
です。
実行するときはターミナルを開きます。Ctrl + Alt + T
を同時に押す。
ターミナルで以下を入力します。
python3 shikoshiko.py
「水位」「温度」「画像」が10秒ごとに表示されれば成功です!

撮影画像の保存先
- 保存場所:
~/pictures/
- ファイル名 例:
capture_2025-05-27_14-22-10.jpg
データをCSVに保存したり、メール通知を加えればさらに便利になります!
次回は、災害時も一目で状況把握:小さなディスプレイに情報を表示しよう!です。
イケオジ流!ラズベリーパイ(Raspberry Pi)一覧はこちら
ラズベリーパイを始めるならこれ!本体・モニター・センサー類の商品リスト
X(旧twitter) 今日のイケオジ
イケオジのキング・オブ・アスリートへの道はこちら
ソニースマートフォン:[PR]毎日がもっと特別に!音楽や映像視聴、撮影など、いつもの体験をアップデート。長持ちバッテリーだから、ずっと使っていても充電切れを気にせず楽しめます。

OPPOスマートフォン:[PR]OPPO公式オンラインショップでは、スマートフォンをはじめ、イヤホンやスマートウォッチといったIoT関連製品などを取り揃えております。

HUAWEIスマートフォン:[PR]HUAWEI(ファーウェイジャパン)公式サイト。2022年度スマートウォッチ市場日本国内シェア2位!進化系スマートウォッチはすべてここに集結。

ノジマのスマホ買取:[PR]ノジマが運営するスマートフォンの宅配買取サービスです。高価買取(大手買取サイトの価格を毎日調査・反映しています)。最短翌日集荷(査定についても当社スタッフが実施しています)。安心の東証プライム市場企業。

ミニPC専門店:[PR]MinisforumのミニPCは、仕事向けのコスパ重視のミニPCや最新のCPUやGPUなどを使用した最新型ミニPC。省スペースながら高性能、豊かな接続端子、より良い冷却システムと静音性、メモリやストレージを増設など簡単、複数ディスプレイ同時に出力可能。

中古スマホ激安販売:[PR]スマホ専門で販売・買取・修理サービスを全国50店舗展開するダイワンテレコムが運営する、中古スマホのECサイト!商品は主にはiPhone・iPadですが、Androidやガラケーもラインナップしています。

さあ、勇気を出してイケオジブログをシェアしよう!
コメントを残す