採集PMS7003 顆粒度傳感器數據,顯示在TFT屏幕上,並通過webapi上傳(1/2)

PMS7003採集

整體介紹

樹莓派+PMS7003+1.44寸TFT屏幕
20秒採集一次數據
60秒鐘上傳一次心跳
語言:python
接口:webapi post

PMS7003傳感器介紹

Dust Sensor - PMS 5003/6003/7003: 數據鏈接.
PMS 7003: github鏈接.

數據位介紹

以下是PMS7003的數據位。
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

採集方法

由於PMS7003的傳輸過來數據需要先轉換成16進制 才能被程序計算,所以前置步驟,需要進行轉換。

# 字符轉換16 進制
def hexShowNew(argv):  
    try:
        result = ''
        hLen = len(argv)
        for i in range(hLen):
            hvol = argv[i]
            hhex = '%02x' % hvol
            result += hhex + ' '
        # print(result)
        return result
    except:
        pass

同時數據傳輸過來的話可能異常數據,所以一定要計算校驗位。
一共32個數據,前30個數據想加的值,是否等於後2個數據的值。
我這邊圖方便,全部轉換成10進制數據來計算。

 for index in range(0,29) :
       checksum += int(strarr[index],16)

其中這些數據是我們要的:

pm1point0 = strarr[4] + strarr[5]#pm1.0
pm2point5 = strarr[6] + strarr[7]#pm2.5
pm10 = strarr[8] + strarr[9]#pm10
pm1point0air = strarr[10] + strarr[11]#pm1.0
pm2point5air = strarr[12] + strarr[13]#pm2.5
pm10air = strarr[14] + strarr[15]#pm10
um0point3 = strarr[16] + strarr[17]#0.3um顆粒
um0point5 = strarr[18] + strarr[19]#0.5um顆粒
um1point0 = strarr[20] + strarr[21#1.0um顆粒
um2point5 = strarr[22] + strarr[23]#2.5um顆粒
um5point0 = strarr[24] + strarr[25]#5.0um顆粒
um10 = strarr[26] + strarr[27]#10um顆粒

以下是程序源碼:

# -*- coding: utf-8 -*
# python -u 啓動,禁用stdout緩衝功能,不然打印有延時。
import serial
import time
import sys
import socket
import json
import requests

# 
class ParticleOutputModel:
    hostname = ''
    uuid = ''
    machinetype = '' 
    flag = ''
    pm1point0 = 0
    pm2point5 = 0 
    pm10 = 0
    pm1point0air = 0 
    pm2point5air = 0 
    pm10air = 0 
    over0point3um = 0 
    over0point5um = 0 
    over1point0um = 0 
    over2point5um = 0 
    over5point0um = 0 
    over10um = 0

    def __init__(self,hostname,uuid,machinetype,flag,pm1point0,pm2point5,pm10,pm1point0air,pm2point5air,pm10air,over0point3um,over0point5um,over1point0um,over2point5um,over5point0um,over10um):
        self.hostname = hostname
        self.uuid = uuid
        self.machinetype = machinetype 
        self.flag = flag
        self.pm1point0 = pm1point0
        self.pm2point5 = pm2point5 
        self.pm10 = pm10
        self.pm1point0air = pm1point0air 
        self.pm2point5air = pm2point5air 
        self.pm10air = pm10air 
        self.over0point3um = over0point3um 
        self.over0point5um = over0point5um 
        self.over1point0um = over1point0um 
        self.over2point5um = over2point5um 
        self.over5point0um = over5point0um 
        self.over10um = over10um

# 打開串口
ser = serial.Serial("/dev/ttyAMA0", 9600)

def is_open(filename):
 
    try:
        vHandle =win32file.CreateFile(filename, GENERIC_READ, 0, None, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, None)
        if int(vHandle)==INVALID_HANDLE_VALUE:
            print("# file is already open")
            return True  # file is already open
        win32file.CloseHandle(vHandle)
 
    except Exception as e:
        print(e)
        return True

# 16 進制
def hexShowNew(argv): 
    try:
        result = ''
        hLen = len(argv)
        for i in range(hLen):
            hvol = argv[i]
            hhex = '%02x' % hvol
            result += hhex + ' '
        # print(result)
        return result
    except:
        pass

# main方法:
def main():
    host = 'localhost'
    port = 7002
    while True:
        try:
            print("create connection success")

            while True:
                count = ser.inWaiting()
                if count > 30:
                    # 讀取內容並回顯
                    recv = ser.read(count)
                    strvalue = hexShowNew(recv)
                    strarr = strvalue.split()

                    if (len(strarr) == 32):
                        print("################################")
                    print("load data success")

                    checksum=0
                    for index in range(0,29) :
                        checksum += int(strarr[index],16)
                    
                    print("checksum")
                    print(checksum)

                    print("systemchecksum")
                    syschecksum = int(str(strarr[30])+str(strarr[31]),16)
                    print(syschecksum)

                    if checksum == syschecksum:
                        print("checksum is success")

                        pm1point0 = strarr[4] + strarr[5]
                        pm2point5 = strarr[6] + strarr[7]
                        pm10 = strarr[8] + strarr[9]
                        pm1point0air = strarr[10] + strarr[11]
                        pm2point5air = strarr[12] + strarr[13]
                        pm10air = strarr[14] + strarr[15]
                        um0point3 = strarr[16] + strarr[17]
                        um0point5 = strarr[18] + strarr[19]
                        um1point0 = strarr[20] + strarr[21]
                        um2point5 = strarr[22] + strarr[23]
                        um5point0 = strarr[24] + strarr[25]
                        um10 = strarr[26] + strarr[27]
                 
                        resultstr = "<ParticleDetection><Flag>[Flag]</Flag><PM1.0>[PM1.0]</PM1.0><PM2.5>[PM2.5]</PM2.5><PM10>[PM10]</PM10><PM1.0air>[PM1.0air]</PM1.0air><PM2.5air>[PM2.5air]</PM2.5air><PM10air>[PM10air]</PM10air><over0.3um>[over0.3um]</over0.3um><over0.5um>[over0.5um]</over0.5um><over1.0um>[over1.0um]</over1.0um><over2.5um>[over2.5um]</over2.5um><over5.0um>[over5.0um]</over5.0um><over10um>[over10um]</over10um></ParticleDetection>"
                        resultstr = resultstr.replace("[Flag]", "success")
                        resultstr = resultstr.replace("[PM1.0]", str(int(pm1point0, 16)))
                        resultstr = resultstr.replace("[PM2.5]", str(int(pm2point5, 16)))
                        resultstr = resultstr.replace("[PM10]", str(int(pm10, 16)))
                        resultstr = resultstr.replace("[PM1.0air]", str(int(pm1point0air, 16)))
                        resultstr = resultstr.replace("[PM2.5air]", str(int(pm2point5air, 16)))
                        resultstr = resultstr.replace("[PM10air]", str(int(pm10air, 16)))
                        resultstr = resultstr.replace("[over0.3um]", str(int(um0point3, 16)))
                        resultstr = resultstr.replace("[over0.5um]", str(int(um0point5, 16)))
                        resultstr = resultstr.replace("[over1.0um]", str(int(um1point0, 16)))
                        resultstr = resultstr.replace("[over2.5um]", str(int(um2point5, 16)))
                        resultstr = resultstr.replace("[over5.0um]", str(int(um5point0, 16)))
                        resultstr = resultstr.replace("[over10um]", str(int(um10, 16)))
                        
                        
                        x = ParticleOutputModel("raspberry","sssss","machinetype","success",int(pm1point0, 16),int(pm2point5, 16),int(pm10, 16),int(pm1point0air, 16),int(pm2point5air, 16),int(pm10air, 16),int(um0point3, 16),int(um0point5, 16),int(um1point0, 16),int(um2point5, 16),int(um5point0, 16),int(um10, 16))
                        #對象序列化
                        x= x.__dict__
                        json_str = json.dumps(x,ensure_ascii=False,indent=4)
                        
                        try:
                            with open('./data.json', 'w') as file_object:
                                file_object.write(json_str)
                        except:
                            print('error:') 
                        
                        headers = {'Content-Type': 'application/json'}
                        r = requests.post("http接口", data=json_str, headers=headers,timeout=5)
                        print("send success")
                        time.sleep(20)
                    else:
                        time.sleep(2)
                        print("checksum is error")

                else:
                    print("load data fail, no transaction")
                    ser.flushInput()
                    time.sleep(0.5)
                
        except:
            print("exception")
            time.sleep(20)


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        if ser != None:
            ser.close()



最後會先保存一份json文件在本地,同時調用Post接口傳到接口,存到數據庫中。
有另一個程序會把存在本地的json文件,讀取出來,並顯示在1.44寸的TFT屏幕界面上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章