code.py
1 # SPDX-FileCopyrightText: 2017 Limor Fried for Adafruit Industries 2 # 3 # SPDX-License-Identifier: MIT 4 5 try: 6 import struct 7 except ImportError: 8 import ustruct as struct 9 10 # Connect the sensor TX pin to the board/computer RX pin 11 # For use with a microcontroller board: 12 import board 13 import busio 14 uart = busio.UART(board.TX, board.RX, baudrate=9600) 15 16 # For use with Raspberry Pi/Linux: 17 # import serial 18 # uart = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=0.25) 19 20 # For use with USB-to-serial cable: 21 # import serial 22 # uart = serial.Serial("/dev/ttyUSB0", baudrate=9600, timeout=0.25) 23 24 buffer = [] 25 26 while True: 27 data = uart.read(32) # read up to 32 bytes 28 data = list(data) 29 # print("read: ", data) # this is a bytearray type 30 31 buffer += data 32 33 while buffer and buffer[0] != 0x42: 34 buffer.pop(0) 35 36 if len(buffer) > 200: 37 buffer = [] # avoid an overrun if all bad data 38 if len(buffer) < 32: 39 continue 40 41 if buffer[1] != 0x4d: 42 buffer.pop(0) 43 continue 44 45 frame_len = struct.unpack(">H", bytes(buffer[2:4]))[0] 46 if frame_len != 28: 47 buffer = [] 48 continue 49 50 frame = struct.unpack(">HHHHHHHHHHHHHH", bytes(buffer[4:])) 51 52 pm10_standard, pm25_standard, pm100_standard, pm10_env, \ 53 pm25_env, pm100_env, particles_03um, particles_05um, particles_10um, \ 54 particles_25um, particles_50um, particles_100um, skip, checksum = frame 55 56 check = sum(buffer[0:30]) 57 58 if check != checksum: 59 buffer = [] 60 continue 61 62 print("Concentration Units (standard)") 63 print("---------------------------------------") 64 print("PM 1.0: %d\tPM2.5: %d\tPM10: %d" % 65 (pm10_standard, pm25_standard, pm100_standard)) 66 print("Concentration Units (environmental)") 67 print("---------------------------------------") 68 print("PM 1.0: %d\tPM2.5: %d\tPM10: %d" % (pm10_env, pm25_env, pm100_env)) 69 print("---------------------------------------") 70 print("Particles > 0.3um / 0.1L air:", particles_03um) 71 print("Particles > 0.5um / 0.1L air:", particles_05um) 72 print("Particles > 1.0um / 0.1L air:", particles_10um) 73 print("Particles > 2.5um / 0.1L air:", particles_25um) 74 print("Particles > 5.0um / 0.1L air:", particles_50um) 75 print("Particles > 10 um / 0.1L air:", particles_100um) 76 print("---------------------------------------") 77 78 buffer = buffer[32:] 79 # print("Buffer ", buffer)