ArduinoでDHT11を使って室温を取得し、Mackerelに投稿する
ELEGOO Arduino用UNO R3スターターキットに同梱されている、気温と湿度を測れるやつ(DHT11 Temperature and Humidity module)で取得した気温をMackerelに投稿してみた。
まずは説明書通り簡単な回路を組んでArdunio IDEで実行する。
スターターキットに同梱されているサンプルコードの出力を、Serial.println(temperature)
だけにしてシンプルにしておいた。
~/desktop/mackerel-plugin-dht $ git diff DHT11.ino diff --git a/DHT11.ino b/DHT11.ino index c4c54ac..f80e18a 100644 --- a/DHT11.ino +++ b/DHT11.ino @@ -48,6 +48,10 @@ void loop( ) true, then a measurement is available. */ if( measure_environment( &temperature, &humidity ) == true ) { + Serial.println(temperature); - Serial.print( "T = " ); - Serial.print( temperature, 1 ); - Serial.print( " deg. C, H = " ); - Serial.print( humidity, 1 ); - Serial.println( "%" ); } }
Mackerelへの投稿は、go-mackerel-pluginを利用してカスタムメトリックプラグインを作成して行う。
シリアル通信の受信は、go.bug.st/serialを利用するとできる。
他の人が使うことを考慮していないため、ポートのパスはベタ書きした。
scanner.Scan()
した1行目の値の表記がおかしかったので、2行目の値を投稿することにした。
注意点として、killしないと受信できない。
~/desktop $ lsof | grep usbmodem serial-mo 22338 wafuwafu13 3u CHR 9,5 0t7 723 /dev/cu.usbmodem1101 ~/desktop $ kill 22338
func (u DhtPlugin) FetchMetrics() (map[string]float64, error) { mode := &serial.Mode{ BaudRate: 9600, } port, err := serial.Open("/dev/cu.usbmodem1101", mode) if err != nil { return nil, fmt.Errorf("Failed to open port: %s", err) } scanner := bufio.NewScanner(port) scanner.Split(bufio.ScanLines) var degrees []string for scanner.Scan() { degrees = append(degrees, scanner.Text()) if len(degrees) == 2 { break } } degree, _ := strconv.ParseFloat(degrees[1], 64) return map[string]float64{"degrees": degree}, nil }
ビルドして、パスを設定ファイルに追加する。
[plugin.metrics.dht]
command = "/Users/wafuwafu13/Desktop/mackerel-plugin-dht/mackerel-plugin-dht"
室温は18℃だった。ストーブに近づけたら47℃まで上がった。
使用したコードはこちら。
github.com