驴友花雕 发表于 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接法)

页: 1 2 [3] 4 5
查看完整版本: 【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块