IOT連携


以下に、IoT・センサー技術および外部データ取得(気象データAPI等)に関する6ヶ月(24週)の週ごとの授業スケジュール案と、それに対応した実習教材(ノートブック形式・プロジェクトテーマ)案をまとめました。

📘 カリキュラム全体構成(全24週)

期間 単元 内容概要
第1~4週 IoTとスマート農業の基礎 概論、事例紹介、IoTの基本構造、センサーの種類と役割
第5~8週 センサー実装とデータ収集 温湿度、土壌、照度など各種センサーの使用とRaspberry Pi/Arduinoでの収集
第9~12週 通信とデータ送信 MQTT、HTTP、LoRaなどの通信プロトコル実践、クラウド連携
第13~16週 外部データ活用 気象APIの利用(OpenWeatherMap等)、衛星・農業オープンデータ取得
第17~20週 データ蓄積・可視化 時系列DB、可視化ツール(Grafana等)、Jupyterノートブックでの分析
第21~24週 応用プロジェクト 小規模スマート農業システム構築(IoT+外部データ+可視化)

🧪 週別スケジュールと実習教材例(抜粋)

📦 第1~4週:IoTとスマート農業の基礎

授業テーマ実習内容ノートブック例
1スマート農業とは?スマート農業事例分析SmartAgri_Overview.ipynb:国内外の成功事例の調査
2IoTの基礎構造IoTシステムの構成図を描くIoT_Architecture_Intro.ipynb:IoTの構成(センサー→通信→クラウド)
3センサーの種類と役割農業で使われるセンサーの比較Sensor_Types_Comparison.ipynb
4センサー選定ワークショップ作物に応じたセンサー設計グループで作物ごとのセンサープランを作成

🧲 第5~8週:センサー実装とデータ収集

授業テーマ実習内容ノートブック例
5温湿度センサーの実装DHT11で温湿度測定Sensor_DHT11_Read.ipynb(Raspberry Pi)
6土壌水分センサーの実装Capacitive soil sensor使用SoilMoisture_Logging.ipynb
7複数センサーの同時取得I2C, GPIOの扱いMultiSensor_Collection.ipynb
8CSV保存+グラフ描画取得データの可視化SensorData_Plotting.ipynb(Matplotlib/Pandas)

🌐 第13~16週:外部データ活用(気象・オープンデータ)

授業テーマ実習内容ノートブック例
13気象APIの概要OpenWeatherMap APIの使い方WeatherAPI_Basics.ipynb(APIキー取得と使い方)
14APIデータの解析気象データの加工と分析WeatherAPI_Analysis.ipynb(気温の推移グラフ)
15オープン農業データ取得農研機構・気象庁データセットの活用OpenAgriData_Usage.ipynb
16自作API統合センサーデータ+APIの統合分析Sensor_Weather_Integration.ipynb

🛠️ 第21~24週:応用プロジェクト

授業テーマ実習内容ノートブック例
21企画立案チームで課題設定・システム設計水やり支援、霜予測、日射最適化など
22センサー構築センサー組み立て+データ送信MQTT→クラウド or ローカル
23データ統合・可視化可視化・アラート設計Grafana/Plotlyでの時系列分析
24成果発表チームプレゼン最終プレゼン・振り返りノートブック提出

🧰 使用予定技術・ツール一覧

・ハードウェア:Raspberry Pi / Arduino Uno, DHT11, 土壌水分センサー, 照度センサー

・ソフトウェア:Python, Jupyter Notebook, Grafana, InfluxDB, SQLite

・通信:MQTT, HTTP, Webhook

・外部API:OpenWeatherMap, 気象庁, 農研機構API/CSV

・可視化:Matplotlib, Plotly, Grafana


✅ 今後の提案

・実習用ノートブックテンプレートの配布(GitHub等で一括管理)

・IoTデバイスの貸出・管理案の整備

・各週での「理解度チェック」やミニテスト付き教材の導入

以下は、SmartAgri_Overview.ipynb の内容例です。

このノートブックは、スマート農業の概要や事例を学ぶことを目的としたイントロダクション教材です。

📘 SmartAgri_Overview.ipynb

目的: スマート農業の概要を理解し、国内外の事例から技術の活用方法を学ぶ


# スマート農業とは? - Smart Agriculture Overview

## 🔍 1. スマート農業の定義

スマート農業とは、IoT、AI、ロボティクス、クラウドなどの先端技術を活用して、農作業の効率化・自動化・最適化を図る新しい農業の形です。

- 労働力不足の解消
- 品質の安定と向上
- 環境負荷の低減

---

## 🌍 2. 世界のスマート農業事例

| 国 | 事例 | 技術活用ポイント |
|----|------|-----------------|
| オランダ | 精密農業と温室制御 | センサー+AIによる環境制御 |
| アメリカ | ドローンによる作物観察 | NDVI解析による病害虫検出 |
| 日本 | 水田の遠隔水管理(WATARAS) | 水位センサー+LTE通信 |

---

## 🧑‍🌾 3. 日本国内の事例ピックアップ

```python
import pandas as pd

# 国内事例のサンプルデータ
data = {
    "地域": ["北海道", "茨城県", "長崎県"],
    "作物": ["小麦", "メロン", "トマト"],
    "技術": ["トラクター自動走行", "ハウス内環境センサー", "画像解析による熟度判定"]
}

df = pd.DataFrame(data)
df

🛠 4. スマート農業の構成要素


from IPython.display import Image
Image("https://example.com/smart_agri_architecture.png")  # ※ 実際の画像は差し替え必要

・センサー(温湿度、土壌、水位など)

・通信(Wi-Fi, LoRa, 5G, LTE)

・データ分析(クラウド, AI, BIツール)

・自動化(アクチュエータ、ドローン)


💡 5. ディスカッション課題

あなたの地元や興味のある地域で、どのようなスマート農業の技術が活用できそうか?

グループで意見を出し合い、1つのアイデアにまとめよう。

✅ 振り返りクイズ(ミニテスト)


from IPython.display import display
import ipywidgets as widgets

q1 = widgets.RadioButtons(
    options=['労働力削減', '害虫の増加', '収穫時期の不安定化'],
    description='スマート農業の効果は?'
)
display(q1)

📎 参考リンク

・農林水産省「スマート農業の推進について」

・FAO: Smart Agriculture

・オランダWageningen大学のスマート農業研究


---

このノートブックは主に「イントロ+理解+議論+軽い可視化」の構成になっています。  
必要に応じて、以下のような拡張も可能です:

- 地域の気候や作物データをAPIで取得して事例と関連付ける
- 自分の地域をGoogleマップAPI等で表示
- 日本地図にスマート農業事例をマッピング

---

以下は、IoT_Architecture_Intro.ipynb の内容例です。

このノートブックは、IoTシステムの構成とそのデータの流れを理解するための導入教材として設計されています。

📘 IoT_Architecture_Intro.ipynb

目的: IoTシステムの全体像(センサー → 通信 → クラウド → 可視化)を把握する


# IoTアーキテクチャ入門 - Introduction to IoT Architecture

## 🎯 学習目標

- IoTの基本構造(センサー・通信・クラウド・可視化)を理解する
- 各構成要素の役割を明確に説明できるようになる

🧱 1. IoTシステムの構成要素とは?


from IPython.display import Image
Image("https://example.com/iot_architecture_diagram.png")  # 実際には適切な図に置き換えてください

・センサー:環境や作物のデータ(温度・湿度・土壌など)を取得

・通信:データを送信(例:Wi-Fi, LoRa, LTE)

・クラウド/エッジ:受け取ったデータを保存・分析(AWS, Firebase, Raspberry Pi等)

・可視化・制御:グラフやダッシュボードで表示/機器の制御(Grafana, Webアプリ等)

📡 2. 通信プロトコルの例

プロトコル用途特徴
HTTPデータ送信(REST API)簡単だがやや重い
MQTT軽量なデータ配信IoT向き、低消費電力
LoRa長距離通信低速だが広範囲カバー可
BLE近距離通信スマホ連携など

🧪 3. 簡易IoT構成モデルをPythonで模倣(データ取得〜送信)


import random
import time

# 仮のセンサーデータを生成
def get_temperature():
    return round(random.uniform(20.0, 30.0), 2)

def get_humidity():
    return round(random.uniform(40.0, 70.0), 2)

data_packet = {
    "temperature": get_temperature(),
    "humidity": get_humidity(),
    "timestamp": time.strftime('%Y-%m-%d %H:%M:%S')
}

print("📦 送信データ:", data_packet)

☁️ 4. クラウド送信のイメージ(HTTPリクエスト)


import requests

url = "https://example-iot-endpoint.com/data"
# 実際の送信はコメントアウト
# response = requests.post(url, json=data_packet)
print("送信先URL:", url)

※ 本物のAPIキーやURLを使用する場合は、セキュリティに注意!

📊 5. 収集したデータを簡易可視化(ローカル)


import matplotlib.pyplot as plt

temps = [get_temperature() for _ in range(10)]
plt.plot(temps, marker='o')
plt.title("📈 Temperature Over Time (Simulated)")
plt.xlabel("Time (unit)")
plt.ylabel("Temperature (°C)")
plt.grid(True)
plt.show()

💬 6. ディスカッション

あなたが作りたいIoTシステムでは、どの構成要素が特に重要になりそうですか? センサーの種類、通信方法、保存方法を考えてみましょう。

✅ 振り返りチェック(選択式)


import ipywidgets as widgets
from IPython.display import display

q = widgets.RadioButtons(
    options=['MQTT', 'FTP', 'SMTP'],
    description='IoT向け通信プロトコルは?'
)
display(q)

📎 参考リンク

・MQTTとは? ・IoTの基本構造 | AWS IoT Coreガイド ・スマート農業の通信技術(農研機構)

このノートブックを基にして、次は「実際のセンサー(DHT11など)との接続」「クラウドへのデータ送信」など、具体的な実装ステップに進みます。

以下は、Sensor_Types_Comparison.ipynb の内容です。このノートブックでは、農業用途でよく使われるセンサーの種類を理解し、比較検討することを目的としています。

📘 Sensor_Types_Comparison.ipynb

目的: 農業用センサーの種類・用途・特徴を理解し、目的に合ったセンサーを選定できるようになる。


# センサーの種類と比較 - Sensor Types for Smart Agriculture

## 🎯 学習目標

- 農業に利用される主要なセンサーの種類を理解する
- それぞれの特徴・用途・メリット・注意点を把握する

📋 1. よく使われるセンサーのリスト


import pandas as pd

data = {
    "センサー名": ["DHT11", "土壌水分センサー", "照度センサー(BH1750)", "CO2センサー", "NDVIセンサー"],
    "測定項目": ["温度・湿度", "土壌水分", "日射・照度", "二酸化炭素濃度", "植生指数(NDVI)"],
    "特徴": [
        "安価・精度は低め",
        "静電容量式は信頼性が高い",
        "I2C接続、高感度",
        "温室内の換気管理に有効",
        "ドローンや衛星搭載に使用"
    ],
    "用途例": [
        "ハウス内環境モニタリング",
        "灌水のタイミング判断",
        "光合成効率の推定",
        "ビニールハウスのCO2制御",
        "生育状況・病害検出"
    ]
}

df = pd.DataFrame(data)
df

📊 2. 価格帯と利用難易度の比較(視覚化)


import matplotlib.pyplot as plt

sensors = ["DHT11", "Soil", "Light", "CO2", "NDVI"]
cost = [3, 5, 4, 20, 100]  # 単位: USD(概算)
difficulty = [1, 2, 2, 3, 4]  # 1(易)〜5(難)

fig, ax = plt.subplots()
ax.bar(sensors, cost, label="価格")
ax.plot(sensors, difficulty, label="難易度", color='red', marker='o')
ax.set_ylabel("価格(USD)/難易度(1~5)")
ax.set_title("センサーの価格と使用難易度比較")
ax.legend()
plt.grid(True)
plt.show()

🧠 3. ケース別センサー選定シナリオ


### ケースA:露地栽培での灌水判断
- 使用センサー:土壌水分センサー
- 利点:過不足のない水やりを実現
- 注意点:屋外設置には防水加工が必要

### ケースB:ビニールハウスの環境モニタリング
- 使用センサー:DHT11, 照度センサー, CO2センサー
- 利点:統合的な環境制御が可能
- 注意点:温度上昇時の精度低下に注意(DHT11)

### ケースC:大規模圃場での生育状況把握
- 使用センサー:NDVIセンサー(もしくは衛星画像)
- 利点:異常地帯の特定、病害予兆の検出

💬 4. ディスカッション課題

あなたの興味のある作物・栽培方法において、どのセンサーが最も重要ですか? 理由とともに、想定する活用方法をまとめましょう。

✅ 振り返りチェック


import ipywidgets as widgets
from IPython.display import display

q1 = widgets.Dropdown(
    options=[
        'DHT11(温湿度)',
        'NDVIセンサー(植生指数)',
        '土壌水分センサー',
        '照度センサー'
    ],
    description='日射量を測るには?'
)
display(q1)

📎 参考リンク

Adafruitセンサーカタログ SparkFun Soil Moisture Guide NDVIとは?農業における応用

このノートブックは、次週の**実際のセンサー取得(DHT11など)**へつなぐ準備として利用します。

以下は、Sensor_DHT11_Read.ipynb の内容例です。このノートブックでは、DHT11センサー(温湿度)をRaspberry Piに接続し、Pythonを使ってデータを取得する基本的な実装を学びます。

📘 Sensor_DHT11_Read.ipynb

目的: DHT11センサーを用いて温度・湿度データをRaspberry Piから読み取る


# DHT11センサーの読み取り実践 - Read Temperature and Humidity using DHT11

## 🎯 学習目標

- DHT11の構造と動作原理を理解する
- Raspberry Piに接続してPythonで温湿度データを取得する

🧱 1. 必要なハードウェアと配線

・センサー:DHT11(3ピン or 4ピン)

・接続先:Raspberry Pi GPIO(例:GPIO4)

・抵抗:10kΩ プルアップ(4ピンタイプのみ)


### 配線図

- VCC → Raspberry Pi 3.3V(Pin1)
- GND → GND(Pin6)
- DATA → GPIO4(Pin7)

※ 4ピンタイプの場合:VCC–DATA間に10kΩのプルアップ抵抗を入れる

🔧 2. ライブラリのインストール(事前準備)


sudo apt update
sudo apt install python3-pip
pip3 install Adafruit_DHT

ライブラリ名:Adafruit_DHT(Adafruit社製のDHTセンサードライバ)

🧪 3. センサーデータの読み取り(基本コード)


import Adafruit_DHT
import time

# 使用センサーとGPIOピン設定
sensor = Adafruit_DHT.DHT11
pin = 4  # GPIO4

# データ取得ループ
for i in range(5):
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    if humidity is not None and temperature is not None:
        print(f"🌡 温度: {temperature:.1f}°C  💧 湿度: {humidity:.1f}%")
    else:
        print("⚠️ センサーの読み取りに失敗しました")
    time.sleep(2)

📊 4. データをグラフに可視化(シミュレーション)


import matplotlib.pyplot as plt

temps = [22.1, 22.4, 22.2, 22.5, 22.3]
hums = [55.1, 54.8, 55.3, 55.0, 54.9]

plt.plot(temps, label='温度(°C)', marker='o')
plt.plot(hums, label='湿度(%)', marker='x')
plt.title("DHT11 測定データ (例)")
plt.xlabel("時刻(回数)")
plt.ylabel("値")
plt.legend()
plt.grid(True)
plt.show()

💬 5. ディスカッション課題

センサーのデータを記録・蓄積して活用するにはどんな仕組みが必要?

(例:CSV保存/クラウド送信/グラフ表示)

📝 6. 発展課題

10秒ごとにデータを取得してCSVに保存してみよう

一定以上の温度になったらアラートを出すロジックを追加してみよう

✅ 確認クイズ


import ipywidgets as widgets
widgets.RadioButtons(
    options=['GPIOピン', 'USBポート', 'HDMI端子'],
    description='DHT11のデータ出力先は?'
)

📎 参考リンク

・Adafruit DHT Python Library GitHub

・Raspberry Pi GPIO ピン配置

・農業用センサー活用事例(農研機構)

このノートブックの内容を発展させて、次の週ではクラウド連携(FirebaseやMQTT)やデータ蓄積→可視化へ進めます。

📥 Sensor_DHT11_Read.ipynb

Raspberry Pi 実機での温湿度データ取得にそのまま使用できます。必要に応じてCSV保存やアラート処理の拡張も可能です。次に進めたいノートブックやテーマがあれば、気軽に教えてください! ​​

以下は、SoilMoisture_Logging.ipynb の内容例です。このノートブックでは、土壌水分センサーを使ってデータを取得し、一定間隔でロギング(記録)する基本的な仕組みを学びます。

📘 SoilMoisture_Logging.ipynb

目的: 土壌水分センサーからのデータを定期的に取得し、CSVファイルに記録する。


# 土壌水分センサーのデータ取得とロギング

## 🎯 学習目標

- 土壌水分センサーの仕組みを理解する
- Pythonでセンサーデータを読み取り、CSVに記録する

🧱 1. 使用するセンサーと接続

センサー名: 土壌水分センサー(アナログ or デジタルタイプ)

接続例: Raspberry Pi + ADC(例:MCP3008)経由

GPIO: SPIインターフェース使用


### 配線例(MCP3008経由)

- センサーVCC → 3.3V
- センサーGND → GND
- センサー信号 → MCP3008 CH0
- MCP3008 → SPI0 (MISO: GPIO9, MOSI: GPIO10, CLK: GPIO11, CS: GPIO8)

🔧 2. 必要なライブラリのインストール


pip3 install gpiozero spidev

🧪 3. センサーデータの取得コード


from gpiozero import MCP3008
import time

soil = MCP3008(channel=0)

for i in range(5):
    value = soil.value  # 0.0 (乾燥) 〜 1.0 (湿潤)
    print(f"🌱 土壌水分レベル: {value:.2f}")
    time.sleep(2)

💾 4. CSVファイルへの記録


import csv
from datetime import datetime

filename = "soil_log.csv"

with open(filename, mode='w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(["timestamp", "soil_moisture"])

    for i in range(10):
        value = soil.value
        timestamp = datetime.now().isoformat()
        writer.writerow([timestamp, value])
        print(f"✅ 記録: {timestamp} - {value:.2f}")
        time.sleep(5)

📈 5. ログデータの可視化(例)


import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("soil_log.csv")
df["timestamp"] = pd.to_datetime(df["timestamp"])

plt.plot(df["timestamp"], df["soil_moisture"], marker='o')
plt.title("土壌水分の変化")
plt.xlabel("時刻")
plt.ylabel("水分値(0.0〜1.0)")
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

💬 6. ディスカッション課題

土壌のどの深さにセンサーを埋めるべきか?また、場所によるばらつきへの対応方法は?

📝 発展課題

複数センサーを使用して圃場マッピングを行う

湿度が一定値を下回ったら警告メールを送る(IFTTT or Gmail API)

📎 参考リンク

gpiozero soil sensor example

MCP3008の使い方

📥 SoilMoisture_Logging.ipynb

以下は、MultiSensor_Collection.ipynb の内容です。 このノートブックは、複数のセンサー(例:温度・湿度・土壌水分・照度など)を同時にデータ収集してCSVファイルに記録する基本構成を学ぶ教材です。

📘 MultiSensor_Collection.ipynb


# 複数センサーのデータ収集とロギング

## 🎯 学習目標

- 複数種類のセンサーを同時に扱う方法を理解する
- 測定データを一括でCSVに記録する

🧱 1. 使用するセンサー一覧と接続

センサー測定項目接続方式
DHT11温度・湿度GPIO(デジタル)
土壌水分センサー水分量MCP3008経由(アナログ)
照度センサー(例:BH1750)照度I2C

🔧 2. ライブラリのインストール


pip3 install Adafruit_DHT smbus2 gpiozero

🧪 3. センサー初期化コード


import Adafruit_DHT
from gpiozero import MCP3008
import smbus2
import time

# DHT11 設定
dht_sensor = Adafruit_DHT.DHT11
dht_pin = 4

# 土壌水分センサー(アナログ)設定
soil = MCP3008(channel=0)

# 照度センサー(BH1750)設定
bus = smbus2.SMBus(1)
BH1750_ADDR = 0x23
ONE_TIME_HIGH_RES_MODE = 0x20

💾 4. すべてのセンサーデータを取得してCSV保存


import csv
from datetime import datetime

filename = "multi_sensor_log.csv"

def read_light():
    data = bus.read_i2c_block_data(BH1750_ADDR, ONE_TIME_HIGH_RES_MODE)
    return (data[0] << 8 | data[1]) / 1.2  # lx

with open(filename, mode='w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(["timestamp", "temperature", "humidity", "soil_moisture", "light_lux"])

    for i in range(10):
        timestamp = datetime.now().isoformat()
        humidity, temperature = Adafruit_DHT.read_retry(dht_sensor, dht_pin)
        soil_value = soil.value
        light_lux = read_light()

        print(f"[{timestamp}] T={temperature}°C, H={humidity}%, Soil={soil_value:.2f}, Light={light_lux:.2f} lx")
        writer.writerow([timestamp, temperature, humidity, soil_value, light_lux])
        time.sleep(5)

📈 5. データの読み込みとプロット


import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("multi_sensor_log.csv")
df["timestamp"] = pd.to_datetime(df["timestamp"])

plt.figure(figsize=(12,6))
plt.plot(df["timestamp"], df["temperature"], label="温度(°C)")
plt.plot(df["timestamp"], df["humidity"], label="湿度(%)")
plt.plot(df["timestamp"], df["soil_moisture"], label="土壌水分")
plt.plot(df["timestamp"], df["light_lux"], label="照度(lux)")
plt.legend()
plt.xticks(rotation=45)
plt.title("複数センサーの測定値")
plt.tight_layout()
plt.grid(True)
plt.show()

💬 6. ディスカッション課題

センサーごとに測定精度や反応速度が異なる中で、どのように「意味のあるデータ」を得るべきか?

📝 発展課題

測定値に対して異常値判定の処理を加える(外れ値除去)

測定インターバルを環境に応じて可変にする(例:気温が高いときは頻繁に測る)

📎 参考リンク

BH1750 sensor

Adafruit DHT Library

gpiozero MCP3008

📘 SensorData_Plotting.ipynb


# センサーデータの可視化
## 🎯 学習目標 - センサーで収集したCSVデータをPandasで読み込む - 時系列データを可視化することで環境変化を直感的に把握する

🗂 1. 対象とするデータ形式

multi_sensor_log.csv の形式を想定:

2025-04-20T14:00:00 ...
timestamptemperaturehumiditysoil_moisturelight_lux
23.550.20.44300.2
............

📖 2. CSVの読み込み


import pandas as pd

df = pd.read_csv("multi_sensor_log.csv")
df["timestamp"] = pd.to_datetime(df["timestamp"])
df.head()

📈 3. 各センサーデータの折れ線グラフ


import matplotlib.pyplot as plt

plt.figure(figsize=(12, 6))

plt.plot(df["timestamp"], df["temperature"], label="温度(°C)")
plt.plot(df["timestamp"], df["humidity"], label="湿度(%)")
plt.plot(df["timestamp"], df["soil_moisture"], label="土壌水分")
plt.plot(df["timestamp"], df["light_lux"], label="照度(lux)")

plt.title("センサーデータの時系列プロット")
plt.xlabel("時刻")
plt.ylabel("値")
plt.legend()
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

🎨 4. サブプロットで個別表示


fig, axs = plt.subplots(4, 1, figsize=(12, 10), sharex=True)

axs[0].plot(df["timestamp"], df["temperature"], color="red")
axs[0].set_ylabel("温度(°C)")

axs[1].plot(df["timestamp"], df["humidity"], color="blue")
axs[1].set_ylabel("湿度(%)")

axs[2].plot(df["timestamp"], df["soil_moisture"], color="green")
axs[2].set_ylabel("土壌水分")

axs[3].plot(df["timestamp"], df["light_lux"], color="orange")
axs[3].set_ylabel("照度(lux)")
axs[3].set_xlabel("時刻")

plt.suptitle("センサーデータの詳細可視化", fontsize=16)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

📝 発展課題

・一定期間をズームして表示する機能を追加

・異常値を検出してハイライトする

・外部天候データと比較することで相関分析

✅ 手順

以下のコードをコピーして、テキストファイルとして保存します(例: SensorData_Plotting.ipynb)。 拡張子を .ipynb にします。 Jupyter Notebook や VS Code 上で開くことができます。 📦 .ipynb 内容

{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# センサーデータの可視化\n",
    "\n",
    "## 🎯 学習目標\n",
    "\n",
    "- センサーで収集したCSVデータをPandasで読み込む\n",
    "- 時系列データを可視化することで環境変化を直感的に把握する"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 🗂 1. 対象とするデータ形式\n",
    "\n",
    "`multi_sensor_log.csv` の形式を想定:\n",
    "\n",
    "| timestamp           | temperature | humidity | soil_moisture | light_lux |\n",
    "|---------------------|-------------|----------|----------------|-----------|\n",
    "| 2025-04-20T14:00:00 | 23.5        | 50.2     | 0.44           | 300.2     |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 📖 2. CSVの読み込み"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_csv(\"multi_sensor_log.csv\")\n",
    "df[\"timestamp\"] = pd.to_datetime(df[\"timestamp\"])\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 📈 3. 各センサーデータの折れ線グラフ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.figure(figsize=(12, 6))\n",
    "\n",
    "plt.plot(df[\"timestamp\"], df[\"temperature\"], label=\"温度(°C)\")\n",
    "plt.plot(df[\"timestamp\"], df[\"humidity\"], label=\"湿度(%)\")\n",
    "plt.plot(df[\"timestamp\"], df[\"soil_moisture\"], label=\"土壌水分\")\n",
    "plt.plot(df[\"timestamp\"], df[\"light_lux\"], label=\"照度(lux)\")\n",
    "\n",
    "plt.title(\"センサーデータの時系列プロット\")\n",
    "plt.xlabel(\"時刻\")\n",
    "plt.ylabel(\"値\")\n",
    "plt.legend()\n",
    "plt.grid(True)\n",
    "plt.xticks(rotation=45)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 🎨 4. サブプロットで個別表示"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig, axs = plt.subplots(4, 1, figsize=(12, 10), sharex=True)\n",
    "\n",
    "axs[0].plot(df[\"timestamp\"], df[\"temperature\"], color=\"red\")\n",
    "axs[0].set_ylabel(\"温度(°C)\")\n",
    "\n",
    "axs[1].plot(df[\"timestamp\"], df[\"humidity\"], color=\"blue\")\n",
    "axs[1].set_ylabel(\"湿度(%)\")\n",
    "\n",
    "axs[2].plot(df[\"timestamp\"], df[\"soil_moisture\"], color=\"green\")\n",
    "axs[2].set_ylabel(\"土壌水分\")\n",
    "\n",
    "axs[3].plot(df[\"timestamp\"], df[\"light_lux\"], color=\"orange\")\n",
    "axs[3].set_ylabel(\"照度(lux)\")\n",
    "axs[3].set_xlabel(\"時刻\")\n",
    "\n",
    "plt.suptitle(\"センサーデータの詳細可視化\", fontsize=16)\n",
    "plt.xticks(rotation=45)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 📝 発展課題\n",
    "\n",
    "- 一定期間をズームして表示する機能を追加\n",
    "- 異常値を検出してハイライトする\n",
    "- 外部天候データと比較することで相関分析"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": ""
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}

👉 WeatherAPI_Basics.ipynb

このノートブックでは、Open-Meteo API を使った天気データの取得・可視化を学ぶ内容になっています。必要に応じて、都市やパラメータを変更してカスタマイズも可能です! ​​

👉 WeatherAPI_Analysis.ipynb

このノートブックでは、天気APIから得られたデータをもとに、気温の時間帯別分析や相関分析、移動平均による傾向把握を行います。CSVデータは事前に保存しておく必要があります(例: tokyo_weather_data.csv)。 ​​

🔵 第13~16週:外部データ活用(気象・オープンデータ)

📅 第13週:天気APIの基礎と取得方法

🎯 学習目標

天気データAPI(例:Open-Meteo)の仕組みを理解する APIを使って天気情報を取得する方法を学ぶ

🛠 実習

・Pythonで requests を使ったAPIリクエスト

・JSON形式のレスポンスを解析し、必要な気温・湿度情報を抽出

・PandasとMatplotlibによる時系列の可視化

💡 発展課題

・他の都市(札幌・大阪など)との気温・湿度の比較

・風速や降水量など他のパラメータの追加取得と分析

・日の出・日の入り時間の可視化

📅 第14週:天気データの分析と傾向把握

🎯 学習目標

・APIデータから得た情報の統計分析と傾向を理解する

・相関分析や時系列処理を通して、データ解釈の幅を広げる

🛠 実習

・気温・湿度データの移動平均や標準偏差の算出

・相関行列の作成とヒートマップによる可視化

・日中と夜間の気温差の統計的比較

💡 発展課題

・異常気象を検出するための温度変化分析

・週ごとの変動比較(曜日ごとの特徴)

・他の都市と比較して「都市ヒートアイランド現象」を分析

📅 第15週:公開農業データの活用(農林水産省等)

🎯 学習目標

・公開されている農業統計データの探し方・読み解き方を学ぶ

・地域や作物別の収穫量データを活用し、可視化・分析を行う

🛠 実習

・農業データ(例:作物ごとの収穫量)をPandasで読み込み

・年別、地域別の作物傾向をグラフで可視化

・天気データとの簡単な相関を試みる

💡 発展課題

・作物収穫量と気温・降水量との相関を可視化

・地域ごとの成長傾向や作物構成の違い分析

・経年で収穫量が減っている作物の要因分析(仮説立案)

📅 第16週:センサー+外部データの統合分析

🎯 学習目標

・自分で取得したセンサーデータと天気APIのデータを組み合わせる

・両者を比較することで、センサー補完や妥当性検証の方法を学ぶ

🛠 実習

・同時刻のセンサーデータとAPIデータを時系列で統合

・気温・湿度の差を可視化し、傾向を分析

・相関係数の算出とその意味の考察

💡 発展課題

・雨天や高温時のセンサー誤差傾向の抽出

・センサーデータの補正ロジック(フィルタやバイアス補正)の設計

・センサーが欠損した場合のAPI代替モデル構築の検討

📘 第13週:WeatherAPI_Basics.ipynb


# 第13週:天気APIの基礎と取得方法

## 🎯 学習目標
- 天気データAPI(例:Open-Meteo)の仕組みを理解
- APIを使って天気情報を取得し可視化

import requests
import pandas as pd
import matplotlib.pyplot as plt

# 天気API(Open-Meteo)のリクエスト
params = {
    'latitude': 35.6895,
    'longitude': 139.6917,
    'hourly': 'temperature_2m',
    'timezone': 'Asia/Tokyo'
}
response = requests.get('https://api.open-meteo.com/v1/forecast', params=params)
data = response.json()

# データフレームに変換
hourly = pd.DataFrame({
    'time': data['hourly']['time'],
    'temp': data['hourly']['temperature_2m']
})
hourly['time'] = pd.to_datetime(hourly['time'])
hourly.set_index('time', inplace=True)

# グラフ描画
hourly.plot(figsize=(10, 4), title='東京の気温(Open-Meteo)')
plt.ylabel("気温 (°C)")
plt.show()

📘 第14週:WeatherAPI_Analysis.ipynb


# 第14週:天気データの分析と傾向把握

## 📈 学習目標
- APIデータの統計的傾向分析
- 相関分析と可視化

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

weather = pd.read_csv('tokyo_weather.csv', parse_dates=['time'])
weather.set_index('time', inplace=True)

# 移動平均
weather['temp_ma'] = weather['temperature'].rolling(window=6).mean()
weather[['temperature', 'temp_ma']].plot(figsize=(10,4), title="気温と移動平均")
plt.ylabel("気温 (°C)")
plt.show()

# 相関マトリクス
sns.heatmap(weather.corr(), annot=True)
plt.title("相関行列")
plt.show()

📘 第15週:OpenAgriData_Usage.ipynb


# 第15週:公開農業データの活用

## 🌾 学習目標
- 農水省等のデータをPandasで分析・可視化
- 地域・作物ごとの傾向をつかむ

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

crop = pd.read_csv('crop_yield_sample.csv')

# 作物ごとの収穫量比較
plt.figure(figsize=(10,5))
sns.barplot(data=crop, x='地域', y='収穫量(kg)', hue='作物')
plt.title('地域別作物収穫量')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

📘 第16週:Sensor_Weather_Integration.ipynb


# 第16週:センサー+外部データの統合分析

## 🔄 学習目標
- センサーデータと天気APIデータを統合し傾向を比較分析

import pandas as pd
import matplotlib.pyplot as plt

# 読み込み
sensor = pd.read_csv('sensor_data.csv', parse_dates=['time'])
weather = pd.read_csv('weather_data.csv', parse_dates=['time'])

sensor.set_index('time', inplace=True)
weather.set_index('time', inplace=True)

# 結合
merged = pd.merge(sensor, weather, left_index=True, right_index=True)

# 気温比較可視化
merged[['temperature_sensor', 'temperature_weather']].plot(figsize=(10,4), title="センサーと天気APIの気温比較")
plt.ylabel("気温 (°C)")
plt.show()

# 相関
print("相関係数(気温):", merged['temperature_sensor'].corr(merged['temperature_weather']))

🟢 第21~24週:応用プロジェクト(センサー+外部データ+分析の統合)

📅 第21週:プロジェクト企画とデータ要件定義

🎯 学習目標

自身が取り組む農業課題・仮説を設定し、必要なデータやセンサーの種類を洗い出す 分析や可視化のゴールを明確にする(収穫予測、環境最適化、異常検知など)

🛠 実習

テーマ例:

・「ハウス内の高温状態を検知して自動換気を提案」

・「露地栽培で雨量と湿度を加味した水やり最適化モデル」

・「仮説→必要データ→分析手法」の構成を紙やMiroなどでまとめる

💡 発展課題

・地域や作物に合わせたオープンデータ活用戦略の検討

・外部気象APIと自センサーの統合データ構造の設計

📅 第22週:データ収集・前処理の設計と実装

🎯 学習目標

・必要なセンサーやAPIからデータを継続的に取得する仕組みを実装

・欠損処理・ノイズ除去・スムージングなどの前処理スキルを習得

🛠 実習

・複数センサー+天気APIからの時系列収集スクリプト作成(Python)

・CSV or SQLite等に保存し、1日単位のバッチ処理を想定

💡 発展課題

・データ欠損時の補完方法(前方補完・平均補完等)の比較

・ノイズセンサーデータをフィルタリングするアルゴリズムの実装(移動平均・中央値)

📅 第23週:可視化・モデル分析の実装

🎯 学習目標

・統合データをグラフ・ヒートマップ・傾向図として表現

・必要に応じて簡易な機械学習(決定木、回帰モデル)を用いた予測分析を試す

🛠 実習

・Seaborn / Matplotlib / Plotly を用いた視覚化

・Scikit-learn によるシンプルなモデル化(例:湿度と降水量からの給水判断予測)

💡 発展課題

・しきい値ベースのアラート判定システムの構築(Slack通知など)

・外れ値検出(Isolation Forestなど)を使った異常気象の早期検知

📅 第24週:成果発表・報告書作成

🎯 学習目標

・プロジェクトで得られた洞察や成果をチームや他者に説明できるようにする

・分析の意義・課題・今後の改善点を文章化

🛠 実習

・成果スライドの作成(Googleスライド、Canva、Notionなど)

・分析レポート(Jupyter NotebookまたはMarkdown)をチームでレビュー

・成果物プレゼンテーション(5~10分)

💡 発展課題

GitHubに公開し、README+デモGIF付きのポートフォリオ化 次のステップとしての自動制御(例:リレーで換気ファン起動)設計案の検討

✅ 応用プロジェクトのまとめ

フェーズ主な成果物
21テーマ設定課題・仮説・必要データの整理シート
22実装準備センサ/API収集スクリプト、前処理コード
23分析実行可視化ノートブック、分析レポート
24発表準備スライド資料、成果発表、レビュー記録
ご希望があれば、これに対応した .ipynb ノートブック(プロジェクトテンプレート形式)も順次作成可能です。 また、発表テンプレート(Notion/スライド形式)や、評価ルーブリックの設計も支援できます! 以下に、第21~24週の応用プロジェクトに対応した実習用コード(Jupyter Notebook形式に相当)を週ごとに表示します。 センサー + 外部データ + 可視化・分析の統合的なコードです。

📘 第21週:プロジェクト企画とデータ定義

この週はコードというより、構想フェーズです。以下は プロジェクト企画テンプレート例(Markdown)です。

# プロジェクト企画書テンプレート

## 🧩 課題設定
- 作物:レタス
- 栽培環境:ビニールハウス
- 想定課題:夏季における高温ストレスと生育不良

## 🔍 仮説
- ハウス内の気温が30°Cを超えると生育に影響 → 換気が必要

## 📊 使用するデータ
- DHT11温湿度センサーデータ
- Open-Meteoの外気温
- 土壌水分(任意)

## ⚙️ 必要センサ/外部データ
- DHT11センサ
- Open-Meteo API(外気温)

📘 第22週:データ収集・前処理


import requests
import pandas as pd
import datetime
import random

# ダミー:センサーデータ生成
def generate_sensor_data():
    now = datetime.datetime.now()
    data = []
    for i in range(48):  # 2日間分のデータ(30分間隔)
        time = now - datetime.timedelta(minutes=i*30)
        temp = round(random.uniform(22, 35), 1)
        hum = round(random.uniform(40, 80), 1)
        data.append({'time': time, 'temperature': temp, 'humidity': hum})
    return pd.DataFrame(data)

sensor_df = generate_sensor_data()
sensor_df.to_csv("sensor_data.csv", index=False)

# 天気APIからの取得
params = {
    'latitude': 35.6895,
    'longitude': 139.6917,
    'hourly': 'temperature_2m',
    'timezone': 'Asia/Tokyo'
}
response = requests.get("https://api.open-meteo.com/v1/forecast", params=params)
weather_data = response.json()
weather_df = pd.DataFrame({
    "time": weather_data["hourly"]["time"],
    "temperature_outdoor": weather_data["hourly"]["temperature_2m"]
})
weather_df["time"] = pd.to_datetime(weather_df["time"])
weather_df.to_csv("weather_data.csv", index=False)

📘 第23週:可視化・分析(統合分析)


import pandas as pd
import matplotlib.pyplot as plt

# データ読み込み
sensor = pd.read_csv("sensor_data.csv", parse_dates=["time"])
weather = pd.read_csv("weather_data.csv", parse_dates=["time"])

# 時刻の丸め(例:1時間ごとに統合)
sensor['time'] = sensor['time'].dt.floor('1H')
sensor = sensor.groupby('time').mean().reset_index()

# 結合
merged = pd.merge(sensor, weather, on="time", how="inner")

# 可視化
plt.figure(figsize=(10,5))
plt.plot(merged["time"], merged["temperature"], label="屋内気温")
plt.plot(merged["time"], merged["temperature_outdoor"], label="屋外気温")
plt.xlabel("時刻")
plt.ylabel("気温 (°C)")
plt.title("屋内と屋外の気温比較")
plt.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# 相関分析
correlation = merged["temperature"].corr(merged["temperature_outdoor"])
print(f"屋内と屋外の気温の相関係数: {correlation:.2f}")

📘 第24週:レポート生成(Markdown / Notebook出力)


# プロジェクトレポート:ビニールハウスの温度最適化

## 🎯 課題と仮説
- 屋内温度が30°Cを超えるとレタスの生育に悪影響
- 外気温と屋内気温に強い相関がある場合、事前予測による対策が可能

## 🧪 実験概要
- DHT11センサで屋内温湿度を30分ごとに取得
- Open-Meteo APIから外気温を1時間ごとに取得
- 2日分のデータで比較・相関を分析

## 📊 結果
- 相関係数:0.85(高相関)
- 気温が上がるタイミングで屋内も上昇する傾向が確認された

## 💡 考察
- API気温上昇時に事前に換気ファンを動作させることで高温リスクを軽減できる可能性
- 次ステップとしてアクチュエータ制御と自動通知を実装