Arduino 和 LM75 的 I2C 总线通讯(2) – 温度小数部分

上篇文章《Arduino 和 LM75 的 I2C 总线通讯》里,没用到LM75的小数位,现在补充上来。这样可以由原来1度的分辨率提高到0.5度的分辨率。

从LM75的datasheet上看,温度是9bits,前8bits是整数部分,第9个bit是小数部分。所以读取2个byte,第2个byte,保留最高位,然后将此位右移7位,得到1或者0两种值,如果为1,即为0.5度。

LM75_TEMPERATURE_DATA_FORMAT下图是 I2C Timing Diagrams 和 TEMPERATURE REGISTER 示意图:

LM75_TEMPERATURE_REGISTER

实现代码如下:(版本0.02)

#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(72, 2);    

  while(Wire.available()) 
  { 
    int part1 = Wire.read();
    Serial.print("part1  is : ");
    Serial.println(part1,BIN);
    
    int part2 = Wire.read();
    Serial.print("part2  is : ");
    
    part2 &= B10000000;
    part2 >>= 7;
    Serial.println(part2,BIN);
    
    Serial.print("result is : ");
    Serial.println(part1 + part2 * 0.5);
    Serial.println("-----------------");
  }

  delay(500);
}

测试结果:

LM75_two_bytes本代码有个问题,就是温度为负数时,显示的数值不正确,这个将在下一个版本里更新。(20161226 已更新 《Arduino 和 LM75 的 I2C 总线通讯(4) – 温度小数部分(2)》)

扩展阅读:

  • http://playground.arduino.cc/Main/I2cScanner

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

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.