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円位 配線:家に転がっていたもの ### 仮組  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); } ``` ### 入れ物を作る このままだと使いづらいので、ケースを設計 なんとなく部品の寸法を計測して、干渉部分はにげつつ   3Dプリンタで造形 造形の写真撮り忘れたので、いきなり組立状態 基盤の固定は樹脂を溶かしてカシメました。  蓋を閉じて完成!  ### 計測してみた うちのフトアゴちゃんに嫌な顔されながら計測してみました 半年使用したビバリアのスパイラルUVB デザート 26Wで53μW/cm2でした 本日、8/1のAM9:00 晴れ(薄雲あり)で100μW/cm2でしたので、少し少ないのかな? OLEDモジュールのちらつきでうまく撮れませんでした。(目視ではちらつきはわからないです)  ### 最後に 誰かの参考になれば幸いです。素人の電子工作のため、間違いがあったらすいません。 話半分に聞いてください。ありがとうございました。