以前に、SCP1000気圧センサーで気圧と温度を測定しましたが、秋月電子で比較的安価な気圧センサーが手に入りましたのでArduinoで使ってみました。
その気圧センサーはMPL115A2で概要は「デジタル気圧計・キットの製作」に記載した通りですが、今回はMPL115A2使用大気圧センサーモジュールキットを使います。
ピンヘッダーの半田付けが必要ですがその分若干お安くなっております。
キットの内訳と組み立てた状況
MPL115A2周辺の組み立て
簡単なブレッドボードシールドを作り、その上に気圧センサーとその周辺の回路を組み立て、さらにLCDシールドを使って表示することとしました。
全体の回路図
組み立て状況
スケッチ(Arduino-1.0使用)
気圧を表示するスケッチは「Arduinoで遊ぶ」の大気圧センサーを参考にさせて頂き、それにLCD表示部分を加えております。
I2Cで読み取ったデータは、気圧表示にするために換算が必要です。その検算をするためにスケッチの後半に校正データを表示する項目を追加しております。
//Serial.println(Padc);
//Serial.println(Tadc);
//Serial.println(Pcomp);
//Serial.println(a0);
//Serial.println(b1);
//Serial.println(c11);
//Serial.println(c12);
//Serial.println(b2);
//Serial.println(c22);
換算するための式
float Pcomp = a0 + (b1 + c11 * Padc + c12 * Tadc) * Padc + (b2 + c22 * Tadc) * Tadc;
float Pha = Pcomp * 650 / 1023 + 500;
スケッチ
#include <Wire.h>
#include <LiquidCrystal.h>
const int address = 0x60;
float read_coefficients(int total_bits, int fractional_bits, int zero_pad) {
unsigned char msb, lsb;
msb = Wire.read();
lsb = Wire.read();
return ((float) ((msb << 8) + lsb) / ((long)1 << 16 - total_bits + fractional_bits + zero_pad));
}
unsigned int read_adc() {
unsigned char msb, lsb;
msb = Wire.read();
lsb = Wire.read();
return (((unsigned int)msb << 8) + lsb) >> 6;
}
float a0, b1, b2, c12, c11, c22;
LiquidCrystal lcd(12,11,5,4,3,2);
void setup () {
Wire.begin();
Serial.begin(9600);
lcd.begin(16,2);
Wire.beginTransmission(address);
Wire.write(0x04); // Read coefficient data
Wire.endTransmission();
Wire.requestFrom(address, 12); // Request 12 bytes
if (Wire.available()) {
a0 = read_coefficients(16, 3, 0);
b1 = read_coefficients(16, 13, 0);
b2 = read_coefficients(16, 14, 0);
c12 = read_coefficients(14, 13, 9);
c11 = read_coefficients(11, 10, 11);
c22 = read_coefficients(11, 10, 15);
}
}
void loop () {
Wire.beginTransmission(address);
Wire.write(0x12); // Start both conversions(Pressure and Temperature)
Wire.write(0x01);
Wire.endTransmission();
lcd.clear();
delay(5);
Wire.beginTransmission(address);
Wire.write((uint8_t)0x00); // Read pressure and temperature
Wire.endTransmission();
Wire.requestFrom(address, 4); // Request 4 bytes
if(Wire.available()) {
unsigned int Padc = read_adc();
unsigned int Tadc = read_adc();
float Pcomp = a0 + (b1 + c11 * Padc + c12 * Tadc) * Padc + (b2 + c22 * Tadc) * Tadc;
float Pha = Pcomp * 650 / 1023 + 500;
Serial.println(Pha);
lcd.print("Barometer ");
lcd.setCursor(5, 1);
lcd.print(Pha);
lcd.print(" hpa");
//Serial.println(Padc);
//Serial.println(Tadc);
//Serial.println(Pcomp);
//Serial.println(a0);
//Serial.println(b1);
//Serial.println(c11);
//Serial.println(c12);
//Serial.println(b2);
//Serial.println(c22);
}
delay(1000);
}
Arduinoのシリアルデータ表示
全体の組み立て状況と気圧の表示