GY-30数字光强传感器通过I²C接入Arduino
2016-06-17 16:39
295 查看
作者:颜哲锟
GY-30数字光强传感器通过I²C通信协议接入Arduino过程中的一些问题和解决方案
前言
刚拿到GY-30数字光强传感器的时候,真心感觉比原来的模拟输出的光强传感器要精确好几倍。没被拆封的GY-30模块,排针是需要自己焊的。
注:I²C,这是正确的写法,但也有简写成IIC或I2C。
1.单个GY-30接入Arduino UNO
焊完用杜邦线和Arduino板子相连即可,淘宝商家提供的手册是基于UNO板的,GY-30的VCC接Arduino的5v,GND接GND,SDA接A4,SCL接A5,ADD是地址引脚,单个sensor工作时不用接。一个UNO板子和一个GY-30传感器连接起来很容易就调试成功了。附上代码
附上代码 #include <Wire.h> //IIC库 #include <math.h> int BH1750address = 0x23;//芯片地址为16位23 byte buff[2]; void setup() { Wire.begin(); Serial.begin(9600); } void loop() { int i; uint16_t val=0; BH1750_Init(BH1750address); delay(1000); if(2==BH1750_Read(BH1750address)) { val=((buff[0]<<8)|buff[1])/1.2; Serial.print(val,DEC); Serial.println("[lx]"); } delay(150); } int BH1750_Read(int address) // { int i=0; Wire.beginTransmission(address); Wire.requestFrom(address, 2); while(Wire.available()) // { buff[i] = Wire.read(); // read one byte i++; } Wire.endTransmission(); return i; } void BH1750_Init(int address) { Wire.beginTransmission(address); Wire.write(0x10);//1lx reolution 120ms Wire.endTransmission(); }
2.尝试让多个GY-30接入Arduino MEGA2560
我需要让4个GY-30同时接入,所以尝试更换成接口更多的MEGA2560,以实现将串口模拟成IIC接口并实现通信,但Arduino的串口监视器没有数据读出。此坑略去几百字,附上总结:
我理解成“SDA接A4,SCL接A5”是通过Arduino的模拟口传输的,所以把UNO换成其他型号的板子也应该是A4和A5口,但MEGA2560的串口监视器上的光强数据不再读出,翻墙找到UNO和MEGA的电路图,秒懂错误原因。这I²C压根不是通过A4A5口的模拟输出口传输的,而是UNO的A4A5口还是有SDA和SCL功能。
附上翻墙拿到的2个电路图。
3.GY-30数字光强传感器的地址问题的解决方案以及在IIC协议下的总结发现
3.1GY-30的地址解决方案
解决了串口引脚接线问题,接下来需要解决一下基于Arduino利用IIC协议和GY-30通行时的地址问题。我起先对IIC地址的理解是像IP地址那样可以自己设置,最后发现并不全对,这需要看芯片是否支持更改地址。
此坑略去几千字,附上总结:
对于这个GY-30数字光强传感器,内置BH1750FVI,sensor外接有5个引脚,GND ADD SDA SCL VCC。通过阅读芯片技术手册(英文版淘宝自取或中文版http://wenku.baidu.com/link?url=rXMAHAejMui15JWn20Rr8pR-came8Oo5WA3N5H29PGOLh_YL5a7_YUsKtuFk6dqHCpnxoMbfPNx52yJt8sOL2m6-FQyPYZsIjlQoQt_eMBe)遗憾地发现,这芯片只支持2个I²Cslave地址
,1011100是高电平地址为0x5c,0100011为低电平,地址是0x23。不用ADD引脚或者接GND时,芯片默认为低电平即0x23,当ADD接5V或者3.3V时,芯片为高电平即0x5c。
3.2 IIC协议下的地址解决方案
3.2.1
其实本来考虑的是想更改sensor的地址,然后让4个sensor同时连接在I²C总线上,但内置BH1750FVI只能实现2个地址,所以方案最终改成了用2个Arduino板子分别控制横向和纵向方向上的2个sensor。在寻找更改芯片地址的技术资料和初始化命令的时候,找到过这种思路的先例,一般sensor的技术手册、数据手册会有详细的地址和引脚接线信息,这是一个普遍的寻址思路。
3.2.2
当然还有一种设置地址的方法。比如,BLinkM(有I²C功能的已装配完毕的彩色LED模块),它的地址是需要自己设置的,需要从http://code.google.com/p/blinkm-projects/下载BlinkMTester的测试程序。编译并上传BlinkMTester测试程序,将每个BlinkM模块逐一连接到Arduino,使用BlinkMTester测试程序的扫描命令S显示当前连接模块的地址,并使用A命令来给每个模块设置不同的地址。3.3总结
I²C Bus 的通信协议对于多个不同传感器的接入有很大方便,能减少大量线路。但对于接多个相同的传感器,问题变得复杂,上限数量需要看sensor的内置芯片是否支持重置地址;如果不能重置,则上限要看芯片支持分配几个地址。
附上示意图
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Patrol 7 架构下?的处理方法
- 中病毒后常用的解决方法病毒终极解决方案
- C#实现子窗体与父窗体通信方法实例总结
- QQ尾巴 InfoMs.Ime 解决方案
- Lua和C语言的交互详解
- IE对CSS样式表的限制分析与解决方案
- 开源MySQL高效数据仓库解决方案:Infobright详细介绍
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- java和c#使用hessian通信的方法
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法