多点の温度計測をする。

# はじめに
多点の温度計測（５点程度）が必要になった。
ネットワーク越しに値が見たい
計測先はWiFiなのでIPアドレスがかわる

多点なのでOneWire

https://amzn.asia/d/cPXfN9E

機器PC、マイコンは　以下の３台
1. 設定用　分解能設定--> M5Stack Basic
2. 温度計測側
2. データ受信側（ベータベース・可視化）

# 設定用(Arduino)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/92bfd14b-0151-33bf-642b-efe1ef027373.png)
## 目的
センサー１個つないで以下のことができる
- センサー動作確認（温度表示）
- センサー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
- 基板
    - Port 2(UART)に接続
    - DinはGrove2番ピン（RaspberryPiのPin4)
    - DCDCコンバータ(秋月電子 K-16055)で電圧を3.3Vに下げる。
    - PullUP抵抗は4.7k
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/2437b405-1361-17de-d893-177a4ce925e0.png)


## Setup
- オリジナルのRasbian（M5StackのカスタムOSではなぜか１Wire動かず）
    - FANの設定
    - 音は出ない
    - 本体の表示ない
- NTPの設定
    - /etc/systemd/timesyncd.conf　内のFallbackNTPのコメントを外して設定、再起動
- WiFi IEEE802.1Xの認証設定
    - 今回はネットがこれのせいでRasPIを使っている
    - いろいろなサイトを検索しながら。。。
    - パスワードをハッシュしないといけなかった。
- Node-REDのインストール
## Node-RED
- サービスでスタートさせる。
- node-red-contrib-ds18b20-sensor　パレット追加

InfluxDBは```Influx Batch```ノードを使用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/c2849308-4338-dab6-8dfa-8b3a64af442e.png)


### Inject
測定タイミングになる。
開始後５秒と５分間隔を設定

### rpi-ds18b20
rpi-ds18b20 はArrayにチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/a6ff92bf-691b-0777-2c2a-f4b8d7a9c0b9.png)

### 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"
  )
```
![Web キャプチャ_20-7-2023_193628_10.96.100.114.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/55a2109f-e8bf-6b54-08a6-f7c9fb224dfd.jpeg)