به نام خدا
اندازه گیری دما با استفاده از سنسور DS18B20 و رزبری پای
در این پروژه قصد داریم تا با استفاده از سنسور دمای DS18B20 و رزبری پای دما را اندازه گیری کنیم. این سنسور انتخاب مناسبی برای ایستگاه های هوا شناسی و سیستم خودکار خانه می باشد. تعداد کمی سنسور از این دسته وجود دارند که به راحتی با رزبری پای راه اندازی می شوند. این دسته از سنسور ها اندازه ی ترانزیستور هستند و معمولا سه پایه دارند. برای اتصال این سنسور ها به رزبری پای تنها به یک مقاومت ۴٫۷ و یا ۱۰ کیلو اهمی نیاز است.
اطلاعات تخصصی سنسور DS18B20
بازه ی زمانی -۵۵ تا ۱۲۵ درجه سانتی گرد
ولتاژ کاری ۳ تا ۵ ولت
نمونه برداری در هر بازه ی ۷۵۰ میلی ثانیه ای
دقت اندازه گیری ۰٫۵°C (9 bit); ۰٫۲۵°C (10 bit); ۰٫۱۲۵°C (11 bit); ۰٫۰۶۲۵°C (12 bit)
۶۴ بیت آدرس دهی
پروتکل اتصال تک سیمی
اتصال سنسور DS18B20 به رزبری پای
پین های این سنسور را در زیر مشاهده می کنید.
سیم بندی برای خروجی ssh
R1: ۴٫۷K Ohm 10K Ohm
سیم بندی اتصالات ال سی دی
R1: 4.7K Ohm or 10K Ohm resistor
فعال سازی ارتباط تک سیمی
قبل از اینکه رزبری پای داده از سنسور داده ای دریافت کند باید این ارتباط را فعال کنیم. هنگامی که سنسور را متصل کردید و تغذیه ی رزبری پای را وصل کردید ، به آن وارد شوید و مراحل زیر را طی کنید :
- در پنجره ی فرمان زیر را وارد کنید sudo nano /boot/config.txt سپس dtoverlay=w1–gpio در انتهای فایل اضافه کنید.
- از برنامه خارج شوید و رزبری پای را با فرمان sudo reboot ریبوت کنید.
- بار دیگر وارد رزبری پای شوید و فرمان sudo modprobe w1–gpio را وارد کنید.
- سپس فرمان sudo modprobe w1-therm را وارد کنید.
- آدرس را با استفاده فرمان cd /sys/bus/w1/devices تغییر دهید.
- حال Is را در لیست دستگاه وارد کنید :
همانطور که مشاهده می کنید w1_bus_master1 برای سیستم من ۲۸-۰۰۰۰۰۶۶۳۷۶۹۶ نمایش داده شده است.
۷٫ حال آدرس را همانند cd ۲۸-XXXXXXXXXXXX وارد کنید. ( آدرس سیستم خود را وارد کنید )
برای مثال برای من به شکل cd ۲۸-۰۰۰۰۰۶۶۳۷۶۹۶ می باشد.
۸٫ w1_slave را وارد کنید که خروجی خوانده شده از سنسور را می خواند.
در اینجا دمای خوانده شده ۲۸۶۲۵ می باشد که به معنی ۲۸٫۶۲۵ درجه ی سانتی گراد است.
۹٫ cd را وارد کنید تا به قسمت روت وارد شوید.
این تمام کار های لازم برای ایجاد ارتباط یک طرفه بود. حال می توانید یکی از کد های زیر را برای این پروژه استفاده کنید.
خروجی دما در پایانه ی ssh
کد زیر خروجی دما را در پایانه ی ssh در واحد فارنهایت و سلسیوس نمایان می کند.
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)
نمایش دما بر روی ال سی دی
برای استفاده از ال سی دی باید کتابخانه ی آن بر روی رزبری پای شما نصب شده باشد. برای اینکار ابتدا دستور زیر را وارد کنید
sudo apt-get install python-pip
بعد از نصب آن کتابخانه ی RPLCD را با وارد کردن دستور زیر نصب کنید
sudo pip install RPLCD
بعد از انجام مراحل بالا با اجرای کد زیر بر روی رزبری پای دما بر روی ال سی دی نمایان خواهد شد :
import os import glob import time from RPLCD import CharLCD lcd = CharLCD(cols=16, rows=2, pin_rs=37, pin_e=35, pins_data=[33, 31, 29, 23]) 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 #CELSIUS CALCULATION def read_temp_c(): 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 = int(temp_string) / 1000.0 # TEMP_STRING IS THE SENSOR OUTPUT, MAKE SURE IT'S AN INTEGER TO DO THE MATH temp_c = str(round(temp_c, 1)) # ROUND THE RESULT TO 1 PLACE AFTER THE DECIMAL, THEN CONVERT IT TO A STRING return temp_c #FAHRENHEIT CALCULATION def read_temp_f(): 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_f = (int(temp_string) / 1000.0) * 9.0 / 5.0 + 32.0 # TEMP_STRING IS THE SENSOR OUTPUT, MAKE SURE IT'S AN INTEGER TO DO THE MATH temp_f = str(round(temp_f, 1)) # ROUND THE RESULT TO 1 PLACE AFTER THE DECIMAL, THEN CONVERT IT TO A STRING return temp_f while True: lcd.cursor_pos = (0, 0) lcd.write_string("Temp: " + read_temp_c() + unichr(223) + "C") lcd.cursor_pos = (1, 0) lcd.write_string("Temp: " + read_temp_f() + unichr(223) + "F")
دیدگاهها (0)