Đăng bởi Để lại phản hồi

Đọc dữ liệu cảm biến CO2, Nhiệt độ, HCHO, TVOC từ cảm biến WP06003 thông qua BLE

Đọc dữ liệu của cảm biến nồng độ carbon dioxide (CO2) WP6003 thông qua BLE. WP6003 là một cảm biến giá rẽ. Bạn có thể mua nó tại FUVITECH.

Ngoài CO2, bạn có thể đọc các thông số TVOC, HCHO, nhiệt độ. Tôi có thể đọc dữ liệu bằng ứng dụng điện thoại thông minh, nhưng tôi đọc nó qua BLE vì ứng dụng gốc đi theo cảm biến thì hoạt động không mượt cho lắm.

Cảm biến và app

Chuẩn bị

Bạn hãy thử kết nối thiết bị với BLE Scanner và bạn sẽ thấy địa chỉ của nó với đầu 6003# …. .

Dữ liệu kèm theo

Dữ liệu có tổng cộng 18 byte và có vẻ ở định dạng sau (một số không xác định). TVOC và HCHO có thể ngược lại.

  • 6 byte: Dấu thời gian 0x0a (?), Năm (2 chữ số), tháng, ngày, giờ và phút được thể hiện bằng 1 byte mỗi
  • 2 byte: Nhiệt độ (đơn vị 0,1 ° C)
  • 2 byte: không xác định
  • 2 byte: TVOC (0,001 mg / m3)
  • 2 byte: HCHO (0,001 mg / m3)
  • 2 byte: không xác định (0100)
  • 2 byte: nồng độ CO2 (ppm)

Code Python và Arduino

https://github.com/zu2/wp6003

Code Python

# -*- coding: utf-8 -*-
import Adafruit_BluefruitLE, uuid
from Adafruit_BluefruitLE.services import UART, DeviceInformation
import struct
import atexit
import time
import datetime
 
DEVICE  = '6003#XXXXXXXXXXXXX' # デバイス名
SERVICE = uuid.UUID('0000FFF0-0000-1000-8000-00805F9B34FB')
SENSOR  = uuid.UUID('0000FFF4-0000-1000-8000-00805F9B34FB')
  
provider = Adafruit_BluefruitLE.get_provider()
provider.initialize()
 
def main():
    adapter = provider.get_default_adapter()
    adapter.power_on()
    print('adapter:', adapter.name)
    try:
        print('adapter.start_scan()')
        adapter.start_scan()
        atexit.register(adapter.stop_scan)
        known_uarts = set()
        isnotFound = True
        while(isnotFound):
            found = set(provider.find_devices())
            new = found - known_uarts
            for device in new:
                print('Found device: {0} [{1}]'.format(device.name, device.id))
                if(device.name == DEVICE): 
                    print('connecting...')
                    device.connect()
                    print('connected.')
                    isnotFound = False
                    adapter.stop_scan()
            known_uarts.update(new)
            time.sleep(0.5)
        if device is None:
            raise RuntimeError('Failed to find UART device!')
    finally:
        adapter.stop_scan()
  
    print(device.name)
  
    device.discover([SERVICE],[SENSOR])
    service = device.find_service(SERVICE)
    print('got service',SERVICE)
    sensor = service.find_characteristic(SENSOR)
    print('got characteristic',SENSOR)
  
    def received(data):
        dt_now = datetime.datetime.now()
        print('Notify:',dt_now,' ',data.hex())
        print('Time: 20',data[1],'年',data[2],'月',data[3],'日', data[4],':',data[5])
        print('Temp:',(data[6]*256+data[7])/10,'℃')
        print('TVOC:',(data[10]*256+data[11])/1000,'mg/㎥')
        print('HCHO:',(data[12]*256+data[13])/1000,'mg/㎥')
        print('CO2 :',(data[16]*256+data[17]),'ppm')
 
    sensor.start_notify(received)
    print('start notifications.')
    while (True):
        time.sleep(5)
  
provider.run_mainloop_with(main)

Trả về kết quả:

Chúc các bạn thành công!

Dịch và chỉnh nội dung: FUVITECH. Nguồn zukeran.org