📟 راهاندازی LCD I2C با میکروپایتون روی رزبری پای پیکو (درایور i2c_lcd)
نمایشگر LCD کاراکتری ۱۶×۲ همان صفحهی آبی یا سبز آشنایی است که روی دستگاههای صنعتی، شارژرها و پروژههای دانشجویی میبینی. اگر یک ماژول کوچک I2C پشتش لحیم شده باشد، به جای دهدوازده سیم فقط با چهار سیم وصل میشود. در این آموزش LCD I2C با میکروپایتون را روی رزبری پای پیکو راه میاندازیم: آدرس نمایشگر را پیدا میکنیم، متن مینویسیم و یک ساعت کارکرد زنده روی خط دوم نشان میدهیم. اگر قبلاً همین کار را در Wokwi یا با آردوینو دیدهای، این نسخهی فارسی و خطبهخط آن برای پیکو است.
چه چیزی میسازیم؟
یک برنامهی کوتاه که اول همهی دستگاههای روی باس I2C را پیدا و در سریال مانیتور چاپ میکند، بعد روی خط اول LCD یک پیام خوشآمد مینویسد و روی خط دوم، زمانی را که از روشن شدن برد گذشته به شکل دقیقه:ثانیه نشان میدهد. همین الگو پایهی هر پروژهای است که بخواهد عدد سنسور، منو یا وضعیت دستگاه را روی صفحه بیاورد.
قطعههای لازم
- یک برد رزبری پای پیکو
- یک نمایشگر LCD 16×2 با ماژول I2C (ماژول پشتش معمولاً تراشهی PCF8574 دارد)
- چهار سیم جامپر ماده-نر یا یک بردبورد
ماژول I2C پشت LCD چه کار میکند؟
خود LCD کاراکتری برای کار کردن به شش تا ده پایهی داده و کنترل نیاز دارد. ماژول I2C (همان برد کوچک سیاهی که پشت نمایشگر است) یک «گسترشدهندهی پایه» به نام PCF8574 دارد: پیکو فقط با دو سیم SDA و SCL به آن فرمان میدهد و ماژول آن فرمانها را به پایههای LCD میرساند. هر دستگاه I2C یک آدرس دارد؛ این ماژولها معمولاً روی 0x27 یا 0x3F هستند. یک پیچ آبی کوچک هم روی ماژول هست که کنتراست را تنظیم میکند و جلوتر میبینی چقدر مهم است.
سیمکشی
| پایهی ماژول LCD | پایهی پیکو | شمارهی فیزیکی |
|---|---|---|
| GND | GND | پایهی ۳ (یا هر GND دیگر) |
| VCC | VBUS (۵ ولت USB) | پایهی ۴۰ |
| SDA | GP0 (I2C0 SDA) | پایهی ۱ |
| SCL | GP1 (I2C0 SCL) | پایهی ۲ |
پیکو دو باس I2C دارد و هر باس فقط روی پایههای مشخصی کار میکند. برای باس شمارهی ۰، جفتهای GP0/GP1، GP4/GP5، GP8/GP9، GP12/GP13، GP16/GP17 و GP20/GP21 مجازند. ما GP0 و GP1 را برداشتیم؛ پروژهی آمادهی شبیهساز از GP4 و GP5 استفاده میکند که آن هم I2C0 است. نقشهی کامل پایهها را در پین اوت رزبری پای پیکو ببین.
فایلهای درایور: 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)
توضیح خط به خط
I2C(0, sda=Pin(0), scl=Pin(1), freq=400000): باس I2C شمارهی ۰ را روی GP0 و GP1 با سرعت ۴۰۰ کیلوهرتز میسازد. اگر شمارهی باس با پایهها جور نباشد، پیکو خطایValueError: bad SCL pinمیدهد.i2c.scan(): فهرست آدرس همهی دستگاههایی را که جواب دادهاند برمیگرداند. ما باhexآنها را به شکل 0x27 چاپ میکنیم. اگر فهرست خالی بود، مشکل از سیمکشی است، نه از کد.I2cLcd(i2c, 0x27, 2, 16): نمایشگر را با آدرس 0x27، دو سطر و شانزده ستون میسازد. دقت کن ترتیب «سطر، ستون» است. برای LCD 20×4 بنویسI2cLcd(i2c, 0x27, 4, 20).lcd.clear(): صفحه را پاک میکند و مکاننما را به گوشهی بالا-چپ میبرد.lcd.putstr("Salam Pico!"): متن را از جای فعلی مکاننما مینویسد. اگر متن از ۱۶ حرف بیشتر شود، خودش به خط بعد میرود.time.ticks_ms()وtime.ticks_diff: زمان گذشته را به میلیثانیه حساب میکنند.ticks_diffحتی وقتی شمارنده سرریز کند جواب درست میدهد، برای همین از تفریق ساده بهتر است.lcd.move_to(0, 1): مکاننما را به ستون ۰ از سطر ۱ (یعنی خط دوم، چون شمارهها از صفر شروع میشوند) میبرد. اول ستون، بعد سطر."Uptime %02d:%02d ": عدد را دو رقمی و با صفر اول مینویسد. سه فاصلهی آخر عمداً آنجاست تا اگر متن قبلی بلندتر بوده، حرفهای اضافهاش پاک شوند.
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 جزو امکانات اشتراک پلاس هستند؛ یعنی مثال آماده رایگان باز میشود و میتوانی کدش را بخوانی، و برای اجرا کردنش پلاس لازم داری. شبیهساز فارسی است، روی گوشی هم کار میکند و چون روی سرور داخل ایران است، روی اینترنت ملی هم باز میشود.
اشکالهای رایج
- نور روشن است ولی هیچ حرفی دیده نمیشود: کنتراست. پیچ آبی پشت ماژول را آرام بچرخان تا حروف پیدا شوند. این شایعترین «خرابی» LCD است که اصلاً خرابی نیست.
- خط اول پر از مربعهای سیاه است: LCD برق دارد ولی از پیکو فرمانی نگرفته. آدرس را با
scan()چک کن و اگر 0x3F بود، عدد را در کد عوض کن. - ImportError: no module named 'i2c_lcd': فایلهای
lcd_api.pyوi2c_lcd.pyروی برد نیستند، یا اسم فایل توpico_i2c_lcd.pyاست. - OSError: [Errno 5] EIO: پیکو در آن آدرس دستگاهی پیدا نکرد. SDA و SCL جابهجا نیستند؟ GND مشترک است؟
- ValueError: bad SCL pin: پایهها را از دو باس مختلف انتخاب کردهای، مثلاً SDA روی GP0 و SCL روی GP3. جفت درست را از جدول بالا بردار.
- حرفهای قبلی ته خط میمانند: متن کوتاهتر جای متن بلندتر را کامل نمیپوشاند. ته رشته چند فاصله بگذار.
- نوشتهی فارسی خراب است: جدول حروف داخلی این LCDها فقط لاتین و چند نماد دارد. فینگلیش بنویس یا با
custom_charچند حرف کوچک بساز.
قدم بعدی
حالا که صفحه داری، یک سنسور به آن بده: در 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، قدمبهقدم
سنسور رطوبت خاک با آردوینو و ساخت سیستم آبیاری خودکار گلدان
همهی آموزشهای رزبری پای پیکو و میکروپایتون ← · همهی مقالهها