引言
最近入手了一个米家温湿度计2,今天介绍一下如何使用Python获取它的数据。
实验过程
我们使用到了python的bluepy模块,用以连接蓝牙设备。
温度、湿度和电压数据获得
我们可以直接通过蓝牙直接获取温度、湿度和电压的数据,得到的为bytes格式:
temp=int.from_bytes(data[0:2],byteorder='little',signed=True)/100
humidity=int.from_bytes(data[2:3],byteorder='little')
voltage=int.from_bytes(data[3:5],byteorder='little') / 1000
电池电量百分比显示
由于设备并没有提供电池电量百分比数据,我们可以自己进行计算,公式如下:
米家温湿度计使用的是一个CR2032纽扣电池,首次开机测得的电池电压为3.261V(不同的设备不同,可结合自己的情况),在网上查到CR2032纽扣电池的放电曲线如下:
由图中可以得到,电池放电的截止电压约为2V,所以我们可以得到纽扣电池的电量百分比:
battery = round((voltage - 2) / (3.261 - 2) * 100, 2)
由此我们便得到了所有的数据
完整代码
from bluepy import btle
from dataclasses import dataclass
mac = "A4:C1:38:BE:C9:D5"
@dataclass
class Result:
temperature: float
humidity: int
voltage: float
battery: int = 0
class Measure(btle.DefaultDelegate):
def __init__(self, params):
btle.DefaultDelegate.__init__(self)
def handleNotification(self, cHandle, data):
try:
result = Result(0,0,0,0)
temp=int.from_bytes(data[0:2],byteorder='little',signed=True)/100
humidity=int.from_bytes(data[2:3],byteorder='little')
voltage=int.from_bytes(data[3:5],byteorder='little') / 1000
battery = round((voltage - 2) / (3.261 - 2) * 100, 2)
result.temperature = temp
result.humidity = humidity
result.voltage = voltage
result.battery = battery
print(result)
except Exception as e:
print(e)
def connect():
p = btle.Peripheral(mac)
p.writeCharacteristic(0x0038, b'\x01\x00', True)
p.writeCharacteristic(0x0046, b'\xf4\x01\x00', True)
p.withDelegate(Measure("mijia"))
return p
p = connect()
if p.waitForNotifications(3000):
p.disconnect()
下面是我自己运营的微信小程序“但行趣事”和公众号“是雯子吖”,更多的技术文章以及视频我会放到小程序和公众号当中,有志同道合的小伙伴也可以在小程序(联系客服按钮)或者公众号(直接留言)当中联系我们
![]() |
![]() |