171浏览
查看: 171|回复: 4

[项目] 【花雕学编程】Arduino动手做(233)---ADXL345 非活动中断

[复制链接]
【花雕学编程】Arduino动手做(233)---ADXL345 非活动中断图1

ESP32-S3 UNO 开发板是基于 ESP32-S3-WROOM-1-N16R8 微控制器的扩展板,基于 Arduino 开发板架构。凭借 2.4GHz Wi-Fi 和集成蓝牙 5.0 等高级功能,它为开发各种项目提供了一个强大的平台。ESP32-S3 UNO 配备 16MB 闪存和 8MB RAM,特别适用于物联网 (IoT)、机器人和其他工程项目的复杂应用。该开发板支持 Python 和 C 等流行的编程语言,可以在 Arduino IDE 开发环境中轻松编程和使用。该板的高级功能,包括对多种通信协议的支持和高处理能力,使其成为专业工程师和开发人员的理想工具。

【花雕学编程】Arduino动手做(233)---ADXL345 非活动中断图2

驴友花雕  中级技神
 楼主|

发表于 2024-10-6 06:04:31

【花雕学编程】Arduino动手做(233)---ADXL345 非活动中断

本帖最后由 驴友花雕 于 2024-10-6 06:07 编辑

  ADXL345是一款由Analog Devices公司推出的三轴数字加速度计,具有高分辨率和低功耗的特点,非常适合移动设备和其他需要精确加速度测量的应用。以下是对ADXL345三轴模块的详细介绍:
1、主要特点
高分辨率:ADXL345能够提供高达13位的分辨率,能够测量高达±16g的加速度1。
低功耗:在测量模式下,功耗低至23 μA,在待机模式下功耗仅为0.1 μA1。
多种测量范围:用户可以选择±2g、±4g、±8g或±16g的测量范围,适应不同的应用需求1。
数字接口:支持SPI(3线或4线)和I2C数字接口,方便与各种微控制器进行通信1。
内置功能:具有活动/非活动检测、单击/双击检测、自由落体检测等多种功能,可以独立映射到两个中断输出引脚1。

2、应用场景
移动设备:用于检测设备的倾斜、运动和冲击。
医疗仪器:用于监测患者的运动状态。
游戏和定点设备:用于检测用户的动作和姿态。
工业仪器仪表:用于监测机器的振动和运动状态。
个人导航设备:用于检测设备的方向和运动。

3、引脚功能
ADXL345模块通常有以下引脚:
VCC:电源引脚,连接到2.0V至3.6V的电源。
GND:地引脚。
SDA/SDI/SDIO:数据输入/输出引脚,用于I2C或SPI通信。
SCL/SCLK:时钟引脚,用于I2C或SPI通信。
CS:片选引脚,用于SPI通信。
INT1/INT2:中断引脚,用于输出检测到的事件。

4、使用步骤
连接电源和地:将VCC引脚连接到电源,GND引脚连接到地。
选择通信接口:根据需要选择I2C或SPI接口,并连接相应的引脚。
初始化传感器:在代码中初始化ADXL345传感器,设置测量范围和其他参数。
读取数据:通过I2C或SPI接口读取加速度数据,并进行处理。
ADXL345是一款功能强大且易于使用的三轴加速度计,适用于各种需要精确加速度测量的应用。

【花雕学编程】Arduino动手做(233)---ADXL345 非活动中断图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-10-6 06:10:01

【花雕学编程】Arduino动手做(233)---ADXL345 非活动中断

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百三十三:ESP32-S3 UNO开发板 双核16M+8M+Wi-Fi+蓝牙5.0+45个GPIO
  {花雕动手做}项目之十一:测试ESP32-S3 UNO使用ADXL345_WE 库的活动/非活动中断功能

实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百三十三:ESP32-S3 UNO开发板 双核16M+8M+Wi-Fi+蓝牙5.0+45个GPIO
  4.   {花雕动手做}项目之十一:ESP32-S3 UNO使用ADXL345_WE 库的活动/非活动中断功能
  5. */
  6. #include<Wire.h>
  7. #include<ADXL345_WE.h>
  8. #define ADXL345_I2CADDR 0x53 // 如果 SDO = HIGH,则为 0x1D
  9. const int int2Pin = 2;
  10. volatile bool in_activity = false; // 活动或不活动中断发生
  11. /* 有几种方法可以创建您的 ADXL345 对象:
  12.    ADXL345_WE myAcc = ADXL345_WE()                -> uses Wire / I2C Address = 0x53
  13.    ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR
  14.    ADXL345_WE myAcc = ADXL345_WE(&wire2)          -> uses the TwoWire object wire2 / ADXL345_I2CADDR
  15.    ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together
  16. */
  17. ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);
  18. void setup() {
  19.   Serial.begin(115200);  // 初始化串口通信,波特率为115200
  20.   Wire.begin(4, 5);  // 初始化I2C总线,设置SDA为GPIO4,SCL为GPIO5
  21.   pinMode(int2Pin, INPUT);
  22.   Serial.println("ADXL345 - 活动和不活动中断");
  23.   Serial.println();
  24.   if (!myAcc.init()) {
  25.     Serial.println("ADXL345 未连接!");
  26.   }
  27.   /* 插入来自 ADXL345_calibration.ino 的数据并取消注释以获得更精确的结果*/
  28.   // myAcc.setCorrFactors(-266.0, 285.0, -268.0, 278.0, -291.0, 214.0);
  29.   /* Choose the data rate         Hz
  30.       ADXL345_DATA_RATE_3200    3200
  31.       ADXL345_DATA_RATE_1600    1600
  32.       ADXL345_DATA_RATE_800      800
  33.       ADXL345_DATA_RATE_400      400
  34.       ADXL345_DATA_RATE_200      200
  35.       ADXL345_DATA_RATE_100      100
  36.       ADXL345_DATA_RATE_50        50
  37.       ADXL345_DATA_RATE_25        25
  38.       ADXL345_DATA_RATE_12_5      12.5
  39.       ADXL345_DATA_RATE_6_25       6.25
  40.       ADXL345_DATA_RATE_3_13       3.13
  41.       ADXL345_DATA_RATE_1_56       1.56
  42.       ADXL345_DATA_RATE_0_78       0.78
  43.       ADXL345_DATA_RATE_0_39       0.39
  44.       ADXL345_DATA_RATE_0_20       0.20
  45.       ADXL345_DATA_RATE_0_10       0.10
  46.   */
  47.   myAcc.setDataRate(ADXL345_DATA_RATE_25);
  48.   Serial.print("数据速率:");
  49.   Serial.print(myAcc.getDataRateAsString());
  50.   /* 选择测量范围
  51.       ADXL345_RANGE_16G    16g
  52.       ADXL345_RANGE_8G      8g
  53.       ADXL345_RANGE_4G      4g
  54.       ADXL345_RANGE_2G      2g
  55.   */
  56.   myAcc.setRange(ADXL345_RANGE_4G);
  57.   Serial.print(" /g 范围: ");
  58.   Serial.println(myAcc.getRangeAsString());
  59.   Serial.println();
  60.   attachInterrupt(digitalPinToInterrupt(int2Pin), in_activityISR, RISING);
  61.   /* 必须为活动设置三个参数:
  62.       1.直流/交流模式:
  63.           ADXL345_DC_MODE - 阈值是定义的(参数 3)
  64.           ADXL345_AC_MODE - 阈值 = 启动加速度 + 定义的阈值
  65.      2. 轴,考虑:
  66.           ADXL345_000  -  没有轴(没有意义)
  67.           ADXL345_00Z  -  z
  68.           ADXL345_0Y0  -  y
  69.           ADXL345_0YZ  -  y,z
  70.           ADXL345_X00  -  x
  71.           ADXL345_X0Z  -  x,z
  72.           ADXL345_XY0  -  x,y
  73.           ADXL345_XYZ  -  所有轴
  74.      3. 以 g 为单位的阈值
  75.   */
  76.   myAcc.setActivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 0.5);
  77.   /* 在活动中必须设置四个参数:
  78.     1.直流/交流模式:
  79.         见活动参数
  80.     2. 轴,考虑:
  81.         见活动参数
  82.     3. 以 g 为单位的阈值
  83.     4. 以秒为单位的不活动时间阈值(最大 255)
  84.   */
  85.   myAcc.setInactivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 0.5, 10.0);
  86.   /* 仅当同时使用活动和不活动时,设置链接位才有意义
  87.     如果未设置链接位:
  88.     - 活动中断可以随时多次触发
  89.     - 如果不活动参数可以触发不活动。满足,独立于活动参数。 (如果使用)
  90.     如果设置了链接位:
  91.     - 活动中断只能在非活动中断后触发
  92.     - 在下一个非活动中断发生之前,只能触发一个活动中断
  93.   */
  94.   // myAcc.setLinkBit(true);
  95.   /* 你可以选择以下中断:
  96.      变量名:触发,如果:
  97.     ADXL345_OVERRUN - 新数据替换未读数据
  98.     ADXL345_WATERMARK - FIFO 中的样本数量等于 FIFO_CTL 中定义的数量
  99.     ADXL345_FREEFALL - 所有轴的加速度值都低于 THRESH_FF 中定义的阈值
  100.     ADXL345_INACTIVITY - 符合。所有包含轴的值是 < THRESH_INACT for period > TIME_INACT
  101.     ADXL345_ACTIVITY - 符合。包含轴的值 > THRESH_ACT
  102.     ADXL345_DOUBLE_TAP - 在一个(包括)上检测到双击。轴和各种定义的条件得到满足
  103.     ADXL345_SINGLE_TAP - 在一个上检测到单击,包括。轴和各种定义的条件得到满足
  104.     ADXL345_DATA_READY - 新数据可用
  105.     将中断分配给 INT1 (INT_PIN_1) 或 INT2 (INT_PIN_2)。数据就绪,溢出
  106.     始终启用。您只能更改这些默认情况下为 INT1 的分配。
  107.     您可以使用 deleteInterrupt(type) 删除中断;
  108.   */
  109.   myAcc.setInterrupt(ADXL345_ACTIVITY, INT_PIN_2);
  110.   myAcc.setInterrupt(ADXL345_INACTIVITY, INT_PIN_2);
  111. }
  112. /*  在主循环中进行了一些检查:
  113.     getActTapStatus() 以字节形式返回负责活动中断的轴(库中的代码)
  114.     getActTapStatusAsString() 以字符串形式返回导致中断的轴
  115.     readAndClearInterrupts(); 将中断类型返回为字节(库中的代码)
  116.     checkInterrupt(intSource, type) 如果 intSource 的类型为 bool,则返回
  117. */
  118. void loop() {
  119.   if ((millis() % 1000) == 1) {
  120.     xyzFloat g = myAcc.getGValues();
  121.     Serial.print("g-x   = ");
  122.     Serial.print(g.x);
  123.     Serial.print("  |  g-y   = ");
  124.     Serial.print(g.y);
  125.     Serial.print("  |  g-z   = ");
  126.     Serial.println(g.z);
  127.   }
  128.   if (in_activity == true) {
  129.     //byte actTapSource = myAcc.getActTapStatus();
  130.     //Serial.println(actTapSource, BIN);
  131.     String axes = myAcc.getActTapStatusAsString();
  132.     byte intSource = myAcc.readAndClearInterrupts();
  133.     if (myAcc.checkInterrupt(intSource, ADXL345_ACTIVITY)) {
  134.       Serial.print("活动在: ");
  135.       Serial.println(axes);
  136.     }
  137.     if (myAcc.checkInterrupt(intSource, ADXL345_INACTIVITY)) {
  138.       Serial.println("不活动!");
  139.     }
  140.     delay(500);
  141.     myAcc.readAndClearInterrupts();
  142.     in_activity = false;
  143.   }
  144. }
  145. void in_activityISR() {
  146.   in_activity = true;
  147. }
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-10-6 06:58:27

【花雕学编程】Arduino动手做(233)---ADXL345 非活动中断

实验串口返回情况

【花雕学编程】Arduino动手做(233)---ADXL345 非活动中断图1

【花雕学编程】Arduino动手做(233)---ADXL345 非活动中断图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-10-6 07:11:40

【花雕学编程】Arduino动手做(233)---ADXL345 非活动中断

实验场景图

【花雕学编程】Arduino动手做(233)---ADXL345 非活动中断图1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail