برد رزبری پای پیکو یک میکروکنترلر حرفه ای برای شروع کار برنامه نویسی به زبان میکروپایتون است. بردی ارزان قیمت، کاربردی از مطرح ترین کمپانی دنیا که این امکانات را در اختیار ما قرار داده است. در این پروژه توسط سنسور دما رطوبت 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
اتصال سنسور DHT11 به PICO
برای انجام اتصالات فقط به سه پایه نیاز داریم. پایه دیتا OUT، پایه تغذیه VCC و پایه GND که در Pinout رزبری پای پیکو مشخص است که هر پایه میتوانید چه ماهیتی داشته باشد. در اجرای این پروژه به صورت دلخواه برای اتصال پایه دیتا OUT از هر کدام از پایه های GP که با رنگ سبز مشخص شده است میتوانید استفاده کنید ( در این پروژه از پایه GP16 استفاده شده است) سپس پایه تغذیه VCC را ۳٫۳ ولت و یکی از پایه های GND را انتخاب کنید.
- پایه OUT سنسور را به پایه GP16 اتصال دهید.
- پایه VCC سنسور را به پایه ۳٫۳ ولت اتصال دهید.
- پایه GND سنسور را به پایه GND اتصال دهید.
راه اندازی سنسور 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 در سیستم ذخیره کنید.
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 استفاده میکنیم.
در پین اوت بالا پایه هایی که با رنگ آبی و فلش آبی مشخص شده است، پایه های ارتباطی I2C در پیکو هستند که مجاز به استفاده از آن ها هستیم.
- پایه VCC نمایشگر OLED را به پایه ۳٫۳ ولت پیکو اتصال دهید.
- پایه GND نمایشگر OLED را به پایه GND پیکو اتصال دهید.
- پایه SDA نمایشگر OLED را به پایه GP0 پیکو اتصال دهید.
- پایه SCL نمایشگر OLED را به پایه GP1 پیکو اتصال دهید.
راه اندازی نمایشگر 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()
کد به پایان رسید. برنامه را اجرا کنید. دیتا برای شما نمایش داده خواهد شد.
وسایل مورد نیاز
جمع بندی لیدی پای
ساخت ترموستات با هر میکروکنتری چالش های زیادی دارد اما چالش اصلی استفاده از زبان برنامه نویسی جدیدی است که این روزها برای میکروکنترلرها تعریف شده است و آن چیزی نیست جز میکروپایتون MICROPYTHON. در این پروژه به زبان میکروپایتون توسط سنسور دما رطوبت DHT11 و نمایشگر OLED یک دماسنج و رطوبت سنج با برد رزبری پای پیکو در نرم افزار THONNY IDE نوشته و اجرا کردیم. با اجرای این آموزش به تحلیل کدهای میکروپایتون و اجرای پروژه مسلط خواهید شد.
سلام این همه سایت خارجی هست یه نفر نتونست درست بگه باید چجوری لایببری اد کنیم با یک بار خوندن این آموزش دقیق متوجه شدم داستان از چه قراره
خیلی ممنونم
با سلام
سپاس از همراهی شما کاربر گرامی
امیدوارم آموزش ها مفید واقع شود.
با سلام من درایور رو روی thonny در پوشه جدا ندارم و کار نمیکنه لطفا راهنمایی کنید.
با سلام
حتما بایستی درایور را در برنامه فراخوانده و سپس با همان اسم در برد pico ذخیره کنید.
با سلام
چون دو کتابخانه داریم، تداخل برای میکروپایتون نداره؟ من هیچ پروژه ای رو از سایت های خارجی برای oled نتوستم پیاده کنم
با سلام
خیر این مورد کاملا بی ارتباط است و محدودیتی برای فراخوانی کتابخانه وجود ندارد.
سلام
برای من کتابخانه ها نصب نمیشه شما چیکار کردید؟
با سلام
به صورت دستی در کد برنامه اضافه کنید در متن آموزش گفته شده است.
سلام سنسور دمای من چهار پایه دارد و پایه چهارمیش برای دیتا است
برنامه نویسی آن رو از متن بالا گرفتم
الان باید بزنامه نویسیش رو عوض کنم یا همین کار می کنه
با سلام
تفاوتی ندارد. از همین کد استفاده کنید.
سلام وقت بخیر
برای استفاده از درایور SSD باید در رزبری پای پیکو با چه اسمی ذخیره کنیم؟
با سلام
بله دقیقا از همان اسم SSD1306 استفاده کنید.