夏休みだ~!!
製作物のレベルは置いておいて、とにかくグイグイ製作していきたいと思います。
最初は温度計&圧力計を作ります。
ロケットの実験の計測装置として使いたい。
目次
部品構成
- マイコン:Arduino Uno (たぶん第2世代)
- 温度・圧力計:BMP085
- 表示:I2C接続小型LCD
BMP085を使ってみる
さっそく使ってみます。Arduino使うの久しぶりなので練習もかねて。
BMP085は温度も測れる圧力計です。使ってる基板は生産終了してるけど同様のチップかBMP180を使った基板なら同じように使える。
BMP085ライブラリ
以下のライブラリを使います。
ダウンロードしたら自分のスケッチフォルダ以下にあるlibrariesフォルダにぶち込んでIDEを再起動。
BMP085とArduinoの接続
以下のように接続します。
BMP085 ⇔ Arduino
VCC ⇔ 3.3V
GND ⇔ GND
SCL ⇔ A5
SDA ⇔ A4
サンプルスケッチの書き込みと実行
ファイルメニュー→スケッチ例→Adafruit BMP085 Library→BMP085test
上記でサンプルスケッチが開いたらコンパイルして書き込み。
コンソールで接続して情報を表示したところ。(接続ボーレートは9600)

0.5秒ごとに温度・気圧・高度など表示される。表示は後でいじるにして、テスト完了。
LCDの接続テスト
こっちは完全に初めて。部品はこいつ。
部品のページから飛べるブログに載っているコードで難なく動いた。
LCDとArduinoの接続
LCD ⇔ Arduino
VDD ⇔ 3.3V
GND ⇔ GND
SDA ⇔ A4
SCL ⇔ A5

表示限界(8文字)を超える文字列はどうなる?
LCDの表示は8文字2段。これを超えて表示しようとするとどうなるのか気になったので、文字をちょっと変えて表示させてみる。
ちょうど下段のSCIENCEが2文字目から7文字表示しているので、これに9文字をぶっこんだらどうなるか確認。
ソースの35行目がSCIENCEを表示しているところなので、これを「1SCIENCE2」に書き換え。
表示は「 1SCIENC 」になりました。後ろが切れる。ふつー。
自分で使う分には十分。
intとfloatをLCDで表示できるようにする?
LCDで表示できるのは文字列のみ。
圧力計の温度はfloat型、圧力はint32_t型なので、これらを表示できるようにする関数を追加。
参考にするのはブログの2つ目の記事。
int型は上記記事そのまま。floatも追加。floatはsprintfが使えなかったのでdtostrf関数を使用。(参考:逆引きArduino)
void lcd_printInt(int num)
{
char str[10];
sprintf(str,"%d",num);
lcd_printStr(str);
}
void lcd_printFloat(float num)
{
char str[10];
dtostrf(num, 5, 1, str);
lcd_printStr(str);
}
テストコードはこんな感じ(適当)
void loop() {
lcd_setCursor(0, 0);
int num1 = 1000723;
lcd_printInt(num1);
lcd_setCursor(1, 1);
float num2 = 10.25;
lcd_printFloat(num2);
delay(100);
}
ライブラリ化
LCDのスケッチをライブラリ化しておこう。作ったライブラリはGithubに置いておく。現時点ではエラー処理とかしてない。
ライブラリ作ってて思ったこと
intをstrに変換する際の表示がおかしい。桁数を増やすとマイナスになったりする。sprintfであふれてるっぽい動き。
→調べたら。AVRのintは16bitなので、数値が大きくなると表示がバグるっぽい。
BMP085の温度変数はint32_t(32bit)を使ってるので、対策が必要。
32bit用の表示関数作ろう?いや、桁数が多すぎて見にくいしMPa表示にしてしまおう。
Arduinoのi2cってWireライブラリを使ってるんだが、複数のデバイス繋ぐときにデバイスのライブラリ毎にWire.begin()するのが作法なのかな?
一回初期化したらあとはアドレスで制御なんじゃなかろうか。I2CのインスタンスがWire固定なのがいまいちな仕様になる原因か?
まあいいや、とりあえず動かして考えよう。
圧力・温度計化
複数デバイスつないで動かしたらそのまま動いてしまった
そのまま動いたわ。以下スケッチ。
温度は絶対温度化、圧力は単位をMPaにして小数点第2位まで表示にした。単位表示が切れてMPになってるのは気にしない。
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <I2C_LCD.h>
Adafruit_BMP085 bmp;
I2C_LCD lcd;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
lcd.begin();
if( !bmp.begin()){
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while(1){}
}
}
void loop() {
// put your main code here, to run repeatedly:
float temp = bmp.readTemperature()+273.15;
Serial.print(temp);
Serial.print(" K, ");
float pressure = bmp.readPressure()/1000000.0;
Serial.print(pressure);
Serial.println(" MPa");
lcd.setCursor(0,0);
lcd.printFloat(pressure, 5, 2);
lcd.setCursor(6,0);
lcd.printStr("MPa");
lcd.setCursor(0,1);
lcd.printFloat(temp, 5, 1);
lcd.setCursor(6,1);
lcd.printStr("K");
delay(500);
}
実際の動作

できたので計測したい場所にぶっこんで計測できるように実装しよう。
実装
どういう風にしようかちょっと考える。
まず、容器の中で計測できるようにセンサー基板だけワイヤーで引き離す。
次に、ワイヤーを圧力シール内に入れることを考えて、長いワイヤー部は取り外せるようにする。
最後に、導体容器を使うことも考えてセンサーは絶縁する。
なんか、絶縁だけして長めのジャンパ線でセンサー基板を接続すれば上記満たせるわ。ということで、センサー部はほぼこのまま行きます。
あとは、電池駆動にする。スケッチのシリアル通信部は削除。
電池は+をVin、-をGNDに接続してやればいいみたい。
おっと、単三2本直列じゃだめぽ。
100円ショップで買ったUSB充電アダプタでUSBポート経由で給電してやったらうまく動いた。
以下、一式。
USBケーブル繋いでる白いBOXが電源
真ん中がArduinoとブレッドボードの表示部
下がケーブルを繋いだセンサー

以上、圧力&温度センサーの作成でした。