Makato-kan が 2026年08月09日09時28分50秒 に編集
初版
タイトルの変更
写真1枚に環境情報も入れた 家庭菜園タイムラプスシステムの製作(1/3)
タグの変更
ESP32
M5Stack
タイムラプスカメラ
メイン画像の変更
記事種類の変更
製作品
本文の変更
カメラ部と表示保存部を分離した、家庭菜園向けのタイムラプスカメラシステムです。 保存された画像から、撮影日時のほか、温湿度や明るさの情報を取り出すことができます。  #### システム概要 本システムは、撮影・測定を行う「カメラ部」と、データの受信・保存・表示を行う「表示保存部」の2つで構成されています。 【カメラ部】XIAO ESP32S3 Sense (温湿度・明るさ測定 + 画像にテキスト埋め込み) │ ▼ (データ送信:画像2枚 + 音声2秒) │ 【表示保存部】M5Stack CORE BASIC (SDカードへ保存 + 画面表示) #### カメラ部(XIAO ESP32S3 Sense) o 温湿度センサー(DHT11)とCDSセルを接続。 o JPEG画像ファイルの先頭に、測定値をテキストデータとして埋め込み。 o 最大解像度(測定値埋め込み済)と、M5表示用の2枚の画像、および2秒間の音声データをM5Stackへ送信します。 #### 表示保存部(M5Stack CORE BASIC) o I2C接続したRTC(リアルタイムクロック)で時刻を管理。 o データ受信時、最大解像度のJPEGと音声データにタイムスタンプをつけ、SDカードに保存します。 o 同時に、表示用データを画面に表示します。 #### 補足(仕様について) M5Stack(初期ロット・フラッシュメモリ4MB)のメモリ制限により、M5側でのFTPサーバー運用や画像の縮小処理が難しかったため、カメラ側から「保存用」と「表示用」の2枚の画像を送信する仕様にしています。16MBモデルであれば1つのファイルで共通化できる可能性があります。 #### M5Stackの操作方法 • ボタンA(長押し):最後に保存した表示用データを画面に再表示します。 • ボタンC(長押し):設定済みのSSIDに接続し、タイムサーバー(NTP)から時刻を取得してRTCにセットします。 #### ネットワーク・環境設定 ###### 注意: 本システムにセキュリティ機能はありません。 • RTCセットアップ用:SSID / パスワード • M5Stack用:SSID / パスワード • M5Stack FTPサーバー用:ユーザー名 / パスワード • IPアドレス設定: o M5Stack:192.168.4.1 o XIAO ESP32S3:192.168.4.2 • SDカード保存先ディレクトリ:/cam0 (※存在しない場合は自動生成されます) #### 部品表 |部品名|数量|備考| |:---|:---:|:---| |M5Stack CORE BASIC|1台|表示保存部| |RTCモジュール (DS3231)|1台|3.3V動作,Raspberry Pi 3/4用が手頃でおすすめです| |XIAO ESP32S3 Sense|1台|カメラ部| |DHT11|1個|温湿度センサー| |CDSセル|1個|ADCで値読み取り| |分圧抵抗 (3.3kΩ)|1個|1/4W程度| |接続用基板・配線類|適量|必要に応じてご用意ください| #### 電源に関する注意点 • XIAO ESP32S3 Sense モバイルバッテリーからUSB給電する場合、低消費電流による自動シャットダウンを防ぐため、「常時給電・微弱電流対応」のモデルを使用してください。 • M5Stack CORE BASIC ACアダプターで常時運用する場合、内蔵バッテリーの過充電を防ぐためにバッテリーを取り外しての運用を推奨します。 (※バッテリーの取り外しはメーカー保証対象外となる可能性があります。自己責任で行うか、事前に公式情報をご確認ください) #### 保存・表示データフォーマット 最大解像度用JPEG画像の先頭に、以下のフォーマット(アスキーテキスト)で測定値が埋め込まれています。 ID,温度,湿度,0,0,0,0,0,0,CDSセルの値(ADC変換値) #### 測定値取り出しスクリプト(Windows11の場合) ```arduino:Chk-tmp.bat @echo off setlocal enabledelayedexpansion :: 1. 対象のファイル名を環境変数にセット set "TARGET_FILE=%~1" if "%TARGET_FILE%"=="" ( echo [error] Please set filename echo Usage: %~nx0 filename.jpg exit /b 1 ) if not exist "%TARGET_FILE%" ( echo [error] file "%TARGET_FILE%" not found exit /b 1 ) echo Check: %TARGET_FILE%... :: 2. バッチの変数 $env:TARGET_FILE を直接参照することで引数エラーを完全回避 powershell -NoProfile -ExecutionPolicy Bypass -Command ^ "$bytes = [System.IO.File]::ReadAllBytes($env:TARGET_FILE);" ^ "$found = $false;" ^ "for ($i = 0; $i -lt $bytes.Length - 4; $i++) {" ^ "if ($bytes[$i] -eq 0xFF -and $bytes[$i+1] -eq 0xFE) {" ^ "$length = ($bytes[$i+2] * 256) + $bytes[$i+3];" ^ "$textLength = $length - 2;" ^ "if ($textLength -gt 0 -and ($i + 4 + $textLength) -le $bytes.Length) {" ^ "$commentBytes = $bytes[($i+4)..($i+3+$textLength)];" ^ "$text = [System.Text.Encoding]::ASCII.GetString($commentBytes);" ^ "Write-Host '--- Averable Varue ---';" ^ "Write-Host $text;" ^ "$found = $true;" ^ "break;" ^ "}" ^ "}" ^ "}" ^ "if (-not $found) { Write-Host 'COM maker is not found!!'; }" endlocal pause ``` ```arduino:上記スクリプト実行例 C:\Users\makat\Desktop>.\Chk-tmp.bat img-010.jpg Check: img-010.jpg... --- Averable Varue --- 88,26.2,77.0,0,0,0,0,0,2170 続行するには何かキーを押してください . . . ``` LinuxやMacOSで使う場合はこのスクリプトを生成AIに見せてtailやcutコマンドを使ってシェルスクリプトで作ってくださいというと作ってもらえますよ。 #### プログラム開発のポイント(生成AI活用のコツ) 本システムのプログラムは生成AIを活用して作成しています。AIにコードを生成してもらう際は、以下の点に注意するとスムーズです。 1. ライブラリのバッティング対策 SdFat.h と LittleFS.h を同時に使用する場合など、競合しやすいライブラリの名称やバージョン、注意点をあらかじめプロンプトに明記する。 2. M5Stack用ライブラリの指定 明示しないと M5Unified.h を使わずに古いライブラリで生成されたり、SdFat.h を指定しても標準の SD.h で書かれたりすることがあるため、出力されたコードは必ず目視で確認する。 • XIAO ESP32S3のコード・詳細については: [2/3の記事へ] 制作中です • M5Stackのコード・詳細については: [3/3の記事へ] 制作中です