ESP8266-Arduino编程实例-MMA8451加速度计驱动

MMA8451加速度计驱动

1、MMA8451介绍

MMA8451 是一款具有 14 位分辨率的低功耗加速度计,具有灵活用户可编程选项的嵌入式功能,可配置为两个中断引脚。嵌入式中断功能可实现整体节能,从而使主机处理器免于连续轮询数据访问低通滤波数据和高通滤波数据,最大限度地减少颠簸检测和更快转换所需的数据分析。来自可配置嵌入式功能的任意组合的惯性唤醒中断信号允许 MMA8451Q 监控事件并在不活动期间保持低功耗模式。
在这里插入图片描述

其特性如下:

  • 1.95 至 3.6 伏电源电压
  • 1.6 至 3.6 伏接口电压
  • ±2g/±4g/±8g 动态可选满量程
  • 输出数据速率 (ODR) 从 1.56 Hz 到 800 Hz
  • 99 μg/√Hz 噪声
  • 14位和8位数字输出
  • I²C 数字输出接口(工作频率为 2.25 MHz,带 4.7 kΩ 上拉电阻)
  • 两个可编程中断引脚,用于七个中断源
  • 三个嵌入式运动检测通道
    • 自由落体或运动检测:一个通道
    • 脉冲检测:一个通道
    • 震动检测:一个通道
  • 具有可编程滞后的方向(纵向/横向)检测
  • 自动唤醒和返回睡眠的自动 ODR 更改
  • 32个样本先进先出
  • 每个样本和通过 FIFO 可用的高通滤波器数据
  • 自我测试

2、硬件准备

  • ESP8266 NodeMCU开发板一块
  • MMA8451传感器模块一个
  • 面板板一个
  • 杜邦线若干
  • 数据线一条

硬件接线如下:

在这里插入图片描述

3、软件准备

  • Arduino IDE或VSCode + PlatformIO

在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:

ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:

4、代码实现

本次实例使用MMX8451驱动库如下:

1)导入依赖库头文件

1
2
3
4
5
6
7
#include <Wire.h>
#include "Adafruit\_MMA8451.h"
#include <Adafruit\_Sensor.h>

// 创建MM8451设备对象
Adafruit_MMA8451 mma = Adafruit\_MMA8451();

2)设备初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void setup(void) {
// 串口初始化
Serial.begin(9600);

Serial.println("Adafruit MMA8451 test!");

// MMA8451
if (! mma.begin()) {
Serial.println("Couldnt start");
while (1);
}
Serial.println("MMA8451 found!");
// 设置重力参数
mma.setRange(MMA8451_RANGE_2_G);

Serial.print("Range = "); Serial.print(2 << mma.getRange());
Serial.println("G");
}

3)数据采集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
void loop() {
// 读取传感器数据
mma.read();
Serial.print("X:\t"); Serial.print(mma.x);
Serial.print("\tY:\t"); Serial.print(mma.y);
Serial.print("\tZ:\t"); Serial.print(mma.z);
Serial.println();

// 获取传感器最新事件
sensors\_event\_t event;
mma.getEvent(&event);

// 显示加速度数据
Serial.print("X: \t"); Serial.print(event.acceleration.x); Serial.print("\t");
Serial.print("Y: \t"); Serial.print(event.acceleration.y); Serial.print("\t");
Serial.print("Z: \t"); Serial.print(event.acceleration.z); Serial.print("\t");
Serial.println("m/s^2 ");

// 获取方向
uint8\_t o = mma.getOrientation();

switch (o) {
case MMA8451_PL_PUF:
Serial.println("Portrait Up Front");
break;
case MMA8451_PL_PUB:
Serial.println("Portrait Up Back");
break;
case MMA8451_PL_PDF:
Serial.println("Portrait Down Front");
break;
case MMA8451_PL_PDB:
Serial.println("Portrait Down Back");
break;
case MMA8451_PL_LRF:
Serial.println("Landscape Right Front");
break;
case MMA8451_PL_LRB:
Serial.println("Landscape Right Back");
break;
case MMA8451_PL_LLF:
Serial.println("Landscape Left Front");
break;
case MMA8451_PL_LLB:
Serial.println("Landscape Left Back");
break;
}
Serial.println();
delay(500);

}

文章来源: https://iotsmart.blog.csdn.net/article/details/126206160