![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
久坐警报器
main.cpp
- Committer:
- limr
- Date:
- 2016-05-22
- Revision:
- 3:c3f198cd0624
- Parent:
- 2:6a50d967a71a
File content as of revision 3:c3f198cd0624:
#include "mbed.h" #include"time.h" #include"math.h" #define UPA1 10000//坐时最大加速度值 #define UPA2 10000 #define UPA3 10000 uint16_t x_a,y_a,z_a,all_a; bool flag = 0; SPI spi_master(P0_6,P0_5,P0_7); //mosi miso sclk DigitalOut cs(P0_4); //Serial pc(P0_23,P0_25); Serial pc(P0_9,P0_11); PwmOut buzzer(p22);//buzzer float frequency[]={659,554,659,554,440,494,554,587,494,659,554,440}; float beat[]={1,1,1,1,1,0.5,0.5,1,1,1,1,2}; //节拍数组 uint8_t LIS3DH_SPI_RD(uint8_t addr) { uint8_t temp; cs = 0; wait_us(10); spi_master.write(addr); temp=spi_master.write(0xff); wait_us(10); cs = 1; return temp; } void LIS3DH_SPI_WR(uint8_t addr,uint8_t wrdata) { cs = 0; wait_us(10); spi_master.write(addr); spi_master.write(wrdata); wait_us(10); cs = 1; } void SPI_LIS3DH_Init()//启动函数 { spi_master.format(8,3); spi_master.frequency(100000); wait_ms(5); LIS3DH_SPI_WR(0x24,0x80); wait_ms(5); LIS3DH_SPI_WR(0x20,0x17); LIS3DH_SPI_WR(0x23,0x80); } void get_val(void)//得到加速度函数 { uint8_t Dx_L=1,Dy_L=1,Dz_L=1; uint8_t Dx_H=1,Dy_H=1,Dz_H=1; if(LIS3DH_SPI_RD(0x0f|0x80)==0x33) { printf("check device ok!\r\n"); flag=1; Dx_H=LIS3DH_SPI_RD(0x29|0x80); Dx_L=LIS3DH_SPI_RD(0x28|0x80); Dy_H=LIS3DH_SPI_RD(0x2b|0x80); Dy_L=LIS3DH_SPI_RD(0x2A|0x80); Dz_H=LIS3DH_SPI_RD(0x2d|0x80); Dz_L=LIS3DH_SPI_RD(0x2C|0x80); } else { printf("check device err!\r\n"); wait(1); } x_a=Dx_H<<8|Dx_L/16; y_a=Dy_H<<8|Dy_L/16; z_a=Dz_H<<8|Dz_L/16; } void buzzerini(void) { while(1){ for (int i=0;i<=11;i++) { buzzer.period(1/(2*frequency[i])); // 设置PWM周期 buzzer=0.5; // 设置占空比 wait(0.4*beat[i]); // 保持节拍周期 } get_val(); if(x_a>UPA3) { buzzer.period_us(0); break; } } } void calsample(void) { uint16_t sum; clock_t st,en; st=clock(); get_val(); while((double)((en=clock())-st)/CLK_TCK>100) { all_a=(uint16_t)sqrt((double)(x_a+y_a+z_a)); get_val(); sum+=all_a; wait(10); } } void sit_judgement() { int flag=1; clock_t start,end; start=clock(); calsample(); while(all_a<=UPA1)//T+的情况 { end=clock(); if((double)(end-start)/CLK_TCK>300)//坐了300s { flag=0; buzzerini(); break; } calsample(); } while(flag)//T-的情况 { calsample(); if(all_a<UPA2) { break; } wait(10); } } int main(void) { SPI_LIS3DH_Init(); while(1) { sit_judgement(); if(flag) { flag=0; wait(5);//等站起来后读取判断周期变长 } } }