編集履歴一覧に戻る
daikon.berryのアイコン画像

daikon.berry が 2026年08月15日11時08分07秒 に編集

初版

タイトルの変更

+

爬虫類飼育用UVA、UVB測定器を作ってみた

タグの変更

+

Arduino

+

UV

+

計測

+

AS7331

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

ライセンスの変更

+

(MIT) The MIT License

本文の変更

+

## はじめに 爬虫類を飼育しているとUVBの量が気になりますよね。 でも製品を購入すると無茶苦茶高いです。 謎のメーカの物が15000円位で売ってますが、信用できるのか? 不安があったため、信頼できるセンサーで自作しました。 ### 必要な部品 UVセンサー:QWIIC UV SENSOR AS7331 ¥4672 I2C線:FLEXIBLE QWIIC CABLE - 500MM ¥467 無くてもよいです ARDUINO NANO 互換機:DFRDUINO NANO ATMEGA328 EVAL BRD ¥1002       ARDUINOであれば、ほかの物でもOKだと思います 電源スイッチ:家に転がっていたもの 9V電池スナップ:エルパ(ELPA) 電池ボックス PP-006NH ¥198 液晶パネル:OLEDモジュール SSD1306 ¥400円位 配線:家に転がっていたもの ### 仮組 ![キャプションを入力できます](https://camo.elchika.com/aca6951f7c97a9177f6993374d1f63d6446dd5e3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61663665663662322d613539332d343836632d393532612d3462343137656334396263642f61656561366265332d343861622d346264642d383933322d383630316534343061623438/) Arduino Nano互換機 VIN:9V電池の+ GRD:9V電池のマイナス(間にプッシュスイッチを入れています)           A4:SDA A5:SCL +5V:AS7331の+ GRD:AS7331のGRD Arduino Nano互換機とはQwiicカプラを使っているので、コネクタでつなぎました 配線でつなぐなら+3.3Vのほうが良いかも Arduino Nano互換機 → AS7331 → OLEDモジュールとつないでいます。 Qwiicの線を半分に切って、AS7331とOLEDモジュールに使用しました。 OLEDモジュール:赤線VDD 黒線GRD 黄線SCK 青線SDA ### プログラム チャッピーに聞いて、ArduinoIDEを開き、必要なライブラリーをインストール #include <Wire.h> #include <SparkFun_AS7331.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> Wire.h (標準ライブラリ) 種類: Arduino標準ライブラリ(インストール不要) 役割: Arduinoと各種センサー・ディスプレイ間で行われるI2C通信を制御するための基本ライブラリです。特別な導入をしなくても、コードの先頭でインクルードするだけで使用できます。 SparkFun_AS7331.h 種類: サードパーティ製ライブラリ(ライブラリマネージャでインストール) 役割: 今回使用した紫外線センサー「AS7331」を制御するための専用ライブラリです。センサーの初期化、測定モードの切り替え(ワンショット測定)、UVA・UVB・UVCのデータ取得などを行います。 インストール: Arduino IDEのライブラリマネージャで「SparkFun AS7331」と検索してインストールします。 Adafruit_GFX.h 種類: サードパーティ製ライブラリ(ライブラリマネージャでインストール) 役割: Adafruit社が提供するグラフィック描画の共通基盤となるライブラリです。有機EL(OLED)ディスプレイなどの画面に対して、文字、図形、線などを描画するための共通の仕組みを提供します。 インストール: ライブラリマネージャで「Adafruit GFX Library」と検索してインストールします。 Adafruit_SSD1306.h 種類: サードパーティ製ライブラリ(ライブラリマネージャでインストール) 役割: 今回使用したOLEDディスプレイのコントローラーチップ「SSD1306」を制御するための専用ライブラリです。画面のクリアやカーソル位置の指定、文字サイズの変更などを行います(内部で上記の Adafruit_GFX を利用して動作します)。 インストール: ライブラリマネージャで「Adafruit SSD1306」と検索してインストールします。 ※インストール時に「依存関係のある他のライブラリ(Adafruit BusIOなど)も一緒にインストールしますか?」と聞かれた場合は、すべて「はい(Install all)」を選択してください。 ### 完成したスケッチ チャッピーに聞いたら、AS7331の出力はμW/cm2で出てくるらしい。信用してみる ```arduino #include <Wire.h> #include <SparkFun_AS7331.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); SfeAS7331ArdI2C myUVSensor; void setup() { Serial.begin(115200); Wire.begin(); // ディスプレイの初期化 if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); while(1); } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); // 紫外線センサーの初期化 if (myUVSensor.begin() == false) { Serial.println("Sensor failed to begin. Please check your wiring!"); while (1); } // コマンド(ワンショット)モードの準備 if (myUVSensor.prepareMeasurement(MEAS_MODE_CMD) == false) { Serial.println("Sensor did not get set properly."); while (1); } } void loop() { // 1. 測定開始コマンドを送信 if (ksfTkErrOk != myUVSensor.setStartState(true)) { Serial.println("Error starting reading!"); } // 2. 変換時間分だけ待機 delay(2 + myUVSensor.getConversionTimeMillis()); // 3. データを読み込む if (ksfTkErrOk != myUVSensor.readAllUV()) { Serial.println("Error reading UV."); } // 4. 値の取得 float uva = myUVSensor.getUVA(); float uvb = myUVSensor.getUVB(); float uvc = myUVSensor.getUVC(); // シリアルモニタ出力 Serial.print("UVA: "); Serial.print(uva); Serial.print(" | UVB: "); Serial.print(uvb); Serial.print(" | UVC: "); Serial.println(uvc); // ディスプレイ表示 display.clearDisplay(); // タイトル (文字サイズ1) display.setTextSize(1); display.setCursor(0, 0); display.println("AS7331 UV Sensor"); // UVA表示 (文字サイズ1でコンパクトに、または大きめに調整) display.setCursor(0, 16); display.print("UVA:"); display.print(uva, 1); display.println(" uW/cm2"); // UVB表示 display.setCursor(0, 32); display.print("UVB:"); display.print(uvb, 1); display.println(" uW/cm2"); // UVC表示 display.setCursor(0, 48); display.print("UVC:"); display.print(uvc, 1); display.println(" uW/cm2"); display.display(); delay(1000); } ``` ### 入れ物を作る このままだと使いづらいので、ケースを設計 なんとなく部品の寸法を計測して、干渉部分はにげつつ ![キャプションを入力できます](https://camo.elchika.com/cfcf58017a27c83e0c2bae564cb13c3a5d5cfe23/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61663665663662322d613539332d343836632d393532612d3462343137656334396263642f33653232343236652d653830612d343837362d613061632d303832313931623638356338/) ![キャプションを入力できます](https://camo.elchika.com/ce1c0bac919592184a722f1217d58c3e68cbe091/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61663665663662322d613539332d343836632d393532612d3462343137656334396263642f35643664396564652d386634662d346165622d623938362d393639363835393636336666/) 3Dプリンタで造形 造形の写真撮り忘れたので、いきなり組立状態 基盤の固定は樹脂を溶かしてカシメました。 ![キャプションを入力できます](https://camo.elchika.com/85a758f43bc6db330a48bee58dfd24029eb557be/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61663665663662322d613539332d343836632d393532612d3462343137656334396263642f39323530326666342d323265372d346265362d383666662d616139343066663138316263/) 蓋を閉じて完成! ![キャプションを入力できます](https://camo.elchika.com/f80db1ee9edc51c243214f7bf459a229fffb4abd/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61663665663662322d613539332d343836632d393532612d3462343137656334396263642f62346539303336342d376133342d346537332d623831642d373733613366386132366666/) ### 計測してみた うちのフトアゴちゃんに嫌な顔されながら計測してみました 半年使用したビバリアのスパイラルUVB デザート 26Wで53μW/cm2でした 本日、8/1のAM9:00 晴れ(薄雲あり)で100μW/cm2でしたので、少し少ないのかな? OLEDモジュールのちらつきでうまく撮れませんでした。(目視ではちらつきはわからないです) ![キャプションを入力できます](https://camo.elchika.com/4416c4159a561744347f3ed4f328691e54cb1b08/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61663665663662322d613539332d343836632d393532612d3462343137656334396263642f35623733613839332d346362322d343466382d396138382d383962393131323135633533/) ### 最後に 誰かの参考になれば幸いです。素人の電子工作のため、間違いがあったらすいません。 話半分に聞いてください。ありがとうございました。