مرور کلی: توزیع Occidentalis لینوکس برای رزبری پای (و Raspbian از تاریخ دسامبر 2012) از سنسور دمای یک سیمه DS18B20 پشتیبانی می کنند. این سنسور در یک پکیج سه پایه کوچک مانند ترانزیستور ها و ادوات دیجیتالی دقیق عرضه میشود.
در این قسمت از آموزش فرا میگیرید که چگونه از یک سنسور DS18B20 به همراه رزبریپای برای خواندن دما استفاده کنید . از آنجایی که رزبریپای ADC(مبدل آنالوگ به دیجیتال) ندارد نمی توان از یک سنسور دمای آنالوگ مانند TMP36 یا LM35 استفاده کرد ، که DS18B20 را به گزینه مناسبی تبدیل می کند.
دیگر کتابخانه ها
اگر از پایتون استفاده می کنید ، یک کتابخانه خوب برای DS18B20 که با رزبری پای کار می کند در گیت هاب (اینجا) موجود است.
قطعات
- برای ساخت این پروژه به قطعات زیر نیاز دارید :
- برد رزبری پای (هر ورژنی که دوست دارید ، در این پروژه از ورژن یک استفاده شده)
- سنسور دمای دیجیتال DS18B20 (اگر دوست داشتین نسخه ی ضدآب یا دما بالا)
- همچنین یک مقاومت 4.7k یا 10k نیز نیاز دارید.
- مینی بردبرد
- سیم جامپر نری به نری
- برد توسعه GPIO
نکته مهم : در این پروژه از یک برد کمکی برای انتقال پایه های رزبری پای استفاده شده که استفاده از این روش ضروری نیست و با هر روشی که خودتان بلد هستید مثلا سیم برد بوردی یک سر نری یک سر مادگی میتوانید از روی رزبری پای پایه ها را انتقال دهید به روی برد بورد…
سخت افزار
نمای بردبرد برای اتصالات پایه سنسور DS18B20 در عکس زیر نمایش داده شده است.
سنسورهای “1سیمه” DS18B20 برخلاف هر سنسور دیگری میتوانند به طور موازی نیز متصل شوند . تمامی سنسورها باید به پایه های یکسانی وصل شوند ، اما برای تمامی آن ها فقط به یک مقاومت 4.7k نیاز دارید.
این مقاومت به عنوان بالاکش برای خط داده استفاده می شود و برای پایدار نگه داشتن انتقال داده ضروری است .توجه کنید که DS18B20 را به طور درست در جای خود قرار دهید .
اگر از نسخه ضدآب DS18B20 استفاده می کنید توجه کنید که این قطعه سه سیم دارد قرمز ، سیاه و زرد و سیم بدنه که نیازی به اتصال ندارد .
اگر از نسخه “دما بالا” ی DS18B20 استفاده می کنید ، سیم نارنجی را به 3.3 ولت ، سفید را به زمین و آبی را به پایه شماره 4 متصل کنید . همچنان به یک مقاومت 4.7~10k از پایه data به 3.3 ولت نیاز دارید .
سنسور 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
رابط کاربری اندکی غیرقابل اعتماد است اما خوشبختانه به ما میگوید که آیا دمای معتبری برای خواندن موجود است یا خیر. شبیه به یک فایل است بنابراین تنها کاری که باید انجام دهیم خواندن آن است.
پاسخ آن حتما دارای یک 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 فایل را ذخیره کنید .
تست و راه اندازی
برنامه باید به عنوان super-user اجرا شود ، بنابراین دستور زیر را در ترمینال وارد کنید :
sudo python thermometer.py
اگر همه چیز به درستی پیش رفته باشد ، مقادیری را مانند عکس زیر مشاهده خواهید کرد :
با قرار دادن انگشت خود روی سنسور آن را گرم کنید .
اضافه کردن سنسورهای بیشتر
شما می توانید سنسورهای DS18B20 بیشتری را نیز به صورت موازی اضافه کنید. کافیست تمام پایه های VCC سنسورها را بهم ، dataها بهم و زمین ها را نیز به هم متصل کنید. از یک مقاومت 4.7k استفاده کنید . چندین دایرکتوری (/sys/bus/w1/devices/28-nnnnn) مشاهده خواهید کرد که هرکدام دارای شماره سریال منحصر بفرد به عنوان نام دایرکتوری می باشد. کد برنامه پایتون در حال حاضر فقط با یک سنسور کار می کند بنابراین اگر احتیاج به خواندن چندین سنسور به طور همزمان دارید آن را بسته به نیاز خود تغییر دهید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
چند تا سوال
من ابن سنسور و یک رزبری 3 بی پلاس
مشکل اول : سنسور رو درست وصل میکنم. ولی توی دایرکتوری sys/bus../ که میرم نمیتونم سنسور دما رو ببینم. یعنی پوشش اصن اضافه نشده . خودم لینوکس کارم. و قبلا هم این سنسور رو متصل کرده بودم. اما الان نمیتونم بفهمم چشه. همچین مشکلی کسی برخورده ؟ راه حلی بنظرتون میاد ؟ البته بدلیل کمبود سیم مجبور شدم سیم سنسوررو لخت کنم و مستقیم به بردبورد بزنم و بعد با جمپر از برد بورد دیتا و زمین و مثیت رو به رزبری وصل کنم. ممکنه بخاطر سیم کشی وصل نشده باشه سنسور ؟؟؟