驴友花雕
发表于 2022-5-25 14:43:58
(2)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十一:ADXL345 传感器控制红蓝绿三色LED灯
*/
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>//导入ADXL345驱动库
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified();
void setup(void) {
Serial.begin(9600);//串口初始化
Serial.println("ADXL345 传感器控制红蓝绿三色LED灯");
if (!accel.begin())
{
Serial.println("未检测到 ADXL345 传感器。");
while (1);
}
pinMode(7, OUTPUT); // 激活 LED 的输出模式
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
}
void loop(void) {
sensors_event_t event;
accel.getEvent(&event);
floatx = event.acceleration.x;
floaty = event.acceleration.y;
floatz = event.acceleration.z;
//串口打印X\Y\Z数值
Serial.print("X: "); Serial.print(x); Serial.print("");
Serial.print("Y: "); Serial.print(y); Serial.print("");
Serial.print("Z: "); Serial.print(z); Serial.print("");
Serial.println("m/s^2 ");
if (x < 5) { //它识别的条件
//轴的移动。
digitalWrite(7, HIGH);
}
else {
digitalWrite(7, LOW);
}
if (y < 5) {
digitalWrite(6, HIGH);
}
else {
digitalWrite(6, LOW);
}
if (z != -1) { //传感器倒置时标记 -1G
digitalWrite(5, HIGH);
}
else {
digitalWrite(5, LOW);
}
delay(1000);
}
驴友花雕
发表于 2022-5-25 14:45:29
(3)实验串口返回情况
驴友花雕
发表于 2022-5-25 14:47:32
(4)实验场景图
驴友花雕
发表于 2022-5-30 21:12:40
驴友花雕
发表于 2022-6-6 10:37:53
程序十二:校准ADXL345的指南(1)实验接线示意图
驴友花雕
发表于 2022-6-6 10:40:00
(2)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十二:校准ADXL345的指南
*/
#include<Wire.h>
#include<ADXL345_WE.h>
#define ADXL345_I2CADDR 0x53
/* 有几种方法可以创建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(){
Wire.begin();
Serial.begin(9600);
Serial.println("ADXL345校准程序准备就绪");
Serial.println();
if(!myAcc.init()){
Serial.println("ADXL345 未连接!");
}
Serial.println("校准程序:");
Serial.println(" - 保持全分辨率");
Serial.println(" - 电源电压有影响(至少对于模块)");
Serial.println(" ->选择您将在项目中使用的相同电压!");
Serial.println(" - 慢慢地转动你的 ADXL (!)找到最小和最大原始 x,y 和 z 值");
Serial.println(" - 一个或两个单位的偏差并不重要");
Serial.println(" - 校准改变 g 与原始的斜率,并假设零为 (最小值 + 最大值)/2 ");
Serial.println(" - 记下六个值 ");
Serial.println(" - 您可以尝试实验中得到的校准值");
Serial.println(" - 准备好了吗?然后键入任何密钥并发送。 ");
while(!Serial.available());
Serial.read();
Serial.println();
Serial.println();
Serial.println();
}
void loop() {
xyzFloat raw = myAcc.getRawValues();
Serial.print("Raw-x = ");
Serial.print(raw.x);
Serial.print("|Raw-y = ");
Serial.print(raw.y);
Serial.print("|Raw-z = ");
Serial.println(raw.z);
delay(1000);
}
驴友花雕
发表于 2022-6-6 10:41:22
(3)实验串口返回情况
驴友花雕
发表于 2022-6-6 10:43:45
(4)实验说明:见上图红点处,这里确定的六个值是:
X(最小值)=-295X(最大值)=255Y(最小值)=-283Y(最大值)=264Z(最小值)=-262Z(最大值)=265
驴友花雕
发表于 2022-6-8 11:47:59
程序十三:通过输入程序十二中获得的值来应用校准(导入实测的修正值)(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十三:通过输入程序十二中获得的值来应用校准(导入实测的修正值)
*/
#include<Wire.h>
#include<ADXL345_WE.h>
#define ADXL345_I2CADDR 0x53
/*有几种方法可以创建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() {
Wire.begin();
Serial.begin(9600);
Serial.println("ADXL345准备就绪!");
Serial.println();
if (!myAcc.init()) {
Serial.println("ADXL345 未连接!");
}
myAcc.setCorrFactors(-295.0, 255.0, -283.0, 264.0, -262.0, 265.0);
/* 在下一步中,角度偏移被校正,以获得相当精确的校正
x 和 y 的角度可达 ~60°。附加偏移校正仅用于
校正角度测量。该过程仅确保从0°开始。
*/
Serial.println("将ADXL345平放,不要移动它");
delay(2000);
myAcc.measureAngleOffsets();
Serial.println("....完成");
myAcc.setDataRate(ADXL345_DATA_RATE_25);
myAcc.setRange(ADXL345_RANGE_2G);
}
void loop() {
xyzFloat raw = myAcc.getRawValues();
xyzFloat g = myAcc.getGValues();
xyzFloat angle = myAcc.getAngles();
xyzFloat corrAngles = myAcc.getCorrAngles();
/* 仍然是未更正的原始值!!*/
Serial.print("Raw-x = ");
Serial.print(raw.x);
Serial.print("|Raw-y = ");
Serial.print(raw.y);
Serial.print("|Raw-z = ");
Serial.println(raw.z);
/* g 值使用校正后的原始数据 */
Serial.print("g-x = ");
Serial.print(g.x);
Serial.print("|g-y = ");
Serial.print(g.y);
Serial.print("|g-z = ");
Serial.println(g.z);
/* 角度使用校正后的 Raw。角度由以下公式简单计算
角度 = 弧度(g 值) */
Serial.print("角度 x= ");
Serial.print(angle.x);
Serial.print("|角度 y= ");
Serial.print(angle.y);
Serial.print("|角度 z= ");
Serial.println(angle.z);
/* 校正后的角度使用校正的原始数据和额外的角度
偏移以确保它们从 0° 开始
*/
Serial.print("校正角 x = ");
Serial.print(corrAngles.x);
Serial.print("|校正角 y = ");
Serial.print(corrAngles.y);
Serial.print("|校正角 z = ");
Serial.println(corrAngles.z);
Serial.print("模块的方向: ");
Serial.println(myAcc.getOrientationAsString());
Serial.println();
delay(1000);
}
驴友花雕
发表于 2022-6-8 11:50:54
(2)实验串口返回情况
(3)实验说明可以看到,z 轴的校正 g 值现在看起来要好得多。由于剩余的偏移,角度具有一定的偏差。另一方面,校正的角度(“校正角cAngles”)波动接近于零。
驴友花雕
发表于 2022-6-9 06:36:02
程序十四:测量 ADXL345 的俯仰角和滚动角与校正角度法的对比(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十四:测量 ADXL345 的俯仰角和滚动角与校正角度法的对比
*/
#include<Wire.h>
#include<ADXL345_WE.h>
#define ADXL345_I2CADDR 0x53 // 如果 SDO = HIGH,则为 0x1D
/* 有几种方法可以创建您的 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() {
Wire.begin();
Serial.begin(9600);
Serial.println("ADXL345 程序 - 俯仰和横滚与校正角度");
Serial.println();
if (!myAcc.init()) {
Serial.println("ADXL345 未连接!");
}
/* 添加您使用 ADXL345_calibration.ino 找到的最小和最大原始值。
顺序是:setCorrFactors(min x, max x, min y, max y, min z, max z)。
setCorrFactors 校准斜率并假设零点
是(最小+最大)/2。您必须将 setCorrFactors 函数添加到所有草图
您想在其中使用它。
*/
myAcc.setCorrFactors(-295.0, 255.0, -283.0, 264.0, -262.0, 265.0);
/* 在下一步中,角度的偏移被校正以获得相当精确的校正
角度 x 和 y 高达 ~60°。额外的 offsetCorrection 仅用于校正
角度测量,不适用于俯仰和滚动。该过程只是确保从 0° 开始。
*/
Serial.println("将您的 ADXL345 平放,不要移动它");
delay(2000);
myAcc.measureAngleOffsets();
Serial.println("....完成");
/* 选择数据速率 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_50);
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_2G);
Serial.print("/g 范围:");
Serial.println(myAcc.getRangeAsString());
Serial.println();
}
void loop() {
//xyzFloat g = myAcc.getGValues();
xyzFloat corrAngles = myAcc.getCorrAngles();
/* 修正后的角度使用修正后的原始数据和额外的角度
抵消。该方法为 x/y 提供了相当精确的值
角度向上 60°。
*/
Serial.print("角度 x = ");
Serial.print(corrAngles.x);
Serial.print("|角度 y = ");
Serial.print(corrAngles.y);
Serial.print("|角度 z = ");
Serial.println(corrAngles.z);
/* 俯仰和横滚使用更正的坡度,但没有额外的偏移。
所有轴都被考虑用于计算。
*/
float pitch = myAcc.getPitch();
float roll= myAcc.getRoll();
Serial.print("俯仰 ="); //将x轴的倾斜角度称为“俯仰”
Serial.print(pitch);
Serial.print("| 滚动 = ");//将y轴的倾斜角度称为“滚动”
Serial.println(roll);
Serial.println();
delay(1000);
}
驴友花雕
发表于 2022-6-9 06:38:03
(2)实验串口返回情况
驴友花雕
发表于 2022-6-9 06:39:51
(3)打开Arduino IDE——工具——串口绘图器,查看实验波形实验串口绘图器返回情况
驴友花雕
发表于 2022-6-11 10:06:16
程序十五:将ADXL345置于休眠状态,并唤醒它(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十五:将ADXL345置于休眠状态,并唤醒它
*/
#include<Wire.h>
#include<ADXL345_WE.h>
#define ADXL345_I2CADDR 0x53
/* 有几种方法可以创建您的 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(){
Wire.begin();
Serial.begin(9600);
Serial.println("ADXL345实验程序 - 睡眠");
Serial.println();
if(!myAcc.init()){
Serial.println("ADXL345 未连接!");
}
myAcc.setDataRate(ADXL345_DATA_RATE_50);
myAcc.setRange(ADXL345_RANGE_2G);
}
void loop(){
myAcc.setSleep(true, ADXL345_WUP_FQ_1);
Serial.println("在睡眠模式下测量:");
doMeasurements();
myAcc.setSleep(false);
Serial.println("正常模式下测量:");
doMeasurements();
}
void doMeasurements(){
for(int i=0; i<10; i++){
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);
delay(60);
}
}
驴友花雕
发表于 2022-6-11 10:08:03
(2)打开Arduino IDE——工具——串口绘图器,查看实验波形实验串口绘图器返回情况
驴友花雕
发表于 2022-6-11 10:09:33
(3)实验串口返回情况
驴友花雕
发表于 2022-6-13 15:00:52
16、程序十六:ADXL345自由落体中断(激活并分配给 INT2) (1)ADXL345的中断特性 有关中断功能的一般信息ADXL345区分了八个中断:(a)溢出:当未读数据被覆盖时触发,即当数据速率大于数据检索的频率时。水印:如果FIFO缓冲器中的测量值数量与FIFO控制寄存器中定义的值相对应(稍后会更清晰)。(b)自由落体:当所有轴上的加速度值在一段时间内低于某个值时,就会触发该值。(c)不活动:在指定时间内超过指定轴上的加速度限制时。(d)活动:当指定轴上的加速度超过极限时。(e)单点:超过特定限制的最大持续时间的加速度。(f)双击:两个峰值,两者都满足单点条件,并且它们之间也有一定的时间间隔。(g)数据就绪:存在未读数据。(h)使用函数:激活中断。第一个参数是中断类型,第二个参数是确定中断输出的引脚。setInterrupt(type, pin1/pin2) 请务必注意,“溢出”、“水印”和“数据就绪”的中断始终处于启用状态。因此,您无法禁用它们,只需更改输出引脚即可。默认值为 INT1。您必须先激活所有其他中断。您可以使用 停用它们。deleteInterrupt(type) 在中断寄存器中,在中断的情况下,存储中断类型。读取此寄存器将删除中断,以便可以触发新的中断。其函数为 。它将中断类型作为字节返回。如何“翻译”这可以在库文件ADXL345_WE.h中找到。或者,您可以检查特定类型。readAndClearInterrupts()checkInterrupt(source, type) 还有另一个通用功能,即.这将设置中断引脚是低电平有效还是高电平有效(默认)。setInterruptPolarity(polarity)
驴友花雕
发表于 2022-6-13 15:02:06
(2)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十六:ADXL345自由落体中断(激活并分配给 INT2)
*/
#include<Wire.h>
#include<ADXL345_WE.h>
#define ADXL345_I2CADDR 0x53
const int int2Pin = 2;
volatile bool freeFall = 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() {
Wire.begin();
Serial.begin(9600);
pinMode(int2Pin, INPUT);
Serial.println("ADXL345_Sketch - ADXL345实验程序 - 自由落体中断");
Serial.println();
if (!myAcc.init()) {
Serial.println("ADXL345 未连接!");
}
/* 插入测试的数据并取消注释以获得更精确的结果 */
myAcc.setCorrFactors(-295.0, 255.0, -283.0, 264.0, -262.0, 265.0);
myAcc.setDataRate(ADXL345_DATA_RATE_25);
myAcc.setRange(ADXL345_RANGE_2G);
/* setFreeFallThresholds函数的参数为:
-g 阈值——不要选择太低的参数。 0.3 - 0.6 克就可以了。
- 以毫秒为单位的时间阈值,最大值为 1275。推荐为 100 - 350;
如果时间阈值太低,则可以将振动检测为自由落体。
*/
myAcc.setFreeFallThresholds(0.4, 100);
/* 你可以选择以下中断:
Variable name: Triggered, if:
ADXL345_OVERRUN - new data replaces unread data
ADXL345_WATERMARK - the number of samples in FIFO equals the number defined in FIFO_CTL
ADXL345_FREEFALL - acceleration values of all axes are below the threshold defined in THRESH_FF
ADXL345_INACTIVITY - acc. value of all included axes are < THRESH_INACT for period > TIME_INACT
ADXL345_ACTIVITY - acc. value of included axes are > THRESH_ACT
ADXL345_DOUBLE_TAP - double tap detected on one incl. axis and various defined conditions are met
ADXL345_SINGLE_TAP - single tap detected on one incl. axis and various defined conditions are met
ADXL345_DATA_READY - new data available
Assign the interrupts to INT1 (INT_PIN_1) or INT2 (INT_PIN_2). Data ready, watermark and overrun are
always enabled. You can only change the assignment of these which is INT1 by default.
You can delete interrupts with deleteInterrupt(type);
*/
myAcc.setInterrupt(ADXL345_FREEFALL, INT_PIN_2);
attachInterrupt(digitalPinToInterrupt(int2Pin), freeFallISR, RISING);
freeFall = false;
}
void loop() {
xyzFloat raw = myAcc.getRawValues();
xyzFloat g = myAcc.getGValues();
Serial.print("Raw-x = ");
Serial.print(raw.x);
Serial.print("|Raw-y = ");
Serial.print(raw.y);
Serial.print("|Raw-z = ");
Serial.println(raw.z);
Serial.print("g-x = ");
Serial.print(g.x);
Serial.print("|g-y = ");
Serial.print(g.y);
Serial.print("|g-z = ");
Serial.println(g.z);
Serial.println();
if (freeFall == true) {
Serial.println("Aaaaaaaaah!!!!! - 我是 faaaaallllling!");
delay(1000);
freeFall = false;
/* 通过读取中断寄存器清除中断 */
myAcc.readAndClearInterrupts();
/* 如果您还期望其他中断,您可以检查类型。对于此评论的上一行,
并替换为以下四行:*/
//byte intType = myAcc.readAndClearInterrupts();
//if(myAcc.checkInterrupt(intType, ADXL345_FREEFALL)){
//Serial.println("FREEFALL confirmed");
//}
}
delay(500);
}
void freeFallISR() {
freeFall = true;
}
驴友花雕
发表于 2022-6-13 15:03:23
(3)实验串口返回情况
驴友花雕
发表于 2022-6-13 15:04:55
(4)打开Arduino IDE——工具——串口绘图器,查看实验波形实验串口绘图器返回情况
驴友花雕
发表于 2022-6-13 15:07:35
程序十七:数据就绪中断在 Arduino 引脚 2 上触发中断(分配给 INT2)(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十七:数据就绪中断在 Arduino 引脚 2 上触发中断(分配给 INT2)
*/
#include<Wire.h>
#include<ADXL345_WE.h>
#define ADXL345_I2CADDR 0x53
const int int2Pin = 2;// 中断引脚
volatile bool dataReady = 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() {
Wire.begin();
Serial.begin(9600);
pinMode(int2Pin, INPUT);
Serial.println("ADXL345实验程序 - 数据就绪中断");
Serial.println();
if (!myAcc.init()) {
Serial.println("ADXL345 未连接!");
}
myAcc.setDataRate(ADXL345_DATA_RATE_0_20);
myAcc.setRange(ADXL345_RANGE_2G);
attachInterrupt(digitalPinToInterrupt(int2Pin), dataReadyISR, RISING);
/* 默认中断引脚极性为高电平有效。如果您愿意,请更改 */
// myAcc.setInterruptPolarity(ADXL345_ACT_LOW);
myAcc.setInterrupt(ADXL345_DATA_READY, INT_PIN_2);
}
/* 在以下循环中,INT2 上只能出现一种中断类型。
如果您期望有更多的候选人,您可以检查如下:
uint8_t intType = myAcc.readAndClearInterrupts();
if(myAcc.checkInterrupt(intType, ADXL345_DATA_READY)){
Serial.println(“DATA READY CONFIRMED”);
}
*/
void loop() {
// 你看这里是无延迟控制输出速率
if (dataReady == true) {
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);
dataReady = false;
}
}
void dataReadyISR() {
dataReady = true;
}