AtomS3 LiteとDS18B20で温度測定できずにハマった

# はじめに
WiFi接続で外の温度を測るためにAtomS3 Lite + DS18B20で測定ノードを組んだが難航中。
色々ソフトをひねくり返してM5.beginが原因のようだと判断しました。
なんとか動きました。

## ハードの説明
AtomS3 Lite
DS18B20
ATOMICプロトキット
　温度センサDS18B20 DQ端子をプルアップ抵抗4.7kΩを内蔵して3.3Vに接続
　5V,GNDを引き出してニッケル水素電池×４本で駆動
　部品故障時はVH-3.96コネクタの端子ネジを緩めて交換、ハンダいらず
EXT.IO2
　I2C接続で8チャネル入出力に拡張

![IMG_9072.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586414/fcdf6f32-6fb4-36ed-8abd-a166191fb424.jpeg)

## ソフトの説明
　Arudino IDE 2.3.2
　M5AtomS3 1.0.0
　DallasTemperature 3.9.0
　M5Unified 0.1.16
　M5Unit-EXTIO2 1.0.3

## サンプルプログラム
[Arduino+DS18B20で温度測定してみた](https://qiita.com/hnw/items/315fad0d4b60ada10d00)を参考にしています。
GPIOはG5です
```
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 5 on the Arduino
#define ONE_WIRE_BUS 5

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");

  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));

  delay(500);
}
```

正常な出力です
```
Temperature for the device 1 (index 0) is: 29.50
Requesting temperatures...DONE
Temperature for the device 1 (index 0) is: 29.50
Requesting temperatures...DONE
Temperature for the device 1 (index 0) is: 29.50
Requesting temperatures...DONE
Temperature for the device 1 (index 0) is: 29.50
Requesting temperatures...DONE
```
これにM5.unified.hをつけてM5.beginを実行すると
```
#include <M5Unified.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 5 on the Arduino
#define ONE_WIRE_BUS 5

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  auto cfg = M5.config(); // 設定用の構造体を代入。
  cfg.serial_baudrate = 9600;
  M5.begin(cfg);
  // start serial port
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");

  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));

  delay(500);
}
```
-127.00℃　ぇぇぇぇなんで
```
Requesting temperatures...res...DONE
Temperature for the device 1 (index 0) is: -127.00
Requesting temperatures...DONE
Temperature for the device 1 (index 0) is: -127.00
Requesting temperatures...DONE
Temperature for the device 1 (index 0) is: -127.00
Requesting temperatures...DONE
Temperature for the device 1 (index 0) is: -127.00
```

AtomS3の内臓スイッチも使いたいのでコレ困る。
M5Unifiedの完成度かと考えて#include AtomS3.hに置き換えても-127.00℃。
ハードの初期化がらみかな。
しばらく仕様書読んで試行錯誤です。

## 追記2024/07/31　初期化コードを追加して動いた

[ののやま様がM5stack用に書かれたコード](https://zenn.dev/nono_tech/articles/372ea290cb2e02)をよく見て・・・
pinMode(ONE_WIRE_BUS,INPUT); 
sensors.begin();
の順番で初期化
```
#include <M5Unified.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 5 on the Arduino
#define ONE_WIRE_BUS 5

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  auto cfg = M5.config(); // 設定用の構造体を代入。
  cfg.serial_baudrate = 9600;
  M5.begin(cfg);
  // start serial port
  Serial.println("Dallas Temperature IC Control Library Demo");
  pinMode(ONE_WIRE_BUS,INPUT); //【農系IoT】より初期化コード追加

  // Start up the library
  sensors.begin();
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");

  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));

  delay(500);
}
```
動いた。長かった。
```
Temperature for the device 1 (index 0) is: 29.50
Requesting temperatures...DONE
Temperature for the device 1 (index 0) is: 29.50
Requesting temperatures...DONE
Temperature for the device 1 (index 0) is: 29.50
Requesting temperatures...DONE
Temperature for the device 1 (index 0) is: 29.50
```
DallasTemperatureのサイトに「動かないときは各処理系で聞いてね（意訳）」とあったのはこういうことか。本番プログラムに移植してWiFi飛ばします。