关键词: 树莓派, 温度传感器
问:使用Raspberry Pi 从 MCP9808读取温度数据
MCP9808是一款温度传感器,采用I2C通信标准来传输连续轮询温度。它支持报警功能和待机模式,以便在需要时节省电力。在本说明文档中,我们将执行几个python命令来获取传感器的温度。
MCP9808 上的 I2C
Microchip将0x18用作此板上的主地址,借助芯片上的3个引脚来更改I2C地址冲突时的地址。当调用传感器中的任何寄存器时,该板应写入或获得双字节响应(MSB优先,LSB最后)。我使用的是Adafruit 的分线板[1528-1032-ND],其中已经包含一些正偏电阻。
需注意的寄存器:
0x01 : 0000000X 00011111 : 这里的X是配置中的备用位,默认为0,此为连续轮询模式。温度寄存器会不断更新,但存在功耗问题。将此位设为1将停止轮询并节省功耗。
0x05 : AAASMMMM LLLLLLLL : 该寄存器包含12位浮点温度,其中“A”为报警信息,“S”为符号位,“M”和“L”分别代表MSB和LSB。最终输出将显示为MMMMLLLL.LLLL。
请注意,在本说明中,我没有设置符号位和报警位,但如果你希望测量零下温度,则需要进行设置。
在 Raspberry PI 上的实现:
使用Raspberry Pi与I2C接口相连的好处在于Python终端的交互性。我使用的是在Raspbian发行版上启用了I2C的Raspberry Pi 4 。确保你的GPIO支持3V3、GND、SDA并且SCL支持MCP9808上的正确引脚。在Raspbian中打开终端并执行以下三个命令:
python
from smbus import SMBus
bus = SMBus(1)
该命令将创建一个待连接的总线对象,该对象将反过来收集我们请求的I2C数据。接下来,向芯片询问它的温度数据:
temp_binary = format(bus.read_word_data(0x18, 0x05),‘016b’)
该 bus.read_byte_data(Address, Register) 将从传感器检索数据,我们使用封闭的 format() 函数将信息读取为二进制数,这样是为了使提取这两个字节变得简单。Python通常喜欢使用int或float,但这会造成妨碍,因为会由多个字节返回值。我们将按照 [0:8][8:16] 顺序将其编制索引,而MSB位于数组的后半部分。
计算输出:
我们可以利用以下函数来正确地获取输出值
def word_To_LSB_MSB(word):
return word[0:8], word[12 :16] // note that word indices [8,9,10,11] are not used in this example.
请查看下图,了解我们所需的输出。
最后,将这二者结合在一起,再加上一些浮点运算即可。
LSB, MSB = word_To_LSB_MSB(temp_binary)
float(int(MSB + LSB,2)) / 16
除以16可将结果转为MMMMLLLL.LLLL,并获得十进制精度。注意,返回的结果应以摄氏为单位。在上图所示的情况下,我们从二进制浮动数00010111.0101计算出的温度是23.3125摄氏度。
完成后进入省电模式:
如果你希望在完成操作后关闭器件,只需将待机位设置为省电模式:
bus.write_byte_data(0x18,0x01,0b00000001)
由于只需更改MCP9809配置寄存器中的MSB,所以我们写入一个字节,不过我们将字符缩短了,因此不会更改寄存器中的LSB。
要使MCP9808恢复到完全工作功能状态,必须使传感器获得动力循环或使用寄存器的零刷新模式。
Microchip的规格书在此传感器的应用中仍然非常有用,如果你要使用MCP9808,请务必定期查询。注意,本文未涉及此传感器的一些重要功能,例如中断、负温度的符号位和待机工作。
使用的项:
Raspberry Pi:1690-RASPBERRYPI4B/4GB-ND
母头到公头的面包板线:1568-1511-ND
用于MCP9808的Adafruit分线板:1528-1032-ND
更多编程設計相关技术内容, 请参考下面帖子:
- CY7C68013A-56BAXC 单片机如何编程
- 树莓派操作系统根文件系统编程(Rootfs ROMing)- 如何把它作为RAM磁盘时添加软件包
- PLC上的隐藏编程访问端口
- PIC 微控制器包括 PIC16 和 PIC18 应该使用哪个编程器
- 如何寻找合适的 MCU 编程器
******
如有任何问题,欢迎联系得捷电子DigiKey客服团队。
中国(人民币)客服
- 400-920-1199
- service.sh@digikey.com
- QQ在线实时咨询 |QQ号:4009201199
中国(美金)/ 香港客服
- 400-882-4440
- 8523104-0500
- china.support@digikey.com
到微信搜寻“digikey”或“得捷电子”
关注我们官方微信
并登记成会员,
每周接收工程师秘技,
赚积分、换礼品、享福利