「マイコンで気象観測」其の4 大気圧値を得る

 使用したのはLPS331というセンサーです。このセンサー、安いわりにこのセンサーみたいに値がふらつく事も無く、もっと高いセンサー同様に値が信頼できます。
 SPIとI2Cどちらかの接続を選べ、個人的には毎回I2Cで使用しています。


 setup前の記述です。SA0=GND 1011100x xはreadの時1=0xB9、writeの時0=0xB8となっているんですが、どちらも右へ1bitシフトすると1011100となり、アドレスは0x5cになります。
int lps331ad=0x5C;
long r1,r2,r3;//気圧の上中下位バイト
long r4,r5;//温度の上下位バイト


 setup中の記述です。BBが読めるかの確認と、睡眠から起こしています。
// 気圧センサのテスト,0f番地からBBが読めれば正常
Wire.beginTransmission(lps331ad); //SA0=GNDで0xB8,SA0=VDDで0xBA
Wire.write(0x0f);
Wire.endTransmission(false);

Wire.requestFrom(lps331ad, 1,false);
Serial.println(Wire.read(),HEX);//正しく通信出来ている場合、0xBBが読み取れる。
Wire.endTransmission(true);
// 0xa0で7Hz,0x90にすると1Hzで気圧を更新
Wire.beginTransmission(lps331ad); //SA0=GNDで0xB8,SA0=VDDで0xBA
Wire.write(0x20);
Wire.write(0x90);
Wire.endTransmission(true);


 Loop中の記述です。指定のアドレスから帰ってきた値を式に代入して気圧値と、ついでに温度値を得ています。
//LPS331
Wire.beginTransmission(lps331ad); //SA0=GNDで0xB8,SA0=VDDで0xBA
Wire.write(0x2a);
Wire.endTransmission(false);

Wire.requestFrom(lps331ad, 1,false);
r1=Wire.read();
Wire.endTransmission(true);
//////////////////////////////////////////////////////////////////////////////////////

// データ習得(気圧の中位バイト)
Wire.beginTransmission(lps331ad); //SA0=GNDで0xB8,SA0=VDDで0xBA
Wire.write(0x29);
Wire.endTransmission(false);

Wire.requestFrom(lps331ad, 1,false);
r2=Wire.read();
Wire.endTransmission(true);
//////////////////////////////////////////////////////////////////////////////////////

// データ習得(気圧の下位バイト)
Wire.beginTransmission(lps331ad); //SA0=GNDで0xB8,SA0=VDDで0xBA
Wire.write(0x28);
Wire.endTransmission(false);

Wire.requestFrom(lps331ad, 1,false);
r3=Wire.read();
Wire.endTransmission(true);
//////////////////////////////////////////////////////////////////////////////////////

//Serial.print((float(r1<<16)+(r2<<8)+r3)/4096);
//Serial.println("hPa");

float lps_hpa=((r1<<16)+(r2<<8)+r3)/4096;
//Serial.println(lps_hpa);

// データ習得(温度の上位バイト)
Wire.beginTransmission(lps331ad); //SA0=GNDで0xB8,SA0=VDDで0xBA
Wire.write(0x2C);
Wire.endTransmission(false);

Wire.requestFrom(lps331ad, 1,false);
r4=Wire.read();
Wire.endTransmission(true);
//////////////////////////////////////////////////////////////////////////////////////

// データ習得(気圧の下位バイト)
Wire.beginTransmission(lps331ad); //SA0=GNDで0xB8,SA0=VDDで0xBA
Wire.write(0x2B);
Wire.endTransmission(false);

Wire.requestFrom(lps331ad, 1,false);
r5=Wire.read();
Wire.endTransmission(true);
//////////////////////////////////////////////////////////////////////////////////////
int F=(r4<<8)+r5;
float lps_t;
if(highByte(r4)==0){
lps_t=42.5+F/480;
}
if(highByte(r4)==1){
lps_t=42.5+~F/480;
}