【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;
- }
复制代码
|