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

目录 Content
[hide]

知识的进步,在于不断的积累。某个关键的技术点,也许当时没有意识到解决方法,那么放一放,在以后的日子里,也许那个解决方法就会到来。这当中原因,很大程度是受当时认识水平的局限性所致。

就拿 LM75 温度的小数部分来说,LT 的上篇文章《Arduino 和 LM75 的 I2C 总线通讯(2) – 温度小数部分》写于 2014 年 10 月份,当时留了一个坑,是说“温度为负数时,显示的数值不正确,这个将在下一个版本里更新”,那么,现在 2016 年的 12 月的今天可以把这个坑填上了。

上图是使用新的代码( 版本0.03 ),把 LM75 放入冰箱冷冻室降温做的一个测试曲线。

一、原因分析

还拿温度寄存器来说

D15-D8 这一个 Byte 的数值,其实是包含了符号的。上篇文章里用了 int 类型来定义 part1 就是犯了错误。因为 Arduino 里的 Int 是 16bit 的, 所以 D15 为1时,并没有当作负数来处理!

二、解决方案

方法很简单:把 part1 的类型由 int 更改为 char 就可以了!

验证一下:

111111111 前8位为 11111111,char 类型的话,十进制为  -1, 加上 LSB 的 0.5,就表示为 -0.5

三、实现代码

只做一处更改

char part1 = Wire.read();

完整代码如下:( 版本0.03 )

#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()) 
  { 
    char 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);
}

扩展阅读

Leave a Reply

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