37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序八:使用ADXL345_WE 库测量角度、校正角度和方向
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);
}
实验串口返回情况
实验串口绘图器返回情况
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序九:点阵屏加速度仪
Arduino实验接线示意图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序九:点阵屏加速度仪
Arduino实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序九:点阵屏加速度仪
*/
#include <LedControl.h> //导入点阵屏驱动库
#include <Wire.h>
#define DEVICE (0x53) //ADXL345设备地址
#define TO_READ (6) //我们要读取的字节数(每个轴两个字节)
byte buff[TO_READ] ; //6字节缓冲区,用于保存从设备读取的数据
char str[512]; //字符串缓冲区在发送数据之前对其进行转换
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[1]) << 8) | buff[0];
y = (((int)buff[3]) << 8) | buff[2];
z = (((int)buff[5]) << 8) | buff[4];
// 将值转换为可以在矩阵上表示的值
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[i] = Wire.read(); // 接收一个字节
i++;
}
Wire.endTransmission(); //结束传输
delay(300);
}
实验串口返回情况
实验串口绘图器返回情况
Arduino实验场景图
(6)实验的视频记录
https://v.youku.com/v_show/id_XNTgxMDI1NTc3Ng==.html?firsttime=0
程序十:ADXL345三轴传感器控制D13脚LED灯的亮灭
(1)实验接线示意图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序十:ADXL345三轴传感器控制D13脚LED灯的亮灭
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);
float x = event.acceleration.x;
float y = event.acceleration.y;
float z = 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毫秒
}
实验串口返回情况
实验串口绘图器返回情况
Arduino实验场景图
hacker_2023.08.12
666