久坐警报器

Dependencies:   mbed

Committer:
limr
Date:
Tue May 10 12:05:02 2016 +0000
Revision:
1:32df8ff2011e
Parent:
0:76c6ddb1425b
Child:
2:6a50d967a71a
health

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 0:76c6ddb1425b 3
limr 1:32df8ff2011e 4 #define UPA 3800//坐时最大加速度值
limr 0:76c6ddb1425b 5
limr 0:76c6ddb1425b 6 uint16_t x_a,y_a,z_a;
limr 0:76c6ddb1425b 7 bool flag = 0;
limr 0:76c6ddb1425b 8
limr 0:76c6ddb1425b 9 SPI spi_master(P0_6,P0_5,P0_7); //mosi miso sclk
limr 0:76c6ddb1425b 10 DigitalOut cs(P0_4);
limr 0:76c6ddb1425b 11
limr 0:76c6ddb1425b 12 //Serial pc(P0_23,P0_25);
limr 0:76c6ddb1425b 13
limr 0:76c6ddb1425b 14 Serial pc(P0_9,P0_11);
limr 0:76c6ddb1425b 15
limr 0:76c6ddb1425b 16 PwmOut buzzer(p22);//buzzer
limr 0:76c6ddb1425b 17 float frequency[]={659,554,659,554,440,494,554,587,494,659,554,440};
limr 0:76c6ddb1425b 18 float beat[]={1,1,1,1,1,0.5,0.5,1,1,1,1,2}; //节拍数组
limr 0:76c6ddb1425b 19
limr 0:76c6ddb1425b 20 uint8_t LIS3DH_SPI_RD(uint8_t addr)
limr 0:76c6ddb1425b 21 {
limr 0:76c6ddb1425b 22 uint8_t temp;
limr 0:76c6ddb1425b 23 cs = 0;
limr 0:76c6ddb1425b 24 wait_us(10);
limr 0:76c6ddb1425b 25 spi_master.write(addr);
limr 0:76c6ddb1425b 26 temp=spi_master.write(0xff);
limr 0:76c6ddb1425b 27 wait_us(10);
limr 0:76c6ddb1425b 28 cs = 1;
limr 0:76c6ddb1425b 29 return temp;
limr 0:76c6ddb1425b 30 }
limr 0:76c6ddb1425b 31
limr 0:76c6ddb1425b 32 void LIS3DH_SPI_WR(uint8_t addr,uint8_t wrdata)
limr 0:76c6ddb1425b 33 {
limr 0:76c6ddb1425b 34 cs = 0;
limr 0:76c6ddb1425b 35 wait_us(10);
limr 0:76c6ddb1425b 36 spi_master.write(addr);
limr 0:76c6ddb1425b 37 spi_master.write(wrdata);
limr 0:76c6ddb1425b 38 wait_us(10);
limr 0:76c6ddb1425b 39 cs = 1;
limr 0:76c6ddb1425b 40 }
limr 0:76c6ddb1425b 41
limr 0:76c6ddb1425b 42 void SPI_LIS3DH_Init()//启动函数
limr 0:76c6ddb1425b 43 {
limr 0:76c6ddb1425b 44 spi_master.format(8,3);
limr 0:76c6ddb1425b 45 spi_master.frequency(100000);
limr 0:76c6ddb1425b 46 wait_ms(5);
limr 0:76c6ddb1425b 47 LIS3DH_SPI_WR(0x24,0x80);
limr 0:76c6ddb1425b 48 wait_ms(5);
limr 0:76c6ddb1425b 49 LIS3DH_SPI_WR(0x20,0x17);
limr 0:76c6ddb1425b 50 LIS3DH_SPI_WR(0x23,0x80);
limr 0:76c6ddb1425b 51 }
limr 0:76c6ddb1425b 52
limr 0:76c6ddb1425b 53 void get_val(void)//得到加速度函数
limr 0:76c6ddb1425b 54 {
limr 0:76c6ddb1425b 55 uint8_t Dx_L=1,Dy_L=1,Dz_L=1;
limr 0:76c6ddb1425b 56 uint8_t Dx_H=1,Dy_H=1,Dz_H=1;
limr 0:76c6ddb1425b 57 if(LIS3DH_SPI_RD(0x0f|0x80)==0x33)
limr 0:76c6ddb1425b 58 {
limr 0:76c6ddb1425b 59 printf("check device ok!\r\n");
limr 0:76c6ddb1425b 60 flag=1;
limr 0:76c6ddb1425b 61 Dx_H=LIS3DH_SPI_RD(0x29|0x80);
limr 0:76c6ddb1425b 62 Dx_L=LIS3DH_SPI_RD(0x28|0x80);
limr 0:76c6ddb1425b 63 Dy_H=LIS3DH_SPI_RD(0x2b|0x80);
limr 0:76c6ddb1425b 64 Dy_L=LIS3DH_SPI_RD(0x2A|0x80);
limr 0:76c6ddb1425b 65 Dz_H=LIS3DH_SPI_RD(0x2d|0x80);
limr 0:76c6ddb1425b 66 Dz_L=LIS3DH_SPI_RD(0x2C|0x80);
limr 0:76c6ddb1425b 67 }
limr 0:76c6ddb1425b 68 else
limr 0:76c6ddb1425b 69 {
limr 0:76c6ddb1425b 70 printf("check device err!\r\n");
limr 0:76c6ddb1425b 71 wait(1);
limr 0:76c6ddb1425b 72 }
limr 0:76c6ddb1425b 73 x_a=Dx_H<<8|Dx_L/16;
limr 0:76c6ddb1425b 74 y_a=Dy_H<<8|Dy_L/16;
limr 0:76c6ddb1425b 75 z_a=Dz_H<<8|Dz_L/16;
limr 0:76c6ddb1425b 76 }
limr 0:76c6ddb1425b 77 void buzzerini(void)
limr 0:76c6ddb1425b 78 {
limr 1:32df8ff2011e 79 for (int i=0;i<=11;i++)
limr 1:32df8ff2011e 80 {
limr 0:76c6ddb1425b 81 buzzer.period(1/(2*frequency[i])); // 设置PWM周期
limr 0:76c6ddb1425b 82 buzzer=0.5; // 设置占空比
limr 0:76c6ddb1425b 83 wait(0.4*beat[i]); // 保持节拍周期
limr 1:32df8ff2011e 84 }
limr 0:76c6ddb1425b 85 }
limr 0:76c6ddb1425b 86 void sit_judgement()
limr 0:76c6ddb1425b 87 { int flag=0;
limr 0:76c6ddb1425b 88 clock_t start,end;
limr 0:76c6ddb1425b 89 start=clock();
limr 0:76c6ddb1425b 90 get_val();
limr 1:32df8ff2011e 91 while(y_a<=UPA)
limr 0:76c6ddb1425b 92 { get_val();
limr 0:76c6ddb1425b 93 end=clock();
limr 1:32df8ff2011e 94 if(((double)end-start)/CLK_TCK>20)//坐了20s
limr 0:76c6ddb1425b 95 { flag=1;
limr 0:76c6ddb1425b 96 break;
limr 0:76c6ddb1425b 97 }
limr 0:76c6ddb1425b 98 }
limr 0:76c6ddb1425b 99 while(flag)
limr 0:76c6ddb1425b 100 { buzzerini();
limr 0:76c6ddb1425b 101 get_val();
limr 1:32df8ff2011e 102 if(y_a>UPA)
limr 1:32df8ff2011e 103 {
limr 1:32df8ff2011e 104 buzzer.period_us(0);
limr 1:32df8ff2011e 105 break;}
limr 1:32df8ff2011e 106
limr 0:76c6ddb1425b 107 }
limr 0:76c6ddb1425b 108 }
limr 0:76c6ddb1425b 109
limr 0:76c6ddb1425b 110
limr 0:76c6ddb1425b 111
limr 0:76c6ddb1425b 112
limr 0:76c6ddb1425b 113 int main(void)
limr 0:76c6ddb1425b 114 {
limr 0:76c6ddb1425b 115 SPI_LIS3DH_Init();
limr 0:76c6ddb1425b 116 while(1)
limr 0:76c6ddb1425b 117 {
limr 0:76c6ddb1425b 118 sit_judgement();
limr 0:76c6ddb1425b 119 if(flag)
limr 0:76c6ddb1425b 120 {
limr 0:76c6ddb1425b 121 flag=0;
limr 1:32df8ff2011e 122 wait(20);//等站起来后读取判断周期变长
limr 0:76c6ddb1425b 123 }
limr 0:76c6ddb1425b 124 }
limr 0:76c6ddb1425b 125 }