はじめに
多点の温度計測(5点程度)が必要になった。
ネットワーク越しに値が見たい
計測先はWiFiなのでIPアドレスがかわる
多点なのでOneWire
機器PC、マイコンは 以下の3台
- 設定用 分解能設定--> M5Stack Basic
- 温度計測側
- データ受信側(ベータベース・可視化)
設定用(Arduino)
目的
センサー1個つないで以下のことができる
- センサー動作確認(温度表示)
- センサーID表示
- 精度(分解能)を9ビットにセットする。
Hardware
M5Stack Basic
基板 27PinにDin
PullUp抵抗 4.7kΩ
Library
M5Stack
DallasTemperature
スケッチ
#include <M5Stack.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// DS18B20のデータピンを指定します
const int oneWireBus = 26;
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);
TFT_eSprite spr1 = TFT_eSprite(&M5.Lcd);
TFT_eSprite spr2 = TFT_eSprite(&M5.Lcd);
void setup() {
// M5Stackの初期化
M5.begin();
//音が出るのでMute
M5.Speaker.begin();
M5.Speaker.mute();
// シリアル通信を開始します
Serial.begin(9600);
spr1.setColorDepth(8);
spr1.createSprite(320, 50);
spr2.setColorDepth(8);
spr2.createSprite(320, 100);
// DS18B20のセンサーを開始します
sensors.begin();
}
void loop() {
char buf[25];
spr1.fillRect(0, 0, 320, 50, TFT_BLACK);
spr2.fillRect(0, 0, 320, 100, TFT_BLACK);
// センサーから温度を読み取ります
sensors.requestTemperatures();
sensors.setResolution(9);
// センサーの数を取得します
int sensorCount = sensors.getDeviceCount();
// 各センサーの温度を表示します
for (int i = 0; i < sensorCount; i++) {
// センサーのアドレスを取得します
DeviceAddress sensorAddress;
sensors.getAddress(sensorAddress, i);
sprintf(buf, "%02x-%02x%02x%02x%02x%02x%02x ", sensorAddress[0], sensorAddress[6], sensorAddress[5], sensorAddress[4], sensorAddress[3], sensorAddress[2], sensorAddress[1]);
// 温度を取得します
float temperature = sensors.getTempCByIndex(i);
// シリアルモニタに温度を表示します
Serial.print(buf);
Serial.print("Sensor ");
Serial.print(i + 1);
Serial.print(" temperature: ");
Serial.print(temperature);
Serial.println("°C");
spr1.setTextSize(2);
spr1.setTextDatum(TC_DATUM);
spr1.setTextColor(TFT_WHITE, TFT_BLACK);
spr1.drawString(buf, 0, 0, 2);
spr2.setTextSize(2);
spr2.setTextDatum(TC_DATUM);
spr2.setTextColor(TFT_WHITE, TFT_BLACK);
spr2.drawFloat(temperature, 2, 0, 0, 7);
}
spr1.pushSprite(0, 20);
spr2.pushSprite(0, 100);
// M5Stackの更新処理
M5.update();
Serial.println("----");
// 1秒待ちます
delay(500);
}
測定器(RaspberryPI (M5Stack CM4Stack))
目的
- 本番のセンシング
- 温度センサー 5本以上
HardWare
- CM4STACK
- 基板
Setup
- オリジナルのRasbian(M5StackのカスタムOSではなぜか1Wire動かず)
- FANの設定
- 音は出ない
- 本体の表示ない
- NTPの設定
- /etc/systemd/timesyncd.conf 内のFallbackNTPのコメントを外して設定、再起動
- WiFi IEEE802.1Xの認証設定
- 今回はネットがこれのせいでRasPIを使っている
- いろいろなサイトを検索しながら。。。
- パスワードをハッシュしないといけなかった。
- Node-REDのインストール
Node-RED
- サービスでスタートさせる。
- node-red-contrib-ds18b20-sensor パレット追加
Inject
測定タイミングになる。
開始後5秒と5分間隔を設定
rpi-ds18b20
Function
cm4_1とRoom1は適宜変更
let newMsg = {};
let datas= new Array();
for(let i=0;i<msg.payload.length;i++){
let data ={};
data= {
measurement:"cm4_1",
fields:{
Temp:msg.payload[i].temp
},
tags:{
Room:"Room1",
Sensor:msg.payload[i].file
},
timestamp: new Date()
};
datas.push(data);
}
newMsg.payload=datas;
return newMsg;
InfluxDB
- Version2で設定
- WiFiで8086ポートが通らないので8080ポートに変更
データ受信側(ベータベース・可視化)
Software
- Ubuntu 22.04LTS
- InfluxDB
- Grafana
InfluxDB
- 設定
- WiFiのFirewallで8086ポートがつぶされていたので8080ポートに設定
- /etx/influxdb/config.toml に
http-bind-address = ":8080"
を追加
Grafana
クエリ
from(bucket: "bucket1")
|> range(start: -1d)
|> filter(fn: (r) =>
r._measurement == "cm4_1" and
r._field == "Temp"
)