【花雕学编程】Arduino动手做(233)---ESP32-S3 UNO使用ADXL345_WE 库的活动/非活动中断功能

在这里插入图片描述

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十三:ESP32-S3 UNO开发板 双核16M+8M+Wi-Fi+蓝牙5.0+36个GPIO

偶然发现了这块ESP32-S3 UNO(N16R8)开发板,与Arduino UNO的外观设计规格是一样的。

在这里插入图片描述
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 开发环境中轻松编程和使用。该板的高级功能,包括对多种通信协议的支持和高处理能力,使其成为专业工程师和开发人员的理想工具。

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

实验开源代码

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

#include<Wire.h>
#include<ADXL345_WE.h>

#define ADXL345_I2CADDR 0x53 // 如果 SDO = HIGH,则为 0x1D
const int int2Pin = 2;
volatile bool in_activity = false; // 活动或不活动中断发生

/* 有几种方法可以创建您的 ADXL345 对象:
   ADXL345_WE myAcc = ADXL345_WE()                -> uses Wire / I2C Address = 0x53
   ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR
   ADXL345_WE myAcc = ADXL345_WE(&wire2)          -> uses the TwoWire object wire2 / ADXL345_I2CADDR
   ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together
*/

ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);

void setup() {
  Serial.begin(115200);  // 初始化串口通信,波特率为115200
  Wire.begin(4, 5);  // 初始化I2C总线,设置SDA为GPIO4,SCL为GPIO5
  pinMode(int2Pin, INPUT);
  Serial.println("ADXL345 - 活动和不活动中断");
  Serial.println();
  if (!myAcc.init()) {
    Serial.println("ADXL345 未连接!");
  }

  /* 插入来自 ADXL345_calibration.ino 的数据并取消注释以获得更精确的结果*/
  // myAcc.setCorrFactors(-266.0, 285.0, -268.0, 278.0, -291.0, 214.0);

  /* Choose the data rate         Hz
      ADXL345_DATA_RATE_3200    3200
      ADXL345_DATA_RATE_1600    1600
      ADXL345_DATA_RATE_800      800
      ADXL345_DATA_RATE_400      400
      ADXL345_DATA_RATE_200      200
      ADXL345_DATA_RATE_100      100
      ADXL345_DATA_RATE_50        50
      ADXL345_DATA_RATE_25        25
      ADXL345_DATA_RATE_12_5      12.5
      ADXL345_DATA_RATE_6_25       6.25
      ADXL345_DATA_RATE_3_13       3.13
      ADXL345_DATA_RATE_1_56       1.56
      ADXL345_DATA_RATE_0_78       0.78
      ADXL345_DATA_RATE_0_39       0.39
      ADXL345_DATA_RATE_0_20       0.20
      ADXL345_DATA_RATE_0_10       0.10
  */
  myAcc.setDataRate(ADXL345_DATA_RATE_25);
  Serial.print("数据速率:");
  Serial.print(myAcc.getDataRateAsString());

  /* 选择测量范围
      ADXL345_RANGE_16G    16g
      ADXL345_RANGE_8G      8g
      ADXL345_RANGE_4G      4g
      ADXL345_RANGE_2G      2g
  */
  myAcc.setRange(ADXL345_RANGE_4G);
  Serial.print(" /g 范围: ");
  Serial.println(myAcc.getRangeAsString());
  Serial.println();

  attachInterrupt(digitalPinToInterrupt(int2Pin), in_activityISR, RISING);

  /* 必须为活动设置三个参数:
      1.直流/交流模式:
          ADXL345_DC_MODE - 阈值是定义的(参数 3)
          ADXL345_AC_MODE - 阈值 = 启动加速度 + 定义的阈值
     2. 轴,考虑:
          ADXL345_000  -  没有轴(没有意义)
          ADXL345_00Z  -  z
          ADXL345_0Y0  -  y
          ADXL345_0YZ  -  y,z
          ADXL345_X00  -  x
          ADXL345_X0Z  -  x,z
          ADXL345_XY0  -  x,y
          ADXL345_XYZ  -  所有轴
     3. 以 g 为单位的阈值
  */

  myAcc.setActivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 0.5);

  /* 在活动中必须设置四个参数:
    1.直流/交流模式:
        见活动参数
    2. 轴,考虑:
        见活动参数
    3. 以 g 为单位的阈值
    4. 以秒为单位的不活动时间阈值(最大 255)
  */

  myAcc.setInactivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 0.5, 10.0);

  /* 仅当同时使用活动和不活动时,设置链接位才有意义
    如果未设置链接位:
    - 活动中断可以随时多次触发
    - 如果不活动参数可以触发不活动。满足,独立于活动参数。 (如果使用)
    如果设置了链接位:
    - 活动中断只能在非活动中断后触发
    - 在下一个非活动中断发生之前,只能触发一个活动中断
  */
  // myAcc.setLinkBit(true);

  /* 你可以选择以下中断:
     变量名:触发,如果:
    ADXL345_OVERRUN - 新数据替换未读数据
    ADXL345_WATERMARK - FIFO 中的样本数量等于 FIFO_CTL 中定义的数量
    ADXL345_FREEFALL - 所有轴的加速度值都低于 THRESH_FF 中定义的阈值
    ADXL345_INACTIVITY - 符合。所有包含轴的值是 < THRESH_INACT for period > TIME_INACT
    ADXL345_ACTIVITY - 符合。包含轴的值 > THRESH_ACT
    ADXL345_DOUBLE_TAP - 在一个(包括)上检测到双击。轴和各种定义的条件得到满足
    ADXL345_SINGLE_TAP - 在一个上检测到单击,包括。轴和各种定义的条件得到满足
    ADXL345_DATA_READY - 新数据可用

    将中断分配给 INT1 (INT_PIN_1) 或 INT2 (INT_PIN_2)。数据就绪,溢出
    始终启用。您只能更改这些默认情况下为 INT1 的分配。

    您可以使用 deleteInterrupt(type) 删除中断;
  */

  myAcc.setInterrupt(ADXL345_ACTIVITY, INT_PIN_2);
  myAcc.setInterrupt(ADXL345_INACTIVITY, INT_PIN_2);

}

/*  在主循环中进行了一些检查:
    getActTapStatus() 以字节形式返回负责活动中断的轴(库中的代码)
    getActTapStatusAsString() 以字符串形式返回导致中断的轴
    readAndClearInterrupts(); 将中断类型返回为字节(库中的代码)
    checkInterrupt(intSource, type) 如果 intSource 的类型为 bool,则返回
*/

void loop() {
  if ((millis() % 1000) == 1) {
    xyzFloat g = myAcc.getGValues();
    Serial.print("g-x   = ");
    Serial.print(g.x);
    Serial.print("  |  g-y   = ");
    Serial.print(g.y);
    Serial.print("  |  g-z   = ");
    Serial.println(g.z);
  }

  if (in_activity == true) {
    //byte actTapSource = myAcc.getActTapStatus();
    //Serial.println(actTapSource, BIN);
    String axes = myAcc.getActTapStatusAsString();
    byte intSource = myAcc.readAndClearInterrupts();
    if (myAcc.checkInterrupt(intSource, ADXL345_ACTIVITY)) {
      Serial.print("活动在: ");
      Serial.println(axes);
    }

    if (myAcc.checkInterrupt(intSource, ADXL345_INACTIVITY)) {
      Serial.println("不活动!");
    }

    delay(500);
    myAcc.readAndClearInterrupts();
    in_activity = false;
  }
}

void in_activityISR() {
  in_activity = true;
}

实验串口返回情况

在这里插入图片描述
在这里插入图片描述
实验场景图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值