參考資料
https://blog.csdn.net/m0_67258728/article/details/128691546?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-128691546-blog-115401631.235%5Ev40%5Epc_relevant_rights_sort&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-128691546-blog-115401631.235%5Ev40%5Epc_relevant_rights_sort&utm_relevant_index=7
https://blog.csdn.net/m0_49475727/article/details/115401631
電池電量計算方式
以鋰錳鈕扣 CR2025 電池 100% 電量時電壓為 3V、0% 電量時電壓為 2V 計算,請根據您使用的電池修改公式。
程式碼的詳細解說
# 引入必要的模組
from dataclasses import dataclass
import time
from bleak import BleakClient
import asyncio
# 溫溼度計 MAC 位址 (請記得替換)
Mac = "A4:C1:38:AA:BB:CC"
# 定義一個結果的資料結構,使用 dataclass 來方便地建立一個具有固定屬性的類別
@dataclass
class Result:
temperature: float # 溫度
humidity: int # 濕度
voltage: float # 電壓
battery: int = 0 # 電池
# 定義異步函數 main,用來執行主要的藍牙連線和數據讀取工作
async def main(address):
# 創建 BleakClient 實例,並設定連線超時時間
client = BleakClient(address, timeout=30.0)
# 連線到藍牙設備
await client.connect()
print("藍牙連線成功!")
while (1):
# 讀取指定 GATT 特徵的數據
buff = await client.read_gatt_char("ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6")
try:
# 初始化 Result 物件
result = Result(0, 0, 0, 0)
# 解析接收到的數據
temp = int.from_bytes(buff[0:2], byteorder='little', signed=True) / 100
humidity = int.from_bytes(buff[2:3], byteorder='little')
voltage = int.from_bytes(buff[3:5], byteorder='little') / 1000
battery = round((voltage - 2) / (3 - 2) * 100, 2)
# 將解析後的數據存入 Result 物件
result.temperature = temp
result.humidity = humidity
result.voltage = voltage
result.battery = battery
# 顯示解析結果
print(result)
except Exception as e:
print(e)
# 每秒鐘暫停一次
time.sleep(1)
# 執行主函數,開始藍牙連線和數據讀取
asyncio.run(main(Mac))
這個程式碼的目的是使用 Bleak 庫與米家藍牙溫濕度計2建立連線,並從特定的 GATT 特徵中讀取數據。解析數據後,將其存入 Result 物件並顯示在螢幕上。這是一個基於異步 I/O 的程式,可實現非阻塞的藍牙數據讀取。