驴友花雕
发表于 2022-5-14 08:56:20
(2)实验串口返回情况
驴友花雕
发表于 2022-5-14 08:57:58
(3)打开Arduino IDE——工具——串口绘图器,查看实验波形实验串口绘图器返回情况
驴友花雕
发表于 2022-5-14 09:00:07
本帖最后由 驴友花雕 于 2022-5-14 09:02 编辑
程序七:使用ADXL345_WE 库的活动/非活动中断功能(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序七:使用ADXL345_WE 库的活动/非活动中断功能
Arduino------ADXL345
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/
#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() {
Wire.begin();
Serial.begin(9600);
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;
}
驴友花雕
发表于 2022-5-14 09:04:09
(2)实验串口返回情况
驴友花雕
发表于 2022-5-14 09:06:35
程序八:使用ADXL345_WE 库测量角度、校正角度和方向(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序八:使用ADXL345_WE 库测量角度、校正角度和方向
Arduino------ADXL345
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/
#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 校准斜率并假设零点
is (min+max)/2. 必须将 setCorrFactors 函数添加到全局
*/
myAcc.setCorrFactors(-266.0, 285.0, -268.0, 278.0, -291.0, 214.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 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);
/* 角度使用校正后的原始数据。角度简单地计算为
角度 = arcsin(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(500);
}
驴友花雕
发表于 2022-5-14 09:08:18
(2)实验串口返回情况
驴友花雕
发表于 2022-5-14 09:09:37
(2)实验串口绘图器返回情况
驴友花雕
发表于 2022-5-14 09:11:17
程序九:点阵屏加速度仪(1)实验接线示意图
驴友花雕
发表于 2022-5-14 09:13:09
(2)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序九:点阵屏加速度仪
*/
#include <LedControl.h> //导入点阵屏驱动库
#include <Wire.h>
#define DEVICE (0x53) //ADXL345设备地址
#define TO_READ (6) //我们要读取的字节数(每个轴两个字节)
byte buff ; //6字节缓冲区,用于保存从设备读取的数据
char str; //字符串缓冲区在发送数据之前对其进行转换
int MATRIX_WIDTH = 8;
LedControl lc = LedControl(12, 10, 11, 1); // 点阵屏接脚:DIN, CLK, CS, NRDEV
unsigned long delaytime = 50;
int x_key = A1;
int y_key = A0;
int x_pos;
int y_pos;
// 表示单个灯光位置的对象
// 未来的重力更新
class Grain
{
public:
int x = 0;
int y = 0;
int mass = 1;
};
Grain *g;
void setup() {
//设置一个grain对象
g = new Grain();
ClearDisplay();
Wire.begin(); // 加入 i2c 总线(主机地址可选)
Serial.begin(9600);// 启动串口输出
//开启ADXL345
writeTo(DEVICE, 0x2D, 0);
writeTo(DEVICE, 0x2D, 16);
writeTo(DEVICE, 0x2D, 8);
}
void loop() {
// 第一个轴加速度数据寄存器
int regAddress = 0x32;
int x, y, z;
readFrom(DEVICE, regAddress, TO_READ, buff); //从ADXL345读取加速度数据
// 合并每个方向的两个字节
// 最低有效位在前
x = (((int)buff) << 8) | buff;
y = (((int)buff) << 8) | buff;
z = (((int)buff) << 8) | buff;
// 将值转换为可以在矩阵上表示的值
x = map(x, -300, 300, 0, 8);
y = map(y, -300, 300, 0, 8);
z = map(z, -300, 300, 0, 8);
//我们将x y z值作为字符串发送到串口
Serial.print("X: ");
Serial.print(x);
Serial.print(" Y: ");
Serial.print(y);
Serial.print(" Z: ");
Serial.print(z);
Serial.print("\n");
ClearDisplay();
//将grain分配到这个位置
g->x = x;
g->y = y;
lc.setLed(0, g->x, g->y, true);
//在每次更新之间添加一些延迟
delay(10);
}
void ClearDisplay() {
//设置液晶显示器
int devices = lc.getDeviceCount();
for (int address = 0; address < devices; address++)
{
lc.shutdown(address, false);
lc.setIntensity(address, 1);
lc.clearDisplay(address);
}
}
//将val写入设备上的地址寄存器
void writeTo(int device, byte address, byte val)
{
Wire.beginTransmission(device); //开始传输到设备
Wire.write(address); // 发送寄存器地址
Wire.write(val); // 发送要写入的值
Wire.endTransmission(); //结束传输
}
//从设备上的地址寄存器开始读取num字节到buff数组
void readFrom(int device, byte address, int num, byte buff[])
{
Wire.beginTransmission(device); //开始传输到设备
Wire.write(address); //发送要读取的地址
Wire.endTransmission(); //结束传输
Wire.beginTransmission(device); //开始传输到设备
Wire.requestFrom(device, num);// 从设备请求 6 个字节
int i = 0;
while (Wire.available()) //设备发送的数据可能少于请求的数据(异常)
{
buff = Wire.read(); // 接收一个字节
i++;
}
Wire.endTransmission(); //结束传输
delay(300);
}
驴友花雕
发表于 2022-5-14 09:14:38
(3)实验串口返回情况
驴友花雕
发表于 2022-5-14 09:16:34
(4)实验串口绘图器返回情况
驴友花雕
发表于 2022-5-14 09:18:00
(5)实验场景图
驴友花雕
发表于 2022-5-14 09:20:56
(6)实验的视频记录
https://v.youku.com/v_show/id_XNTgxMDI1NTc3Ng==.html?firsttime=0
https://v.youku.com/v_show/id_XNTgxMDI1NTc3Ng==.html?firsttime=0
驴友花雕
发表于 2022-5-14 10:09:02
程序十:ADXL345三轴传感器控制D13脚LED灯的亮灭(1)实验接线示意图
驴友花雕
发表于 2022-5-14 10:11:16
(2)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十:ADXL345三轴传感器控制D13脚LED灯的亮灭
*/
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>//导入ADXL345驱动库
#define LED_PIN 13 //LED接D13
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified();
void setup(void) {
Serial.begin(9600);//串口初始化
Serial.println("ADXL345 传感器控制D13脚LED灯");
if (!accel.begin())
{
Serial.println("未检测到 ADXL345 传感器。");
while (1);
}
pinMode(LED_PIN,OUTPUT);//设置LED为输出
}
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 || x < -5) { //设置点亮LED的X轴阙值
digitalWrite(LED_PIN,HIGH);
Serial.println("X值符合,LED灯亮");
}
else if (y > 5 || y < -5) { //设置点亮LED的Y轴阙值
digitalWrite(LED_PIN,HIGH);
Serial.println("Y值符合,LED灯亮");
}
else{
digitalWrite(LED_PIN,LOW);
}
delay(500);//延时500毫秒
}
驴友花雕
发表于 2022-5-14 10:15:46
(2)实验串口返回情况
驴友花雕
发表于 2022-5-14 10:17:47
(4)实验串口绘图器返回情况
驴友花雕
发表于 2022-5-14 10:20:50
(5)实验场景图
驴友花雕
发表于 2022-5-14 10:24:22
(6)实验的视频记录
https://v.youku.com/v_show/id_XNTg2OTk2NjA2NA==.html
https://v.youku.com/v_show/id_XNTg2OTk2NjA2NA==.html
驴友花雕
发表于 2022-5-23 17:35:35
驴友花雕
发表于 2022-5-25 13:23:23
本帖最后由 驴友花雕 于 2022-5-25 14:42 编辑
程序十一:ADXL345 传感器控制红蓝绿三色LED灯(1)实验接线示意图(实际为IIC接法)