各種センサ
気圧計MPL115A2
I2C接続で気圧と温度が測定できる8PINチップの測定機です。
1,4,5番PINはVDD(5V)につなぎます。
3番PINはGNDにつなぎます。
2番PINは1μのコンデンサを通してGNDへつなぎます。
7番PINは4.7kの抵抗でプルUPして
ArduinoのA4へ接続します。
8番PINは4.7kの抵抗でプルUPして
ArduinoのA5へ接続します。
*電源1番PINは0.1μFのコンデンサで補償します。
プログラムが大きく難しくなっていますので小さく分けて理解します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <Wire.h>//I2C命令集の使用
#define MPL115A2 0x60//気圧計のI2Cアドレス
#define num 100//num回の平均をとる
float a0,b1,b2,c12;//係数のための変数
float Press,Temp;//気圧と気温の変数
void setup() {//初期設定
Serial.begin(9600);//シリアルスタート
Wire.begin();//I2Cスタート
delay(3000);//3秒待ち
Coefficient();//補正係数取得
}
1番PINはVdd5V
2番PINは1μFでGNDへ
3番PINはGND
4番PINは5V通常GNDスリープ
5番PINはGNDでRST
6番PINはNo Connection
7番PINはSDA10kΩでプルアップ
8番PINはSCL10kΩでプルアップ
インクルードファイルと#define,変数
Wire.hをインクルードします。すると,I2Cに関するいくつかの命令が使用できるようになります。
Serialはいつでも使えるようになっています。
#define は「設定する」,「置き換える」という意味です。
3行目の”MPL115A2 0x60"は「MPL115A2は0x60にします」ということです。
4行目は「num」と書いたら「50」と同じということです。
変数
6行目は補正係数のための変数確保です。
7行目のPressuとTempは浮動小数点です。
初期設定
void setup() {//初期設定
ではSerialとWireを始動します。
3秒待って補正係数を取得します。
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void loop() {//繰り返し動作
int i;
float p=0;//pは浮動小数
for(i=0;i<num;i++){
PressTemp();
p=p+int (Pressure());}//積算
Press=p/num;//平均
Serial.print(Press);//232Cへの出力
Serial.println("hPa ");
delay(1000);//1秒待ち
}
繰り返しの内容
気圧と気温を測定して補正された気圧を計算して,積算して平均を求めます。
気圧をシリアル通信でパソコンに送ります。
1秒待機して繰り返します。
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
int Coefficient(){//係数読み込み
unsigned int u,l;//ulは2BYTE数
Wire.beginTransmission(MPL115A2);
Wire.write(0x04);//04番地から読みます
if(Wire.endTransmission()!=0)return 5;//0でなければ失敗帰還
if(Wire.requestFrom(MPL115A2,8)!=8)return 5;//失敗なら帰還
//a0の読み込みと計算
u=Wire.read();l=Wire.read();
// a0 = (u << 5) + (l >> 3) + (l & 0x07) / 8.0 ;
a0=((u << 8) + l ) / 8.0 ;
if( u & 0x80 ) a0 -= 8192.0;
//b1の読み込みと計算
u=Wire.read();l=Wire.read();
//b1 = ( ( ( (u & 0x1F) * 0x100 ) + l ) / 8192.0 ) - 3 ;
b1 = ( ( u <<8) + l ) / 8192.0 ;
if( u & 0x80 ) b1 -= 8.0;
//b2の読み込みと計算
u=Wire.read();l=Wire.read();
//b2 = ( ( ( ( u - 0x80) << 8 ) + l ) / 16384.0 ) - 2 ;
b2 = ( (u << 8 ) + l ) / 16384.0 ;
if( u & 0x80 ) b2 -= 4.0;
//c12の読み込みと計算
u=Wire.read();l=Wire.read();
//c12 = ( ( ( h * 0x100 ) + l ) / 16777216.0 ) ;
c12 = ( ( u <<8) + l ) / 32768.0 ;
if( u & 0x80 ) c12 -= 2.0;
c12 /= 512.0;
return 0;
}
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
int PressTemp(){//気圧と気温を測定
unsigned int u,l;
Wire.beginTransmission(MPL115A2);
Wire.write(0x12);//気圧と気温のAD変換開始
Wire.write(0x01);
if(Wire.endTransmission()!=0)return 5;//失敗はERROR5
delay(3);//変換時間待ち
Wire.beginTransmission(MPL115A2);//
Wire.write(0x00);
if(Wire.endTransmission()!=0)return 5;//失敗はERROR5帰還
if(Wire.requestFrom(MPL115A2,4)!=4)return 5;//失敗はERR5帰還
//気圧
u=Wire.read();l=Wire.read();
Press=((u<<8)+l)/64.0;//=(u*256+l)/64.0;
//気温
u=Wire.read();l=Wire.read();
Temp=((u<<8)+l)/64.0;//=(u*256+l)/64.0;
return 0;
}
気圧と気温の測定
59行目から測定します。
Pressは10bit圧力の出力値です。1024の分解能になります。1気圧は1013hPaですので約1hPaを区別することができます。
Tempは10bitの気温出力値です。
気圧は測定器によって個性が有るので補正しなければなりません。
86
87
88
89
90
91
float Pressure(){//補正された気圧を求める式
float d;
d=a0 + (b1 + c12*Temp )*Press + b2*Temp;
return d * ( 650.0 / 1023.0 ) + 500.0 ;
}
補正係数習得
補正するための係数が測定器のメモリの中に書きこまれています。
33行目からのサブルーチンで係数を求めます。
a0:符号付き整数12bit.少数3bit圧力オフセット係数
b1:符号付き整数2bit.少数13bit圧力感度係数
b2:符号付き整数1bit.少数14bit温度オフセット係数
c12:0.000000000以下少数13bit温度感度係数
羅列されたbitから係数を求めるのは難しいのですがスケッチの中にある計算式を使います。
参考にさせていただいたページです・
補正された気圧
80行目からは気圧の補正をします。
気圧のオフセット補正に感度係数と温度感度係数の補正を足して気圧の測定値をかけます。温度オフセット係数を足して気圧の分解能を求めます。
中心値に分解能を足して気圧とします。
MPL115A2のI2C命令集
Wire.begin();//I2C MPL115A2スタート
Wire.beginTransmission(MPL115A2);//任務開始
精度と表示
MPL115A2は精度はいいようなのですが分解能が1hPaより大きいようで1hPaまでしか信頼できません。100回積算して平均をとりましたが,少数点以下はふらふらしています。
1006.92hPa
1007.11hPa
1007.10hPa
1006.88hPa
1007.04hPa
1007.10hPa
1006.94hPa
測定の一部を抜き出しましたが,表示は1hPaまでしかできません。せいぜい,小数点以下1桁です。2桁目は意味を持ちません。
温湿度計DHT11
4本足の温度,湿度計です。安くて配線は簡単です。
動作電圧:3.5V~5.5V
消費電流:測定時 0.3mA
スタンバイ60μA
サンプリング:2秒以上
温度NTCサーミスタ±2度±0.2
湿度有機ポリマ±5%±1%
電源線2本と10kΩでプルアップした信号線をA3に接続します。
DHT11のデータのタイミングチャートです。
18mS Lowの後80μS Low,80μS Highで開始の合図になります。
50μS Lowの後Hiが
28μS以下ならば"0",
70μSならば"1"となります。
これが40bit続きます。8bit×5Byteです。
1Byte目は湿度の上位8bit
2Byte目は湿度の下位8bit
3Byte目は温度の上位8bit
4Byte目は温度の下位8bit
5Byte目はパリティになっています。
ライブラリを使うとデータの通信や構造に機を使わなくても簡単に湿度と気温を求めることができます。
ただし,Arduino外部の人が作ったライブラリを使うには少々手順が必要です。
ライブラリ用のC++ファイルとヘッダファイル,それにkeywords.TXTが必要になります。
これら3つのファイルをzipファイルにします。方法がわからず困っていましたが,Vista以降であれば3つを選択して→送る→圧縮
とします。
同じホルダ内にzipファイルができます。
のHPへ行くと clone or download という所が有りますので,クリックするとzipファイルをダウンロードできます。
zipファイルの場所をスケッチ→ライブラリをインクルード→zip形式のライブラリをインストールと手続きします。
#include <DHT.h>
#define DHTPIN A3//入力用のPIN
#define DHTTYPE DHT11//型名
DHT dht(DHTPIN, DHTTYPE);//dhtを作成
void setup() {//初期設定
Serial.begin(9600);//シリアルスタート
Serial.println("DHT11 test!");
dht.begin();//dhtスタート
delay(3000);//時間待ち
}
void loop() {//繰り返し動作
float h = dht.readHumidity();//湿度を読む
float t = dht.readTemperature();//温度を読む
if (isnan(h) || isnan(t)) {
Serial.println("read DHT ERROR!");
return; }//h,tが数字でなければERROR,帰還
Serial.print("Humidity: ");//湿度表示
Serial.print(h);
Serial.println(" %\t");
Serial.print("Temperature: "); //温度表示
Serial.print(t);
Serial.println(" *C ");
delay(3000);//時間待ち
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
シンプルなスケッチで湿度と気温が取得できシリアル通信でパソコンに送ることができます。ここではパソコンがArduinoの表示器になっています。
下の写真はシリアルモニタの様子です。
ライブラリを使うとスケッチも簡単で手軽に湿度と気温を求めることができます。
手軽にデータ収集ができる代わりに精度を望むことはできません。湿度は±5%,気温は±1度となっています。それでも息をかけると湿度気温とも変化します。
整数だけで表示して良さそうです。
気圧計+温湿度計
気圧も同時に表示させるためには,それぞれのスケッチを合体させます。Arduinoのスケッチを4つに分けます。
//宣言部分
void setup() {
//設定部分
}
void loop() {
//繰り返し部分
}
//サブルーチン・ファンクション部分
宣言部分,設定部分,繰り返し部分,サブルーチン・ファンクション部分の場所ごとにスケッチを合体すれば,気圧・湿度・温度を測定し表示できます。
もう少し精度がほしいところですが,とりあえず完成を目指します。
気圧・温湿度センサ BME280
高精度の気圧・温湿度センサです。
BME280の部品面とシルク面です。BMP280は湿度センサが有りません。購入時は気を付けましょう。
・測定レンジと測定精度
温度:-40 ~ +85℃,±1℃
湿度:0 ~ 100%,±3%
気圧:300 ~ 1100hPa,±1hPa
・分解能 温度:0.01℃
湿度:0.008%
気圧:0.18Pa
6pinのI2C接続です。
SD0をGNDにすると0x76
SD0をVDDにすると0x77になります。
ヘッダをライブラリに加えます。