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

Dependencies:   mbed ADXL375_i2c LPS25H_lib

Committer:
tanahashi
Date:
Fri Jul 19 10:21:28 2019 +0000
Revision:
1:1191a33a3f7d
Parent:
0:2844a6d048e2
ver8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sigma884 0:2844a6d048e2 1 #include "mbed.h"
Sigma884 0:2844a6d048e2 2 #include "ADXL375_i2c.h"
Sigma884 0:2844a6d048e2 3 #include "LPS25H_lib.h"
Sigma884 0:2844a6d048e2 4
Sigma884 0:2844a6d048e2 5 #define TIME_PRINT 0.1
Sigma884 0:2844a6d048e2 6 #define ALT_SEPARATE 6.0
Sigma884 0:2844a6d048e2 7
Sigma884 0:2844a6d048e2 8 /*******************************************************************************
Sigma884 0:2844a6d048e2 9 コンストラクタ
Sigma884 0:2844a6d048e2 10 *******************************************************************************/
Sigma884 0:2844a6d048e2 11 Serial pc(USBTX, USBRX, 115200);
Sigma884 0:2844a6d048e2 12 Serial sd(p13, p14, 115200);
Sigma884 0:2844a6d048e2 13
Sigma884 0:2844a6d048e2 14 I2C i2c_bus(p9, p10);
Sigma884 0:2844a6d048e2 15
Sigma884 0:2844a6d048e2 16 LPS25H_lib LPS25H(LPS25H_lib::AD0_HIGH, i2c_bus);
Sigma884 0:2844a6d048e2 17 ADXL375_i2c ADXL375(i2c_bus, ADXL375_i2c::ALT_ADDRESS_HIGH);
Sigma884 0:2844a6d048e2 18
Sigma884 0:2844a6d048e2 19 Timer timer_rec;
Sigma884 0:2844a6d048e2 20 Timer timer_button;
Sigma884 0:2844a6d048e2 21 Ticker tick_print;
Sigma884 0:2844a6d048e2 22
Sigma884 0:2844a6d048e2 23 InterruptIn pinReset(p17);
Sigma884 0:2844a6d048e2 24 InterruptIn pinRec(p16);
Sigma884 0:2844a6d048e2 25
Sigma884 0:2844a6d048e2 26 DigitalOut LED_REC(LED1);
Sigma884 0:2844a6d048e2 27 DigitalOut LED_PT(LED2);
Sigma884 0:2844a6d048e2 28
Sigma884 0:2844a6d048e2 29 /*******************************************************************************
Sigma884 0:2844a6d048e2 30 関数のプロトタイプ宣言
Sigma884 0:2844a6d048e2 31 *******************************************************************************/
Sigma884 0:2844a6d048e2 32 void setup();
Sigma884 0:2844a6d048e2 33
Sigma884 0:2844a6d048e2 34 void readSensor();
Sigma884 0:2844a6d048e2 35 void resetPT();
Sigma884 0:2844a6d048e2 36
Sigma884 0:2844a6d048e2 37 void printData();
Sigma884 0:2844a6d048e2 38 void readPC();
Sigma884 0:2844a6d048e2 39
Sigma884 0:2844a6d048e2 40 void recData();
Sigma884 0:2844a6d048e2 41 void startRec();
Sigma884 0:2844a6d048e2 42 void stopRec();
Sigma884 0:2844a6d048e2 43 void buttonPush();
Sigma884 0:2844a6d048e2 44 void buttonRelease();
Sigma884 0:2844a6d048e2 45
Sigma884 0:2844a6d048e2 46 /*******************************************************************************
Sigma884 0:2844a6d048e2 47 変数の宣言
Sigma884 0:2844a6d048e2 48 *******************************************************************************/
Sigma884 0:2844a6d048e2 49 int time_rec;
Sigma884 0:2844a6d048e2 50
Sigma884 0:2844a6d048e2 51 float acc[3];
Sigma884 0:2844a6d048e2 52 float pres, temp, alt;
Sigma884 0:2844a6d048e2 53 float pres_0, temp_0;
Sigma884 0:2844a6d048e2 54 float alt_old, speed;
Sigma884 0:2844a6d048e2 55 int separate_c;
Sigma884 0:2844a6d048e2 56
Sigma884 0:2844a6d048e2 57 bool save = false;
Sigma884 0:2844a6d048e2 58 bool separate = false;
Sigma884 0:2844a6d048e2 59 bool button_push = false;
Sigma884 0:2844a6d048e2 60
Sigma884 0:2844a6d048e2 61 /*******************************************************************************
Sigma884 0:2844a6d048e2 62 メイン関数
Sigma884 0:2844a6d048e2 63 *******************************************************************************/
Sigma884 0:2844a6d048e2 64 int main() {
Sigma884 0:2844a6d048e2 65 setup();
Sigma884 0:2844a6d048e2 66
Sigma884 0:2844a6d048e2 67 pc.attach(&readPC, Serial::RxIrq);
Sigma884 0:2844a6d048e2 68 tick_print.attach(&printData, TIME_PRINT);
Sigma884 0:2844a6d048e2 69
Sigma884 0:2844a6d048e2 70 pinReset.mode(PullUp);
Sigma884 0:2844a6d048e2 71 pinReset.fall(&resetPT);
Sigma884 0:2844a6d048e2 72
Sigma884 0:2844a6d048e2 73 pinRec.mode(PullUp);
Sigma884 0:2844a6d048e2 74 pinRec.fall(&buttonPush);
Sigma884 0:2844a6d048e2 75 pinRec.rise(&buttonRelease);
Sigma884 0:2844a6d048e2 76
Sigma884 0:2844a6d048e2 77 while(1) {
Sigma884 0:2844a6d048e2 78 readSensor();
Sigma884 0:2844a6d048e2 79 recData();
Sigma884 0:2844a6d048e2 80 wait(0.003f);
Sigma884 0:2844a6d048e2 81 }
Sigma884 0:2844a6d048e2 82 }
Sigma884 0:2844a6d048e2 83
Sigma884 0:2844a6d048e2 84 /*******************************************************************************
Sigma884 0:2844a6d048e2 85 センサー読み取り
Sigma884 0:2844a6d048e2 86 *******************************************************************************/
Sigma884 0:2844a6d048e2 87 void readSensor(){
Sigma884 0:2844a6d048e2 88 alt_old = alt;
Sigma884 0:2844a6d048e2 89 pres = LPS25H.getPres();
Sigma884 0:2844a6d048e2 90 temp = LPS25H.getTemp();
Sigma884 0:2844a6d048e2 91 alt = LPS25H.getAlt(pres_0, temp_0);
Sigma884 0:2844a6d048e2 92 speed = (alt - alt_old) / 0.1;
Sigma884 0:2844a6d048e2 93
Sigma884 0:2844a6d048e2 94 if(save && alt <= ALT_SEPARATE && speed < 0.0f && !separate){
Sigma884 0:2844a6d048e2 95 separate_c ++;
Sigma884 0:2844a6d048e2 96 if(separate_c > 10){
Sigma884 0:2844a6d048e2 97 separate_c = 0;
Sigma884 0:2844a6d048e2 98 separate = true;
Sigma884 0:2844a6d048e2 99 }
Sigma884 0:2844a6d048e2 100 }
Sigma884 0:2844a6d048e2 101
Sigma884 0:2844a6d048e2 102 ADXL375.getOutput(acc);
Sigma884 0:2844a6d048e2 103 }
Sigma884 0:2844a6d048e2 104
Sigma884 0:2844a6d048e2 105 /*******************************************************************************
Sigma884 0:2844a6d048e2 106 高度リセット
Sigma884 0:2844a6d048e2 107 *******************************************************************************/
Sigma884 0:2844a6d048e2 108 void resetPT(){
Sigma884 0:2844a6d048e2 109 pres_0 = pres;
Sigma884 0:2844a6d048e2 110 temp_0 = temp;
Sigma884 0:2844a6d048e2 111
Sigma884 0:2844a6d048e2 112 LED_PT = 1;
Sigma884 0:2844a6d048e2 113 wait(0.05f);
Sigma884 0:2844a6d048e2 114 LED_PT = 0;
Sigma884 0:2844a6d048e2 115 wait(0.05f);
Sigma884 0:2844a6d048e2 116 LED_PT = 1;
Sigma884 0:2844a6d048e2 117 wait(0.05f);
Sigma884 0:2844a6d048e2 118 LED_PT = 0;
Sigma884 0:2844a6d048e2 119 wait(0.05f);
Sigma884 0:2844a6d048e2 120 LED_PT = 1;
Sigma884 0:2844a6d048e2 121 wait(0.05f);
Sigma884 0:2844a6d048e2 122 LED_PT = 0;
Sigma884 0:2844a6d048e2 123 }
Sigma884 0:2844a6d048e2 124
Sigma884 0:2844a6d048e2 125 /*******************************************************************************
Sigma884 0:2844a6d048e2 126 データをPCで表示
Sigma884 0:2844a6d048e2 127 *******************************************************************************/
Sigma884 0:2844a6d048e2 128 void printData(){
Sigma884 0:2844a6d048e2 129 pc.printf("%.4f[hPa]\t%.2f[degC]\t%.2f[m] \t", pres, temp, alt);
Sigma884 0:2844a6d048e2 130 pc.printf("%.2f, %.2f, %.2f\t", acc[0], acc[1], acc[2]);
Sigma884 0:2844a6d048e2 131 pc.printf("%d\r\n", separate);
Sigma884 0:2844a6d048e2 132 }
Sigma884 0:2844a6d048e2 133
Sigma884 0:2844a6d048e2 134 /*******************************************************************************
Sigma884 0:2844a6d048e2 135 PCからのコマンド読み取り
Sigma884 0:2844a6d048e2 136 *******************************************************************************/
Sigma884 0:2844a6d048e2 137 void readPC(){
Sigma884 0:2844a6d048e2 138 char c = pc.getc();
Sigma884 0:2844a6d048e2 139 switch(c){
Sigma884 0:2844a6d048e2 140 case '1':
Sigma884 0:2844a6d048e2 141 startRec();
Sigma884 0:2844a6d048e2 142 break;
Sigma884 0:2844a6d048e2 143
Sigma884 0:2844a6d048e2 144 case '0':
Sigma884 0:2844a6d048e2 145 stopRec();
Sigma884 0:2844a6d048e2 146 break;
Sigma884 0:2844a6d048e2 147
Sigma884 0:2844a6d048e2 148 case 'R':
Sigma884 0:2844a6d048e2 149 resetPT();
Sigma884 0:2844a6d048e2 150 break;
Sigma884 0:2844a6d048e2 151 }
Sigma884 0:2844a6d048e2 152 }
Sigma884 0:2844a6d048e2 153
Sigma884 0:2844a6d048e2 154 /*******************************************************************************
Sigma884 0:2844a6d048e2 155 データを記録
Sigma884 0:2844a6d048e2 156 *******************************************************************************/
Sigma884 0:2844a6d048e2 157 void recData(){
Sigma884 0:2844a6d048e2 158 if(save){
Sigma884 0:2844a6d048e2 159 time_rec = timer_rec.read_us();
tanahashi 1:1191a33a3f7d 160 sd.printf("%d,", time_rec);
tanahashi 1:1191a33a3f7d 161 sd.printf("%f,%f,%f,", pres, temp, alt);
tanahashi 1:1191a33a3f7d 162 sd.printf("%.2f,%.2f,%.2f,", acc[0], acc[1], acc[2]);
Sigma884 0:2844a6d048e2 163 sd.printf("%d\r\n", separate);
Sigma884 0:2844a6d048e2 164 }
Sigma884 0:2844a6d048e2 165 }
Sigma884 0:2844a6d048e2 166
Sigma884 0:2844a6d048e2 167 /*******************************************************************************
Sigma884 0:2844a6d048e2 168 記録開始
Sigma884 0:2844a6d048e2 169 *******************************************************************************/
Sigma884 0:2844a6d048e2 170 void startRec(){
Sigma884 0:2844a6d048e2 171 if(!save){
Sigma884 0:2844a6d048e2 172 tick_print.detach();
Sigma884 0:2844a6d048e2 173
Sigma884 0:2844a6d048e2 174 timer_rec.reset();
Sigma884 0:2844a6d048e2 175 timer_rec.start();
Sigma884 0:2844a6d048e2 176 save = true;
Sigma884 0:2844a6d048e2 177 LED_REC = 1;
Sigma884 0:2844a6d048e2 178 }
Sigma884 0:2844a6d048e2 179 }
Sigma884 0:2844a6d048e2 180
Sigma884 0:2844a6d048e2 181 /*******************************************************************************
Sigma884 0:2844a6d048e2 182 記録停止
Sigma884 0:2844a6d048e2 183 *******************************************************************************/
Sigma884 0:2844a6d048e2 184 void stopRec(){
Sigma884 0:2844a6d048e2 185 if(save){
Sigma884 0:2844a6d048e2 186 save = false;
Sigma884 0:2844a6d048e2 187 LED_REC = 0;
Sigma884 0:2844a6d048e2 188 timer_rec.stop();
Sigma884 0:2844a6d048e2 189 sd.printf("\r\n\n");
Sigma884 0:2844a6d048e2 190
Sigma884 0:2844a6d048e2 191 tick_print.attach(&printData, TIME_PRINT);
Sigma884 0:2844a6d048e2 192 }
Sigma884 0:2844a6d048e2 193 }
Sigma884 0:2844a6d048e2 194
Sigma884 0:2844a6d048e2 195 /*******************************************************************************
Sigma884 0:2844a6d048e2 196 ボタンが押されたとき
Sigma884 0:2844a6d048e2 197 *******************************************************************************/
Sigma884 0:2844a6d048e2 198 void buttonPush(){
Sigma884 0:2844a6d048e2 199 if(!button_push){
Sigma884 0:2844a6d048e2 200 timer_button.start();
Sigma884 0:2844a6d048e2 201 button_push = true;
Sigma884 0:2844a6d048e2 202 }
Sigma884 0:2844a6d048e2 203 }
Sigma884 0:2844a6d048e2 204
Sigma884 0:2844a6d048e2 205 /*******************************************************************************
Sigma884 0:2844a6d048e2 206 ボタンが離されたとき
Sigma884 0:2844a6d048e2 207 *******************************************************************************/
Sigma884 0:2844a6d048e2 208 void buttonRelease(){
Sigma884 0:2844a6d048e2 209 int time_button;
Sigma884 0:2844a6d048e2 210
Sigma884 0:2844a6d048e2 211 if(button_push){
Sigma884 0:2844a6d048e2 212 button_push = false;
Sigma884 0:2844a6d048e2 213 time_button = timer_button.read();
Sigma884 0:2844a6d048e2 214 timer_button.stop();
Sigma884 0:2844a6d048e2 215 timer_button.reset();
Sigma884 0:2844a6d048e2 216 if(time_button >= 3){
Sigma884 0:2844a6d048e2 217 if(!save){
Sigma884 0:2844a6d048e2 218 startRec();
Sigma884 0:2844a6d048e2 219 }
Sigma884 0:2844a6d048e2 220 else{
Sigma884 0:2844a6d048e2 221 stopRec();
Sigma884 0:2844a6d048e2 222 }
Sigma884 0:2844a6d048e2 223 }
Sigma884 0:2844a6d048e2 224 }
Sigma884 0:2844a6d048e2 225 }
Sigma884 0:2844a6d048e2 226
Sigma884 0:2844a6d048e2 227 /*******************************************************************************
Sigma884 0:2844a6d048e2 228 セットアップ(最初の1回実行)
Sigma884 0:2844a6d048e2 229 *******************************************************************************/
Sigma884 0:2844a6d048e2 230 void setup(){
Sigma884 0:2844a6d048e2 231 wait(0.5f);
Sigma884 0:2844a6d048e2 232
Sigma884 0:2844a6d048e2 233 LPS25H.begin(25);
Sigma884 0:2844a6d048e2 234 LPS25H.setFIFO(16);
Sigma884 0:2844a6d048e2 235 if(LPS25H.whoAmI() == 0){
Sigma884 0:2844a6d048e2 236 pc.printf("LPS25H : OK\r\n");
Sigma884 0:2844a6d048e2 237 readSensor();
Sigma884 0:2844a6d048e2 238 resetPT();
Sigma884 0:2844a6d048e2 239 }
Sigma884 0:2844a6d048e2 240 else{
Sigma884 0:2844a6d048e2 241 pc.printf("LPS25H : NG.....\r\n");
Sigma884 0:2844a6d048e2 242 }
Sigma884 0:2844a6d048e2 243
Sigma884 0:2844a6d048e2 244 ADXL375.setDataRate(ADXL375_3200HZ);
Sigma884 0:2844a6d048e2 245 if(ADXL375.whoAmI() == 1){
Sigma884 0:2844a6d048e2 246 pc.printf("ADXL375 : OK\r\n");
Sigma884 0:2844a6d048e2 247 }
Sigma884 0:2844a6d048e2 248 else{
Sigma884 0:2844a6d048e2 249 pc.printf("ADXL375 : NG.....\r\n");
Sigma884 0:2844a6d048e2 250 }
Sigma884 0:2844a6d048e2 251 ADXL375.offset(-0.3f, -0.6f, 0.3f);
Sigma884 0:2844a6d048e2 252 wait(0.5f);
Sigma884 0:2844a6d048e2 253 }