# PMS5003T on Go ###### tags: `Go`,`Raspberry Pi`, `PMS5003T` ``` PIN GPIO 1 -> VCC -> 2 2 -> GND -> 14 4 -> RX -> 8 5 -> TX -> 10 ``` ``` go package aqi import ( "fmt" "strconv" "time" "github.com/goburrow/serial" ) func GetAQIData() (int, int, int, float64, float64) { data := getData(5) pm1 := to_i(data, 10) pm25 := to_i(data, 12) pm10 := to_i(data, 14) temperature := float64(to_i(data, 24)) / 10.0 humidity := float64(to_i(data, 26)) / 10.0 return pm1, pm25, pm10, temperature, humidity } func getData(retry int) []byte { var data = make([]byte, 32) port := getPort() defer port.Close() _, err := port.Read(data) printError(err) dataStr := to_hex(data) // 檢查碼 若遇到錯誤 重試 if dataStr[:2] != "42" || dataStr[2:4] != "4d" { if retry > 0 { sleep(5000) getData(retry - 1) } } return data } func getPort() serial.Port { port, err := serial.Open( &serial.Config{ Address: "/dev/ttyS0", BaudRate: 9600, Timeout: 1 * time.Second, }) printError(err) sleep(800) return port } func to_hex(data []byte) string { return fmt.Sprintf("%x", data) } func to_i(data []byte, idx int) int { data = data[idx : idx+2] n, _ := strconv.ParseUint(to_hex(data), 16, 10) return int(n) } func sleep(t int) { time.Sleep(time.Duration(t) * time.Millisecond) } func printError(err error) { if err != nil { fmt.Println(err) } } ```