[{"data":1,"prerenderedAt":13},["ShallowReactive",2],{"blog:oled-ssd1306":3},{"category":4,"cover_image":5,"html":6,"published_at":7,"seo_description":8,"seo_title":9,"slug":10,"sort_order":11,"title_fa":12},"outputs-displays","\u002Fblog\u002Foled-ssd1306.jpg","\u003Cp>در فصل «نمایشگر \u003Ccode dir=\"ltr\">OLED\u003C\u002Fcode>» برای اولین بار توانستیم روی ربات متن و عدد نشان بدهیم؛ بدون این‌که به کامپیوتر وصل باشیم. آن صفحه‌ی کوچکِ سیاه‌وسفید یک \u003Ccode dir=\"ltr\">OLED\u003C\u002Fcode> با تراشه‌ی راه‌اندازِ \u003Ccode dir=\"ltr\">SSD1306\u003C\u002Fcode> بود. بیا ببینیم چرا این نمایشگر این‌قدر باکیفیت و کم‌مصرف است.\u003C\u002Fp>\n\n\u003Ch2>چطور واقعاً کار می‌کند\u003C\u002Fh2>\n\u003Cp>\u003Ccode dir=\"ltr\">OLED\u003C\u002Fcode> سرنام \u003Ccode dir=\"ltr\">Organic Light Emitting Diode\u003C\u002Fcode> است. نکته‌ی اصلی این است که \u003Cstrong>هر پیکسل خودش یک \u003Ccode dir=\"ltr\">LED\u003C\u002Fcode> ریزِ آلی است و نور خودش را می‌سازد\u003C\u002Fstrong>. این با نمایشگر \u003Ccode dir=\"ltr\">LCD\u003C\u002Fcode> فرق اساسی دارد: در \u003Ccode dir=\"ltr\">LCD\u003C\u002Fcode> یک لامپِ پس‌زمینه همیشه روشن است و کریستال‌ها فقط جلوی نورش را می‌گیرند، ولی در \u003Ccode dir=\"ltr\">OLED\u003C\u002Fcode> پیکسلِ خاموش یعنی هیچ نوری؛ برای همین سیاهیِ واقعی، کنتراستِ بالا و صفحه‌ی خیلی نازک داریم.\u003C\u002Fp>\n\u003Cp>اما مغزِ ماجرا تراشه‌ی \u003Ccode dir=\"ltr\">SSD1306\u003C\u002Fcode> است. این تراشه یک حافظه‌ی تصویری (\u003Ccode dir=\"ltr\">framebuffer\u003C\u002Fcode>) دارد: برای صفحه‌ی \u003Ccode dir=\"ltr\">128×64\u003C\u002Fcode> پیکسل، هر پیکسل فقط یک بیت است (روشن یا خاموش)، یعنی مجموعاً حدود ۱۰۲۴ بایت. تو تصویرت را در این حافظه می‌چینی و تراشه خودش کارِ سخت و سریعِ روشن‌وخاموش‌کردنِ پیکسل‌ها را انجام می‌دهد.\u003C\u002Fp>\n\u003Cp>ارتباط با تراشه از طریق \u003Ccode dir=\"ltr\">I²C\u003C\u002Fcode> است؛ پروتکلی که فقط با \u003Cstrong>دو سیم\u003C\u002Fstrong> کار می‌کند: \u003Ccode dir=\"ltr\">SDA\u003C\u002Fcode> (داده) و \u003Ccode dir=\"ltr\">SCL\u003C\u002Fcode> (کلاک). زیباییِ \u003Ccode dir=\"ltr\">I²C\u003C\u002Fcode> این است که چند دستگاه می‌توانند \u003Cstrong>همین دو سیم را با هم به اشتراک بگذارند\u003C\u002Fstrong>؛ مثلاً نمایشگر \u003Ccode dir=\"ltr\">OLED\u003C\u002Fcode> و یک سنسورِ دیگر روی همان \u003Ccode dir=\"ltr\">SDA\u003C\u002Fcode> و \u003Ccode dir=\"ltr\">SCL\u003C\u002Fcode> بنشینند. برای این‌که قاطی نشوند، هر دستگاه یک \u003Cstrong>آدرس\u003C\u002Fstrong> یکتا دارد تا برد بداند دارد با کدام حرف می‌زند. آدرسِ استانداردِ این نمایشگر \u003Ccode dir=\"ltr\">0x3C\u003C\u002Fcode> است (که در مبنای ده می‌شود ۶۰). به همین دلیل وقتی دستورِ \u003Ccode dir=\"ltr\">scan\u003C\u002Fcode> را می‌زنی، عددِ ۶۰ را می‌بینی.\u003C\u002Fp>\n\u003Cp>الگوی کارِ همیشگی هم ساده است: در حافظه بنویس، بعد حتماً \u003Ccode dir=\"ltr\">show()\u003C\u002Fcode> را صدا بزن تا داده روی \u003Ccode dir=\"ltr\">I²C\u003C\u002Fcode> به تراشه فرستاده و صفحه به‌روز شود. داخلِ تراشه این ۶۴ سطر به‌صورت هشت «صفحه» (\u003Ccode dir=\"ltr\">page\u003C\u002Fcode>) هرکدام به بلندیِ ۸ پیکسل سازمان‌دهی شده و هر بایت یک ستونِ عمودیِ ۸ پیکسلی را روشن یا خاموش می‌کند؛ ولی خوشبختانه کتابخانه‌ی \u003Ccode dir=\"ltr\">ssd1306\u003C\u002Fcode> همه‌ی این جزئیات را برایت پنهان می‌کند و تو فقط با \u003Ccode dir=\"ltr\">text\u003C\u002Fcode> و \u003Ccode dir=\"ltr\">pixel\u003C\u002Fcode> کار داری.\u003C\u002Fp>\n\n\u003Ch2>کاربردهای واقعی\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>ساعت‌های هوشمند و دستبندهای تناسب‌اندام، چون کم‌مصرف و نازک‌اند.\u003C\u002Fli>\n\u003Cli>صفحه‌ی کوچکِ برخی گوشی‌ها و پخش‌کننده‌های موسیقی.\u003C\u002Fli>\n\u003Cli>داشبورد و نمایشگرهای خودرو.\u003C\u002Fli>\n\u003Cli>دستگاه‌های پزشکیِ همراه و پنلِ لوازم خانگی.\u003C\u002Fli>\n\u003Cli>نسخه‌ی بزرگش همان تلویزیون‌ها و مانیتورهای \u003Ccode dir=\"ltr\">OLED\u003C\u002Fcode> باکیفیت است.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>در عمل: سیم‌کشی و کد\u003C\u002Fh2>\n\u003Cp>فقط دو سیمِ داده: \u003Ccode dir=\"ltr\">SCL\u003C\u002Fcode> به \u003Ccode dir=\"ltr\">GPIO 22\u003C\u002Fcode> و \u003Ccode dir=\"ltr\">SDA\u003C\u002Fcode> به \u003Ccode dir=\"ltr\">GPIO 21\u003C\u002Fcode>، به‌علاوه‌ی تغذیه‌ی \u003Ccode dir=\"ltr\">3V3\u003C\u002Fcode> و \u003Ccode dir=\"ltr\">GND\u003C\u002Fcode>. اول شیءِ \u003Ccode dir=\"ltr\">I²C\u003C\u002Fcode> و بعد نمایشگر را می‌سازیم، متن می‌نویسیم و با \u003Ccode dir=\"ltr\">show()\u003C\u002Fcode> نشانش می‌دهیم:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode dir=\"ltr\">from machine import Pin, I2C\nimport ssd1306\n\ni2c = I2C(0, scl=Pin(22), sda=Pin(21))\noled = ssd1306.SSD1306_I2C(128, 64, i2c)\n\noled.fill(0)                      # safhe ra pak kon\noled.text(\"Salam Robot!\", 0, 0)\noled.text(\"128 x 64\", 0, 20)\noled.show()                       # hatman show!\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>اشتباه‌های رایج\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>آدرسِ اشتباه:\u003C\u002Fstrong> بعضی ماژول‌ها روی \u003Ccode dir=\"ltr\">0x3D\u003C\u002Fcode> هستند نه \u003Ccode dir=\"ltr\">0x3C\u003C\u002Fcode>؛ اگر چیزی نمایش داده نشد، اول \u003Ccode dir=\"ltr\">scan\u003C\u002Fcode> بگیر.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>جابه‌جایی \u003Ccode dir=\"ltr\">SDA\u003C\u002Fcode> و \u003Ccode dir=\"ltr\">SCL\u003C\u002Fcode>:\u003C\u002Fstrong> این دو سیم نباید قاطی شوند.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>فراموش‌کردنِ \u003Ccode dir=\"ltr\">show()\u003C\u002Fcode>:\u003C\u002Fstrong> شایع‌ترین اشتباه؛ در حافظه می‌نویسی ولی چون \u003Ccode dir=\"ltr\">show()\u003C\u002Fcode> را نمی‌زنی، صفحه خالی می‌ماند.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>رزولوشنِ اشتباه:\u003C\u002Fstrong> بعضی نمایشگرها \u003Ccode dir=\"ltr\">128×32\u003C\u002Fcode> هستند؛ اگر عددِ اشتباه بدهی، تصویر به‌هم می‌ریزد.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>انتظار رنگ:\u003C\u002Fstrong> این نمایشگر تک‌رنگ است، نه رنگی.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>همین حالا امتحان کن\u003C\u002Fh2>\n\u003Cp>متنت را روی صفحه‌ی مجازی ببین: \u003Ca href=\"\u002Flab\u002Fembed\u002Fterm-2-sensors\u002Fsession-07-oled-display\">شبیه‌ساز \u003Ccode dir=\"ltr\">OLED\u003C\u002Fcode> را باز کن\u003C\u002Fa>. برای یادگیری کاملِ نوشتن، شمارنده و رسمِ روی صفحه سراغ \u003Ca href=\"\u002Fcourses\u002Fairo\u002Flessons\u002Ft2\u002Fs07-oled-display\">فصل نمایشگر OLED\u003C\u002Fa> برو.\u003C\u002Fp>","2026-07-18T16:30:00Z","نمایشگر OLED (SSD1306) چطور با نور خودِ هر پیکسل تصویر می‌سازد، چرا با I²C و آدرس 0x3C کار می‌کند و الگوی framebuffer تا show چیست.","نمایشگر OLED و تراشه SSD1306 چطور کار می‌کنند؟ | یادستان","oled-ssd1306",120,"نمایشگر OLED (SSD1306) چطور تصویر می‌سازد؟",1784827101874]