久坐警报器

Dependencies:   mbed

Committer:
limr
Date:
Sun May 22 15:17:51 2016 +0000
Revision:
3:c3f198cd0624
Parent:
2:6a50d967a71a
?????;

Who changed what in which revision?

UserRevisionLine numberNew 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 }