kai wang
/
mbed_health
久坐警报器
main.cpp@3:c3f198cd0624, 2016-05-22 (annotated)
- Committer:
- limr
- Date:
- Sun May 22 15:17:51 2016 +0000
- Revision:
- 3:c3f198cd0624
- Parent:
- 2:6a50d967a71a
?????;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
limr | 0:76c6ddb1425b | 1 | #include "mbed.h" |
limr | 0:76c6ddb1425b | 2 | #include"time.h" |
limr | 3:c3f198cd0624 | 3 | #include"math.h" |
limr | 0:76c6ddb1425b | 4 | |
limr | 3:c3f198cd0624 | 5 | #define UPA1 10000//坐时最大加速度值 |
limr | 3:c3f198cd0624 | 6 | #define UPA2 10000 |
limr | 3:c3f198cd0624 | 7 | #define UPA3 10000 |
limr | 3:c3f198cd0624 | 8 | uint16_t x_a,y_a,z_a,all_a; |
limr | 0:76c6ddb1425b | 9 | bool flag = 0; |
limr | 0:76c6ddb1425b | 10 | |
limr | 0:76c6ddb1425b | 11 | SPI spi_master(P0_6,P0_5,P0_7); //mosi miso sclk |
limr | 0:76c6ddb1425b | 12 | DigitalOut cs(P0_4); |
limr | 0:76c6ddb1425b | 13 | |
limr | 0:76c6ddb1425b | 14 | //Serial pc(P0_23,P0_25); |
limr | 0:76c6ddb1425b | 15 | |
limr | 0:76c6ddb1425b | 16 | Serial pc(P0_9,P0_11); |
limr | 0:76c6ddb1425b | 17 | |
limr | 0:76c6ddb1425b | 18 | PwmOut buzzer(p22);//buzzer |
limr | 0:76c6ddb1425b | 19 | float frequency[]={659,554,659,554,440,494,554,587,494,659,554,440}; |
limr | 0:76c6ddb1425b | 20 | float beat[]={1,1,1,1,1,0.5,0.5,1,1,1,1,2}; //节拍数组 |
limr | 0:76c6ddb1425b | 21 | |
limr | 0:76c6ddb1425b | 22 | uint8_t LIS3DH_SPI_RD(uint8_t addr) |
limr | 0:76c6ddb1425b | 23 | { |
limr | 0:76c6ddb1425b | 24 | uint8_t temp; |
limr | 0:76c6ddb1425b | 25 | cs = 0; |
limr | 0:76c6ddb1425b | 26 | wait_us(10); |
limr | 0:76c6ddb1425b | 27 | spi_master.write(addr); |
limr | 0:76c6ddb1425b | 28 | temp=spi_master.write(0xff); |
limr | 0:76c6ddb1425b | 29 | wait_us(10); |
limr | 0:76c6ddb1425b | 30 | cs = 1; |
limr | 0:76c6ddb1425b | 31 | return temp; |
limr | 0:76c6ddb1425b | 32 | } |
limr | 0:76c6ddb1425b | 33 | |
limr | 0:76c6ddb1425b | 34 | void LIS3DH_SPI_WR(uint8_t addr,uint8_t wrdata) |
limr | 0:76c6ddb1425b | 35 | { |
limr | 0:76c6ddb1425b | 36 | cs = 0; |
limr | 0:76c6ddb1425b | 37 | wait_us(10); |
limr | 0:76c6ddb1425b | 38 | spi_master.write(addr); |
limr | 0:76c6ddb1425b | 39 | spi_master.write(wrdata); |
limr | 0:76c6ddb1425b | 40 | wait_us(10); |
limr | 0:76c6ddb1425b | 41 | cs = 1; |
limr | 0:76c6ddb1425b | 42 | } |
limr | 0:76c6ddb1425b | 43 | |
limr | 0:76c6ddb1425b | 44 | void SPI_LIS3DH_Init()//启动函数 |
limr | 0:76c6ddb1425b | 45 | { |
limr | 0:76c6ddb1425b | 46 | spi_master.format(8,3); |
limr | 0:76c6ddb1425b | 47 | spi_master.frequency(100000); |
limr | 0:76c6ddb1425b | 48 | wait_ms(5); |
limr | 0:76c6ddb1425b | 49 | LIS3DH_SPI_WR(0x24,0x80); |
limr | 0:76c6ddb1425b | 50 | wait_ms(5); |
limr | 0:76c6ddb1425b | 51 | LIS3DH_SPI_WR(0x20,0x17); |
limr | 0:76c6ddb1425b | 52 | LIS3DH_SPI_WR(0x23,0x80); |
limr | 0:76c6ddb1425b | 53 | } |
limr | 0:76c6ddb1425b | 54 | |
limr | 0:76c6ddb1425b | 55 | void get_val(void)//得到加速度函数 |
limr | 0:76c6ddb1425b | 56 | { |
limr | 0:76c6ddb1425b | 57 | uint8_t Dx_L=1,Dy_L=1,Dz_L=1; |
limr | 0:76c6ddb1425b | 58 | uint8_t Dx_H=1,Dy_H=1,Dz_H=1; |
limr | 0:76c6ddb1425b | 59 | if(LIS3DH_SPI_RD(0x0f|0x80)==0x33) |
limr | 0:76c6ddb1425b | 60 | { |
limr | 0:76c6ddb1425b | 61 | printf("check device ok!\r\n"); |
limr | 0:76c6ddb1425b | 62 | flag=1; |
limr | 0:76c6ddb1425b | 63 | Dx_H=LIS3DH_SPI_RD(0x29|0x80); |
limr | 0:76c6ddb1425b | 64 | Dx_L=LIS3DH_SPI_RD(0x28|0x80); |
limr | 0:76c6ddb1425b | 65 | Dy_H=LIS3DH_SPI_RD(0x2b|0x80); |
limr | 0:76c6ddb1425b | 66 | Dy_L=LIS3DH_SPI_RD(0x2A|0x80); |
limr | 0:76c6ddb1425b | 67 | Dz_H=LIS3DH_SPI_RD(0x2d|0x80); |
limr | 0:76c6ddb1425b | 68 | Dz_L=LIS3DH_SPI_RD(0x2C|0x80); |
limr | 0:76c6ddb1425b | 69 | } |
limr | 0:76c6ddb1425b | 70 | else |
limr | 0:76c6ddb1425b | 71 | { |
limr | 0:76c6ddb1425b | 72 | printf("check device err!\r\n"); |
limr | 0:76c6ddb1425b | 73 | wait(1); |
limr | 0:76c6ddb1425b | 74 | } |
limr | 0:76c6ddb1425b | 75 | x_a=Dx_H<<8|Dx_L/16; |
limr | 0:76c6ddb1425b | 76 | y_a=Dy_H<<8|Dy_L/16; |
limr | 0:76c6ddb1425b | 77 | z_a=Dz_H<<8|Dz_L/16; |
limr | 0:76c6ddb1425b | 78 | } |
limr | 0:76c6ddb1425b | 79 | void buzzerini(void) |
limr | 3:c3f198cd0624 | 80 | { while(1){ |
limr | 1:32df8ff2011e | 81 | for (int i=0;i<=11;i++) |
limr | 1:32df8ff2011e | 82 | { |
limr | 0:76c6ddb1425b | 83 | buzzer.period(1/(2*frequency[i])); // 设置PWM周期 |
limr | 0:76c6ddb1425b | 84 | buzzer=0.5; // 设置占空比 |
limr | 0:76c6ddb1425b | 85 | wait(0.4*beat[i]); // 保持节拍周期 |
limr | 1:32df8ff2011e | 86 | } |
limr | 3:c3f198cd0624 | 87 | get_val(); |
limr | 3:c3f198cd0624 | 88 | if(x_a>UPA3) |
limr | 3:c3f198cd0624 | 89 | { |
limr | 3:c3f198cd0624 | 90 | buzzer.period_us(0); |
limr | 3:c3f198cd0624 | 91 | break; |
limr | 3:c3f198cd0624 | 92 | } |
limr | 3:c3f198cd0624 | 93 | } |
limr | 3:c3f198cd0624 | 94 | } |
limr | 3:c3f198cd0624 | 95 | void calsample(void) |
limr | 3:c3f198cd0624 | 96 | { uint16_t sum; |
limr | 3:c3f198cd0624 | 97 | clock_t st,en; |
limr | 3:c3f198cd0624 | 98 | st=clock(); |
limr | 3:c3f198cd0624 | 99 | get_val(); |
limr | 3:c3f198cd0624 | 100 | while((double)((en=clock())-st)/CLK_TCK>100) |
limr | 3:c3f198cd0624 | 101 | { |
limr | 3:c3f198cd0624 | 102 | all_a=(uint16_t)sqrt((double)(x_a+y_a+z_a)); |
limr | 3:c3f198cd0624 | 103 | get_val(); |
limr | 3:c3f198cd0624 | 104 | sum+=all_a; |
limr | 3:c3f198cd0624 | 105 | wait(10); |
limr | 3:c3f198cd0624 | 106 | } |
limr | 0:76c6ddb1425b | 107 | } |
limr | 0:76c6ddb1425b | 108 | void sit_judgement() |
limr | 3:c3f198cd0624 | 109 | { int flag=1; |
limr | 0:76c6ddb1425b | 110 | clock_t start,end; |
limr | 0:76c6ddb1425b | 111 | start=clock(); |
limr | 3:c3f198cd0624 | 112 | calsample(); |
limr | 3:c3f198cd0624 | 113 | while(all_a<=UPA1)//T+的情况 |
limr | 3:c3f198cd0624 | 114 | { end=clock(); |
limr | 3:c3f198cd0624 | 115 | if((double)(end-start)/CLK_TCK>300)//坐了300s |
limr | 3:c3f198cd0624 | 116 | { flag=0; |
limr | 3:c3f198cd0624 | 117 | buzzerini(); |
limr | 0:76c6ddb1425b | 118 | break; |
limr | 0:76c6ddb1425b | 119 | } |
limr | 3:c3f198cd0624 | 120 | calsample(); |
limr | 0:76c6ddb1425b | 121 | } |
limr | 3:c3f198cd0624 | 122 | while(flag)//T-的情况 |
limr | 3:c3f198cd0624 | 123 | { calsample(); |
limr | 3:c3f198cd0624 | 124 | if(all_a<UPA2) |
limr | 3:c3f198cd0624 | 125 | { |
limr | 3:c3f198cd0624 | 126 | break; |
limr | 3:c3f198cd0624 | 127 | } |
limr | 3:c3f198cd0624 | 128 | wait(10); |
limr | 0:76c6ddb1425b | 129 | } |
limr | 0:76c6ddb1425b | 130 | } |
limr | 3:c3f198cd0624 | 131 | |
limr | 3:c3f198cd0624 | 132 | |
limr | 0:76c6ddb1425b | 133 | int main(void) |
limr | 0:76c6ddb1425b | 134 | { |
limr | 0:76c6ddb1425b | 135 | SPI_LIS3DH_Init(); |
limr | 0:76c6ddb1425b | 136 | while(1) |
limr | 0:76c6ddb1425b | 137 | { |
limr | 0:76c6ddb1425b | 138 | sit_judgement(); |
limr | 0:76c6ddb1425b | 139 | if(flag) |
limr | 0:76c6ddb1425b | 140 | { |
limr | 0:76c6ddb1425b | 141 | flag=0; |
limr | 3:c3f198cd0624 | 142 | wait(5);//等站起来后读取判断周期变长 |
limr | 0:76c6ddb1425b | 143 | } |
limr | 0:76c6ddb1425b | 144 | } |
limr | 0:76c6ddb1425b | 145 | } |