〔MPL115A2〕 〔LPS331AP/LPS25H〕 〔Arduinoの動かせ方入門に戻る〕


---------------------------------------------------------------------
#include <SPI.h>
#include "pins_arduino.h"
#define AVE_NUM 20 // 圧力・温度のA/D変換値を平均化する回数
#define H_CORRECT 80 // 自宅でのセンサと実際の高度差補正値(My自宅の標高は100m)
float a0 , b1 , b2 , c12 ; // 係数のデータを保存する変数
unsigned long Press , Temp ; // 圧力および温度の変換値を保存する変数
void setup()
{
// シリアルモニターの設定
Serial.begin(9600) ;
// SPIの初期化
SPI.begin() ; // SPIを行う為の初期化
SPI.setBitOrder(MSBFIRST) ; // ビットオーダー
SPI.setClockDivider(SPI_CLOCK_DIV4) ;// クロック(CLK)をシステムクロックの1/4で使用(16MHz/4)
SPI.setDataMode(SPI_MODE0) ; // クロック極性0(LOW) クロック位相1(HIGH)
delay(3000) ; // 3Sしたら開始
CoefficientRead() ; // メモリーマップから係数を読み出して置く
}
void loop()
{
int i ;
float ans ;
unsigned long p , t ;
p = t = 0 ;
for (i=0 ; i < AVE_NUM ; i++) { // 20回読み込んで平均化する
PressureRead() ; // メモリーマップから圧力および温度のA/D変換値を読み出す
p = p + Press ;
t = t + Temp ;
}
Press = p / AVE_NUM ;
Temp = t / AVE_NUM ;
ans = PressureCalc() ; // 気圧値の計算を行う
Serial.print(ans) ; // 気圧値の表示を行う
Serial.print(" hPa ") ;
ans = AltitudeCalc(ans,H_CORRECT) ; // 高度の計算を行う
Serial.print(ans) ; // 高度の表示を行う
Serial.println(" m") ;
delay(1000) ; // 1秒後に繰り返す
}
// メモリーマップから係数を読み出す処理
void CoefficientRead()
{
unsigned int h , l ;
digitalWrite(SS,LOW) ; // SS(CS)ラインをLOWにする
// a0の係数を得る
SPI.transfer(0x88) ; // a0(MSB:HIGH byte)係数
h = SPI.transfer(0x00) ;
SPI.transfer(0x8a) ; // a0(LSB:LOW byte) 係数
l = SPI.transfer(0x00) ;
a0 = (h << 5) + (l >> 3) + (l & 0x07) / 8.0 ;
// b1の係数を得る
SPI.transfer(0x8c) ; // b1(MSB:HIGH byte)係数
h = SPI.transfer(0x00) ;
SPI.transfer(0x8e) ; // b1(LSB:LOW byte) 係数
l = SPI.transfer(0x00) ;
b1 = ( ( ( (h & 0x1F) * 0x100 ) + l ) / 8192.0 ) - 3 ;
// b2の係数を得る
SPI.transfer(0x90) ; // b2(MSB:HIGH byte)係数
h = SPI.transfer(0x00) ;
SPI.transfer(0x92) ; // b2(LSB:LOW byte) 係数
l = SPI.transfer(0x00) ;
b2 = ( ( ( ( h - 0x80) << 8 ) + l ) / 16384.0 ) - 2 ;
// C12の係数を得る
SPI.transfer(0x94) ; // c12(MSB:HIGH byte)係数
h = SPI.transfer(0x00) ;
SPI.transfer(0x96) ; // c12(LSB:LOW byte) 係数
l = SPI.transfer(0x00) ;
c12 = ( ( ( h * 0x100 ) + l ) / 16777216.0 ) ;
SPI.transfer(0x00) ;
digitalWrite(SS,HIGH) ; // SS(CS)ラインをHIGHにする
}
// メモリーマップから圧力および温度のA/D変換値を読み出す処理
void PressureRead()
{
unsigned int h , l ;
// 圧力および温度の変換を開始させる
digitalWrite(SS,LOW) ; // SS(CS)ラインをLOWにする
SPI.transfer(0x24) ; // 0x24コマンドの発行(圧力と温度の変換)
SPI.transfer(0x00) ;
digitalWrite(SS,HIGH) ; // SS(CS)ラインをHIGHにする
delay(3) ; // 変換完了まで3ms待つ
digitalWrite(SS,LOW) ; // SS(CS)ラインをLOWにする
// 圧力のA/D変換値を得る
SPI.transfer(0x80) ; // 圧力(MSB:HIGH byte)
h = SPI.transfer(0x00) ;
SPI.transfer(0x82) ; // 圧力(LSB:LOW byte)
l = SPI.transfer(0x00) ;
Press = ( ( h * 256 ) + l ) / 64 ;
// 温度のA/D変換値を得る
digitalWrite(SS,LOW) ; // SS(CS)ラインをLOWにする
SPI.transfer(0x84) ; // 温度(MSB:HIGH byte)
h = SPI.transfer(0x00) ;
SPI.transfer(0x86) ; // 温度(LSB:LOW byte)
l = SPI.transfer(0x00) ;
Temp = ( ( h * 256 ) + l ) / 64 ;
SPI.transfer(0x00) ;
digitalWrite(SS,HIGH) ; // SS(CS)ラインをHIGHにする
}
// 気圧値(hPa)を計算する処理
float PressureCalc()
{
float ret , f ;
f = a0 + ( b1 + c12 * Temp ) * Press + b2 * Temp ;
ret = f * ( 650.0 / 1023.0 ) + 500.0 ;
return ret ;
}
// 気圧値(hPa)から高度を計算する処理
float AltitudeCalc(float pressure,int Difference)
{
float h ;
h = 44330.8 * (1.0 - pow( (pressure/1013.25) , 0.190263 )) ;
h = h + Difference ;
return h ;
}
---------------------------------------------------------------------
CIDEツールバーの赤枠部分「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行い
この左図の様に表示されると思います。
SPI.setClockDivider(SPI_CLOCK_DIV2) ;// クロック(CLK)をシステムクロックの1/2で使用(16MHz/2)
#define AVE_NUM 20 // 圧力・温度のA/D変換値を平均化する回数ans = PressurCalc( )
#define H_CORRECT 80 // 自宅でのセンサと実際の高度差補正値(My自宅の標高は100m)
これはセンサー値から計算した高度値(ICAO標準大気)と実際の高度値(実測する場所)に誤差が
高度補正操作について[skMPL115A1]─┬─[examples]───[Pressure]--- Pressure.pde ├ skMPL115A1.cpp ├ skMPL115A1.h └ keywords.txtArduinoIDE 1.0.1 がインストールされているフォルダー、インストール先を変更していないなら

リンクの見直し(*2) 2020/03/21
追記(*1) 2013/01/15
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.