LPS25HをSPIで使えるようにしたライブラリです。  ・気圧  ・温度  ・高度(気圧と温度から) が取得できます。 FIFOも使えます。

Revision:
0:7bbdfc4610fe
Child:
1:5cd2389454f5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LPS25H_spi.cpp	Fri Nov 10 06:47:33 2017 +0000
@@ -0,0 +1,161 @@
+#include "LPS25H_spi.h"
+#include "mbed.h"
+#include "math.h"
+
+/**********
+コンストラクタ
+・使用するSPIを選択
+・使用するCSピンを選択
+**********/
+LPS25H_spi :: LPS25H_spi(SPI &userSPI, PinName userPin) : cs(userPin){
+    spi = &userSPI;
+    
+    spi -> format(8, 3);
+    spi -> frequency(10000000);
+    cs = 0;
+    spi -> write(0x00);
+    spi -> write(0x00);
+    cs = 1;
+}
+    
+/**********
+(void)センサー起動(int データレート)
+・データ更新レートを選択(1, 10, 25, 50, 75)
+**********/
+void LPS25H_spi :: begin(int drate){
+    switch(drate){
+        case 1:
+        cmd_ctrl_reg1 = 0x90;
+        break;
+        
+        case 7:
+        cmd_ctrl_reg1 = 0xA0;
+        break;
+        
+        case 12:
+        cmd_ctrl_reg1 = 0xB0;
+        break;
+        
+        case 25:
+        cmd_ctrl_reg1 = 0xC0;
+        break;
+        
+        default:
+        cmd_ctrl_reg1 = 0x80;
+        break;
+    }
+    cs = 0;
+    spi -> write(CTRL_REG1 & 0x3F);
+    spi -> write(cmd_ctrl_reg1);
+    cs = 1;
+    
+    wait(0.1f);
+}
+
+/**********
+(void)FIFO設定(int FIFOレベル)
+・FIFOウォーターマークレベルを選択(2, 4, 8, 16, 32)
+**********/
+void LPS25H_spi :: setFIFO(int size){
+    cmd_ctrl_reg2 = 0x40;
+    switch(size){
+        case 2:
+        cmd_fifo_ctrl = 0xC1;
+        break;
+        
+        case 4:
+        cmd_fifo_ctrl = 0xC3;
+        break;
+        
+        case 8:
+        cmd_fifo_ctrl = 0xC7;
+        break;
+        
+        case 16:
+        cmd_fifo_ctrl = 0xCF;
+        break;
+        
+        case 32:
+        cmd_fifo_ctrl = 0xDF;
+        break;
+        
+        default:
+        cmd_ctrl_reg2 = 0x00;
+        cmd_fifo_ctrl = 0x00;
+    }
+    
+    cs = 0;
+    spi -> write(CTRL_REG2 & 0x3F);
+    spi -> write(cmd_ctrl_reg2);
+    cs = 1;
+    cs = 0;
+    spi -> write(FIFO_CTRL & 0x3F);
+    spi -> write(cmd_fifo_ctrl);
+    cs = 1;
+    
+    wait(0.1f);
+}
+ 
+/**********
+(int)Who Am I
+接続できているかを判定
+接続OK:1
+接続NG:-1
+**********/
+int LPS25H_spi :: whoAmI(){
+    cs = 0;
+    spi -> write(WHO_AM_I | 0x80 & 0xBF);
+    ans = spi -> write(0x00);
+    cs = 1;
+    if(ans == 0xBD){
+        return 1;
+    }
+    else{
+        return -1;
+    }
+}
+
+/**********
+(float)気圧を取得
+**********/
+float LPS25H_spi :: getPres(){
+    cs = 0;
+    spi -> write(P_XL | 0xC0);
+    pres_raw[0] = spi -> write(0x00); //XL
+    pres_raw[1] = spi -> write(0x00); //L
+    pres_raw[2] = spi -> write(0x00); //H
+    cs = 1;
+    
+    return (float)(pres_raw[0] | pres_raw[1] << 8 | pres_raw[2] << 16) / 4096.0f;
+}
+
+/**********
+(float)温度を取得
+**********/
+float LPS25H_spi :: getTemp(){
+    cs = 0;
+    spi -> write(T_L | 0xC0);
+    temp_raw[0] = spi -> write(0x00); //L
+    temp_raw[1] = spi -> write(0x00); //H
+    cs = 1;
+    
+    if(temp_raw[1] >= 128){
+        return 42.5 - (float)(65536 - (temp_raw[0] | temp_raw[1] << 8)) / 480.0f;
+    }
+    else{
+        return 42.5 + (float)(temp_raw[0] | temp_raw[1] << 8) / 480.0f;
+    }
+}
+
+/**********
+(float)高度を取得(float 0mでの気圧, float 0mでの温度)
+・引数に0m地点での気圧・温度を入れる
+・計算式のソース:http://www.geocities.jp/u4ren6/Main/Excel_Data0017.html
+**********/
+float LPS25H_spi :: getAlt(float P_0, float T_0){
+    pres_0 = P_0;
+    temp_0 = T_0;
+    pres_now = getPres();
+    
+    return -(273.0 + temp_0) / 0.0342 * log(pres_now / pres_0);
+}
\ No newline at end of file