〔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.