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の端子並びとモジュールの並びが異なります。接続に注意します。
接続図
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のモジュールをインポートしたので簡単に温度測定が出来ました。