اتصال سنسور دما DS18B20 به برد رزبری پای پیکو

در این مقاله، یاد میگیرید چگونه برد Raspberry Pi Pico را به سنسور دمای DS18B20 متصل کنید و با استفاده از فریمور MicroPython، دما را قرائت نمایید. سنسور DS18B20 یک سنسور دمای آدرسپذیر است؛ به این معنا که میتوانید چندین سنسور را به یک GPIO مشترک متصل کنید. همچنین نحوه دریافت همزمان دما از چند سنسور DS18B20 را نیز بررسی خواهیم کرد.
برای دنبال کردن این آموزش، لازم است فریمور MicroPython را روی برد Raspberry Pi Pico نصب کرده باشید. همچنین به یک IDE برای نوشتن و آپلود کد روی برد نیاز دارید.
IDE پیشنهادی MicroPython برای Raspberry Pi Pico، نرمافزار Thonny IDE است. در آموزش مربوطه میتوانید نحوه نصب Thonny IDE، فلش کردن فریمور MicroPython و آپلود کد روی برد را یاد بگیرید.
معرفی سنسور دمای DS18B20
سنسور دمای DS18B20 یک سنسور دیجیتال مبتنی بر پروتکل One-Wire است. این بدان معناست که تنها به یک خط داده (به همراه GND) برای برقراری ارتباط با Raspberry Pi Pico نیاز دارد.

این سنسور میتواند از طریق منبع تغذیه خارجی تغذیه شود یا انرژی خود را از خط داده دریافت کند (حالتی که «parasite mode» نامیده میشود) که در این صورت نیازی به منبع تغذیه جداگانه نخواهد بود.
هر سنسور DS18B20 دارای یک کد سریال 64 بیتی منحصربهفرد است. این ویژگی امکان اتصال چندین سنسور به یک خط داده مشترک را فراهم میکند. بنابراین میتوانید تنها با استفاده از یک GPIO، دمای چند سنسور را دریافت کنید.
سنسور دمای DS18B20 در نسخه ضدآب نیز در دسترس است.

در ادامه، مشخصات فنی مهم سنسور دمای DS18B20 ارائه شده است:
- ارتباط از طریق پروتکل One-Wire
- محدوده ولتاژ تغذیه: 3.0V تا 5.5V
- محدوده دمای کاری: -55ºC تا +125ºC
- دقت اندازهگیری ±0.5ºC (در بازه -10ºC تا 85ºC)
برای اطلاعات بیشتر میتوانید دیتاشیت DS18B20 را مطالعه کنید.
سیم کشی سنسور دمای DS18B20 به برد پیکو
سنسور دمای DS18B20 دارای سه پایه GND، Data و VCC است. این سنسور میتواند از طریق پایه VDD (حالت عادی) تغذیه شود یا انرژی خود را از خط داده دریافت کند (حالت parasite). میتوانید از هر یک از این دو روش استفاده کنید، اما ما استفاده از حالت عادی را توصیه میکنیم.

اگر از نسخه ضدآب استفاده میکنید، میتوانید پایهها را بر اساس رنگ سیمها شناسایی کنید:
- مشکی: GND
- قرمز: VDD
- زرد: خط داده
اتصالات به صورت زیر انجام میشود:
- DS18B20 → Raspberry Pi Pico
- GND → GND
- Data (DQ) → هر GPIO دیجیتال (در این آموزش از GPIO22 استفاده میشود)؛ همچنین باید یک مقاومت 4.7kΩ بین خط داده و VCC متصل شود
- VDD → 3V3(OUT)
میتوانید به شماتیک مربوطه نیز مراجعه کنید.

قطعات مورد نیاز پروژه
برای اجرای این پروژه به قطعات زیر نیاز دارید:
- سنسور دمای DS18B20
- برد Raspberry Pi Pico
- سنسور دمای DS18B20
- مقاومت 4.7kΩ
- سیم جامپر
- برد بورد
کد میکروپایتون سنسور DS18B20 و برد پیکو
کد زیر دما را از سنسور DS18B20 خوانده و مقادیر را در شل MicroPython نمایش میدهد. در فریمور MicroPython یک ماژول داخلی به نام ds18x20 وجود دارد، بنابراین نیازی به نصب کتابخانه جداگانه نیست.
کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در اینجا قسمت های مختلف کد را بررسی میکنیم.
در ابتدا، ماژولهای موردنیاز را ایمپورت میکنیم. ماژول machine برای دسترسی به سختافزار، onewire برای برقراری ارتباط با سنسور(های) DS18B20، ماژول ds18x20 برای خواندن دما و time برای مدیریت توابع زمانی استفاده میشوند.
import machine, onewire, ds18x20, time
پایه GPIO که سنسور DS18B20 به آن متصل شده را تعریف میکنیم. در این مثال از GPIO22 استفاده شده است. در صورت استفاده از پایه دیگر، مقدار آن را در کد تغییر دهید.
ds_pin = machine.Pin(22)
سپس با ایجاد یک شیء از کلاس DS18X20 روی پایه ds_pin، سنسور DS18B20 را مقداردهی اولیه میکنیم.
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
سنسور DS18B20 از پروتکل ارتباطی One-Wire استفاده میکند و هر سنسور دارای یک کد سریال 64 بیتی منحصربهفرد است. بنابراین میتوانید چندین سنسور را روی یک GPIO مشترک متصل کرده و داده دریافت کنید.
در خط زیر از تابع scan() برای شناسایی سنسورهای DS18B20 استفاده میشود. آدرسهای پیدا شده در متغیر roms (از نوع لیست) ذخیره میشوند.
roms = ds_sensor.scan()
برای نمایش آدرس هر سنسور در شل:
print('Found DS devices: ', roms)
در ادامه، یک حلقه while تعریف شده است که هر 5 ثانیه یکبار دمای سنسور(ها) را دریافت میکند.
برای نمونهبرداری از دما، باید در هر بار از تابع convert_temp() روی شیء ds_sensor استفاده کنید.
ds_sensor.convert_temp()
سپس یک تأخیر 750 میلیثانیهای اعمال میشود تا زمان کافی برای تبدیل دما فراهم گردد.
time.sleep_ms(750)
پس از آن، با استفاده از متد read_temp() و ارسال آدرس سنسور به عنوان آرگومان، دما خوانده میشود.
tempC = ds_sensor.read_temp(rom)
بهصورت پیشفرض، مقدار دما بر حسب درجه سلسیوس بازگردانده میشود. خط زیر آن را به درجه فارنهایت تبدیل میکند.
tempF = tempC * (9/5) +32
از آنجا که میتوان چند سنسور را به یک خط داده متصل کرد، یک حلقه for تعریف شده است که روی تمام آدرسها پیمایش کرده و دمای هر سنسور را چاپ میکند (در این مثال تنها یک سنسور متصل است).
for rom in roms:
print(rom)
در هر تکرار، دما با دو رقم اعشار {:.2f} در واحدهای سلسیوس و فارنهایت چاپ میشود.
print('temperature (ºC):', "{:.2f}".format(tempC))
print('temperature (ºF):', "{:.2f}".format(tempF))
این حلقه هر 5 ثانیه یکبار تکرار میشود.
time.sleep(5)
عملکرد کد
کد را با استفاده از Thonny IDE یا هر IDE سازگار با MicroPython دیگر روی برد Raspberry Pi Pico ذخیره کنید.
کد ارائهشده را در یک فایل جدید در Thonny IDE کپی نمایید.

پس از کپی کد، روی آیکون Save کلیک کرده و گزینه Raspberry Pi Pico را انتخاب کنید.

فایل را با نام main.py ذخیره نمایید.
نکته: زمانی که فایل را با نام main.py ذخیره میکنید، برد Raspberry Pi Pico بهصورت خودکار آن را هنگام بوت اجرا میکند. اگر نام دیگری انتخاب شود، فایل در سیستمفایل برد ذخیره میشود اما بهصورت خودکار اجرا نخواهد شد.
برد را ریست کنید (آن را از کامپیوتر جدا کرده و مجدداً متصل نمایید). سپس روی دکمه سبزرنگ «Run Current Script» کلیک کنید یا کلید F5 را فشار دهید.

مقادیر جدید دما تقریباً هر 5 ثانیه در شل نمایش داده خواهند شد.

موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود







