آموزش رزبری پای رزبری پای

پروژه ساخت دماسنج و رطوبت سنج با رزبری پای پیکو Pico و میکروپایتون

create-temperature-and-humidity-display-with-oled-raspberry-pico-micropython-digispark
نوشته شده توسط پریسا پوربلورچیان

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

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

 


برد رزبری پای پیکو RASPBERRY PI PICO


رزبری پای Pico یک برد توسعه یافته بر پایه تراشه RP2040 است. RP2040 یک پردازنده ی ۳۲ بیتی dual ARM Cortex-M0+ Microcontroller است. تراشه از یک سیلیکون ۴۰nm با ابعاد ۷X7 میلی متری از پکیج QFN-56 SMD است. فرکانس پردازنده ۱۳۳MHz و حافظه SRAM برابر با ۲۶۴KB است. برای کدنویسی رزبری پای پیکو از زبان برنامه نویسی میکروپایتون استفاده می‌کنیم. بهترین نرم افزار برای کار با برد رزبری پای پیکو THONNY IDE است. برد رزبری پای پیکو از ۴۰ ردیف پین هدر با استایل ۲۱X51 با ضخامت ۱ میلی متری است. از این ۴۰ پایه ۲۶ پایه منحصرا با ولتاژ ۳٫۳ ولت برای GPIO یعنی پایه های ورودی و خروجی است. از این ۴۰ پایه ۲۳ برای پایه های دیجیتال است. رزبری پای پیکو دارای ولتاژ داخلی ۳٫۳ ولت است و در تمامی پایه ها ثابت است. ۲۶ پایه از ۳۰ پایه RP2040 قابل استفاده است.

  • پایه های GPIO0 تا GPIO22 پایه های دیجیتال هستند.
  • پایه های GPIO26 – GPIO28 به عنوان دیجیتال و ورودی ADC قابل استفاده است.
  • پایه های GP0, GP1 پایه های UART هستند.
  • پایه های GP26-27-28 پایه های ADC است.
  • پایه های GP16-17-18-19 پایه های SPI است.
  • پایه های GP4-GP5 پایه های I2C است.

آموزش میکروپایتون با رزبری پای پیکو بخش اول: معرفی و شروع کار با برد

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

آموزش میکروپایتون با رزبری پای پیکو بخش دوم: نرم افزار Arduino و Thonny

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

 


اتصال سنسور DHT11 به PICO


برای انجام اتصالات فقط به سه پایه نیاز داریم. پایه دیتا OUT، پایه تغذیه VCC و پایه GND که در Pinout رزبری پای پیکو مشخص است که هر پایه میتوانید چه ماهیتی داشته باشد. در اجرای این پروژه به صورت دلخواه برای اتصال پایه دیتا OUT از هر کدام از پایه های GP که با رنگ سبز مشخص شده است میتوانید استفاده کنید ( در این پروژه از پایه GP16 استفاده شده است) سپس پایه تغذیه VCC را ۳٫۳ ولت و یکی از پایه های GND را انتخاب کنید.

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

 

  • پایه OUT سنسور را به پایه GP16 اتصال دهید.
  • پایه VCC سنسور را به پایه ۳٫۳ ولت اتصال دهید.
  • پایه GND سنسور  را به پایه GND اتصال دهید.

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

 


راه اندازی سنسور DHT با PICO


 سنسور DHT11 کالیبره شده و دارای خروجی دیجیتال است. محدوده اندازه گیری رطوبت بین ۲۰ تا ۹۰% RH و محدوده‌ی دما از ۰ تا ۵۰ درجه سانتی گراد می‌باشد. ولتاژ کاری ماژول DHT بین ۳٫۳ تا ۵ ولت DC است. فاصله انتقال سیگنال در ماژول DHT11 تا ۲۰ متر می‌باشد. ماژول دما و رطوبت DHT11 بسیار مقرون به صرفه، دارای کیفیت‌ عالی و واکنش سریع نسبت به تغییر دمای محیط است. این سنسور دما رطوبت به ترتیب دارای ۳ پایه GND, VCC, Signal می‌باشد. سنسور dht قابلیت نمایش دما و روطوبت را دارد که میتوانید با هر میکروکنترلی به راحتی توسط کتابخانه ی توسعه یافته برای آن راه اندازی کرد. در این آموزش نیاز به اندازه گیری دمای منفی نداریم. برای راه اندازی سنسور DHT11 در رزبری پای پیکو و نرم افزار THONNY IDE باید کتابخانه آن را به هر دو معرفی کنیم. برای اینکار نرم افزار THONNY IDE را باز کنید و مطابق با روش زیر پیش بروید.

 

معرفی کتابخانه DHT11 به نرم افزار THONNY

در قدم اول دو روش برای فراخوانی کتابخانه و معرفی آن به نرم افزار THONNY وجود دارد. یکی از طریق مسیر View/ Files که در در ستون سمت چپ در ابتدا فایل کتابخانه دانلودی را وارد می‌کنید. سپس در منو پایین Raspberry Pi PICO کتابخانه را اضافه ADD می‌کنید. روش دوم اضافه کردن دستی کتابخانه به برنامه است. به این طریق که فایل کتابخانه را در یک تب جدید در نرم افزار وارد کرده و با نام خودش در برد رزبری پای پیکو ذخیره می‌کنید. در ابتدا کتابخانه را وارد نرم افزار کنید.

import array

import micropython
import utime
from machine import Pin
from micropython import const


class InvalidChecksum(Exception):
    pass


class InvalidPulseCount(Exception):
    pass


MAX_UNCHANGED = const(100)
MIN_INTERVAL_US = const(200000)
HIGH_LEVEL = const(50)
EXPECTED_PULSES = const(84)


class DHT11:
    _temperature: float
    _humidity: float

    def __init__(self, pin):
        self._pin = pin
        self._last_measure = utime.ticks_us()
        self._temperature = -1
        self._humidity = -1

    def measure(self):
        current_ticks = utime.ticks_us()
        if utime.ticks_diff(current_ticks, self._last_measure) < MIN_INTERVAL_US and (
            self._temperature > -1 or self._humidity > -1
        ):
            # Less than a second since last read, which is too soon according
            # to the datasheet
            return

        self._send_init_signal()
        pulses = self._capture_pulses()
        buffer = self._convert_pulses_to_buffer(pulses)
        self._verify_checksum(buffer)

        self._humidity = buffer[0] + buffer[1] / 10
        self._temperature = buffer[2] + buffer[3] / 10
        self._last_measure = utime.ticks_us()

    @property
    def humidity(self):
        self.measure()
        return self._humidity

    @property
    def temperature(self):
        self.measure()
        return self._temperature

    def _send_init_signal(self):
        self._pin.init(Pin.OUT, Pin.PULL_DOWN)
        self._pin.value(1)
        utime.sleep_ms(50)
        self._pin.value(0)
        utime.sleep_ms(18)

    @micropython.native
    def _capture_pulses(self):
        pin = self._pin
        pin.init(Pin.IN, Pin.PULL_UP)

        val = 1
        idx = 0
        transitions = bytearray(EXPECTED_PULSES)
        unchanged = 0
        timestamp = utime.ticks_us()

        while unchanged < MAX_UNCHANGED:
            if val != pin.value():
                if idx >= EXPECTED_PULSES:
                    raise InvalidPulseCount(
                        "Got more than {} pulses".format(EXPECTED_PULSES)
                    )
                now = utime.ticks_us()
                transitions[idx] = now - timestamp
                timestamp = now
                idx += 1

                val = 1 - val
                unchanged = 0
            else:
                unchanged += 1
        pin.init(Pin.OUT, Pin.PULL_DOWN)
        if idx != EXPECTED_PULSES:
            raise InvalidPulseCount(
                "Expected {} but got {} pulses".format(EXPECTED_PULSES, idx)
            )
        return transitions[4:]

    def _convert_pulses_to_buffer(self, pulses):
        """Convert a list of 80 pulses into a 5 byte buffer

        The resulting 5 bytes in the buffer will be:
            ۰: Integral relative humidity data
            ۱: Decimal relative humidity data
            ۲: Integral temperature data
            ۳: Decimal temperature data
            ۴: Checksum
        """
        # Convert the pulses to 40 bits
        binary = 0
        for idx in range(0, len(pulses), 2):
            binary = binary << 1 | int(pulses[idx] > HIGH_LEVEL)

        # Split into 5 bytes
        buffer = array.array("B")
        for shift in range(4, -1, -1):
            buffer.append(binary >> shift * 8 & 0xFF)
        return buffer

    def _verify_checksum(self, buffer):
        # Calculate checksum
        checksum = 0
        for buf in buffer[0:4]:
            checksum += buf
        if checksum & 0xFF != buffer[4]:
            raise InvalidChecksum()

 

این برنامه را با اسم dht.py در برد رزبری پای پیکو Raspberry Pi PICO ذخیره کنید.

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

 

تا این مرحله فقط کتابخانه dht را در برد رزبری پای پیکو با نام dht.py ذخیره کردیم. حالا میتوانیم یک کد راحت برای نمایش دما رطوبت در کنسول نرم افزار نمایش دهیم. یک تب جدید باز کنید. کد زیر را کپی و انتقال دهید. برنامه را با نام دلخواه dht11test.py در سیستم ذخیره کنید.

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

 

from machine import Pin
import time
from dht import DHT11, InvalidChecksum
 
sensor = DHT11(Pin(16, Pin.OUT, Pin.PULL_DOWN))
 
while True:
    temp = sensor.temperature
    humidity = sensor.humidity
    print("Temperature: {}°C   Humidity: {:.0f}% ".format(temp, humidity))
    time.sleep(2)

 

ساخت دماسنج و رطوبت سنج با رزبری پای پیکو - دیجی اسپارک

 

همانطور که در شل مشاهده می‌کنید، دیتای دما رطوبت از سنسور خوانده شده و نمایش داده می‌شود.

Temperature: 28.5°C   Humidity: 33% 
Temperature: 28.5°C   Humidity: 33% 
Temperature: 28.5°C   Humidity: 33% 
Temperature: 28.5°C   Humidity: 33% 
Temperature: 28.5°C   Humidity: 33% 
Temperature: 28.5°C   Humidity: 33% 
Temperature: 28.5°C   Humidity: 33% 
Temperature: 28.5°C   Humidity: 33% 
Temperature: 28.5°C   Humidity: 33% 
Temperature: 28.5°C   Humidity: 33% 

 

برای معرفی ورودی و استفاده از GP که به سنسور متصل شده است، از تابع زیر استفاده می‌کنیم. سنسور به GP16 متصل شده و پول دان است.

sensor = DHT11(Pin(16, Pin.OUT, Pin.PULL_DOWN))

 

برای نمایش دیتای دما از سنسور DHT11 از تابع زیر استفاده کنید.

sensor.temperature

 

برای نمایش دیتای رطوبت از سنسور DHT11 از تابع زیر استفاده کنید.

sensor.humidity

 

برای نمایش دیتای دریافتی رطوبت و دما از سنسور از تابع زیر استفاده کنید.

    print("Temperature: {}°C   Humidity: {:.0f}% ".format(temp, humidity))

 


اتصال نمایشگر OLED به PICO


برای اتصال نمایشگر OLED به رزبری پای پیکو از رابط I2C استفاده می‌کنیم.

نقشه پایه های برد رزبری پای پیکو Pico - دیجی اسپارک

 

در پین اوت بالا پایه هایی که با رنگ آبی و فلش آبی مشخص شده است، پایه های ارتباطی I2C در پیکو هستند که مجاز به استفاده از آن ها هستیم.

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

 

  • پایه VCC نمایشگر OLED را به پایه ۳٫۳ ولت پیکو اتصال دهید.
  • پایه GND نمایشگر OLED را به پایه GND پیکو اتصال دهید.
  • پایه SDA نمایشگر OLED را به پایه GP0 پیکو اتصال دهید.
  • پایه SCL نمایشگر OLED را به پایه GP1 پیکو اتصال دهید.

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

 


راه اندازی نمایشگر OLED با PICO


برای راه اندازی نمایشگر OLED با رزبری پای پیکو قبلا در یک آموزش کامل روش نصب درایور SSD1306 به صورت کامل آموزش داده شده است. بر روی لینک زیر کلیک کنید.

راه اندازی نمایشگر OLED با رزبری پای PICO

اما مراحل اصلی را یک بار دیگر در این آموزش با هم اجرا می‌کنیم. برای راه اندازی OLED به درایور SSD1306 نیاز داریم. همانند روش قبل یک تب جدید در نرم افزار THONNY ایجاد کنید. درایور را کپی و انتقال دهید. سپس این تب را با نام SSD1306.PY در مسیر RASPBERRY PI PICO ذخیره کنید.

 


نمایش دما رطوبت با میکروپایتون


پس از فراخوانی کتابخانه DHT11 و درایور SSD1306 برای نمایشگر OLED در تب های جداگانه بایستی از ترکیب هر دو در کدنویسی پروژه استفاده کنیم.

  • فراخوانی کتابخانه DHT11
  • فراخوانی کتابخانه SSD1306
  • توابع مربوط به معرفی سنسور DHT11  مشخص کردن پایه دیتا
  • مشخص کردن ابعاد OLED
  • مشخص کردن توابع I2C برای نمایشگر OLED
  • مشخص کردن پایه های I2C برای OLED
  • نوشتن تابع نمایش متن در OLED
  • نوشتن تابع نمایش دیتا در OLED
  • دریافت دیتا دما از سنسور DHT11
  • دریافت دیتا رطوبت از سنسور DHT11

در نهایت با ترکیب هر دو برنامه، میتوانیم یک کد سالم برای این پروژه بنویسیم. کد را کپی و به THONNY در یک تب جداگانه اضافه کنید. اسم دلخواه برای این تب در نظر بگیرید و میتوانید در سیستم و یا رزبری پای پیکو ذخیره کنید. در این پروژه برنامه نهایی با نام dht11.py در سیستم ذخیره شده است.

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import utime as time
from dht import DHT11, InvalidChecksum
 
WIDTH  = 128                                            
HEIGHT = 64                                            
 
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000)       
print("I2C Address      : "+hex(i2c.scan()[0]).upper()) 
print("I2C Configuration: "+str(i2c))                   
 
 
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)                
 
while True:
    time.sleep(1)
    pin = Pin(16, Pin.OUT, Pin.PULL_DOWN)
    sensor = DHT11(pin)
    t  = (sensor.temperature)
    h = (sensor.humidity)
    print("Temperature: {}".format(sensor.temperature))
    print("Humidity: {}".format(sensor.humidity))
   
    oled.fill(0)       
    
   
    oled.text("Temp: ",10,10)
    oled.text(str(sensor.temperature),50,10)
    oled.text("*C",90,10)
    
    oled.text("Humi: ",10,30)
    oled.text(str(sensor.humidity),50,30)
    oled.text("%",90,30)
    
    time.sleep(1)
    oled.show()

 

 

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

 

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

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import utime as time
from dht import DHT11, InvalidChecksum

 

سپس ابعاد نمایشگر OLED را در برنامه تعریف کنید.

WIDTH  = 128                                            
HEIGHT = 64

 

در قدم بعدی با توجه به اینکه نمایشگر OLED از پروتکل ارتباطی I2C استفاده می‌کند، آدرس I2C را اسکن و پایه های GP I2C رزبری پای پیکو را برای پایه های SDA , SCL در کد برنامه مشخص می‌کنیم.

i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000)       
print("I2C Address      : "+hex(i2c.scan()[0]).upper()) 
print("I2C Configuration: "+str(i2c))                   
 

 

تابع فراخوانی و فعال شدن نمایشگر OLED را مینویسیم.

oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)                

 

در قدم بعدی توابع مورد نیاز برای دریافت دیتا از سنسور DHT که به پایه شماره ۱۶ یا همان GP16 متصل شده است را فراخوانی می‌کنیم. دیتای دما را در متغیری به نام T و دیتای رطوبت را در متغیری به نام H ذخیره می‌کنیم. دما و رطوبت هرکدام توابع جداگانه ای برای دریافت خواندن دیتا دارند. سپس برای نمایش دیتاها در shell از print استفاده می‌کنیم.

while True:
    time.sleep(1)
    pin = Pin(16, Pin.OUT, Pin.PULL_DOWN)
    sensor = DHT11(pin)
    t  = (sensor.temperature)
    h = (sensor.humidity)
    print("Temperature: {}".format(sensor.temperature))
    print("Humidity: {}".format(sensor.humidity))

 

در قدم بعدی باید دیتای خوانده شده از سنسور را در نمایشگر OLED وارد کنیم. برای نمایش دیتا از OLED.TEXT استفاده می‌کنیم. ابعاد نمایش و سایز را میتوانید توسط تابع OLED.TEXT مشخص کنید. اگر مقدار OLED.FILL را صفر در نظر بگیرید، تمامی صفحه نمایش را در اخیتار داریم.

oled.fill(0)       
    
   
    oled.text("Temp: ",10,10)
    oled.text(str(sensor.temperature),50,10)
    oled.text("*C",90,10)
    
    oled.text("Humi: ",10,30)
    oled.text(str(sensor.humidity),50,30)
    oled.text("%",90,30)
    
    time.sleep(1)
    oled.show()

 

کد به پایان رسید. برنامه را اجرا کنید. دیتا برای شما نمایش داده خواهد شد.

 

 


وسایل مورد نیاز


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

نمایشگر OLED SSD1306

سنسور دما رطوبت DHT11

برد بورد 

کابل فلت 

 


جمع بندی لیدی پای


ساخت ترموستات با هر میکروکنتری چالش های زیادی دارد اما چالش اصلی استفاده از زبان برنامه نویسی جدیدی است که این روزها برای میکروکنترلرها تعریف شده است و آن چیزی نیست جز میکروپایتون MICROPYTHON. در این پروژه به زبان میکروپایتون توسط سنسور دما رطوبت DHT11 و نمایشگر OLED یک دماسنج و رطوبت سنج با برد رزبری پای پیکو در نرم افزار THONNY IDE نوشته و اجرا کردیم. با اجرای این آموزش به تحلیل کدهای میکروپایتون و اجرای پروژه مسلط خواهید شد.

 

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

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

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

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

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

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

۱۰ دیدگاه

  • سلام این همه سایت خارجی هست یه نفر نتونست درست بگه باید چجوری لایببری اد کنیم با یک بار خوندن این آموزش دقیق متوجه شدم داستان از چه قراره
    خیلی ممنونم

    • با سلام
      حتما بایستی درایور را در برنامه فراخوانده و سپس با همان اسم در برد pico ذخیره کنید.

  • با سلام
    چون دو کتابخانه داریم، تداخل برای میکروپایتون نداره؟ من هیچ پروژه ای رو از سایت های خارجی برای oled نتوستم پیاده کنم

    • با سلام
      خیر این مورد کاملا بی ارتباط است و محدودیتی برای فراخوانی کتابخانه وجود ندارد.

  • سلام سنسور دمای من چهار پایه دارد و پایه چهارمیش برای دیتا است
    برنامه نویسی آن رو از متن بالا گرفتم
    الان باید بزنامه نویسیش رو عوض کنم یا همین کار می کنه