爬虫類飼育用UVA、UVB測定器を作ってみた
はじめに
爬虫類を飼育していると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で出てくるらしい。信用してみる
#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モジュールのちらつきでうまく撮れませんでした。(目視ではちらつきはわからないです)
最後に
誰かの参考になれば幸いです。素人の電子工作のため、間違いがあったらすいません。
話半分に聞いてください。ありがとうございました。
投稿者の人気記事



-
daikon.berry
さんが
前の土曜日の11:08
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する