سنجش پارامترهای محیطی نیازمند سنسورهای مختلفی است. یکی از سنسورها پرکاربرد تشخیص شدت نور محیط است. سلامت و پایش وضعیت گیاهان در گلخانهها به کمک سنسورهای نوری انجام میشود. سنسور نوری Light جهت اندازه گیری شدت نور محیط طراحی و در مدلهای مختلف عرضه شده است. سنسور سطح نور یا Light Level Sensor در سطحهای مختلف مقادیر نور محیط را اندازهگیری کرده و به صورت پارامتر Lux ارسال میکند. در این آموزش این بار با زبان میکروپایتون و توسط رزبری پای پیکو سنسور را راه اندازی کرده و عدد لایت را بر واحد لوکس بر روی نمایشگر OLED دریافت خواهیم کرد. در ادامه پروژه شدت نور محیط با میکروپایتون با مرجع تخصصی میکروپایتون به زبان فارسی، دیجی اسپارک همراه باشید.
سنسور BH1750 شدت نور
سنسور BH1750 از خانواده سنسورهای فتو رزیستوری است. این سنسور شدت نور محیط را سنجیده و بر اساس پارامتر Lux به عنوان دیتا تبدیل میکند. مقادیر لوکس از ۰ تا ۶۵۵۳۵ واحد لوکس است. با سنسور BH1750 این مقادیر قابل اندازه گیری است. سنسور دارای ۴ پایه VCC, GND, SCL, SDA است. به تصویر زیر دقت کنید.
معرفی پایههای سنسور BH1750
- پایه VCC تغذیه سنسور است که بین ۲٫۴ تا ۳٫۶ ولت است.
- پایه GND زمین است و به زمینGND میکروکنترلر متصل میشود.
- پایه SCL پایه Serial Clock است و پالس کلاک را برای ارتباط I2C فراهم میکند.
- پایه SDA پایه Serial Data است و جهت ارسال دیتا در رابط I2C استفاده میشود.
- پایه ADDR پین آدرس است و برای زمانیکه بیش از دو ماژول متصل است جهت آدرس دهی استفاده میشود.
- تعذیه: ۲٫۴ – ۳٫۶ ولت
- مصرف جریان در کمترین حالت: ۰٫۱۲ میلی آمپر
- رنج اندازه گیری: ۱ – ۶۵۵۳۵lx
- رابط: I2C BUS
- دقت اندازه گیری: +/-۲۰%
- مبدل A/D برای تبدیل مقادیر آنالوگ به دیجیتال
- تاثیر پذیری کم تابش IR
سنسور BH1750 در ساخت موبایل، چراغهای جلوی اتومبیل استفاده میشود. در مبحث اینترنت اشیا هم بسیار کاربردی است. خصوصا اینکه سنجش پارامتر نور محیط یکی از عوامل بسیار مهم برای پیاده سازی پروژههای اینترنت اشیا است. این سنسور از پروتکل I2C استفاده میکند تا استفاده از سنسور برای میکروکنترلرها سادهتر شود. پایههای SDA و SCL مختص پروتکل I2C است. شدت نور با میزان تابش نور به سنسور اندازه گیری میشود.
اتصال BH1750 به رزبری پای پیکو
برای اتصال از پایه I2C رزبری پای پیکو Raspberry Pi Pico استفاده میکنیم. طبق ترتیب پایه ها از GP16 برای SDA و از GP17 برای SCL استفاده میکنیم. پایه های تغذیه هم به ترتیب به ۳V3OUT و GND متصل شده است.
- GP16 : SDA
- GP17 : SCL
- ۳V3 : VCC
- GND : GND
نرم افزار Thonny IDE
برای کارکردن میکروپایتون با رزبری پای بایستی از IDE مناسب استفاده کرد. نرم افزار Thonny بر پایه پایتون و برای مبتدیان طراحی و توسعه داده شده است. این نرم افزار از پایتون Python 3.7 بهره برده و دیگر نیازی به نصب پایتون به صورت جداگانه نیست. نصب کنید و برنامه نویسی را آغاز کنید. برای نصب Thonny Python از لینک زیر استفاده کنید. دانلود ادیتور Thonny Python
نصب میکروپایتون Thonny در ویندوز
قبل از اتصال رزبری پای پیکو به سیستم کلید BOOTSEL را نگه داشته و پس از اتصال کابل MICRO USB و اتصال به سیستم دست خود را از کلید بردارید. با اینکار رزبری پای پیکو شناسایی شده و پنجره ی آن باز میشود.
در نرم افزار Thonny بر روی نوار سمت راست پایین صفحه کلیک کنید.
سپس بر روی Configure Interpreter کلیک کنید.
سپس پس از شناسایی رزبری پای پیکو، صفحه ی زیر باز شده و پکیج را نصب کنید.
حالا Thonny Python آماده برنامه نویسی برای رزبری پای پیکو است.
نصب درایور میکروپایتون BH1750
جهت نصب درایور BH1750 بر روی نرم افزار Thonny IDE باید به صورت دستی اقدام کنیم و مستقیم درایور را بر روی رزبری پای پیکو Raspberry Pi Pico ذخیره کنیم. جهت سهولت در ادامه درایور BH1750 قرار گرفته شده است. یک تب جدید در Thonny IDE باز کنید. کد را انتقال دهید. با نام BH1750.py در محل RASPBERRY PI PICO ذخیره کنید.
""" Micropython BH1750 ambient light sensor driver. """ from utime import sleep_ms class BH1750(): """Micropython BH1750 ambient light sensor driver.""" PWR_OFF = 0x00 PWR_ON = 0x01 RESET = 0x07 # modes CONT_LOWRES = 0x13 CONT_HIRES_1 = 0x10 CONT_HIRES_2 = 0x11 ONCE_HIRES_1 = 0x20 ONCE_HIRES_2 = 0x21 ONCE_LOWRES = 0x23 # default addr=0x23 if addr pin floating or pulled to ground # addr=0x5c if addr pin pulled high def __init__(self, bus, addr=0x23): self.bus = bus self.addr = addr self.off() self.reset() def off(self): """Turn sensor off.""" self.set_mode(self.PWR_OFF) def on(self): """Turn sensor on.""" self.set_mode(self.PWR_ON) def reset(self): """Reset sensor, turn on first if required.""" self.on() self.set_mode(self.RESET) def set_mode(self, mode): """Set sensor mode.""" self.mode = mode self.bus.writeto(self.addr, bytes([self.mode])) def luminance(self, mode): """Sample luminance (in lux), using specified sensor mode.""" # continuous modes if mode & 0x10 and mode != self.mode: self.set_mode(mode) # one shot modes if mode & 0x20: self.set_mode(mode) # earlier measurements return previous reading sleep_ms(24 if mode in (0x13, 0x23) else 180) data = self.bus.readfrom(self.addr, 2) factor = 2.0 if mode in (0x11, 0x21) else 1.0 return (data[0]<<8 | data[1]) / (1.2 * factor)
نصب درایور میکروپایتون SSD1306
برای استفاده از سخت افزارها بایستی در ایتدا درایور آن ها برای میکروکنترلر نصب شود. این مورد کاملا وابسته به زبان برنامه نویسی مورد نظر و انتخاب نرم افزار است. در پروژه شدت نور محیط با میکروپایتون از زبان برنامه نویسی میکروپایتون و نرم افزار THONNY IDE برای نمایش دیتا در نمایشگر OLED استفاده میکنیم قدم اول برای معرفی نمایشگر OLED به نرم افزار THONNY IDE اضافه کردن درایور مورد نظر است. درایور نمایشگر OLED درایور SSD1306 است. به ترتیب زیر درایور را به نرم افزار و برد رزبری پای پیکو اضافه کنید.
- درایور SSD1306 برای MICROPYTHON را دانلود کنید ( ترجیحا از گیت هاب دانلود کنید )
- در بخش درایورهای نمایشگر درایور SSD1306 را انتخاب کنید.
- پس از انتخاب درایور SSD1306، نرم افزار THONNY IDE را باز کنید.
- درایور را کپی و در یک تب جدید در نرم افزار انتقال دهید. آن را با نام main.py در رزبری پای پیکو Raspberry Pi PICO ذخیره کنید.
- تا این مرحله درایور SSD1306 در برد رزبری پای پیکو تعریف و ذخیره شده است. حالا میتوانید یک برنامه جداگانه در یک تب جداگانه برای نمایشگر OLED بنویسید.
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
برای مطالعه کامل آموزش راه اندازی نمایشگر OLED با رزبری پای پیکو PICO و میکروپایتون کلیک کنید.
اتصالات پروژه شدت نور محیط با میکروپایتون
برای انچام شدت نور محیط با میکروپایتون اتصالات به GP هایی که از I2C پشتیبانی میکنند، نیاز داریم.
- پایه VCC نمایشگر OLED را به پایه ۳٫۳ ولت پیکو اتصال دهید.
- پایه GND نمایشگر OLED را به پایه GND پیکو اتصال دهید.
- پایه SDA نمایشگر OLED را به پایه GP0 پیکو اتصال دهید.
- پایه SCL نمایشگر OLED را به پایه GP1 پیکو اتصال دهید.
در این آموزش از پایه های ۱۷ و ۱۶ استفاده شده است که به ترتیب پایه SDA سنسور BH1750 و پایه SDA نمایشگر OLED به پایه GP16 متصل شده است. پایه SCL نمایشگر OLED و پایه SCL سنسور BH1750 به پایه GP17 متصل شده است.
کد میکروپایتون پروژه شدت نور محیط
برای اجرای این پروژه نیاز به ماژژول و کلاس های پین و تایم هستیم که در سری آموزش های مقدماتی میکروپایتون با رزبری پای پیکو آموزش داده شده است. کد را کپی و به نرم افزار Thonny انتقال دهید. سپس مطابق با اتصالات، پروژه را انجام دهید. قدم بعدی فراخوانی درایورهای نصب شده است.
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
تحلیل کد میکروپایتون
برای شروع کدنویسی به فراخوانی دستورات و کلاس ها نیاز داریم و از ماژول machine استفاده میکنیم. ماژول machine از چندین دستور برای استفاده سخت افزاری از بردها تشکیل شده است. اکثر توابع موجود در این ماژول امکان دست یابی مستقیم بدون محدودیت به بلوک های سخت افزاری را در سیستم برای ما فراهم میکند.
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
برای خواندن داده از سنسور از کلاس BH1750 استفاده میکنیم.
light = BH1750(i2c) lux=light.luminance(BH1750.ONCE_HIRES_1) ## Sample luminance in lux lux = str(round(lux, 1))
به همین ترتیب میتوانید این پروژه را با میکروپایتون اجرا کنید.
با درود
بسیار عالی بود
با سلام
کاربر گرامی سپاس از همراهی شما
سلام و خسته نباشید
ایا قابلیت اتصال همزمان چند سنسور i2c به برد فراهم است ؟
با سلام
بله محدودیتی وجود ندارد.
سلام، وقتتون بخیر.
در انجام این پروژه سوالی برای من پیش آمد ممنون میشم راهنماییم کنید.
همه مراحل به درستی انجام شد و اروری مشاهده نشد. اما در انتها با ارورهای زیر مواجه میشم:
Traceback (most recent call last):
File “”, line 8, in
File “ssd1306.py”, line 110, in __init__
File “ssd1306.py”, line 36, in __init__
File “ssd1306.py”, line 71, in init_display
File “ssd1306.py”, line 115, in write_cmd
OSError: [Errno 5] EIO
امکانش هست فایل کد هارو برای من ارسال کنید؟
با سلام
بایستی طبق اموزش در ابتدا کتابخانه SSD1306 را در پیکو ذخیره کنید. قدم به قدم با متن آموزش پیش بروید. بدون شک مشکلی نخواهید داشت.
سلام
واحد اندازه گیری سنسور لوکس متر چیست ؟
با سلام
واحد اندازه گیری سنسور لوکس متر BH1750 Lux است.
سنسور شدت نور من مدلش فرق داره اما چیپش دقیقا همین BH1750
میتونم از همین آموزش استفاده کنم؟
با سلام
اگر چیپ دقیقا BH1750 باشد، میتوانید استفاده کنید. مشکلی نیست.
سلام وقت به خیر
من در انجام این پروژه به این مشکلات برخوردم و ممنون میشم کمک کنید
File “bh1750.py”, line 30, in __init__
File “bh1750.py”, line 35, in off
File “bh1750.py”, line 49, in set_mode
AttributeError: ‘int’ object has no attribute ‘writeto’
با سلام
کاربر گرامی این ارور به دلیل نداشت کتابخانه I2C MicroPython هست. بررسی کنید
سلام و وقت به خیر
من این مشکل را دارم , ممنون میشم راهنمایی کنید
Traceback (most recent call last):
File “”, line 8, in
File “/lib/BH1750.py”, line 32, in __init__
File “/lib/BH1750.py”, line 37, in off
File “/lib/BH1750.py”, line 51, in set_mode
OSError: [Errno 5] EIO
دیدم یکی دیگر از دوستان نیر همین مشکل را داشتند و شما فرمودید مطابق آموزش عمل کنند
منم طبق آموزش عمل کردم ولی این پیام ها رو دریافت کردم
دیروز هم سوال دیگری داستم ولی هنوز تایید نشده
با سلام
برای حل مشکل مطابق با سولوشن زیر پیش برید:
کتابخانه smbus: این یک کتابخانه برای ارتباط I2C در لینوکس و Raspberry Pi است. شما باید توابعی مانند set_mode و luminance را برای استفاده از توابع smbus برای نوشتن و خواندن داده در گذرگاه I2C بازنویسی کنید.
import machine
machine.Pin(5, machine.Pin.OUT).low() # Reset the ESP32 module if needed
!pip install smbus
سلام و وقت به خیر
من اشتراک ۳ ماهه خرید کردم که جواب گو باشید … ولی متاسفانه …!!!!!
مطمینم خودتون کد را اجرا نکردید
کاربر گرامی تمامی آموزشها توسط خودم تست و بررسی شده است. اینکه شما نتوانستهاید مراحل رو به نتیجه برسانید دلیل بر اشتباه بودن کد نیست. آموزش ها کاملا شفاف از صفر تا صد همراه با تصویر تهیه شده و هزاران نفر استفاده کرده اند. بایستی دقیق و مرحله به مرحله با آموزش ها پیش بروید.
سلام و وقت به خیر به دوستان و عزیزان
بنده تحقیق کردم و علت مشکلات رو بررسی کردم
چه مشکلاتی که خودم داشتم چه ارور های دوستان …
اول این که حتما باید پایه های i2c نصب باشه … که فقط با کپی کد و import کردن از machine درست نمیشه و فراخوانی نمیشه
باید در ایتدا با این دستور پایه های i2c رو نصب کنید pip3 install smbus2 در ویندوز
اگر در لینوکس هستید sudo pip install smbus2
اول هم باید sudo رو نصب کنید
بعد اینکه حتما کد زیر رو که مینویسم در پوشه با نام main.py ذخیره کنید …
from machine import I2C, Pin
from BH1750 import BH1750
from ssd1306 import SSD1306_I2C
from time import sleep
i2c = I2C(0, sda=Pin(16), scl=Pin(17), freq=400000)
oled = SSD1306_I2C(128,64,i2c)
oled.fill(0)
light = BH1750(i2c)
while True:
lux=light.luminance(BH1750.ONCE_HIRES_1)
lux = str(round(lux,1))
oled.fill(0)
oled.text(“LUX” ,15,0)
oled.text(lux, 20,15)
oled.show()
sleep(1)
….
درایور bh1750 هم این رو کپی کنید و در فایل جدا و با نام BH1750.py ذخیره کنید …
“””
Micropython BH1750 ambient light sensor driver.
“””
from utime import sleep_ms
class BH1750():
“””Micropython BH1750 ambient light sensor driver.”””
PWR_OFF = 0x00
PWR_ON = 0x01
RESET = 0x07
# modes
CONT_LOWRES = 0x13
CONT_HIRES_1 = 0x10
CONT_HIRES_2 = 0x11
ONCE_HIRES_1 = 0x20
ONCE_HIRES_2 = 0x21
ONCE_LOWRES = 0x23
# default addr=0x23 if addr pin floating or pulled to ground
# addr=0x5c if addr pin pulled high
def __init__(self, bus, addr=0x23):
self.bus = bus
self.addr = addr
self.off()
self.reset()
def off(self):
“””Turn sensor off.”””
self.set_mode(self.PWR_OFF)
def on(self):
“””Turn sensor on.”””
self.set_mode(self.PWR_ON)
def reset(self):
“””Reset sensor, turn on first if required.”””
self.on()
self.set_mode(self.RESET)
def set_mode(self, mode):
“””Set sensor mode.”””
self.mode = mode
self.bus.writeto(self.addr, bytes([self.mode]))
def luminance(self, mode):
“””Sample luminance (in lux), using specified sensor mode.”””
# continuous modes
if mode & 0x10 and mode != self.mode:
self.set_mode(mode)
# one shot modes
if mode & 0x20:
self.set_mode(mode)
# earlier measurements return previous reading
sleep_ms(24 if mode in (0x13, 0x23) else 180)
data = self.bus.readfrom(self.addr, 2)
factor = 2.0 if mode in (0x11, 0x21) else 1.0
return (data[0]<<8 | data[1]) / (1.2 * factor)
….
درایور ssd1306 رو هم که از داخل خود thonny نصب کنید ( اون بالا داخل tools بعد manage packages بعد در سرچ اسم ssd1306 رو سرچ کنید … بعدش هم که مشخصه …
بعد هم اجرا کنید …
راستی سیم بندی رو دقت کنید … خیلی ها به خاطر سیم بندی ها مشکل داشتن ….
مخلصیم
سپاس از همراهی شما