main.go (1368B)
1 // Copyright 2020 by Brian C. Lane <bcl@brianlane.com>. All rights reserved. 2 // Use of this source code is governed under the Apache License, Version 2.0 3 // that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "fmt" 9 "log" 10 "time" 11 12 "periph.io/x/periph/conn/i2c/i2creg" 13 "periph.io/x/periph/host" 14 15 "github.com/bcl/air-sensors/pmsa003i" 16 ) 17 18 func main() { 19 // Make sure periph is initialized. 20 if _, err := host.Init(); err != nil { 21 log.Fatal(err) 22 } 23 24 // Open a handle to the first available I²C bus: 25 bus, err := i2creg.Open("") 26 if err != nil { 27 log.Fatal(err) 28 } 29 defer bus.Close() 30 31 d, err := pmsa003i.New(bus) 32 if err != nil { 33 log.Fatal(err) 34 } 35 36 for start := time.Now(); time.Since(start) < time.Second*30; { 37 time.Sleep(1 * time.Second) 38 39 // Read the PMSA003i sensor data 40 r, err := d.ReadSensor() 41 if err != nil { 42 // Checksum failures could be transient 43 fmt.Println(err) 44 } else { 45 fmt.Println() 46 fmt.Printf("PM1.0 %3d μg/m3\n", r.EnvPm1) 47 fmt.Printf("PM2.5 %3d μg/m3\n", r.EnvPm2_5) 48 fmt.Printf("PM10 %3d μg/m3\n", r.EnvPm10) 49 fmt.Println("Counters in 0.1L of air") 50 fmt.Printf("%d > 0.3μm\n", r.Cnt0_3) 51 fmt.Printf("%d > 0.5μm\n", r.Cnt0_5) 52 fmt.Printf("%d > 1.0μm\n", r.Cnt1) 53 fmt.Printf("%d > 2.5μm\n", r.Cnt2_5) 54 fmt.Printf("%d > 5.0μm\n", r.Cnt5) 55 fmt.Printf("%d > 10μm\n", r.Cnt10) 56 } 57 } 58 }