零知开源模块应用-ADXL345三轴加速度传感器使用

ADXL345是一种很常用的加速度传感器,本次讲解在零知平台上进行加速度和单双击检测功能使用演示。

一、接线

接线很简单,只需要把模块的SCL、SDA引脚与零知标准板的I2C(A5、A4)引脚相连接即可,可以供电3.3v即可,其他引脚采用模块默认的连接。

二、代码

该应用代码演示了三个轴向的加速度和单击、双击检测的功能:


							
   /*
   *        ADXL345 三轴加速度传感器DEMO
   *        powered by 零知实验室-[url=http://www.lingzhilab.com]www.lingzhilab.com[/url]
   */
   #include "ADXL345.h"
    
   // 默认的I2C地址为0x53
    
   ADXL345 accel;
    
   int16_t ax, ay, az;//原始值
   float nx,ny,nz;//重力加速度
    
   #define LED_PIN LED_BUILTIN
   bool blinkState = false;
    
   //检测单击、双击动作参数设置
   void checkActivitySetup()
   {
           accel.setTapAxisXEnabled(false);//设置X轴方向敲击检测
           accel.setTapAxisYEnabled(false);//y轴方向检测
           accel.setTapAxisZEnabled(true);
            
           accel.setTapThreshold(40);//界限设置:40*0.0625 = 2.5g
           accel.setTapDuration(32);//持续时间:32*0.625ms = 20 ms
           accel.setDoubleTapLatency(80);//延迟:80*1.25ms = 100ms
           accel.setDoubleTapWindow(240);//窗口:240*1.25ms = 300ms
          
   }
    
   void checkActivity()
   {
           Activites act = accel.readActivites();
    
     if (act.isDoubleTap)
     {
       Serial.println("Double Tap Detected");
     } else if (act.isTap)
     {
       Serial.println("Tap Detected");
     }else
     {
            Serial.println("no activity");
     }
   }
    
   void setup() {
        
       Serial.begin(9600);
    
       // 初始化ADXL345
       Serial.println("Initializing I2C devices...");
       accel.initialize();
    
       // 检测是否连接ADXL345
       Serial.println("Testing device connections...");
           if(accel.testConnection()){
                   Serial.println("ADXL345 connection successful");
           }else{
                   Serial.println("ADXL345 connection failed");
           }
            
            // Set measurement range
     // +/-  2G: ADXL345_RANGE_2G
     // +/-  4G: ADXL345_RANGE_4G
     // +/-  8G: ADXL345_RANGE_8G
     // +/- 16G: ADXL345_RANGE_16G
     accel.setRange(ADXL345_RANGE_16G);
            
           checkActivitySetup();//开启单击、双击动作检测
        
       // 用LED指示数据读取
       pinMode(LED_PIN, OUTPUT);
   }
    
   void loop() {
   #if 0        
           // 获取原始的X,Y,Z三轴的数据
       accel.getAcceleration(&ax, &ay, &az);
    
       // 显示 x/y/z 原始数值
       Serial.print("accel:\t");
       Serial.print(ax); Serial.print("\t");
       Serial.print(ay); Serial.print("\t");
       Serial.println(az);
            
   #endif
   #if 1
           //获取重力转换后的加速度数值
           accel.readNormalize(&nx,&ny,&nz);
            
           //使用低通滤波进行处理,以去除尖峰的不准确结果
           float fx, fy, fz;
           //系数范围 0.1~0.9
   //        accel.lowPassFilter(nx,ny,nz,&fx,&fy,&fz,0.5);
            
           Serial.print("gravity:\t");
       Serial.print(nx); Serial.print("\t");
       Serial.print(ny); Serial.print("\t");
       Serial.println(nz);
   //        
   //        Serial.print("filter:\t");
   //    Serial.print(fx); Serial.print("\t");
   //    Serial.print(fy); Serial.print("\t");
   //    Serial.println(fz);
   #endif
   #if 1
           checkActivity();//单双击动作检测
   #endif
    
       // 闪烁LED
       blinkState = !blinkState;
       digitalWrite(LED_PIN, blinkState);
            
           delay(300);
   }
						
						

这里在设置参数时候可以设置上面推荐的数值,如果自己需要就需要根据Datasheet中的说明进行修改。

三、工程

完整的工程文件包括使用到的库请下载:


ADXL345-DEMO1.zip(点击下载)