极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 881|回复: 12

我的两模块都用iic怎么解决?

[复制链接]
发表于 2018-1-24 19:08:19 | 显示全部楼层 |阅读模式
我的DS1307时钟模块和光照模块都用I2C总线的A4、A5脚,我不知该怎么办,求大神!
回复

使用道具 举报

发表于 2018-1-29 10:45:00 | 显示全部楼层
wwwusr 发表于 2018-1-25 12:09
所有的的IIC设备 ,都按到A4(SDA),A5(SCL)上,并联,Arduino以它们的地址作为区分
比如这里有三个IIC ...


我测试这程序是可用的。果断收藏了。
还有,IIC的连接最好不要简单的并联,分别用5V串个1.8K 电阻到 SDA 和 SCL 。
我遇到过不串联电阻时会卡壳,串上电阻后就一齐正常。
IMG_20180129_103538_爱奇艺.jpg
回复 支持 1 反对 0

使用道具 举报

发表于 2018-1-24 22:18:28 | 显示全部楼层
这些电子组件在生产时会预先设置好地址,如 DS1307 的地址是 0x68 Wii 左手把是 0x52 具体电子组件就找说明书,或者找它们的库。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-24 22:49:35 | 显示全部楼层
最帅的老饼 发表于 2018-1-24 22:18
这些电子组件在生产时会预先设置好地址,如 DS1307 的地址是 0x68 Wii 左手把是 0x52 具体电子组件就找说明 ...

麻烦您,再说详细点,我是小白,有点听不懂,谢谢。
回复 支持 反对

使用道具 举报

发表于 2018-1-25 12:09:16 | 显示全部楼层
所有的的IIC设备 ,都按到A4(SDA),A5(SCL)上,并联,Arduino以它们的地址作为区分
比如这里有三个IIC的1602 那就可以这样 (0x26 27  3F,就是各自的地址)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd0(0x26,16,2);
LiquidCrystal_I2C lcd1(0x27,16,2);
LiquidCrystal_I2C lcd2(0x3f,16,2);

void setup()
{

  lcd0.init();
  lcd0.backlight();
  lcd1.init();
  lcd1.backlight();
  lcd2.init();
  lcd2.backlight();

  lcd0.print("This is 0x26");
  lcd1.print("This is 0x27");
  lcd2.print("This is 0x3f");
}


void loop()
{

  for(int i=0;i<100;i++)
  {

    lcd0.setCursor(0,1);
    lcd0.print("          ");
    lcd0.setCursor(0,1);
    lcd0.print(i);

    lcd1.setCursor(0,1);
    lcd1.print("          ");
    lcd1.setCursor(0,1);
    lcd1.print(i*2);

    lcd2.setCursor(0,1);
    lcd2.print("          ");
    lcd2.setCursor(0,1);
    lcd2.print(i*3);

    delay(500);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-25 13:44:04 | 显示全部楼层
wwwusr 发表于 2018-1-25 12:09
所有的的IIC设备 ,都按到A4(SDA),A5(SCL)上,并联,Arduino以它们的地址作为区分
比如这里有三个IIC ...

虽然听不大懂,还是先感谢指教,谢谢。
回复 支持 反对

使用道具 举报

发表于 2018-1-25 14:11:41 | 显示全部楼层
本帖最后由 Stormer 于 2018-1-25 14:15 编辑

设备使用哪些引脚应该有定义啊,在哪里定义的呢? 一般就是该设备的库文件里,比如xxx.h。到这里找到引脚定义的位置,把A4 A5引脚设置成其它闲置具备同样功能的引脚即可。

然而I2C的线是可以并联的,多个设备同时用没问题,只是不同设备要有不同的设备号(地址),区分开。
回复 支持 反对

使用道具 举报

发表于 2018-1-26 14:47:46 | 显示全部楼层
本帖最后由 47okey 于 2018-1-26 14:52 编辑

几个IIC的引脚并接在arduino A4、A5,各自有自己的设备I2C地址。

比如,LCD1602的地址是在程序里设置的。
360截图20180122223750978.png

而DS3231的I2C地址是在库文件的DS3231.CPP里定义了的
360截图20180122223905494.png

如果不知道设备的I2C地址,网上也有小程序烧进arduino 里串口可以显示。
360截图20180122185231607.png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-26 20:51:58 | 显示全部楼层
本帖最后由 tjsanjian 于 2018-1-26 20:53 编辑

太感谢了,六十的人了,学东西太慢了,大家费心了。顺便问下,查I2C地址的程序在那?求教了。
回复 支持 反对

使用道具 举报

发表于 2018-1-26 21:23:43 | 显示全部楼层
tjsanjian 发表于 2018-1-26 20:51
太感谢了,六十的人了,学东西太慢了,大家费心了。顺便问下,查I2C地址的程序在那?求教了。

#include <Wire.h>  
   
void setup(){  
  Wire.begin();  
  Serial.begin(9600);  
  Serial.println("\nI2C Scanner");  
}  
void loop(){  
  byte error, address;  
  int nDevices;  
  Serial.println("Scanning...");  
  nDevices = 0;  
  for (address = 1; address < 127; address++ ){  
    // The i2c_scanner uses the return value of  
    // the Write.endTransmisstion to see if  
    // a device did acknowledge to the address.  
    Wire.beginTransmission(address);  
    error = Wire.endTransmission();  
    if (error == 0){  
      Serial.print("I2C device found at address 0x");  
      if (address < 16)  
        Serial.print("0");  
      Serial.print(address, HEX);  
      Serial.println(" !");  
      nDevices++;  
    }else if (error == 4){  
      Serial.print("Unknow error at address 0x");  
      if (address < 16)  
        Serial.print("0");  
      Serial.println(address, HEX);  
    }  
  }  
  if (nDevices == 0)  
    Serial.println("No I2C devices found\n");  
  else  
    Serial.println("done\n");  
  delay(5000); // wait 5 seconds for next scan  
}  
把模块按接线方法接好,上传这段代码后,打开端口监视器,就能找到在I2C上的设备地址,大家可以试试哦

忘了是哪个论坛看的,没收藏,只是复制了代码。我回帖的截图就是用这查的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-27 13:59:18 | 显示全部楼层
非常感谢,谢谢
回复 支持 反对

使用道具 举报

高级模式  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2018-2-25 07:57 , Processed in 0.041556 second(s), 6 queries , File On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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