OneWire(1-Wire)DS18B20温度センサをArduinoで使う方法|1Wire通信で温度測定

Arduino

はじめに

本記事では、1-Wire(OneWire)通信対応の DS18B20温度センサー(防水プローブ) を使い、Arduinoで温度測定する方法を紹介します。

この記事を読んでわかること

  • 1-Wire(1wire)通信の基本原理と動作手順
  • DS18B20温度センサの回路接続方法
  • Arduinoへの接続とOneWire通信による温度取得手順
  • 実際の動作結果(シリアルモニタ出力)の見方

使用パーツ

パーツ名数量備考
Arduino UNO R41互換機でも可
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チェックから温度変換、スクラッチパッド読み出し、温度計算と表示までを自前で実装しています。

主な動作の流れ

  1. setup(): センサーアドレスを取得・CRCチェック・シリアル出力
  2. 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通信のプロトコル内容を可視化し、通信の詳細を解析してみる予定です。

コメント

タイトルとURLをコピーしました