稼働中

Raspberry Pi Pico(d_04)DS18B20 1wire 温度センサー(1)

DS18B20 1wire 温度センサー

MAXIM Programmable Resolution 1-Wire Digital Thermometer
DS18B20は1-Wireディジタル温度計です。
1本の信号線のみで双方向通信かつ電源供給可能な方式です。1-Wire はマキシム社の登録商標らしいです。
Raspberry Pi PicoのMicroPythonには1-Wire用にonewire、ds18x20モジュールがあります。
ds18x20モジュールにあるclass’DS18X20’を使うと簡単にDS18B20で温度測定が可能です。

外観

DS18B20モジュールの外観です。DS18B20の端子並びとモジュールの並びが異なります。接続に注意します。
DS18B20DS18B20

接続図

DS18B20の動作電圧が3.0~5.5VなのでRaspberry Pi Picoから供給できます。接続は下図のようにしました。DS18B20のDQはRaspberry Pi PicoのGP12と接続しました。
接続図
※Raspberry Pi PicoはパソコンとUSB接続されています。

実体図

以下は実体図です。
実体図

OneWire ドライバー

Raspberry Pi RP2xxx 用クイックリファレンスにOneWire ドライバー(https://micropython-docs-ja.readthedocs.io/ja/latest/rp2/quickref.html#onewire-driver)の例題があります。
これを参考にしました。

onewireモジュールをインポートすると、class ‘OneWire’が使えます。
onewire.pyの中身を見ると__init__(pin)とあるので、
onewire.OneWire(Pin(num)) でオブジェクトを作るようです。
例題ではow = onewire.OneWire(Pin(12))となっています。
onewire.pyは「https://raw.githubusercontent.com/micropython/micropython/master/drivers/onewire/onewire.py」で確認できます。

OneWireには、ROM コマンドのSKIP_ROM、SEARCH_ROM、MATCH_ROMの定数やreset、scan、select_rom、readbit、readbyte、readinto、writebit、write、writebyteのメソッドがあります。

後述のds18x20モジュールを使うので、rom-codeを取得するscan()だけ使います。

ds18x20モジュールをインポートすると class ‘DS18X20’が使えます。
ds18x20の中身を見ると__init__(onewire)とあるので ds18x20.DS18X20(onewire_obj) でオブジェクトを作るようです。

例題ではds = ds18x20.DS18X20(ow)となっています。
ds18x20.pyは「https://github.com/micropython/micropython/blob/master/drivers/onewire/ds18x20.py」で確認できます。

DS18X20には以下のメソッドがあります。


convert_temp()      温度データをSCRATCHPAD 0,1byteに保存
read_temp(rom)      温度データを摂氏に変換して値を返す
read_scratch(rom)   rom-codeデバイスからSCRATCHPADデータを返す
write_scratch(rom, buf)     SCRATCHPADに3bytes(TH,TL,config)を書込む

スクリプト

DS18B20の温度測定とSCRATCHPADの読書きを試して見ます。スクリプトは以下のようにしました。
※開発環境はThonnyです。ThonnyでMicroPythonをRaspberry Pi Pico with RP2040にインストールして使っています。


pico_test_22_1wire_02.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from machine import Pin
import onewire, ds18x20, time

# 8-BIT FAMILY CODE  DS18S20 (10h) DS1822(22h) DS18B20 (28h)
ow = onewire.OneWire(Pin(12))   # GPIO 12 で OneWire バスを作成
ds = ds18x20.DS18X20(ow)        #ds18x20のClassからインスタンス

## rom code を取得
roms = ds.scan()        # 固有の64ビットroms <class 'list'>
print('roms=',roms)     # [bytearray(b'(\xffe\xf8\x93\x16\x05S')]
rom=roms[0]             # 1-WireはDS18B20だけなので[0]
print(roms[0])

## temperature
ds.convert_temp()       # 温度データをSCRATCHPADに保存
time.sleep_ms(750)      # 分解能12bitの場合
temp=ds.read_temp(rom)  # 摂氏温度で取得
print(temp)

## SCRATCHPAD bytearray(9)を読出し
regi=ds.read_scratch(rom)
print(regi)
# SCRATCHPAD データの確認
for i in range(9):
    print(i,'%4d '%regi[i],hex(regi[i]))

## SCRATCHPAD byte 2,3,4 TH,TL,Configurationを書換え
buf = bytearray(3)
buf[0]=0x30  # TH Register
buf[1]=0x20  # TL Register
buf[2]=0x7f  # Configuration Register
ds.write_scratch(rom, buf)

## SCRATCHPAD bytearray(9)を読出して書込みデータを確認
regi=ds.read_scratch(rom)
print(regi)
# SCRATCHPAD data-list  データの確認
for i in range(9):
    print(i,'%4d '%regi[i],hex(regi[i]))

実行結果

以下のように温度測定とSCRATCHPADの読書きが出来ています。


pico_test_22_1wire_02.py
>>> %Run -c $EDITOR_CONTENT
roms= [bytearray(b'(\xffe\xf8\x93\x16\x05S')]
bytearray(b'(\xffe\xf8\x93\x16\x05S')
29.25                                       #temp
bytearray(b'\xd4\x010 \x7f\xff\x7f\x10a')   #SCRATCHPAD データ
0  212  0xd4        # byte_num 値 hex値
1    1  0x1
2   48  0x30
3   32  0x20
4  127  0x7f
5  255  0xff
6  127  0x7f
7   16  0x10
8   97  0x61
bytearray(b'\xd4\x015%\x7f\xff\x7f\x10X')   #SCRATCHPAD データ
0  212  0xd4
1    1  0x1
2   53  0x35        # TH 書換え
3   37  0x25        # TL 書換え
4  127  0x7f        # Config 同値書換え
5  255  0xff
6  127  0x7f
7   16  0x10
8   88  0x58
>>> 

まとめ

Raspberry Pi PicoでMicroPythonを使って1wireデバイスDS18B20での温度測定が出来ました。
onewire、ds18x20のモジュールをインポートしたので簡単に温度測定が出来ました。