探究プロジェクトバンク

Raspberry Piとセンサーによるスマート農業環境モニタリングシステムの構築

Tags: Raspberry Pi, IoT, センサー, Python, スマート農業, データ可視化, 電子工作

導入

現代の農業においては、効率性と持続可能性が喫緊の課題となっています。特に、気候変動や労働力不足といった問題に直面する中で、データに基づいた精密な農業管理が不可欠です。本記事では、Raspberry Piと各種センサーを組み合わせ、農地の環境データをリアルタイムでモニタリングし、可視化するシステムの構築プロジェクトをご紹介いたします。

このプロジェクトを通じて、工学部大学生の皆様は、IoT(Internet of Things)の基本から、ハードウェアの接続、プログラミング、データ処理、そしてWebによる可視化まで、実践的なスキルを横断的に習得することが可能です。これまで「どのようなテーマに取り組むべきか」「どのようにプロジェクトを進めていけば良いか」といった課題をお持ちの方にとって、具体的なアプローチと解決策のヒントを提供できるものと確信しております。この探究テーマは、実社会の課題解決に貢献し、将来のキャリアにおいても非常に価値のある経験となるでしょう。

テーマ/プロジェクトの詳細

このプロジェクトの主要な目的は、特定の農業環境(例:温室、畑地の一部)における重要な環境要因(温湿度、土壌水分量、照度など)を継続的に測定し、そのデータを収集・分析・可視化することです。

期待される成果としては、以下の点が挙げられます。

完成形としては、Raspberry Piを核としたセンサーネットワークが環境データを収集し、そのデータがローカルのデータベースに蓄積され、最終的にはWebブラウザを通じてグラフや数値でリアルタイムに閲覧できるダッシュボードシステムを想定しています。

必要なもの

このプロジェクトに取り組むために必要なハードウェア、ソフトウェア、およびその他のツールは以下の通りです。

ハードウェア

ソフトウェア

その他ツール

進め方

プロジェクトの進め方をステップバイステップで説明します。

ステップ1: Raspberry Piの初期設定と環境構築

  1. Raspberry Pi OSのインストール: Raspberry Pi Imagerを使用して、microSDカードにRaspberry Pi OSを書き込みます。
  2. SSHの有効化とネットワーク設定: ヘッドレス(モニターなし)で作業する場合、sshファイルをbootパーティションに作成し、wpa_supplicant.confファイルでWi-Fi設定を行います。
  3. Python開発環境のセットアップ: Raspberry Pi OSにはPythonがプリインストールされています。pipを用いて必要なライブラリ(RPi.GPIOsmbusAdafruit_DHTFlaskmatplotlibなど)をインストールします。

    bash sudo apt update sudo apt install python3-pip pip3 install RPi.GPIO smbus-cffi Adafruit_DHT Flask matplotlib

ステップ2: センサーの接続

各センサーのデータシートを参照し、Raspberry PiのGPIOピンに正しく接続します。

ステップ3: センサーデータ取得プログラムの作成

Pythonスクリプトを作成し、各センサーからデータを読み取ります。

# 例: DHT11/DHT22センサーから温湿度を読み取る (Adafruit_DHTライブラリを使用)
import Adafruit_DHT
import time

DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4 # GPIO 4番ピンに接続

def read_dht_sensor():
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
    if humidity is not None and temperature is not None:
        return temperature, humidity
    else:
        print("Failed to retrieve data from DHT sensor")
        return None, None

# 例: BH1750照度センサーから照度を読み取る (smbusライブラリを使用)
import smbus

I2C_BUS = 1
BH1750_ADDR = 0x23

def read_bh1750_sensor():
    bus = smbus.SMBus(I2C_BUS)
    # 照度データを読み取り (High resolution mode)
    data = bus.read_i2c_block_data(BH1750_ADDR, 0x10)
    # データ変換
    lux = (data[1] + (256 * data[0])) / 1.2
    return lux

if __name__ == "__main__":
    temp, hum = read_dht_sensor()
    if temp is not None:
        print(f"Temperature: {temp:.1f}°C, Humidity: {hum:.1f}%")

    lux_value = read_bh1750_sensor()
    if lux_value is not None:
        print(f"Illuminance: {lux_value:.2f} lux")

ステップ4: データベース構築とデータ保存

SQLiteデータベースを作成し、定期的にセンサーデータを保存するスクリプトを作成します。sqlite3モジュールを使用します。

import sqlite3
import datetime

DB_FILE = "sensor_data.db"

def init_db():
    conn = sqlite3.connect(DB_FILE)
    cursor = conn.cursor()
    cursor.execute("""
        CREATE TABLE IF NOT EXISTS environment_data (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
            temperature REAL,
            humidity REAL,
            illuminance REAL,
            soil_moisture REAL
        )
    """)
    conn.commit()
    conn.close()

def save_data(temperature, humidity, illuminance, soil_moisture):
    conn = sqlite3.connect(DB_FILE)
    cursor = conn.cursor()
    cursor.execute("""
        INSERT INTO environment_data (temperature, humidity, illuminance, soil_moisture)
        VALUES (?, ?, ?, ?)
    """, (temperature, humidity, illuminance, soil_moisture))
    conn.commit()
    conn.close()

if __name__ == "__main__":
    init_db()
    # ここでセンサーデータを取得し、save_dataを呼び出す
    # save_data(25.5, 60.2, 500, 700)

これらのスクリプトは、cronジョブなどを使用して定期的に実行するよう設定します。

ステップ5: Webインターフェース開発(データ可視化ダッシュボード)

Flaskを使用してWebサーバーを構築し、データベースから読み込んだデータをWebページでグラフ表示します。

from flask import Flask, render_template
import sqlite3
import matplotlib.pyplot as plt
import io
import base64

app = Flask(__name__)
DB_FILE = "sensor_data.db"

def get_data_from_db():
    conn = sqlite3.connect(DB_FILE)
    cursor = conn.cursor()
    cursor.execute("SELECT timestamp, temperature, humidity, illuminance FROM environment_data ORDER BY timestamp DESC LIMIT 50")
    data = cursor.fetchall()
    conn.close()
    return data

@app.route('/')
def index():
    raw_data = get_data_from_db()
    timestamps = [row[0] for row in raw_data]
    temperatures = [row[1] for row in raw_data]
    humidities = [row[2] for row in raw_data]
    illuminances = [row[3] for row in raw_data]

    # グラフ生成の例 (Matplotlib)
    fig, ax1 = plt.subplots(figsize=(10, 6))
    ax1.plot(timestamps, temperatures, label='Temperature (°C)', color='red')
    ax2 = ax1.twinx()
    ax2.plot(timestamps, humidities, label='Humidity (%)', color='blue')
    fig.autofmt_xdate()
    ax1.set_xlabel('Time')
    ax1.set_ylabel('Temperature (°C)', color='red')
    ax2.set_ylabel('Humidity (%)', color='blue')
    plt.title('Temperature and Humidity over Time')
    plt.legend()

    # グラフを画像としてエンコード
    buf = io.BytesIO()
    plt.savefig(buf, format='png')
    plt.close(fig)
    image_base64 = base64.b64encode(buf.getvalue()).decode('utf-8')

    return render_template('index.html', image_base64=image_base64)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

templates/index.htmlファイルも作成し、Webページにグラフを表示するよう設定します。

ステップ6: テストとデバッグ

センサーが正しく動作しているか、データが正確に取得されているか、Webダッシュボードが適切に表示されるかを繰り返しテストします。異常値のハンドリングやエラーログの記録も考慮します。

難易度と所要時間の目安

さらに発展させるには(応用・発展の可能性)

本プロジェクトは多岐にわたる応用・発展の可能性を秘めています。

参考情報源

このプロジェクトを進める上で、以下の情報源が学習の助けとなるでしょう。

まとめ

本記事では、Raspberry Piと各種センサーを活用したスマート農業環境モニタリングシステムの構築プロジェクトについて解説いたしました。このプロジェクトは、IoTデバイスの設計からプログラミング、データ処理、Web開発に至るまで、工学部大学生の皆様が実践的なスキルを幅広く習得できる絶好の機会を提供します。

センサーデータを活用した具体的な課題解決へのアプローチは、理論学習だけでは得られない深い洞察と達成感をもたらすことでしょう。ぜひこの機会に、ご自身のアイデアと技術力を組み合わせ、未来の農業を支える一歩を踏み出していただければ幸いです。