极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14900|回复: 6

调试adxl345,i2c接口1602屏幕显示

[复制链接]
发表于 2015-6-7 20:05:25 | 显示全部楼层 |阅读模式
本帖最后由 dingoslove 于 2015-6-7 20:06 编辑

好久就买了adxl345,一直没有调试,今天有空实验一下。
ADXL345 是一款小巧纤薄的低功耗三轴加速度计,可以对高达±16 g的加速度进行高分辨率(13 位)测量。数字输出数据为 16 位二进制补码格式,可通过SPI (3 线或 4 线)或者I2C数字接口访问。
本例中,ADXL345接3.3v,i2c通信,屏幕使用串口板加1602屏幕,i2c接口,这样接线简单,arduino使用2009版,IDE为1.6.4最新版。
  1. #include <Wire.h>  //调用arduino自带的I2C库
  2. #include <LiquidCrystal_I2C.h>   //调用arduino自带的LiquidCrystal库

  3. #define Register_ID 0
  4. #define Register_2D 0x2D
  5. #define Register_X0 0x32
  6. #define Register_X1 0x33
  7. #define Register_Y0 0x34
  8. #define Register_Y1 0x35
  9. #define Register_Z0 0x36
  10. #define Register_Z1 0x37

  11. LiquidCrystal_I2C lcd(0x27,16,2);  // 设置 LCD 地址为 0x27 ,16字符2行显示

  12. int ADXAddress = 0xA7>>1;  //转换为7位地址
  13. int reading = 0;
  14. int val = 0;
  15. int X0,X1,X_out;
  16. int Y0,Y1,Y_out;
  17. int Z1,Z0,Z_out;
  18. double Xg,Yg,Zg;

  19. void setup()
  20. {
  21.   lcd.init();  //初始化LCD
  22.   delay(100);
  23.   Wire.begin();  //初始化I2C
  24.   delay(100);
  25.   Wire.beginTransmission(ADXAddress);
  26.   Wire.write(Register_2D);
  27.   Wire.write(8);
  28.   Wire.endTransmission();
  29.   lcd.backlight();
  30.   
  31. }

  32. void loop()
  33. {
  34.   Wire.beginTransmission(ADXAddress);
  35.   Wire.write(Register_X0);
  36.   Wire.write(Register_X1);
  37.   Wire.endTransmission();
  38.   Wire.requestFrom(ADXAddress,2);
  39.   if(Wire.available()<=2);
  40.   {
  41.     X0 = Wire.read();
  42.     X1 = Wire.read();
  43.     X1 = X1<<8;
  44.     X_out = X0+X1;
  45.   }

  46.   Wire.beginTransmission(ADXAddress);
  47.   Wire.write(Register_Y0);
  48.   Wire.write(Register_Y1);
  49.   Wire.endTransmission();
  50.   Wire.requestFrom(ADXAddress,2);
  51.   if(Wire.available()<=2);
  52.   {
  53.     Y0 = Wire.read();
  54.     Y1 = Wire.read();
  55.     Y1 = Y1<<8;
  56.     Y_out = Y0+Y1;
  57.   }

  58.   Wire.beginTransmission(ADXAddress);
  59.   Wire.write(Register_Z0);
  60.   Wire.write(Register_Z1);
  61.   Wire.endTransmission();
  62.   Wire.requestFrom(ADXAddress,2);
  63.   if(Wire.available()<=2);
  64.   {
  65.     Z0 = Wire.read();
  66.     Z1 = Wire.read();
  67.     Z1 = Z1<<8;
  68.     Z_out = Z0+Z1;
  69.   }

  70.   Xg = X_out/256.00;//把输出结果转换为重力加速度g,精确到小数点后2位。
  71.   Yg = Y_out/256.00;
  72.   Zg = Z_out/256.00;
  73.   lcd.clear(); //清屏
  74.   lcd.print("X="); //使屏幕显示文字X=
  75.   lcd.print(Xg);
  76.   lcd.setCursor(8, 0);
  77.   lcd.print("Y=");
  78.   lcd.print(Yg);
  79.   lcd.setCursor(0, 1);
  80.   lcd.print("Z=");
  81.   lcd.print(Zg);
  82.   delay(300);  //延时0.3秒,刷新频率这里进行调整

  83. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-6-7 20:09:48 | 显示全部楼层
程序修改子,弘毅老师的,原帖地址http://www.geek-workshop.com/for ... p;highlight=adxl345
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-7 20:14:59 | 显示全部楼层
本帖最后由 dingoslove 于 2015-6-8 16:12 编辑


看看效果吧,接线很容易看清
回复 支持 反对

使用道具 举报

发表于 2015-6-8 18:02:36 | 显示全部楼层
好吧,下一阶段看看
回复 支持 反对

使用道具 举报

发表于 2015-7-3 23:29:48 | 显示全部楼层
请问接口是只能选择A4,A5吗?我看你写的程序和我找的其他程序里都没有定义接口。如果不是必须要A4,A5的话,比如说我希望改为A3,A4,再程序里应该如何实现呢?谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-23 12:01:36 | 显示全部楼层
zhanghe390 发表于 2015-7-3 23:29
请问接口是只能选择A4,A5吗?我看你写的程序和我找的其他程序里都没有定义接口。如果不是必须要A4,A5的话 ...

A4,A5是默认的I2c接口,可以改动,我不会
回复 支持 反对

使用道具 举报

发表于 2015-9-12 13:54:31 | 显示全部楼层
dingoslove 发表于 2015-8-23 12:01
A4,A5是默认的I2c接口,可以改动,我不会

请问一下,你哪两个木块是并联在A4和A5上的吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 01:29 , Processed in 0.035459 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表