経験は何よりも饒舌

10年後に真価を発揮するかもしれないブログ 

ArduinoでDHT11を使って室温を取得し、Mackerelに投稿する

ELEGOO Arduino用UNO R3スターターキットに同梱されている、気温と湿度を測れるやつ(DHT11 Temperature and Humidity module)で取得した気温をMackerelに投稿してみた。

まずは説明書通り簡単な回路を組んでArdunio IDEで実行する。

Elegoo Uno R3 + DHT11 + F-M wires

スターターキットに同梱されているサンプルコードの出力を、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