Arduino 照度センサ データ記録シールドの作成
Arduino UNO を対象として、照度センサと温湿度センサの出力を液晶ディスプレイ (LCD) に表示させながら SD カードに記録を残す機能を有するシールドを作成しました。
作成動機は自転車用の前照灯や登山用ヘッドランプを長時間使用した場合 (とくに電池残量が少なくなったとき) の挙動を定量的に知りたいという、ただそれだけのことです。
当初はスケッチ (計測用プログラム) を書き込んだマイコンを Arduino ボードから取り外してユニバーサル基板上に移植することを検討していたのですが、実装がうまく行かなかったこと、著しい小型化や可搬性の向上が望めないと思われたことの2点から Arduino UNO ボードに接続するシールドを作成することに方針を転換しました。
作成するスケッチも配線もまさに今までの記事の集大成です。
I2C 液晶ディスプレイ AE-AQM1602A のあれこれ
Arduino で 温湿度センサ DHT11 を使う
LCDディスプレイ表示とSDカード記録
レベルシフタ付き microSDカードスロット AE-microSD-LLCNV
ATmega328P
より詳しくは NXP Semiconductors (Philips Semiconductors の後継企業) が公開している仕様をご参照ください。
NXP Semiconductors I²C-bus Specification, Version 6.0, 4th of April 2014.
配線が決まりましたら、計測用スケッチを次のようにまとめます。先の記事で述べましたように LCD への文字表示は特別なライブラリを必要とするわけではないものの、ここではソースコード簡略化のため、ライブラリマネージャに登録されているライブラリのなかで最終メンテナンス日が最も新しいものを利用しています。
#include <Wire.h>
#include <BH1750.h>
#include "DHT.h"
#include <SPI.h>
#include <SD.h>
#include <ST7032_asukiaaa.h>
#define DHTPIN 2
#define DHTTYPE DHT11
ST7032_asukiaaa lcd;
BH1750 lightMeter;
DHT dht(DHTPIN, DHTTYPE);
const int chipSelect = 10;
unsigned long myTime;
void setup() {
Wire.begin(); // Initialize the I2C bus for the BH1750 library
lightMeter.begin(); // Initialize the sensor event object
dht.begin(); // Initialize the dht sensor object
lcd.begin(16, 2);
lcd.setContrast(30);
lcd.print("Init Media");
if (!SD.begin(chipSelect)) {
lcd.clear();
lcd.print("Media Failed");
// don't do anything more:
while (1);
}
lcd.print("Init done");
lcd.clear();
}
void loop() {
delay(2000); // wait a few seconds between measurements.
myTime = millis();
lcd.clear();
float h = dht.readHumidity();
float t = dht.readTemperature(); // read temperature as Celsius
float lux = lightMeter.readLightLevel();
File myFile = SD.open("datalog.txt", FILE_WRITE);
if (myFile) {
myFile.print(myTime);
myFile.print("\ ");
myFile.print(lux);
myFile.print("lx");
myFile.print("\ ");
myFile.print(t);
myFile.print("C");
myFile.print("\ ");
myFile.print(h);
myFile.print("%");
myFile.println();
myFile.close();
lcd.setCursor(0, 0);
lcd.print(myTime / 1000);
lcd.setCursor(0, 1);
lcd.print(lux);
lcd.print("lx");
// if the file isn't open, pop up an error:
} else {
lcd.print("ERROR OPENING");
}
}
ここで作成するのはシールドなので Arduino Uno の配線に合わせて DHT PIN に D2 を割り当てました。
使用しているモジュールで接続ピンが指定されているのは I2C の A4, A5 と SPI の D11-13 そして電源の 5V と GND です。
ここで Arduino Uno の各ピンの位置を見て頂くと分かりやすいのですが、今回使用するピンが長方形の左下と右上に固まっています。
Arduino Uno Rev3 | Arduino Official Store https://store.arduino.cc/usa/arduino-uno-rev3
左上の方には 5V と GND がありますので、接続ピンに自由度がある DHT には右下に移動してもらいました。 これがもしユニバーサル基板への移植であれば、ATmega328P で使用するピンが D10-13 と A4,A5 といった具合にマイコンの右側に固まっているので D9 を割り当てるか、D8 を割り当てて下側から配線を回してくるときれいに収まりそうですね。
あとは私が苦手とする工作の時間です。前回の反省から交差を許容して複雑な配線を廃しました。交差は絶縁体の塗料で被覆されたポリウレタン銅線を導入することで解決です。
見た目は醜悪ではあるものの、照度センサの計測データを記録メディアに保存するという要件を満たせる Arduino UNO シールドがこれで一応は完成しました。
Comments
No comments yet. Leave the first one.
Leave a comment