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)