37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序十一:ADXL345 传感器控制红蓝绿三色LED灯
实验接线示意图(实际为IIC接法)
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);
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) { //它识别的条件
//轴的移动。
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);
}
实验串口返回情况
Arduino实验场景图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序十二:校准ADXL345的指南
实验接线示意图
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);
}
实验串口返回情况
实验说明:见上图红点处,这里确定的六个值是:
X(最小值)=-295
X(最大值)=255
Y(最小值)=-283
Y(最大值)=264
Z(最小值)=-262
Z(最大值)=265
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序十三:通过输入程序十二中获得的值来应用校准(导入实测的修正值)
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);
}
实验串口返回情况
实验说明
可以看到,z 轴的校正 g 值现在看起来要好得多。由于剩余的偏移,角度具有一定的偏差。另一方面,校正的角度(“校正角cAngles”)波动接近于零。
hacker_2023.08.12
666