最大200Gの加速度と気圧から計算した高度をOpenLogで記録するロガー

Dependencies:   mbed ADXL375_i2c LPS25H_lib

main.cpp

Committer:
tanahashi
Date:
2019-07-19
Revision:
1:1191a33a3f7d
Parent:
0:2844a6d048e2

File content as of revision 1:1191a33a3f7d:

#include "mbed.h"
#include "ADXL375_i2c.h"
#include "LPS25H_lib.h"

#define TIME_PRINT 0.1
#define ALT_SEPARATE 6.0

/*******************************************************************************
コンストラクタ
*******************************************************************************/
Serial pc(USBTX, USBRX, 115200);
Serial sd(p13, p14, 115200);

I2C i2c_bus(p9, p10);

LPS25H_lib LPS25H(LPS25H_lib::AD0_HIGH, i2c_bus);
ADXL375_i2c ADXL375(i2c_bus, ADXL375_i2c::ALT_ADDRESS_HIGH);

Timer timer_rec;
Timer timer_button;
Ticker tick_print;

InterruptIn pinReset(p17);
InterruptIn pinRec(p16);

DigitalOut LED_REC(LED1);
DigitalOut LED_PT(LED2);

/*******************************************************************************
関数のプロトタイプ宣言
*******************************************************************************/
void setup();

void readSensor();
void resetPT();

void printData();
void readPC();

void recData();
void startRec();
void stopRec();
void buttonPush();
void buttonRelease();

/*******************************************************************************
変数の宣言
*******************************************************************************/
int time_rec;

float acc[3];
float pres, temp, alt;
float pres_0, temp_0;
float alt_old, speed;
int separate_c;

bool save = false;
bool separate = false;
bool button_push = false;

/*******************************************************************************
メイン関数
*******************************************************************************/
int main() {
    setup();
    
    pc.attach(&readPC, Serial::RxIrq);
    tick_print.attach(&printData, TIME_PRINT);
    
    pinReset.mode(PullUp);
    pinReset.fall(&resetPT);
    
    pinRec.mode(PullUp);
    pinRec.fall(&buttonPush);
    pinRec.rise(&buttonRelease);
    
    while(1) {
        readSensor();
        recData();
        wait(0.003f);
    }
}

/*******************************************************************************
センサー読み取り
*******************************************************************************/
void readSensor(){
    alt_old = alt;
    pres = LPS25H.getPres();
    temp = LPS25H.getTemp();
    alt = LPS25H.getAlt(pres_0, temp_0);
    speed = (alt - alt_old) / 0.1;
    
    if(save && alt <= ALT_SEPARATE && speed < 0.0f && !separate){
        separate_c ++;
        if(separate_c > 10){
            separate_c = 0;
            separate = true;
        }
    }
    
    ADXL375.getOutput(acc);
}

/*******************************************************************************
高度リセット
*******************************************************************************/
void resetPT(){
    pres_0 = pres;
    temp_0 = temp;
    
    LED_PT = 1;
    wait(0.05f);
    LED_PT = 0;
    wait(0.05f);
    LED_PT = 1;
    wait(0.05f);
    LED_PT = 0;
    wait(0.05f);
    LED_PT = 1;
    wait(0.05f);
    LED_PT = 0;
}

/*******************************************************************************
データをPCで表示
*******************************************************************************/
void printData(){
    pc.printf("%.4f[hPa]\t%.2f[degC]\t%.2f[m]  \t", pres, temp, alt);
    pc.printf("%.2f, %.2f, %.2f\t", acc[0], acc[1], acc[2]);
    pc.printf("%d\r\n", separate);
}

/*******************************************************************************
PCからのコマンド読み取り
*******************************************************************************/
void readPC(){
    char c = pc.getc();
    switch(c){
        case '1':
        startRec();
        break;
        
        case '0':
        stopRec();
        break;
        
        case 'R':
        resetPT();
        break;
    }
}

/*******************************************************************************
データを記録
*******************************************************************************/
void recData(){
    if(save){
        time_rec = timer_rec.read_us();
        sd.printf("%d,", time_rec);
        sd.printf("%f,%f,%f,", pres, temp, alt);
        sd.printf("%.2f,%.2f,%.2f,", acc[0], acc[1], acc[2]);
        sd.printf("%d\r\n", separate);
    }
}

/*******************************************************************************
記録開始
*******************************************************************************/
void startRec(){
    if(!save){
        tick_print.detach();
        
        timer_rec.reset();
        timer_rec.start();
        save = true;
        LED_REC = 1;
    }
}

/*******************************************************************************
記録停止
*******************************************************************************/
void stopRec(){
    if(save){
        save = false;
        LED_REC = 0;
        timer_rec.stop();
        sd.printf("\r\n\n");
        
        tick_print.attach(&printData, TIME_PRINT);
    }
}

/*******************************************************************************
ボタンが押されたとき
*******************************************************************************/
void buttonPush(){
    if(!button_push){
        timer_button.start();
        button_push = true;
    }
}

/*******************************************************************************
ボタンが離されたとき
*******************************************************************************/
void buttonRelease(){
    int time_button;
    
    if(button_push){
        button_push = false;
        time_button = timer_button.read();
        timer_button.stop();
        timer_button.reset();
        if(time_button >= 3){
            if(!save){
                startRec();
            }
            else{
                stopRec();
            }
        }
    }
}

/*******************************************************************************
セットアップ(最初の1回実行)
*******************************************************************************/
void setup(){
    wait(0.5f);
    
    LPS25H.begin(25);
    LPS25H.setFIFO(16);
    if(LPS25H.whoAmI() == 0){
        pc.printf("LPS25H  : OK\r\n");
        readSensor();
        resetPT();
    }
    else{
        pc.printf("LPS25H  : NG.....\r\n");
    }
    
    ADXL375.setDataRate(ADXL375_3200HZ);
    if(ADXL375.whoAmI() == 1){
        pc.printf("ADXL375 : OK\r\n");
    }
    else{
        pc.printf("ADXL375 : NG.....\r\n");
    }
    ADXL375.offset(-0.3f, -0.6f, 0.3f);
    wait(0.5f);
}