はじめに
本記事では、1-Wire(OneWire)通信対応の DS18B20温度センサー(防水プローブ) を使い、Arduinoで温度測定する方法を紹介します。
この記事を読んでわかること
- 1-Wire(1wire)通信の基本原理と動作手順
- DS18B20温度センサの回路接続方法
- Arduinoへの接続とOneWire通信による温度取得手順
- 実際の動作結果(シリアルモニタ出力)の見方
使用パーツ
パーツ名 | 数量 | 備考 |
---|---|---|
Arduino UNO R4 | 1 | 互換機でも可 |
DS18B20 防水温度センサー | 1 | 電源電圧範囲:3.0V-5.5V |
4.7kΩ 抵抗 | 1 | データ線のプルアップ用 ※一般的な定数、5k~20kぐらいであれば動くと思います |
ジャンパーワイヤー | 適量 | 色分け推奨(赤/VCC、黒/GND、黄/DATA) |
ブレッドボード | 1 | 配線確認用 |
実験画像
実験風景です!

温度センサは下記画像のものです!


回路図
DS18B20は電源(VCC)、GND、データ(DATA)の3線構成。
ArduinoのD10ピンをデータ線に使用し、4.7kΩ抵抗で5Vにプルアップします。
回路図は下記です。

プログラム
プログラム全体の動作説明
このコードでは、OneWireライブラリだけを使用して、DS18B20温度センサのユニークアドレス検索、CRCチェックから温度変換、スクラッチパッド読み出し、温度計算と表示までを自前で実装しています。
主な動作の流れ
- setup(): センサーアドレスを取得・CRCチェック・シリアル出力
- loop(): 温度変換コマンド送信 → 待機 → スクラッチパッド読み出し → 生データから°C変換 → 表示
プログラムコード
OneWireライブラリのインストールを忘れないように気をつけてください!
#include<OneWire.h>
// OneWireライブラリを読み込む。DS18B20と通信するために必要
OneWire ds(10); // ピン番号に注意(正しく設定)
// データピンを10番に設定。実際の接続ピンに合わせて変更可能
byte addr[8]; // センサーアドレスを保持
// DS18B20の固有64bitアドレスを格納する配列
void setup(void) {
Serial.begin(9600);
// シリアル通信を9600bpsで開始
Serial.println(“start”);
// 起動メッセージを表示
// センサーの検索(起動時に1回だけ)
if (!ds.search(addr)) {
Serial.println(“No DS18B20 found.”);
// センサーが見つからなかった場合のメッセージ
while (1);
// 無限ループで停止
}
// アドレスのCRCチェック(データ破損防止)
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println(“CRC is not valid!”);
while (1);
// CRCが不一致なら停止
}
Serial.print(“Sensor Address: “);
// センサーのアドレスを出力
for (byte i = 0; i < 8; i++) {
Serial.print(addr[i], HEX); Serial.print(” “);
// アドレスをHEX形式で表示
}
Serial.println();
}
void loop(void) {
byte data[12];
// 温度データを格納する配列
float celsius;
// 温度(摂氏)を格納する変数
ds.reset();
// バスをリセット
ds.select(addr);
// アドレス指定(複数センサがある場合に識別)
ds.write(0x44, 1);
// 温度変換開始コマンドを送信
delay(750);
// 12bit精度では変換に最大750msかかる
ds.reset();
ds.select(addr);
ds.write(0xBE);
// スクラッチパッド(温度データ格納領域)読み出しコマンド
for (byte i = 0; i < 9; i++) {
data[i] = ds.read();
// 9バイト分のデータを順に読み出す
}
int16_t raw = (data[1] << 8) | data[0];
// 上位バイトと下位バイトを結合
celsius = (float)raw / 16.0;
// 16で割ることで摂氏温度に変換
Serial.print(“Temp= “);
Serial.println(celsius);
// 温度をシリアルモニタに出力
delay(1000);
// 1秒間隔で繰り返す
}
動作結果
温度データを取得した、シリアルモニタ画像が下記です。
シリアルモニタには1秒毎に温度が更新表示されます。

まとめ
今回の記事では、温度センサー DS18B20 を使って Arduinoで1-Wire通信による温度測定 を行いました。
温度センサーを使ってデータを正しく読み取ることができました。
次回は、ロジックアナライザを使って1-Wire通信のプロトコル内容を可視化し、通信の詳細を解析してみる予定です。
コメント