光合成 は中学理科で習う最重要反応の 1 つ。教科書では式と図で説明されますが、本記事では 3 種類のセンサー を組み合わせて、実際に自分の目で「光合成が起きている」 を確認します。中高生の探究学習・自由研究に最適な、ふくふくおすすめの大物 EP です。
1. 光合成と呼吸の理屈 (おさらい)
光合成: 光のエネルギーで CO2 と水から糖と O2 を作る (光がある時)。呼吸: 糖と O2 から CO2 と水とエネルギーを取り出す (常時)。植物は両方を行う が、十分な光があれば光合成のほうが速いので、結果として CO2 が減り O2 が増える。
- 光合成式: 6 CO2 + 6 H2O + 光 → C6H12O6 + 6 O2
- 呼吸式: C6H12O6 + 6 O2 → 6 CO2 + 6 H2O + エネルギー
- 正味光合成 = 光合成 − 呼吸 が、容器内で観測できる量
2. 実験セットアップ
| 道具 | 用途 | 価格目安 |
|---|---|---|
| 透明な密閉容器 (5L 程度の漬物容器・ペットボトル) | 植物を密閉空間に入れる | 100〜500 円 |
| 観葉植物 (ポトス・サンセベリア等) | 実験対象 | 500〜1,500 円 |
| CO2 センサー (MH-Z19C / SCD40) | CO2 濃度測定 | 1,500〜3,500 円 |
| O2 センサー (Grove O2) | 酸素濃度測定 | 5,000〜8,000 円 |
| 照度センサー (BH1750 / DLight Unit) | 光の強さ測定 | 200〜1,000 円 |
| LED 照明 (デスクライト・ペンダント) | 光源 | (家にあるもの) |
| M5Stack Core2 (推奨) | 3 センサーを束ねる | 7,500 円 |
| SD カード | データ記録 | 500 円 |
3. 容器のセットアップ
- 15L 程度の透明容器 (タッパー、漬物容器、加工した 2L ペットボトルでも OK) を用意
- 2鉢植えごと容器に入れる (土が露出していると CO2 を吸収するので、ジップロックで包むとより正確)
- 3蓋に小さな穴 を開けて、3 センサーのケーブルを通す
- 4シリコンや粘土 で穴をふさいで密閉
- 5容器の外 から照度センサーで光量を測る (容器内に入れると蓋で値が変わる)
(1) 容器の密閉が不完全だと外気が混入し、結果が出ない。粘土・シリコン・テープで気密性を確保。(2) LED 照明 (特に植物育成用) は熱を持つ ので、容器に近づけすぎない (10cm 以上離す)。(3) 連続光照射は植物にストレス。実験は最大 24 時間に留め、その後は通常環境に戻す。(4) M5Stack のリポバッテリーは過熱・直射日光厳禁。USB 給電 + 室内が安全。(5) O2 センサーは高湿度に弱い ので、容器内に乾燥剤を入れるか、湿度をモニタリング。(6) 子どもが実験する場合は保護者の見守りを推奨。
4. M5Stack のコード (3 センサー同時計測)
from m5stack import lcd, sdcardimport unit, time
co2_unit = unit.get(unit.CO2L, unit.PORTA)o2_sensor_pin = 36 # O2 センサーをアナログピンに接続import machineo2_adc = machine.ADC(machine.Pin(o2_sensor_pin))dlight = unit.get(unit.DLIGHT, unit.PORTB)sdcard.SDCard()
def read_o2(): """O2 濃度の換算 (Grove O2 sensor)""" raw = o2_adc.read_uv() / 1_000_000 # V # 大気中 O2 = 20.9 % のとき出力 = 約 0.5V (校正済み前提) return raw / 0.5 * 20.9
with open('/sd/photosynthesis.csv', 'a') as f: f.write('timestamp,co2_ppm,o2_pct,{{lux|*}}\n') while True: ts = time.time() co2 = co2_unit.co2 o2 = read_o2() lux = dlight.lux f.write(f'{ts},{co2},{o2:.2f},{lux:.0f}\n') f.flush()
lcd.clear() lcd.print(f'CO2: {co2} ppm', 10, 30, 0x008800) lcd.print(f'O2: {o2:.1f} %', 10, 70, 0xFF0000) lcd.print(f'Lux: {lux:.0f}', 10, 110, 0x0000FF) time.sleep(30)5. 実験手順
- 108:00: 容器セット完了、初期値を記録 (CO2 / O2 / 照度)
- 208:00 - 12:00: 暗所に置く (呼吸のみ)。CO2 が上がり O2 が下がるはず
- 312:00: 明るい場所 + LED 照明で光照射開始
- 412:00 - 18:00: 光照射 (光合成優勢)。CO2 が下がり O2 が上がるはず
- 518:00: 光を消して再び暗所
- 624 時間続ける とサイクルが 1 巡見える
6. 期待される結果
| 時間帯 | 光 | CO2 の変化 | O2 の変化 | 解釈 |
|---|---|---|---|---|
| 朝 (暗所) | なし | 増加 (+50〜200 ppm/h) | 減少 | 呼吸のみ |
| 昼 (光照射) | あり | 減少 (-100〜500 ppm/h) | 増加 | 光合成 > 呼吸 |
| 夜 (暗所) | なし | 増加 | 減少 | 呼吸のみ |
光合成 = 呼吸 になる光量を「光補償点」と呼びます。この点では CO2 も O2 も変動しない。光を弱くしたり LED を消したりすると、正味光合成が 0 になる照度 が見つかるはず。これは生物学の教科書に載っている重要な概念で、自分の植物の光補償点を測る のが探究学習として強い結論になります。
7. グラフ化 (Colab)
import pandas as pdimport matplotlib.pyplot as plt
df = pd.read_csv('photosynthesis.csv')df['time'] = pd.to_datetime(df['timestamp'], unit='s')
fig, ax1 = plt.subplots(figsize=(12, 5))# 左軸: CO2ax1.plot(df['time'], df['co2_ppm'], 'g-', label='CO2 [ppm]')ax1.set_ylabel('CO2 [ppm]', color='g')ax1.tick_params(axis='y', labelcolor='g')
# 右軸 1: O2ax2 = ax1.twinx()ax2.plot(df['time'], df['o2_pct'], 'r-', label='O2 [%]')ax2.set_ylabel('O2 [%]', color='r')ax2.tick_params(axis='y', labelcolor='r')
# 右軸 2: 照度 (背景の薄い領域として)ax3 = ax1.twinx()ax3.spines['right'].set_position(('outward', 50))ax3.fill_between(df['time'], 0, df['lux'], color='yellow', alpha=0.3)ax3.set_ylabel('照度 [lux]', color='orange')
ax1.set_title('光合成実験:1 日のCO2/O2/照度')fig.autofmt_xdate()plt.tight_layout()plt.savefig('photosynthesis_24h.png', dpi=200)8. 自由研究のまとめ方
- 仮説: 「光合成が起きている時、CO2 は減り O2 は増える」
- 実験条件: 容器サイズ・植物の種類・葉の枚数・照度を必ず記録
- 結果: グラフで「光照射開始から CO2 が ◯ ppm 減った」と数値で
- 考察: 「正味光合成速度 = ◯ ppm/分」、葉面積で割って単位面積あたりに換算するとさらに本格的
- 反省: 「予想通りにならなかった点」「次にやるならどう改善するか」
9. 次の話
EP.08 では 複数日のデータを継続的にログを取る方法 (SD カード保存・ローテーション・電源管理) を扱います。光合成実験のような「24 時間以上の長時間記録」を安定させる技術編です。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。