مهندس موفق الکترونیک

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

مرور کلی: توزیع Occidentalis لینوکس برای رزبری پای (و Raspbian از تاریخ دسامبر 2012) از سنسور دمای یک سیمه DS18B20 پشتیبانی می کنند. این سنسور در یک پکیج سه پایه کوچک مانند ترانزیستور ها و ادوات دیجیتالی دقیق عرضه میشود.

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

در این قسمت از آموزش فرا میگیرید که چگونه از یک سنسور DS18B20 به همراه رزبری‌پای برای خواندن دما استفاده کنید . از آنجایی که رزبری‌پای  ADC(مبدل آنالوگ به دیجیتال) ندارد نمی توان از یک سنسور دمای آنالوگ مانند TMP36 یا LM35 استفاده کرد ، که DS18B20 را به گزینه مناسبی تبدیل می کند.

دیگر کتابخانه ها

اگر از پایتون استفاده می کنید ، یک کتابخانه خوب برای DS18B20 که با رزبری پای کار می کند در گیت هاب (اینجا) موجود است.

قطعات

  • برای ساخت این پروژه به قطعات زیر نیاز دارید :
  • برد رزبری پای (هر ورژنی که دوست دارید ، در این پروژه از ورژن یک استفاده شده)
  • سنسور دمای دیجیتال DS18B20 (اگر دوست داشتین نسخه ی ضدآب یا دما بالا)
  • همچنین یک مقاومت 4.7k یا 10k نیز نیاز دارید.
  • مینی بردبرد
  • سیم جامپر نری به نری
  • برد توسعه GPIO

سنسور دمای دیجیتال DS18B20

مینی بردبرد

سیم جامپر نری به نری

نکته مهم : در این پروژه از یک برد کمکی برای انتقال پایه های رزبری پای استفاده شده که استفاده از این روش ضروری نیست و با هر روشی که خودتان بلد هستید مثلا سیم برد بوردی یک سر نری یک سر مادگی میتوانید از روی رزبری پای پایه ها را انتقال دهید به روی برد بورد…

برد کمکی رزبری پای

سیم برد بوردی یک سر نری یک سر مادگی

 سخت افزار

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

سنسورهای “1سیمه” DS18B20 برخلاف هر سنسور دیگری میتوانند به طور موازی نیز متصل شوند . تمامی سنسورها باید به پایه های یکسانی وصل شوند ، اما برای تمامی آن ها فقط به یک مقاومت 4.7k نیاز دارید.

این مقاومت به عنوان بالاکش برای خط داده استفاده می شود و برای پایدار نگه داشتن انتقال داده ضروری است .توجه کنید که DS18B20 را به طور درست در جای خود قرار دهید .

مطلب پیشنهادی:  ارتباط UART رزبری‌پای با استفاده از پایتون و C

سنسور DS18B20

اگر از نسخه ضدآب DS18B20 استفاده می کنید توجه کنید که این قطعه سه سیم دارد قرمز ، سیاه و زرد و سیم بدنه که نیازی به اتصال ندارد .

اگر از نسخه “دما بالا” ی DS18B20 استفاده می کنید ، سیم نارنجی را به 3.3 ولت ، سفید را به زمین و آبی را به پایه شماره 4 متصل کنید . همچنان به یک مقاومت 4.7~10k از پایه data به 3.3 ولت نیاز دارید .

ضدآب DS18B20

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

سنسور DS18B20

با اینکه DS18B20 شباهت زیادی به یک ترانزیستور 3پایه معمولی دارد اما درون آن مدارات پیچیده ای وجود دارد . این چیپ دارای رابط سریال مخصوص 1-wire و همچنین منطق کنترل کننده و سنسور دما درون خود میباشد. پایه خروجی آن پیام های دیجیتال ارسال می کند و Raspbian/Occidentalis شامل رابطی برای خواندن این پیام ها می شود . می توانید کار با این سنسور را از طریق خط فرمان یا SSH قبل از اجرای کامل برنامه امتحان کنید.

اضافه کردن پشتیبانی از 1-wire

خط زیر را به /boot/config.txt اضافه کنید. می توانید این فایل را با nano با اجرای دستور sudo nano /boot/config.txt و سپس حرکت به سمت پایین فایل و تایپ خط زیر در آن قسمت انجام دهید :

dtoverlay=w1-gpio

سپس با sudo reboot ریبوت کنید . بعد از بالا آمدن سیستم و وارد شدن به آن دستوراتی که در زیر مشاهده می کنید را در خط فرمان وارد کنید . هنگامی که در دایرکتوری ‘devices’ قرار دارید دایرکتوری با ابتدای نام ’28-‘ ممکن است نام متفاوتی داشته باشد ، پس دایرکتوری به همان آدرس تغییر دهید .

sudo modprobe w1-gpio
sudo modprobe w1-therm
cd /sys/bus/w1/devices
ls
cd 28-xxxx (change this to match what serial number pops up)
cat w1_slave

اضافه کردن پشتیبانی از 1-wire

رابط کاربری اندکی غیرقابل اعتماد است اما خوشبختانه به ما میگوید که آیا دمای معتبری برای خواندن موجود است یا خیر. شبیه به یک فایل است بنابراین تنها کاری که باید انجام دهیم خواندن آن است.

مطلب پیشنهادی:  آموزش کنترل از راه دور رزبری پای با VNC

پاسخ آن حتما دارای یک YES یا NO در انتهای خط اول خواهد بود . اگر این پاسخ yes باشد آنگاه دما در پایان خط دوم به صورت مضرب هزار به سانتی گراد قرار خواهد گرفت. بنابراین در مثال بالا در واقع دما به صورت 20.687 و 26.125 درجه سانتی گراد خوانده شده است.

اگر بیشتر از یک سنسور متصل به رزبری پای دارید ، چندین فایل 28-xxx مشاهده خواهید کرد. هر کدام یک شماره سریال منحصر بفرد خواهند داشت بنابراین بهتر است سنسور ها را تک به تک متصل کنید به شماره فایل ایجاد شده نگاه کنید و سپس سنسور ها را شماره گذاری کنید .

نرم افزار

نرم افزار پایتون این پروژه  پیغام های خطا را دریافت می کند و دما را به سانتی گراد و فارنهایت هر ثانیه گزارش می دهد.

import os
import glob
import time

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

def read_temp_raw():
 f = open(device_file, 'r')
 lines = f.readlines()
 f.close()
 return lines

def read_temp():
 lines = read_temp_raw()
 while lines[0].strip()[-3:] != 'YES':
 time.sleep(0.2)
 lines = read_temp_raw()
 equals_pos = lines[1].find('t=')
 if equals_pos != -1:
 temp_string = lines[1][equals_pos+2:]
 temp_c = float(temp_string) / 1000.0
 temp_f = temp_c * 9.0 / 5.0 + 32.0
 return temp_c, temp_f
 
while True:
 print(read_temp()) 
 time.sleep(1)

برنامه با فراخوانی دستور های ‘modprobe’ که برای شروع به اجرای رابط کاربری هستند آغاز می شود .

سه خط بعدی فایلی که پیام ها از آن خوانده می شوند را پیدا می کنند .

یک مشکل در خصوص هنگ های گاه به گاه هنگام خواندن فایل دما در سیستم Raspbian گزارش شده است . اگر شما هم به همین مشکل برخوردید تابع read-temp-raw را با کد زیر جایگزین کنید . همچنین باید یک خط در ابتدای فایل ‘import subprocess’ اضافه کنید .

def read_temp_raw():
 catdata = subprocess.Popen(['cat',device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 out,err = catdata.communicate()
 out_decode = out.decode('utf-8')
 lines = out_decode.split('\n')
 return lines

خواندن دما در دو تابع صورت می گیرد .read-temp-raw فقط دو خط پیام را از رابط کاربری می گیرد . تابع read-temp این پیام را می خواند و وجود پیام های خطا را چک می کند و آنقدر تکرار می کند تا یک پیام با “YES” در انتهای خط اول دریافت کند . این تابع دو مقدار  را برمیگرداند ، اولین آن ها دما به درجه سانتی گراد و دومی به درجه فارنهایت است . در صورت تمایل می توانید این دو مقدار را با دستور زیر از یکدیگر جدا کنید :

deg_c, deg_f = read_temp()

حلقه اصلی برنامه فقط دور می زند ، دما را می خواند و آن را قبل از یک ثانیه وقفه چاپ می کند . برای انتقال برنامه به رزبری پای می توانید از SSH استفاده کنید . یک پنجره ویرایشگر با دستور زیر باز کنید :

nano thermometer.py

سپس کد بالا را در آن جای گذاری کنید و با CTRL_x و Y فایل را ذخیره کنید .

مطلب پیشنهادی:  فوت‌های کوزه‌گری در کار با ابزار Raspi-Config

نرم افزار پایتون

تست و راه اندازی

برنامه باید به عنوان super-user اجرا شود ، بنابراین دستور زیر را در ترمینال وارد کنید :

sudo python thermometer.py

اگر همه چیز به درستی پیش رفته باشد ، مقادیری را مانند عکس زیر مشاهده خواهید کرد :

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

با قرار دادن انگشت خود روی سنسور آن را گرم کنید .

اضافه کردن سنسورهای بیشتر

شما می توانید سنسورهای DS18B20 بیشتری را نیز به صورت موازی اضافه کنید. کافیست تمام پایه های VCC سنسورها را بهم ، dataها بهم و زمین ها را نیز به هم متصل کنید. از یک مقاومت 4.7k استفاده کنید . چندین دایرکتوری (/sys/bus/w1/devices/28-nnnnnمشاهده خواهید کرد که هرکدام دارای شماره سریال منحصر بفرد به عنوان نام دایرکتوری می باشد. کد برنامه پایتون در حال حاضر فقط با یک سنسور کار می کند بنابراین اگر احتیاج به خواندن چندین سنسور به طور همزمان دارید آن را بسته به نیاز خود تغییر دهید.

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

یک دیدگاه

  1. چند تا سوال
    من ابن سنسور و یک رزبری 3 بی پلاس
    مشکل اول : سنسور رو درست وصل میکنم. ولی توی دایرکتوری sys/bus../ که میرم نمیتونم سنسور دما رو ببینم. یعنی پوشش اصن اضافه نشده . خودم لینوکس کارم. و قبلا هم این سنسور رو متصل کرده بودم. اما الان نمیتونم بفهمم چشه. همچین مشکلی کسی برخورده ؟ راه حلی بنظرتون میاد ؟ البته بدلیل کمبود سیم مجبور شدم سیم سنسوررو لخت کنم و مستقیم به بردبورد بزنم و بعد با جمپر از برد بورد دیتا و زمین و مثیت رو به رزبری وصل کنم. ممکنه بخاطر سیم کشی وصل نشده باشه سنسور ؟؟؟