Arduino 和 LM75 的 I2C 总线通讯(1)

Arduino 是一个开源单片机平台。前两天得到一块测温IC模块,LM75,正好有机会研究下Arduino的 I2C 通讯功能。关于I2C总线的知识,可以在这里找到。

(哪里能得到 LM75 呢,试试万能的taobao吧 ,呵呵)

LM75 是一个I2C接口的测温元件,外围电路仅仅需要一枚电容,它的datasheet可以从官方网站上下载到 ,具体的spec这里就不多讲了,感兴趣的可以查看它的datasheet。说到这里,很是感慨,就这么一个4mm*5mm见方的小东西,手册却一点也不含糊,详详细细介绍了所有的功能。其实,有时候看元器件的手册对扩展知识面也很有帮助。LM75的主要功能是测温,本文的目的就是如何应用Arduino和LM75来获取当前的温度,核心是Arduino的I2C协议的应用。

arduino-lm75

看LM75的datasheet,会知道它是作为slave,地址是7-bits,1001A2A1A0,我手里这个A2\A1\A0都是短接地的,所以地址就是1001000,继续查找手册,温度的指针寄存器是00000000,温度的格式是16bits,前面8bits最高位是MSB,若MSB为1,表示为负,后面8bits的最高位是LSB,为 0.5度。为了简化程序,我们只取温度的整数部分,即D15-D8。

再看Arduino的Wire库的应用,Arduino作为master,首先要向I2C总线上的LM75地址发送读取温度寄存器的指令,即00000000,这一步本程序版本0.01暂不考虑,因为LM75上电后,指针寄存器里的指针即指向温度寄存器, 然后读取一个byte就可以得到温度的高8位,即整数值。

让我们看程序:(版本0.01)

    #include <Wire.h>

    void setup()
    {
    Wire.begin(); // join i2c bus (address optional for master)
    Serial.begin(9600); // start serial for output
    }

    void loop()
    {
    Wire.requestFrom(B1001000, 1); // request 1 byte from adress 1001000

    while(Wire.available())
    {
    int temp = Wire.receive();
    Serial.println(temp);
    }

    delay(500);
    }

 

上传到Arduino后,打开Serial Monitor ,就可以在下部的窗口里读到温度值。

arduino-lm75-i2c

哈,我现在室内温度是28度!看来南京最近的天气还是比较凉快的!

关于如何使用小数部分,参阅:《Arduino 和 LM75 的 I2C 总线通讯(2) – 温度小数部分》,这样可以由原来1度的分辨率提高到0.5度的分辨率。

扩展阅读

关键字:Arduino, I2C, Wire, LM75, slave

 

4 thoughts on “Arduino 和 LM75 的 I2C 总线通讯(1)

  1. I tested your code to read the temperature. I have noticed that sometimes the arduino gets stuck and does not read the temperature. After looking for the problem. I noticed that it is recommended to read 2 octets at a time.
    This is your code slightly modified

    #include

    void setup()
    {
    Wire.begin(); // join i2c bus (address optional for master)
    Serial.begin(9600); // start serial for output
    Serial.println(“Let’s measure the Temperature.”);
    }

    void loop()
    {

    Wire.requestFrom(B1001000, 2); // request 2 byte from address 1001000

    while(Wire.available())
    {
    int temp = Wire.receive(); // Read the first octet
    int lsb = Wire.receive(); // Read the second octet
    Serial.print(“temperature = “);
    Serial.println(temp);
    }

    delay(500);
    }

    Best regards

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.