📟 راه‌اندازی LCD I2C با میکروپایتون روی رزبری پای پیکو (درایور i2c_lcd)

✍️ تیم ووکوی فارسی ·

نمایشگر LCD کاراکتری ۱۶×۲ همان صفحه‌ی آبی یا سبز آشنایی است که روی دستگاه‌های صنعتی، شارژرها و پروژه‌های دانشجویی می‌بینی. اگر یک ماژول کوچک I2C پشتش لحیم شده باشد، به جای ده‌دوازده سیم فقط با چهار سیم وصل می‌شود. در این آموزش LCD I2C با میکروپایتون را روی رزبری پای پیکو راه می‌اندازیم: آدرس نمایشگر را پیدا می‌کنیم، متن می‌نویسیم و یک ساعت کارکرد زنده روی خط دوم نشان می‌دهیم. اگر قبلاً همین کار را در Wokwi یا با آردوینو دیده‌ای، این نسخه‌ی فارسی و خط‌به‌خط آن برای پیکو است.

چه چیزی می‌سازیم؟

یک برنامه‌ی کوتاه که اول همه‌ی دستگاه‌های روی باس I2C را پیدا و در سریال مانیتور چاپ می‌کند، بعد روی خط اول LCD یک پیام خوش‌آمد می‌نویسد و روی خط دوم، زمانی را که از روشن شدن برد گذشته به شکل دقیقه:ثانیه نشان می‌دهد. همین الگو پایه‌ی هر پروژه‌ای است که بخواهد عدد سنسور، منو یا وضعیت دستگاه را روی صفحه بیاورد.

قطعه‌های لازم

ماژول I2C پشت LCD چه کار می‌کند؟

خود LCD کاراکتری برای کار کردن به شش تا ده پایه‌ی داده و کنترل نیاز دارد. ماژول I2C (همان برد کوچک سیاهی که پشت نمایشگر است) یک «گسترش‌دهنده‌ی پایه» به نام PCF8574 دارد: پیکو فقط با دو سیم SDA و SCL به آن فرمان می‌دهد و ماژول آن فرمان‌ها را به پایه‌های LCD می‌رساند. هر دستگاه I2C یک آدرس دارد؛ این ماژول‌ها معمولاً روی 0x27 یا 0x3F هستند. یک پیچ آبی کوچک هم روی ماژول هست که کنتراست را تنظیم می‌کند و جلوتر می‌بینی چقدر مهم است.

سیم‌کشی

پایه‌ی ماژول LCDپایه‌ی پیکوشماره‌ی فیزیکی
GNDGNDپایه‌ی ۳ (یا هر GND دیگر)
VCCVBUS (۵ ولت USB)پایه‌ی ۴۰
SDAGP0 (I2C0 SDA)پایه‌ی ۱
SCLGP1 (I2C0 SCL)پایه‌ی ۲

پیکو دو باس I2C دارد و هر باس فقط روی پایه‌های مشخصی کار می‌کند. برای باس شماره‌ی ۰، جفت‌های GP0/GP1، GP4/GP5، GP8/GP9، GP12/GP13، GP16/GP17 و GP20/GP21 مجازند. ما GP0 و GP1 را برداشتیم؛ پروژه‌ی آماده‌ی شبیه‌ساز از GP4 و GP5 استفاده می‌کند که آن هم I2C0 است. نقشه‌ی کامل پایه‌ها را در پین اوت رزبری پای پیکو ببین.

بیشتر LCDهای ۱۶×۲ با ۵ ولت نور و کنتراست بهتری دارند، برای همین VCC را به VBUS می‌زنیم. ولی مقاومت‌های بالاکش روی ماژول I2C خط‌های SDA و SCL را هم به همان ۵ ولت می‌کشند، در حالی که پایه‌های پیکو ۳٫۳ ولتی‌اند. خیلی‌ها سال‌ها بی‌دردسر همین‌طور کار می‌کنند، ولی اگر می‌خواهی کاملاً امن باشی، یک مبدل سطح ولتاژ دوطرفه بین آن‌ها بگذار یا ماژول را با ۳٫۳ ولت تغذیه کن.

فایل‌های درایور: lcd_api.py و i2c_lcd.py

برخلاف DHT یا PWM، فرم‌ور میکروپایتون ماژول داخلی برای LCD ندارد. رایج‌ترین درایور دو فایل پایتونی است: lcd_api.py که دستورهای عمومی LCD (پاک کردن، جابه‌جایی مکان‌نما، نوشتن) را دارد و i2c_lcd.py که همان دستورها را از راه I2C به ماژول PCF8574 می‌فرستد. این دو فایل باید روی خود برد واقعی کپی شوند، کنار main.py؛ اگر نباشند، اولین خط برنامه با خطای ImportError: no module named 'i2c_lcd' می‌ایستد. در Thonny از پنجره‌ی Files روی فایل راست‌کلیک کن و Upload to / را بزن. روش کامل را در نصب میکروپایتون و Thonny روی پیکو نوشته‌ایم.

بعضی آموزش‌ها همین فایل را با نام pico_i2c_lcd.py منتشر کرده‌اند. اگر فایل تو این اسم را دارد، خط import را به from pico_i2c_lcd import I2cLcd تغییر بده؛ بقیه‌ی کد یکی است. در شبیه‌ساز هر دو اسم از قبل آماده‌اند و لازم نیست چیزی کپی کنی.

کد کامل میکروپایتون

from machine import I2C, Pin
from i2c_lcd import I2cLcd
import time

i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)

devices = i2c.scan()
print("I2C devices:", [hex(d) for d in devices])

lcd = I2cLcd(i2c, 0x27, 2, 16)     # address, rows, columns

lcd.clear()
lcd.putstr("Salam Pico!")
start = time.ticks_ms()

while True:
    seconds = time.ticks_diff(time.ticks_ms(), start) // 1000
    minutes = seconds // 60
    seconds = seconds % 60
    lcd.move_to(0, 1)                # column 0, second row
    lcd.putstr("Uptime %02d:%02d   " % (minutes, seconds))
    time.sleep(0.5)

توضیح خط به خط

برای به‌روز کردن یک عدد، کل صفحه را با clear() پاک نکن. پاک کردن کامل باعث چشمک زدن صفحه می‌شود. فقط با move_to به همان جا برو و متن تازه را با چند فاصله‌ی اضافه رویش بنویس.

دستورهای مفید درایور

دستورکار
lcd.putchar("A")فقط یک حرف می‌نویسد
lcd.backlight_off() / backlight_on()نور پس‌زمینه را خاموش و روشن می‌کند (برای صرفه‌جویی در باتری)
lcd.show_cursor() / hide_cursor()خط زیر مکان‌نما را نشان می‌دهد یا پنهان می‌کند
lcd.blink_cursor_on()مکان‌نمای چشمک‌زن، مناسب منو و ورود عدد
lcd.display_off() / display_on()متن را پنهان و دوباره ظاهر می‌کند، بدون پاک شدن
lcd.custom_char(0, bytearray([...]))یک کاراکتر دلخواه ۵×۸ (مثل قلب یا علامت درجه) می‌سازد که با chr(0) چاپ می‌شود؛ این یکی روی برد واقعی کار می‌کند و شبیه‌ساز فعلاً نادیده‌اش می‌گیرد

اجرا در شبیه‌ساز

در تینکرکد فارسی پروژه‌ی آماده‌ی LCD و دماسنج DHT11 با MicroPython روی پیکو همین درایور را با یک سنسور دما و رطوبت ترکیب کرده است. بازش کن، کد بالا را جای کد آن بگذار (یا فقط پایه‌ها را به GP4 و GP5 برگردان) و اجرا کن: خروجی i2c.scan() در سریال مانیتور می‌آید و نوشته‌ها روی LCD سه‌بعدی ظاهر می‌شوند. برد پیکو، میکروپایتون و ماژول LCD I2C جزو امکانات اشتراک پلاس هستند؛ یعنی مثال آماده رایگان باز می‌شود و می‌توانی کدش را بخوانی، و برای اجرا کردنش پلاس لازم داری. شبیه‌ساز فارسی است، روی گوشی هم کار می‌کند و چون روی سرور داخل ایران است، روی اینترنت ملی هم باز می‌شود.

اشکال‌های رایج

قدم بعدی

حالا که صفحه داری، یک سنسور به آن بده: در DHT11 و DHT22 با میکروپایتون دما و رطوبت را می‌خوانیم و همین LCD نشانش می‌دهد. اگر با آردوینو کار می‌کنی، نسخه‌ی C++ همین آموزش در LCD I2C با آردوینو است. برای همه‌ی امکانات برد هم صفحه‌ی رزبری پای پیکو را ببین.

LCD پیکو را در شبیه‌ساز باز کن 📟

سؤال‌های رایج

آدرس LCD من 0x27 است یا 0x3F؟

به تراشه‌ی ماژول I2C پشت نمایشگر بستگی دارد. PCF8574T معمولاً 0x27 و PCF8574AT معمولاً 0x3F است. مطمئن‌ترین راه اجرای i2c.scan() است: عدد 39 یعنی 0x27 و عدد 63 یعنی 0x3F.

چرا نور پس‌زمینه‌ی LCD روشن است ولی هیچ نوشته‌ای دیده نمی‌شود؟

در بیشتر موارد کنتراست تنظیم نیست. پیچ پتانسیومتر آبی پشت ماژول I2C را با پیچ‌گوشتی آرام بچرخان تا حروف ظاهر شوند. اگر باز هم خالی بود، آدرس و سیم‌های SDA و SCL را چک کن.

فایل‌های lcd_api.py و i2c_lcd.py را کجا بگذارم؟

روی برد واقعی، هر دو فایل باید در حافظه‌ی خود پیکو (کنار main.py) ذخیره شوند؛ مثلاً در Thonny با Upload to /. در شبیه‌ساز این درایور از قبل آماده است و لازم نیست فایلی کپی کنی.

مقاله‌های مرتبط

🌡️

سنسور دما و رطوبت DHT11 و DHT22 با میکروپایتون روی رزبری پای پیکو

⏱️

Timer در میکروپایتون: چند کار هم‌زمان روی رزبری پای پیکو بدون sleep

🛠️

نصب میکروپایتون روی رزبری پای پیکو و راه‌اندازی Thonny، قدم‌به‌قدم

🪴

سنسور رطوبت خاک با آردوینو و ساخت سیستم آبیاری خودکار گلدان

همه‌ی آموزش‌های رزبری پای پیکو و میکروپایتون ← · همه‌ی مقاله‌ها