在初中我们就学过加速度,并学习了它的计算方法。今天我们来学习一种神奇的加速度传感器,并看一看它和1602液晶组合会产生怎样神奇的效果呢?
实验名称:ADXL345加速度传感器+1602液晶实验
什么是加速度传感器?
加速度传感器,作用是测量在加速过程中产生的力。最基本的如平常所熟悉的重力加速度,大小是1g。
加速度传感器一般用于什么地方?
通过测量由重力引起的加速度,可以计算出设备相对于水平面的倾斜角度。通过分析动态加速度,可以分析出设备的移动方式。自平衡车中就是使用加速度传感器与陀螺仪进行卡尔曼滤波进行姿态矫正。
一、实验说明
本次试验使用的ADXL345数字传感器,通过I2C或者SPI接口直接输出数字信号。在1g的加速度下,输出数值为256。
ADXL345传感器介绍:
- ADXL345三轴加速度采用ADXL345芯片,具有体积小,功耗低的特点,
- 13位数字精度分辨能够测量超过±16克的加速度变换。
- 信号输出为16位数字输出,可以通过SPI与I2C接口实现信号采集。
- ADXL345适用于倾斜角度测量,能够进行静态重力加速度检测。同时也适用于运动状态的追踪,测量运动或冲击过程造成的瞬时加速度。其高分辨率(4毫克/ LSB)使之能够感应变化小于1°的倾斜角度。
- DFrobot的ADXL345三轴加速度计还内置一款LDO模块让你的加速度计能够工作于3.3〜6V的工作电压之下。
- 传感器提供了几个特殊的功能。能够在静态或动态情况下检测是否有运动或停止出现,另外能够感知单轴的加速度值是否超出用户的设定值。检测单击/双击。如果该设备正在下降,能进行自由落体感应检测。这些功能能够被映射到两个中断输出引脚上。
- 在低功耗模式是用户能够基于ADXL345动作感应,进行电源管理,同时只损耗极低的功耗。
在我们的公众号:xunmingiot回复“手册”,即可获得ADXL345中文手册。
二、物料清单

PS:所需物料可以在这里购买—http://tbll000175.cn/DXSXCvr4
三、模块说明

针脚说明:


四、接口说明

1、两组电源 一组是模块的电源 一组是背光板的电源 一般均使用5V供电。本次试验背光使用3.3V供电也可以工作。
2、VL是调节对比度的引脚,串联不大于5KΩ的电位器进行调节。本次实验使用1KΩ的电阻来设定对比度。其连接分高电位与低电位接法,本次使用低电位接法,串联1KΩ电阻后接GND。
注意:不同液晶的对比度电阻是不同的,最好是接一个电位器进行测试,本次实验使用的1KΩ电阻在其他液晶上不一定正确。
3、RS 是很多液晶上都有的引脚 是命令/数据选择引脚 该脚电平为高时表示将进行数据操作;为低时表示进行命令操作。
4、RW 也是很多液晶上都有的引脚 是读写选择端 该脚电平为高是表示要对液晶进行读操作;为低时表示要进行写操作。
5、E 同样很多液晶模块有此引脚 通常在总线上信号稳定后给一正脉冲通知把数据读走,在此脚为高电平的时候总线不允许变化。
6、D0—D7 8 位双向并行总线,用来传送命令和数据。
7、BLA是背光源正极,BLK是背光源负极。
五、四位连线法图



六、实验代码
#include <Wire.h> //调用arduino自带的I2C库
#include <LiquidCrystal.h> //调用arduino自带的LiquidCrystal库
#define Register_ID 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//设置接口
int ADXAddress = 0xA7>>1; //转换为7位地址
int reading = 0;
int val = 0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;
void setup()
{
lcd.begin(16, 2); //初始化LCD
delay(100);
Wire.begin(); //初始化I2C
delay(100);
Wire.beginTransmission(ADXAddress);
Wire.write(Register_2D);
Wire.write(8);
Wire.endTransmission();
}
void loop()
{
Wire.beginTransmission(ADXAddress);
Wire.write(Register_X0);
Wire.write(Register_X1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2);
{
X0 = Wire.read();
X1 = Wire.read();
X1 = X1<<8;
X_out = X0+X1;
}
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Y0);
Wire.write(Register_Y1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2);
{
Y0 = Wire.read();
Y1 = Wire.read();
Y1 = Y1<<8;
Y_out = Y0+Y1;
}
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Z0);
Wire.write(Register_Z1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2);
{
Z0 = Wire.read();
Z1 = Wire.read();
Z1 = Z1<<8;
Z_out = Z0+Z1;
}
Xg = X_out/256.00;//把输出结果转换为重力加速度g,精确到小数点后2位。
Yg = Y_out/256.00;
Zg = Z_out/256.00;
lcd.clear(); //清屏
lcd.print("X="); //使屏幕显示文字X=
lcd.print(Xg);
lcd.setCursor(8, 0);
lcd.print("Y=");
lcd.print(Yg);
lcd.setCursor(0, 1);
lcd.print("Z=");
lcd.print(Zg);
delay(300); //延时0.3秒,刷新频率这里进行调整
}
七、相关函数介绍
setCursor():放置LCD光标; 也就是说,设置写入LCD的后续文本的位置。
句法:lcd .setCursor(col,row)。参数col:定位光标的列(0为第一列);row:定位光标的行(0为第一行)。
Wire.available():返回可用read()检索的字节数。
delay( ms):此函数为毫秒级延时。参数为时长,类型unsigned long。
今天的内容你学会了吗?动手实践才是真理呦,赶快跟着小编的讲解实际操作一下吧!有问题还可以在评论区留言呦!关注我们的微信公众号:xunmingiot,后台回复“入门”即可获取学习资料,帮助你更好的进入学习。
我们下期再见啦!(码字不易,点个赞再走呗)
往期教程可以点击以下链接查看:
怎样快速入门Arduino?(十九)—1602液晶显示实验(1)
怎样快速入门Arduino?(十八)—EEPROM读写与获取串口数据流
怎样快速入门Arduino?(十七)—Arduino驱动数码管(2)