رزبری پای میکروپایتون Micropython پروژه رزبری پای

پروژه کنترل شدت نور محیط با میکروپایتون و رزبری پای پیکو

create-light-meter-with-bh1750-raspberry-pi-pico-and-micropython-digispark
نوشته شده توسط پریسا پوربلورچیان

سنجش پارامترهای محیطی نیازمند سنسورهای مختلفی است. یکی از سنسورها پرکاربرد تشخیص شدت نور محیط است. سلامت و پایش وضعیت گیاهان در گلخانه‌ها به کمک سنسورهای نوری انجام می‌شود. سنسور نوری Light جهت اندازه گیری شدت نور محیط طراحی و در مدل‌های مختلف عرضه شده است. سنسور سطح نور یا Light Level Sensor در سطح‌های مختلف مقادیر نور محیط را اندازه‌گیری کرده و به صورت پارامتر Lux ارسال می‌کند. در این آموزش این بار با زبان میکروپایتون و توسط رزبری پای پیکو سنسور را راه اندازی کرده و عدد لایت را بر واحد لوکس بر روی نمایشگر OLED دریافت خواهیم کرد. در ادامه پروژه شدت نور محیط با میکروپایتون با مرجع تخصصی میکروپایتون به زبان فارسی، دیجی اسپارک همراه باشید.

پروژه کنترل شدت نور محیط با میکروپایتون و رزبری پای پیکو - دیجی اسپارک

 


سنسور BH1750 شدت نور


سنسور BH1750 از خانواده سنسورهای فتو رزیستوری است. این سنسور شدت نور محیط را سنجیده و بر اساس پارامتر Lux به عنوان دیتا تبدیل می‌کند. مقادیر لوکس از ۰ تا ۶۵۵۳۵ واحد لوکس است. با سنسور BH1750 این مقادیر قابل اندازه گیری است. سنسور دارای ۴ پایه VCC, GND, SCL, SDA است. به تصویر زیر دقت کنید.

سنسور BH1750 شدت نور - دیجی اسپارک

معرفی پایه‌های سنسور 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 شدت نور در پروژه میکروپایتون - دیجی اسپارک

 

 


اتصال 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 و اتصال به سیستم دست خود را از کلید بردارید. با اینکار رزبری پای پیکو شناسایی شده و پنجره ی آن باز می‌شود.

نصب میکروپایتون راه اندازی برد رزبری پای پیکو Pico - دیجی اسپارک

در نرم افزار Thonny بر روی نوار سمت راست پایین صفحه کلیک کنید.

نرم افزار Thonny برد رزبری پای پیکو - دیجی اسپارک

 

سپس بر روی Configure Interpreter کلیک کنید.

تنظیمات نرم افزار Thonny برد رزبری پای پیکو - دیجی اسپارک

 

سپس پس از شناسایی رزبری پای پیکو، صفحه ی زیر باز شده و پکیج را نصب کنید.

 

حالا 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)

 

نصب درایور میکروپایتون BH1750

 


نصب درایور میکروپایتون SSD1306


برای استفاده از سخت افزارها بایستی در ایتدا درایور آن ها برای میکروکنترلر نصب شود. این مورد کاملا وابسته به زبان برنامه نویسی مورد نظر و انتخاب نرم افزار است. در پروژه شدت نور محیط با میکروپایتون از زبان برنامه نویسی میکروپایتون و نرم افزار THONNY IDE برای نمایش دیتا در نمایشگر OLED استفاده می‌کنیم قدم اول برای معرفی نمایشگر OLED به نرم افزار THONNY IDE اضافه کردن درایور مورد نظر است. درایور نمایشگر OLED درایور SSD1306 است. به ترتیب زیر درایور را به نرم افزار و برد رزبری پای پیکو اضافه کنید.

نصب درایور میکروپایتون برای OLED در رزبری پای پیکو - دیجی اسپارک

 

  • در بخش درایورهای نمایشگر درایور SSD1306 را انتخاب کنید.

  •  پس از انتخاب درایور SSD1306، نرم افزار THONNY IDE را باز کنید.

کدنویسی میکروپایتون در Thonny برای OLED - دیجی اسپارک

 

  • درایور را کپی و در یک تب جدید در نرم افزار انتقال دهید. آن را با نام main.py در رزبری پای پیکو Raspberry Pi PICO ذخیره کنید.

انتقال درایور با نام main.py در رزبری پیکو - دیجی اسپارک

 

  • تا این مرحله درایور SSD1306 در برد رزبری پای پیکو تعریف و ذخیره شده است. حالا میتوانید یک برنامه جداگانه در یک تب جداگانه برای نمایشگر OLED بنویسید.

 

محدودیت در دسترسی کامل به این مجموعه آموزش

 

دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندس‌های دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید.

 

برای مطالعه کامل آموزش راه اندازی نمایشگر OLED با رزبری پای پیکو PICO و میکروپایتون کلیک کنید.

پروژه میکروپایتون رزبری پای با OLED و ماژول Lux متر - دیجی اسپارک

 


اتصالات پروژه شدت نور محیط با میکروپایتون


برای انچام شدت نور محیط با میکروپایتون اتصالات به GP هایی که از I2C پشتیبانی می‌کنند، نیاز داریم.

پایه های خروجی رزبری پای پیکو Pico - دیجی اسپارک

 

اتصال نمایشگر OLED به پیکو PICO - دیجی اسپارک

 

  • پایه 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))

به همین ترتیب میتوانید این پروژه را با میکروپایتون اجرا کنید.

 



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

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

پریسا پوربلورچیان

تولید کننده محتوا / کارشناس IOT

زندگی یعنی پژوهش و فهمیدن چیزی جدید

تلاشم بر این است تجربیاتم در زمینه IOT‌ را به بهترین شکل با شما در میان بگذارم.

تبادل نظر و رفع عیب با ثبت دیدگاه

۱۸ دیدگاه

  • سلام، وقتتون بخیر.
    در انجام این پروژه سوالی برای من پیش آمد ممنون میشم راهنماییم کنید.
    همه مراحل به درستی انجام شد و اروری مشاهده نشد. اما در انتها با ارورهای زیر مواجه می‌شم:
    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
    میتونم از همین آموزش استفاده کنم؟

    • با سلام
      اگر چیپ دقیقا 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 رو سرچ کنید … بعدش هم که مشخصه …
    بعد هم اجرا کنید …
    راستی سیم بندی رو دقت کنید … خیلی ها به خاطر سیم بندی ها مشکل داشتن ….
    مخلصیم