آموزش راه اندازی ماژول نمایشگر OLED با آردوینو و ESP8266 NodeMCU

آموزش راه اندازی ماژول نمایشگر OLED با آردوینو و ESP8266 Node MC

شما هم از کار با نمایشگر LCD در پروژه‌های آردوینو خسته شده‌اید؟ طبیعی است زیرا LCD مربوط به گذشته‌است و زمان آن رسیده که وارد دنیای نمایشگرهای OLED (Organic Light-Emitting Diode) شویم. پس با ما در آموزش راه اندازی ماژول نمایشگر OLED با آردوینو و ESP8266 NodeMCU همراه باشید تا چگونگی استفاده از این نمایشگر را بیاموزید. این نمایشگرها بسیار سبک و کم ضخامت هستند، می‌توانند انعطاف‌پذیر باشند و تصویر روشن‌تر و باکیفیت‌تری را ارائه می‌دهند.

درایور SSD1306 و راه‌های ارتباطی آن برای راه اندازی ماژول OLED با آردوینو

در قلب ماژول نمایشگر OLED، یک تراشه درایور قدرتمند CMOS به نام SSD1306 قرار گرفته است که می‌تواند با روش‌های مختلفی نظیر I2C و SPI با میکروکنترلر ارتباط برقرار کند.

به طور کلی، ارتباط SPI سریع‌تر از I2C است، اما به پین‌های I/O بیشتری نیاز دارد. در حالی که I2C فقط به دو پین نیاز دارد که می‌تواند از آن‌ها به طور مشترک با سایر قطعات جانبی I2C استفاده کند. پس انتخاب بین این دو پروتکل، یک معامله بین سرعت و تعداد پین است و به شما و نیازتان بستگی دارد.

دو ماژول نمایشگر OLED با پروتکل‌های ارتباطی SPI و I2C

به لطف تنوع بالای کنترلر SSD1306، این ماژول در رنگ‌ها و اندازه‌های مختلفی موجود است؛ برای مثال در ابعاد 128×64 و 128×32 و در رنگ‌های سفید، آبی و دو رنگ. خبر خوب این است که همه این نمایشگرها می‌توانند با هم جابجا شوند و بدون نیاز به تغییر کد و برنامه کار کنند.

ماژول نمایشگر OLED در دو سایز متفاوت

تغذیه مورد نیاز ماژول نمایشگر OLED

نمایشگر OLED، نور صفحه را خود تولید می‌کند. پس بدون نیاز به نور پس زمینه (بک لایت) کار می‌کند. به همین دلیل کنتراست بالا، زاویه دید بسیار وسیع و قابلیت نمایش عمق‌های مختلف رنگ مشکی از ویژگی‌های این نمایشگرها است. نبود بک لایت باعث کاهش چشمگیر توان مورد نیاز برای راه‌اندازی OLED می‌شود. این نمایشگر به طور متوسط 20mA جریان نیاز دارد. البته این مقدار به اینکه چه سطحی از صفحه روشن شده است هم بستگی دارد.

ولتاژ کاری کنترلر SSD1306 از 1.65 تا 3.3 ولت است، درحالی که پنل OLED به 7 تا 15 ولت ولتاژ تغذیه نیاز دارد. تمام این تغذیه‌های مختلف توسط یک مدار پمپ شارژ داخلی تأمین می‌شود. این موضوع باعث می‌شود بتوانیم ماژول نمایشگر OLED را به سادگی و بدون نیاز به استفاده از مبدل تغییر سطح منطقی، به آردوینو یا هر میکروکنترلر دیگری با منطق 5 ولت متصل کنیم.

ساختار حافظه ماژول نمایشگر OLED

صرف‌نظر از سایز ماژول OLED، درایور SSD1306 یک رم یک کیلوبایتی داخلی برای داده­‌های نمایشگر گرافیکی (GDDRAM) دارد، که الگوی بیتی تصویری که می‌خواهیم نمایش دهیم را ذخیره می‌کند. فضای این حافظه یک کیلوبایتی به 8 صفحه تقسیم شده است (از 0 تا 7). هر صفحه از 128 ستون یا سگمنت تشکیل شده (از 0 تا 127 بلوک) و هر ستون 8 بیت داده (از 0 تا 7) را در خود ذخیره می‌کند. در نتیجه :

8 صفحه x تعداد 128 سگمنت x تعداد 8 بیت داده = 8192 بیت = 1024 بایت = 1 کیلوبایت حافظه

تمام حافظه 1 کیلوبایتی با صفحات، سگمنت‌ها و داده­‌ها در شکل زیر نشان‌داده‌شده است:

ساختار حافظه ماژول نمایشگر OLED

هر بیت یک پیکسل خاص را روی صفحه نمایش نشان می‌دهد که با برنامه‌نویسی می‌تواند خاموش یا روشن شود.

نکته:

نمایشگر 128×64، تمام محتویات رم را نمایش می‌دهد، درحالی‌که نمایشگر 128×32 تنها 4 صفحه از رم (نیمی از محتویات) را نمایش می‌دهد.

مشخصات کامل ماژول در جدول زیر آمده است:

تکنولوژی نمایشگرOLED یا Organic LED
پروتکل­های ارتباط با میکروکنترلرI2C/SPI
ابعاد صفحه نمایش0.96 اینچ
رزولوشن (وضوح)128×64 پیکسل
ولتاژ کاری3.3 تا 5 ولت
جریان کاریحداکثر 20mA
زاویه دید160°
تعداد کاراکتر در هر سطر21
تعداد سطرها7

پین‌های ماژول نمایشگر OLED

برای راه اندازی ماژول نمایشگر OLED با آردوینو R3 یا هر مدل دیگر از آردوینو لازم است قبل از اینکه به سیم‌کشی و برنامه نویسی بپردازیم، نگاهی به پین‌های نمایشگر بیندازیم:

پین‌های ماژول نمایشگر OLED

GND: باید به زمین آردوینو متصل شود.

VCC: تغذیه نمایشگر است که به پین 5 ولت آردوینو متصل می­‌شود.

SCL: پین کلاک سریال رابط I2C است.

SDA: پین داده سریال رابط I2C است.

اتصال ماژول نمایشگر OLED به ESP8266 NodeMCU

از مباحث تئوری که بگذریم، وقت کار عملی است! بیایید نمایشگر را به ESP8266 NodeMCU متصل کنیم.

اتصالات نسبتاً ساده هستند، با وصل کردن پین VCC به خروجی 3.3V ماژول NodeMCU شروع کنید و GND را نیز به زمین متصل کنید.

سپس پین SCL را به پین کلاک I2C ماژول NodeMCU (پین D1) متصل کرده و پین SDA را به پین دیتای I2C برد NodeMCU (پین D2) متصل کنید. برای یادآوری می‌توانید به قسمت پایه‌های برد NodeMCU ESP8266 در مقاله آموزش راه‌اندازی برد NodeMCU ESP8266 با آردوینو مراجعه کنید.

شکل زیر نحوه­‌ی اتصالات را نشان می­‌دهد:

اتصال ماژول نمایشگر OLED به ESP8266 NodeMCU

اتصال ماژول نمایشگر OLED به آردوینو Uno

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

اتصالات بسیار ساده هستند. با وصل کردن پین VCC به خروجی 5V آردوینو شروع کنید و GND را نیز به زمین متصل کنید.

حال پین‌های ارتباط I2C باقی مانده‌اند. توجه کنید که هر برد آردوینو پین‌های I2C متفاوتی دارد که باید بر همین اساس متصل شود. در آردوینوهای طرح R3، SDA (خط دیتا) و SCL (خط کلاک)، پین‌هدرهای نزدیک پین AREF هستند که با نام‌های A5(SCL) و A4(SDA) شناخته می‌شوند.

اگر آردوینو Mega دارید، این پین‌ها متفاوت هستند و باید از پین 21 (SCL) و 20 (SDA) استفاده کنید. برای درک سریع‌تر به جدول زیر مراجعه کنید.

SDASCL 
A4A5Arduino Uno
A4A5Arduino Nano
2021Arduino Mega
23Leonardo/micro

شکل زیر نحوه­‌ی اتصالات را نشان می‌دهد.

چگونگی اتصال ماژول نمایشگر OLED به آردوینو

نصب کتابخانه برای ماژول نمایشگر OLED

برای کدنویسی و راه اندازی ماژول نمایشگر OLED با آردوینو نیاز است ابتدا کتابخانه های مربوطه را نصب کنیم. کنترلر SSD1306 نمایشگر OLED، درایورهای انعطاف‌پذیر ولی پیچیده‌ای دارد. برای استفاده از این کنترلر به دانش زیادی در زمینه آدرس‌­دهی حافظه نیاز است اما خوشبختانه کتابخانه Adafruit SSD1306 نوشته شده تا پیچیدگی‌های کنترلر SSD1306 را از بین ببرد و با دستورات ساده بتوانیم نمایشگر را کنترل کنیم.

برای نصب کتابخانه به مسیر Sketch > Include Library > Manage Libraries بروید و منتظر بمانید تا Library Manager لیست کتابخا‌نه‌های نصب شده را به‌روز کند.

مسیر نصب کتابخانه برای ماژول نمایشگر OLED

جستجوی خود را با نوشتن عبارت “adafruit ssd1306” فیلتر کنید. چندین گزینه خواهید دید. به دنبال کتابخانه Adafruit SSD1306 بگردید. روی آن کلیک کرده و Install را بزنید.

نصب کتابخانه Adafruit SSD1306

کتابخانه Adafruit SSD1306  یک کتابخانه سخت‌افزاری است که توابع سطح پایین را مدیریت می‌کند و باید با کتابخانه Adafruit GFX همراه شود تا اشکال گرافیکی پایه مانند نقطه، خط، دایره، مستطیل و … را نمایش دهد.

نصب کتابخانه Adafruit GFX

یک مشکل رایج کنترلر SSD1306
جهت راه اندازی ماژول نمایشگر OLED با آردوینو نیاز است یکی از مشکلات رایج کنترلر SSD1306 را بدانیم: اگرچه SSD1306 دارای GDDRAM داخلی برای نمایشگر است، ولی نمی‌توانیم محتویات آن را بخوانیم. بنابراین، انجام تغییرات در بافر نمایشگر برای انجام عملیات ریاضی غیر ممکن است.
به عنوان جایگزین، این کتابخانه 1 کیلوبایت یا (128*64)/8 بیت از حافظه­‌ی ESP8266 یا ATmega328P را به عنوان بافر اختصاص می‌دهد تا بتواند بافر نمایشگر را تغییر دهد و سپس یک انتقال از حافظه میکروکنترلر به حافظه‌­ی داخلی کنترلر SSD1306 انجام می‌شود.

 انجام تغییراتی در کتابخانه Adafruit SSD1306

کتابخانه Adafruit SSD1306 برای ماژول نمایشگر OLED با ابعاد 128×64 (که در این آموزش در حال استفاده از آن هستیم) نوشته نشده است. ابعاد نمایشگر باید در هدر فایل Adafruit_SSD1306.h تغییر داده شود تا برای ما کار کند. اگر این تغییر اعمال نشود، هنگام کامپایل برنامه در آردوینو IDE پیغام خطای زیر را دریافت خواهید:

;error(“Height incorrect, please fix Adafruit_SSD1306.h!”)#

ارور برنامه در صورت تغییر ندادن هدر فایل Adafruit_SSD1306.h

برای تغییر هدر فایل Adafruit_SSD1306.h، مسیری که برنامه‌هایتان ذخیره می‌شوند را باز کنید که معمولاً My Documents > Arduino است. حال به libraries > Adafruit_SSD1306 بروید.

تغییر هدر فایل Adafruit_SSD1306 در My Documents کامپیوتر

فایل Adafruit_SSD1306.h را با یک برنامه ویرایش متن (مانند Notepad یا ++ Notepad) باز کنید. در فایل به دنبال بخش SSD1306 Displays بگردید یا مستقیماً به خط شماره 28 بروید و کد زیر را کامنت کنید.

#define SSD1306_128_32

سپس خط زیر را از حالت کامنت خارج کنید.

define SSD1306_128_64#

در انتها باید کد شما به شکل زیر دربیاید:

کد نهایی آردوینو پس از اعمال تغییرات لازم در کتابخانه Adafruit_SSD1306.h

همین! اکنون فایل را ذخیره کنید و آردوینو IDE را ری استارت کنید.

کد نمایش متن

به بخش جذاب راه اندازی ماژول نمایشگر OLED با آردوینو رسیدیم!

برنامه تست زیر پیام “Hello World!” را روی نمایشگر چاپ می‌کند. این برنامه همچنین شامل موارد زیر است:

  • نمایش متن وارونه
  • نمایش اعداد
  • نمایش اعداد به همراه مبنای آن‌ها (هگزادسیمال، دسیمال)
  • نمایش کاراکترهای اسکی
  • اسکرول افقی و عمودی متن
  • اسکرول قسمتی از صفحه‌نمایش

این برنامه کاملاً به شما نشان می‌دهد چگونه از نمایشگر OLED استفاده کنید و اصول نوشتن برنامه برای پروژه‌های کاربردی و عملی‌تر را ارائه می‌کند. برنامه زیر را امتحان کنید، در ادامه به بررسی دقیق‌تر آن می‌پردازیم. وقتی این برنامه را build می‌کنید، IDE پیام اخطاری مبنی بر کم بودن حافظه نمایش می‌دهد. این اخطار به این خاطر است که 1 کیلوبایت از حافظه­‌ی ATmega238P به عنوان بافر نمایشگر اختصاص داده شده است. پس توجهی به این اخطار نکنید.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(-1);

void setup()   
{                
	// initialize with the I2C addr 0x3C
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  

	// Clear the buffer.
	display.clearDisplay();

	// Display Text
	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,28);
	display.println("Hello world!");
	display.display();
	delay(2000);
	display.clearDisplay();

	// Display Inverted Text
	display.setTextColor(BLACK, WHITE); // 'inverted' text
	display.setCursor(0,28);
	display.println("Hello world!");
	display.display();
	delay(2000);
	display.clearDisplay();

	// Changing Font Size
	display.setTextColor(WHITE);
	display.setCursor(0,24);
	display.setTextSize(2);
	display.println("Hello!");
	display.display();
	delay(2000);
	display.clearDisplay();

	// Display Numbers
	display.setTextSize(1);
	display.setCursor(0,28);
	display.println(123456789);
	display.display();
	delay(2000);
	display.clearDisplay();

	// Specifying Base For Numbers
	display.setCursor(0,28);
	display.print("0x"); display.print(0xFF, HEX); 
	display.print("(HEX) = ");
	display.print(0xFF, DEC);
	display.println("(DEC)"); 
	display.display();
	delay(2000);
	display.clearDisplay();

	// Display ASCII Characters
	display.setCursor(0,24);
	display.setTextSize(2);
	display.write(3);
	display.display();
	delay(2000);
	display.clearDisplay();

	// Scroll full screen
	display.setCursor(0,0);
	display.setTextSize(1);
	display.println("Full");
	display.println("screen");
	display.println("scrolling!");
	display.display();
	display.startscrollright(0x00, 0x07);
	delay(2000);
	display.stopscroll();
	delay(1000);
	display.startscrollleft(0x00, 0x07);
	delay(2000);
	display.stopscroll();
	delay(1000);    
	display.startscrolldiagright(0x00, 0x07);
	delay(2000);
	display.startscrolldiagleft(0x00, 0x07);
	delay(2000);
	display.stopscroll();
	display.clearDisplay();

	// Scroll part of the screen
	display.setCursor(0,0);
	display.setTextSize(1);
	display.println("Scroll");
	display.println("some part");
	display.println("of the screen.");
	display.display();
	display.startscrollright(0x00, 0x00);
}

void loop() {}

برنامه با اضافه‌ کردن چهار کتابخانه یعنی SPI.h، Wire.h، Adafruit_GFX.h و Adafruit_SSD1306.h شروع می‌شود. با اینکه نیازی به کتابخانه SPI.h برای نمایشگرهای با رابط I2C نیست، باید برای کامپایل شدن صحیح برنامه آن را هم اضافه کنیم.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

سپس باید یک شیء از کتابخانه Adafruit_SSD1306.h بسازیم. سازنده (constructor) Adafruit_SSD1306، شماره پینی از آردوینو که به پین reset نمایشگر متصل است را می‌گیرد. زیرا نمایشگری که ما استفاده می‌کنیم پین RESET ندارد، به‌ جای شماره پین عدد 1- قرار می‌دهیم تا هیچ یک از پین‌های ESP8266 یا آردوینو به ‌عنوان ریست نمایشگر استفاده نشود.

Adafruit_SSD1306 display(-1);

تابع setup : با استفاده از تابع ()begin، شیء OLED را مقداردهی می‌کنیم. این تابع دو پارامتر می‌گیرد. پارامتر اول SSD1306_SWITCHCAPVCC است که مدار پمپ شارژ داخلی را روشن می‌کند درحالی‌که پارامتر دوم آدرس I2C نمایشگر OLED را مشخص می‌کند. معمولاً آدرس I2C این ماژول‌ نمایشگر OLED، 0x3C است. این آدرس ثابت می‌باشد و قابل تغییر نیست.

در ادامه، قبل از نمایش اولین پیام روی نمایشگر، حافظه بافر را خالی کرده‌ایم.

// initialize with the I2C addr 0x3C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

// Clear the buffer.
display.clearDisplay();

نمایش یک متن ساده (Hello World) در ماژول نمایشگر OLED

نمایش "hello world" در ماژول نمایشگر OLED
// Display Text
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,28);
display.println("Hello world!");
display.display();
delay(2000);

برای نمایش متن روی ماژول نمایشگر OLED، باید اندازه فونت را تعیین کنیم. این کار با فراخوانی تابع setTextSize(font-size) و ارسال پارامتر سایز (که از 1 شروع می‌شود) صورت می‌گیرد.

حال باید رنگ فونت را با فراخوانی تابع setTextColor(color) تعیین کنیم. برای پس زمینه تاریک، پارامتر WHITE و برای پس زمینه روشن پارامتر BLACK ارسال کنید. حال قبل از نمایش پیام باید محل مکان نما را با فراخوانی تابع setCursor(X,Y) مشخص کنیم. پیکسل‌های صفحه با مختصات افقی (X) و عمودی (Y) مشخص شده‌اند. این سیستم مختصات، مبدا (0,0) را در گوشه بالا سمت چپ صفحه قرار می‌دهد. مقدار X با حرکت به سمت راست و مقدار Y با حرکت به سمت پایین افزایش می‌یابد.

می‌توانیم همان‌طور که روی سریال مانیتور داده چاپ می‌کنیم از توابع ساده (” “)print یا (” “)println برای نمایش پیام روی نمایشگر استفاده کنیم. به‌خاطر داشته باشید تابع ()println مکان‌نما را به خط جدید منتقل می‌کند.

برای اینکه کتابخانه بتواند با سرعت زیادی عملیات ریاضی را روی بافر نمایشگر انجام دهد (با سرعت بیش از 100 فریم بر ثانیه)، فراخوانی‌های توابع print بلافاصله محتویات بافر نمایشگر را به کنترلر SSD1306 انتقال نمی‌دهد. پس برای اینکه به کتابخانه بگوییم اطلاعات را در ATmega328P از بافر نمایشگر به حافظه­‌ی داخلی کنترلر SSD1306 انتقال دهد نیاز است از دستور ()display استفاده کنیم. به‌محض اینکه محتویات حافظه انتقال یابد، پیکسل‌های متناظر در حافظه بافر، روی نمایشگر OLED ظاهر می‌شوند.

نمایش متن به صورت وارونه

نمایش متن به صورت وارونه در ماژول نمایشگر OLED
// Display Inverted Text
display.clearDisplay();
display.setTextColor(BLACK, WHITE); // 'inverted' text
display.setCursor(0,28);
display.println("Hello world!");
display.display();
delay(2000);

برای نمایش متن به صورت وارونه، تابع setTextColor(FontColor,BackgroundColor) را دوباره فراخوانی می‌کنیم. اگر توجه کنید در قسمت قبل فقط یک پارامتر به تابع ارسال کردیم ولی در این قسمت دو پارامتر ارسال می­کنیم. این کار به‌خاطر مفهومی به نام function overloading قابل انجام است.

Function overloading قابلیتی است که به برنامه‌نویس اجازه می‌دهد چندین تابع با اسم یکسان ولی با ترکیب پارامترهای مختلف بسازد. هنگام فراخوانی این تابع، بسته به پارامترهای ارسال شده، عملکرد خاصی از ان تابع اجرا خواهد شد.

تغییر سایز فونت

تغییر سایز فونت نمایشگر
// Changing Font Size
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0,24);
display.setTextSize(2);
display.println("Hello!");
display.display();
delay(2000);

در قسمت‌های قبلی این آموزش، تابع setTextSize(font-size) را برای تنظیم سایز فونت فراخوانی و عدد 1 به‌عنوان پارامتر ارسال کردیم. شما می‌توانید با ارسال اعداد صحیح مثبت، از این تابع برای تعیین سایز فونت استفاده کنید.

در این نمایشگر کاراکترها با نسبت 7:10 پردازش می‌شوند. به این معنا که با سایز فونت 1، به هر کاراکتر 7×10 پیکسل اختصاص می‌یابد و با سایز فونت 2 به هر کاراکتر 14×20 پیکسل و الی آخر. کتابخانه Adafruit_GFX کار پردازش فونت را انجام می‌دهد و به طور پیش‌فرض فونت mono-spaced انتخاب شده است. با این‌حال نسخه‌های اخیر این کتابخانه قابلیت استفاده از فونت‌های جایگزین را به ما می‌دهد. چندین فونت جایگزین همراه کتابخانه موجود است و امکان اضافه‌کردن فونت‌های جدید هم وجود دارد.

نمایش اعداد

نمایش اعداد در ماژول OLED
// Display Numbers
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,28);
display.println(123456789);
display.display();
delay(2000);

مشخص‌کردن مبنای اعداد

با فراخوانی توابع ()print یا ()println، می‌توان اعداد را روی نمایشگر OLED نمایش داد. چنانچه این تابع سربارگذاری اعداد بدون علامت 32 بیتی را به عنوان آرگومان ورودی دریافت کند، می‌توان اعداد 0 تا 4294967295 را نمایش داد.

اعداد با مبنای مشخص شده
// Specifying Base For Numbers
display.clearDisplay();
display.setCursor(0,28);
display.print("0x"); display.print(0xFF, HEX); 
display.print("(HEX) = ");
display.print(0xFF, DEC);
display.println("(DEC)"); 
display.display();
delay(2000);

توابع ()print و ()println پارامتر دومی هم به‌صورت اختیاری می‌گیرند که مبنای عدد را مشخص می‌کند؛ مقادیر مجاز مبنا عبارت‌اند از: BIN (باینری، مبنای 2)، OCT  (اوکتال، مبنای 8)، DEC (دسیمال، مبنای 10) و HEX (هگزادسیمال، مبنای 16). برای اعداد با ممیز شناور (floating point) این پارامتر تعداد رقم پس از ممیز را مشخص می‌کند. برای مثال:

  • دستور print(78,BIN)، “1001110” را چاپ می‌کند.
  • دستور print(78,OCT)، “116” را چاپ می‌کند.
  • دستور print(78,DEC)، “78” را چاپ می‌کند.
  • دستور print(78,HEX)، “4E” را چاپ می‌کند.
  • دستور print(1.23456,0)، “1” را چاپ می‌کند.
  • دستور print(1.23456,2)، “1.23” را چاپ می‌کند.
  • دستور print(1.23456,4)، “1.2345” را چاپ می‌کند.

نمایش کاراکترهای اسکی

نمایش کاراکتر های اسکی در ماژول نمایشگر OLED
// Display ASCII Characters
display.clearDisplay();
display.setCursor(0,24);
display.setTextSize(2);
display.write(3);
display.display();
delay(2000);

توابع ()print و ()println اطلاعات را به ‌صورت متن اسکی قابل خواندن برای کاربر ارسال می‌کند در حالی که تابع ()write داده باینری به نمایشگر ارسال می‌کند. بنابراین شما می‌­توانید از این تابع برای نمایش کاراکترهای اسکی استفاده کنید. برای مثال ارسال عدد 3 ، کاراکتر قلب را نمایش می‌دهد.

اسکرول تمام صفحه‌­نمایش

اسکرول تمام صفحه‌نمایش در ماژول نمایشگر OLED
// Scroll full screen
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.println("Full");
display.println("screen");
display.println("scrolling!");
display.display();
display.startscrollright(0x00, 0x07);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollleft(0x00, 0x07);
delay(2000);
display.stopscroll();
delay(1000);    
display.startscrolldiagright(0x00, 0x07);
delay(2000);
display.startscrolldiagleft(0x00, 0x07);
delay(2000);
display.stopscroll();

شما می‌توانید با فراخوانی توابع startscrollright(start page, stop page) و startscrollleft(start page, stop page) نمایشگر را به صورت افقی اسکرول کنید و با فراخوانی startscrolldiagright(start page, stop page)  و startscrolldiagleft(start page, stop page) اسکرول قطری انجام دهید. همه این توابع دو پارامترِ start page و stop page را می‌گیرند. در مورد اینکه صفحه (page) چیست در قسمت توضیحات ساختار حافظه نمایشگر OLED گفتیم. از آنجا که 8 صفحه (از 0 تا 7) داریم، با اسکرول کردن تمام صفحات یعنی ارسال پارامترهای 0x00 و 0x07، کل صفحه را اسکرول کنید.

برای متوقف نمودن اسکرول صفحه نیز می‌توانید از تابع ()stopscroll استفاده کنید.

اسکرول بخشی از صفحه نمایش:

اسکرول بخشی از صفحه نمایش
// Scroll part of the screen
display.setCursor(0,0);
display.setTextSize(1);
display.println("Scroll");
display.println("some part");
display.println("of the screen.");
display.display();
display.startscrollright(0x00, 0x00);

گاهی اوقات نمی‌خواهیم تمام صفحه را اسکرول کنیم. برای این کار کافی است پارامترهای start page و stop page را طوری مقداردهی کنیم که صفحه موردنظر ما اسکرول شود. مجدداً تاکید می‌شود که حافظه نمایشگر از 8 صفحه (از 0 تا 7) تشکیل شده است و می­توانید با ارسال شماره صفحات مشخصی به عنوان پارامتر ورودی، بخشی از صفحه نمایش را اسکرول نمائید. در این مثال، هر دو پارامتر را 0x00 قرار داده‌ایم. در نتیجه فقط صفحه اول (8 سطر اول) اسکرول خواهد شد.

کد رسم شکل‌های ساده در ماژول نمایشگر OLED

در این مثال می‌خواهیم تعدادی شکل ساده بکشیم. این برنامه چندین تابعِ طراحی شامل مستطیل، مستطیل با گوشه‌های گرد، دایره و مثلث را نشان می‌دهد. ابتدا برنامه را امتحان کنید، سپس به بررسی دقیق‌تر آن خواهیم پرداخت.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(-1);

void setup()   
{                
	// initialize with the I2C addr 0x3C
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  

	// Clear the buffer.
	display.clearDisplay();

	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,0);
	display.println("Rectangle");
	display.drawRect(0, 15, 60, 40, WHITE);
	display.display();
	delay(2000);
	display.clearDisplay();

	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,0);
	display.println("Filled Rectangle");
	display.fillRect(0, 15, 60, 40, WHITE);
	display.display();
	delay(2000);
	display.clearDisplay();

	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,0);
	display.println("Round Rectangle");
	display.drawRoundRect(0, 15, 60, 40, 8, WHITE);
	display.display();
	delay(2000);
	display.clearDisplay();

	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,0);
	display.println("Filled Round Rectangl");
	display.fillRoundRect(0, 15, 60, 40, 8, WHITE);
	display.display();
	delay(2000);
	display.clearDisplay();

	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,0);
	display.println("Circle");
	display.drawCircle(20, 35, 20, WHITE);
	display.display();
	delay(2000);
	display.clearDisplay();

	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,0);
	display.println("Filled Circle");
	display.fillCircle(20, 35, 20, WHITE);
	display.display();
	delay(2000);
	display.clearDisplay();

	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,0);
	display.println("Triangle");
	display.drawTriangle(30, 15, 0, 60, 60, 60, WHITE);
	display.display();
	delay(2000);
	display.clearDisplay();

	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,0);
	display.println("Filled Triangle");
	display.fillTriangle(30, 15, 0, 60, 60, 60, WHITE);
	display.display();
	delay(2000);
	display.clearDisplay();
}

void loop() {}


اکثر خطوط این کد (شامل کتابخانه‌ها و راه‌اندازی نمایشگر) مانند مثال بالا می‌باشد، با این تفاوت که این برنامه برای رسم چند شکل ساده نوشته شده است.

رسم مستطیل

شما می‌توانید با استفاده از تابع drawRect(X-coordinate, Y-coordinate, Width, Height, color) یک مستطیل رسم کنید. در حقیقت این تابع مستطیل‌های توخالی با حاشیه 1 پیکسل رسم می‌کند.

رسم مستطیل در نمایشگر
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Rectangle");
display.drawRect(0, 15, 60, 40, WHITE);
display.display();
delay(2000);

با استفاده از تابع ()fillRect نیز می‌توانید یک مستطیل توپر بکشید.

رسم یک مستطیل توپر در ماژول نمایشگر OLED
display.clearDisplay();  
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Filled Rectangle");
display.fillRect(0, 15, 60, 40, WHITE);
display.display();
delay(2000);

رسم مستطیل با گوشه‌های گرد

برای رسم این مستطیل‌ها می‌توان از تابع drawRounfRect(X-coordinate, Y-coordinate, Width, Height, color) استفاده کرد. پارامترهای این تابع (به‌استثنای پارامتر شعاع گرد شدن گوشه) مشابه ()drawRect است. این تابع هم مستطیل‌های توخالی با حاشیه­‌ای به قطر 1 پیکسل رسم می‌کند.

رسم مستطیل با گوشه‌های گرد
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Round Rectangle");
display.drawRoundRect(0, 15, 60, 40, 8, WHITE);
display.display();
delay(2000);

شما می‌توانید با تابع ()fillRounfRect، مستطیل توپر با گوشه‌های گرد بکشید.

رسم مستطیل توپر با گوشه‌های گرد
display.clearDisplay();  
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Filled Round Rectangl");
display.fillRoundRect(0, 15, 60, 40, 8, WHITE);
display.display();
delay(2000);

رسم دایره

رسم دایره با استفاده از تابع drawCircle(X-coordinate of center, Y-coordinate of center) صورت می‌گیرد. این تابع دایره‌های توخالی با حاشیه 1 پیکسلی رسم می‌کند.

رسم دایره در نمایشگر OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Circle");
display.drawCircle(20, 35, 20, WHITE);
display.display();
delay(2000);

برای رسم دایره توپر می‌توانید از تابع ()fillcircle استفاده کنید.

رسم دایره توپر در ماژول OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Filled Circle");
display.fillCircle(20, 35, 20, WHITE);
display.display();
delay(2000);

رسم مثلث

شما می‌توانید با استفاده از تابع drawTriangle(x0, y0, x1, y1, x2, y2, color) روی نمایشگر یک مثلث رسم کنید. این تابع 7 پارامتر می‌گیرند که عبارت‌اند از: مختصات X و Y ، سه گوشه مثلث و رنگ آن. (X0, Y0) رأس بالایی، (X1, Y1) رأس سمت چپ و (X2, Y2) رأس سمت راست را مشخص می‌کنند. این تابع مثلث‌های توخالی با حاشیه 1 پیکسل را رسم می‌کند.

رسم یک مثلث
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Triangle");
display.drawTriangle(30, 15, 0, 60, 60, 60, WHITE);
display.display();
delay(2000);
رسم یک مثلث توپر در ماژول نمایشگر OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Filled Triangle");
display.fillTriangle(30, 15, 0, 60, 60, 60, WHITE);
display.display();
delay(2000);

کد نمایش تصاویر Bitmap

در مثال آخر این آموزش نشان می‌دهیم چگونه تصاویر بیت مپ را روی نمایشگر OLED نمایش دهید. این کار برای نمایش لوگوهای تمام صفحه شرکت‌ها، ساخت تصاویر sprite یا تصاویر گرافیکی جذاب برای نمایش اطلاعات استفاده می‌شود.

تصویر  Sprite: در CSS برای کم شدن حجم بارگذاری صفحه وب از تکنیکی استفاده می‌شود که در آن چندین تصویر (مثلاً لوگوهای back، forward و home یک وب‌سایت) در یک تصویر و کنار هم قرار می‌گیرند و هنگام نمایش، فقط بخش موردنظر از تصویر نشان داده می‌شود. به این تصویر sprite گفته می‌شود.

کد زیر را داخل آردوینو IDE کپی و روی upload کلیک کنید.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(-1);

// Bitmap of MarilynMonroe Image
const unsigned char MarilynMonroe [] PROGMEM = {
	0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xf0, 0x41, 0xff, 0xff, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xf1, 0xff, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x02, 0x78, 0x7f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xfe, 0x03, 0x7c, 0x1f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x07, 0xff, 0xff, 0xfe, 0x01, 0xfe, 0x1f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xfd, 0xe0, 0x03, 0xff, 0xff, 0xfc, 0x00, 0xfe, 0x0f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0xe0, 0xff, 0xff, 0xfc, 0x00, 0x06, 0x07, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xf9, 0xff, 0xff, 0xfc, 0x00, 0x02, 0x07, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xc3, 0xc3, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xe0, 0x0c, 0x00, 0xe7, 0x81, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xe0, 0x02, 0x00, 0x02, 0x00, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x3f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x1e, 0x3f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0x3f, 0xf8, 0x00, 0x18, 0x7f, 0x1f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xf8, 0x01, 0x80, 0x03, 0xfc, 0x3f, 0xfc, 0x00, 0x70, 0xfe, 0x1f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xf0, 0x43, 0xff, 0xff, 0xf8, 0x7f, 0xf8, 0x00, 0x00, 0x7e, 0x1f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xf0, 0xff, 0xfc, 0x00, 0x00, 0x7c, 0x3f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xf1, 0xef, 0xf8, 0x00, 0x01, 0xfc, 0x3f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xf3, 0x80, 0xa0, 0x00, 0x07, 0xfc, 0xaf, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xec, 0x5f, 0xff, 0xff, 0xe7, 0xf0, 0x00, 0x00, 0x03, 0xfe, 0xdf, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xee, 0x7f, 0xff, 0xff, 0xc7, 0xf8, 0x00, 0x00, 0x03, 0xff, 0xdf, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xf7, 0xc7, 0xff, 0x06, 0x00, 0x03, 0xff, 0xbf, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, 0xc7, 0x07, 0xff, 0x80, 0x00, 0x07, 0xdb, 0xbf, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0x80, 0x03, 0xff, 0xc0, 0x00, 0x03, 0xc3, 0x0f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x98, 0x03, 0xff, 0xf8, 0x00, 0x07, 0xe0, 0x0f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xfc, 0x01, 0x07, 0xfc, 0x1f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xcf, 0xef, 0xff, 0xff, 0xe1, 0xff, 0xfc, 0x01, 0x07, 0xf8, 0x1f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0x7f, 0xf1, 0xff, 0xf8, 0x02, 0x07, 0x88, 0x3f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xcf, 0xef, 0xf8, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x07, 0x84, 0x3f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xe7, 0xef, 0xf0, 0x04, 0x7f, 0xff, 0xc0, 0x00, 0x07, 0x84, 0x7f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x3f, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x06, 0x04, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x3f, 0x7f, 0xe1, 0xf0, 0x07, 0xff, 0x80, 0x00, 0x07, 0x06, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xfe, 0x03, 0xff, 0x00, 0x00, 0x03, 0x80, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xf2, 0x3f, 0xc6, 0x7f, 0x81, 0xce, 0x00, 0x00, 0x01, 0xc1, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xe0, 0x3f, 0xc0, 0x07, 0xc1, 0xfe, 0x00, 0x00, 0x0d, 0xc0, 0x7f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xe0, 0x3f, 0xc0, 0x01, 0xe0, 0xfc, 0x00, 0x00, 0x0f, 0xc0, 0x7f, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xc0, 0x3f, 0xc0, 0x00, 0x50, 0xfc, 0x00, 0x00, 0x0e, 0xc0, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xc0, 0x3f, 0xc0, 0x00, 0x18, 0xf8, 0x00, 0x00, 0x0e, 0xc1, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xc0, 0x3f, 0xc0, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x66, 0x81, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xc0, 0x1f, 0xc7, 0x80, 0x00, 0xf8, 0x00, 0x01, 0xe0, 0x00, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xc0, 0x1f, 0xc1, 0xe0, 0x01, 0xf8, 0x00, 0x03, 0xf0, 0x01, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x80, 0x1f, 0xc0, 0x3e, 0x03, 0xf0, 0x00, 0x00, 0xe0, 0x03, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x00, 0x1f, 0xe0, 0xe0, 0x03, 0xf2, 0x00, 0x00, 0xc0, 0x03, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x80, 0x1f, 0xf0, 0x00, 0x07, 0xe6, 0x00, 0x00, 0xc0, 0x03, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0x00, 0x1f, 0xee, 0x00, 0x00, 0x80, 0x07, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xb8, 0x0f, 0xff, 0xf0, 0x3f, 0xdc, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xbc, 0x0f, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x9e, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x08, 0x0f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x00, 0x0b, 0xff, 0xff, 0xfe, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x00, 0x0b, 0xff, 0xff, 0xf9, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x3c, 0x09, 0xff, 0xff, 0xf1, 0x80, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x1e, 0x08, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x1f, 0x08, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0x80, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xce, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xfe, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 
	0xff, 0xff, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff
};

void setup()   
{                
	// initialize with the I2C addr 0x3C
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  

	// Clear the buffer.
	display.clearDisplay();

	// Display bitmap
	display.drawBitmap(0, 0,  MarilynMonroe, 128, 64, WHITE);
	display.display();

	// Invert Display
	//display.invertDisplay(1);
}

void loop() {}


خروجی به شکل زیر خواهد بود:

خروجی بیت مپ در ماژول OLED

برای نمایش تصویر بیت مپ روی نمایشگر OLED باید تابع drawBitmap(X-coordinate, Y-coordinate, bitmap array, width, height, color) را فراخوانی کنیم. این تابع شش پارامتر می‌گیرد که به ترتیب عبارت‌اند از: مختصات X گوشه بالا سمت چپ، مختصات Y گوشه بالا سمت چپ، آرایه بیت مپ، عرض تصاویر بیت مپ در واحد پیکسل، ارتفاع تصاویر بیت مپ در واحد پیکسل و رنگ.

در این مثال، اندازه تصویر 128×64 است. پس مختصات X و Y را برابر 0 و عرض و ارتفاع را 128 و 64 قرار می‌دهیم.

// Display bitmap
display.drawBitmap(0, 0,  MarilynMonroe, 128, 64, WHITE);
display.display();

ولی قبل از فراخوانی تابع ()drawBitmap، به یک تصویر نیاز داریم. فراموش نکنید رزولوشن نمایشگر ما 128×64 است، پس تصاویر بزرگ‌تر از این اندازه به‌درستی نمایش داده نمی‌شوند. برای به‌دست‌آوردن یک تصویر با اندازه مناسب، می‌توانید از برنامه ویرایش تصویر دلخواه خود مانند Inkspace، Photoshop یا حتی Paint استفاده کنید و ابعاد تصویر را 128×64 پیکسل تنظیم کنید.

برای مثال ما تصویر خندان Marilyn Monroe را انتخاب کردیم و اندازه آن را با استفاده از Paint به 128×64 پیکسل تغییر داده و با فرمت .bmp ذخیره کردیم.

تغییر سایز عکس مورد نظر

حال که تصویر بیت مپ را در اختیار داریم زمان آن رسیده که آن را به‌صورت آرایه‌ای دربیاوریم که برای کنترلر SSD1306  قابل‌فهم باشد. این کار به دو روش امکان‌پذیر است: روش آنلاین با استفاده از image2cpp و روش آفلاین با استفاده از برنامه LCD Assistant.

ساخت آرایه Bitmap به روش آنلاین با image2cpp

یک اپلیکیشن آنلاین به نام image2cpp موجود است که تصویر شما را به یک آرایه تبدیل می‌کند. Image2cpp به نسبت LCD Assistant قدرتمند و جدیدتر است و به ما اجازه می‌دهد:

  • چندین عکس را هم‌زمان تبدیل کنیم.
  • تصویر را بکشیم یا جمع کنیم تا به‌اندازه دلخواه ما دربیاید.
  • حد آستانه روشنایی تصویر را تعیین کنیم، به شکلی که چه بخش‌هایی از تصویر سیاه و چه بخش‌هایی سفید شوند.
  • تصویر را عمودی یا افقی بچرخانیم.
  • رنگ‌های تصویر را معکوس (نگاتیو) کنیم.

این ابزار به قدری قدرتمند است که می‌تواند به ‌صورت آفلاین هم کار کند. کافی است تصویر را روی کامپیوتر خود ذخیره و با مرورگر خود باز کنید. این قابلیت به لطف Jasper van Loenen ممکن شده است.

برای شروع، image2cpp را در مرورگر خود باز کنید و عکسی را که می‌خواهید روی نمایشگر OLED نمایش دهید انتخاب کنید.

انتخاب عکس در برنامه image2cpp

ابعاد تصویر در قسمت Canvas size  که زیرمجموعه بخش Image setting است، نمایش داده می‌شود. اگر ابعاد تصویر بزرگتر از 128×64 است، آن را به 128×64 تنظیم کنید. می‌توانید خروجی را در بخش Preview مشاهده نمایید.

همچنین در صورت نیاز می‌توانید رنگ پس‌زمینه را تغییر دهید یا تصویر را نگاتیو کنید.

در نهایت، مهم‌ترین گزینه که حد آستانه روشنایی است را بسته به نیاز خود تنظیم کنید. با این کار پیکسل‌هایی که روشنایی آن‌ها بیش از حد آستانه است سفید شده و مابقی پیکسل‌ها سیاه خواهند شد. ما برای تصویر خود حد آستانه 171 را تعیین کردیم تا جزئیات مناسبی از تصویر داشته باشیم.

تنظیمات عکس در برنامه image2cpp

این پیش‌نمایش کوچک، تأثیر هر تغییری را که در تنظیمات اعمال کنید نشان می‌دهد. پس می‌توانید با تغییر تنظیمات و بررسی پیش‌نمایش، به تصویر مناسب خود دست یابید.

پیش نمایش تصویر بیت مپ پس از ایجاد تغییرات

پس از مشاهده­‌ی نتیجه‌­ی موردنظر، می‌توانید آرایه را بسازید. برای این کار کافی است در بخش Output، Code output format را روی Arduino Code قرار دهید و روی دکمه Generate code کلیک کنید. این برنامه گزینه دیگری به نام Draw mode یا “حالت رسم” دارد. این گزینه آرایه تصویر را برحسب روش اسکن صفحه‌نمایش می‌سازد. اگر تصویر شما به‌هم‌ریخته نمایش داده می‌شود، این گزینه را تغییر داده و دوباره امتحان کنید.

ساخت آرایه در output برنامه image2cpp

حال آرایه بیت مپ شما آماده است! شما می‌توانید خروجی را مستقیماً از نمونه کد بالا به دست آوردید. فقط اطمینان داشته باشید که نام مناسبی برای آن انتخاب و سپس آرایه خود را در تابع ()drawBitmap فراخوانی کنید.

بیت مپ بدست آمده از عکس

ساخت آرایه بیت مپ به‌صورت آفلاین با برنامه LCD Assistant

برنامه دیگری به نام LCD Assistant وجود دارد، که می‌تواند تصاویر بیت مپ را به آرایه تبدیل کند. این برنامه به قدرتمندی image2cpp نیست اما در میان علاقه‌مندان این حوزه همچنان محبوب است.

برای شروع، باید تصویر خود را به بیت مپ مونو‌کروم با ابعاد 128×64 تبدیل کنید. برای این کار به‌دلخواه از یک برنامه ویرایش تصویر مانند Inkscape، Photoshop، Paint و … می‌توانید استفاده کنید. در اینجا ما از paint استفاده کرده‌ایم.

فایل خود را در Paint باز کنید و اندازه آن را به 128×64، تغییر دهید.

تغییر سایز عکس در برنامه paint

حال فایل خود را با فرمت bitmap ذخیره کنید. برای این کار در هنگام ذخیره، Save as type را روی Monochrome Bitmap(*.bmp;*.dib) قرار دهید. با این کار یک تصویر بیت مپ ساخته می‌شود که برای هر پیکسل، فقط مقادیر 0 یا 1 (سیاه یا سفید) را دارد.

ذخیره عکس با فرمت bitmap

تنها مشکل این روش این است که امکان تعیین حد آستانه روشنایی را نداریم. این مقدار به‌صورت پیش‌فرض روی 50% قرار داشته و قابل تغییر نیست.

حال برنامه LCD Assistant را دانلود کنید. فایل .exe آن را اجرا و تصویر بیت مپ خود را از منوی File باز کنید.

این ابزار قابلیت خاص بیشتری ندارد؛ پس به منوی File رفته و این بار Save output را انتخاب کنید. تصویر شما به‌صورت فایل متنی ذخیره می‌شود.

انتخاب گزینه‌ی Save output از زیر منوی File برای ذخیره فایل به‌صورت متنی

این ابزار گزینه دیگری به نام Byte Orientation یا “ترتیب قرارگیری بایت‌ها” دارد که تصویر را برحسب روش اسکن صفحه‌نمایش می‌سازد. اگر تصویر شما به‌هم‌ریخته نمایش داده می‌شود، این گزینه را تغییر داده و دوباره امتحان کنید.

همین! پس از ساخت آرایه، آن را در کد خود کپی کنید.

آرایه کپی شده در کد

نام مناسبی برای آرایه خود انتخاب کنید و آن را در تابع ()drawBitmap فراخوانی کنید.

حالا شما کاملا با چگونگی کنترل و راه اندازی ماژول نمایشگر OLED با آردوینو وESP8266 NodeMCU آشنا شده اید و وقت آن است که دست به کار شوید و پروژه دلخواه خود را با استفاده از نمایشگر OLED بسازید. شما می‌توانید سوالات و نظرات خود را در بخش دیدگاه با ما در میان بگذارید.

مقالات مشابه

۳۳ دیدگاه. Leave new

  • محسن فرقانی
    اسفند ۲۵, ۱۴۰۰ ۰۸:۲۸

    با سلام.
    ممنون از مطلب مفیدتون
    فقط اگه ممکنه در قسمت “مشخص‌کردن مبنای اعداد” عدد ۴۲۹۴۹۶۲۹۵ را اصلاح کنید.عدد صحیح برابر با ۴۲۹۴۹۶۷۲۹۵ میباشد. ( ۲ به توان ۳۲ )

    پاسخ
    • سلام محسن عزیز،
      خواهش می‌کنم، مرسی که ما رو همراهی می‌کنی،
      یک اشتباه تایپی بود و اصلاح شد،
      ممنون از شما

      پاسخ
  • عالی بود خسته نباشید

    پاسخ
  • سلام
    من oled 128×32 رو اول با esp راه انداختم
    فرداش که همون کد رو ریختم دوباره روش تا شش هفت تا کاراکتر ها رو (همون نوشته ها رو) نشون میده و بقیه اش هم‌ برفکی هستش
    و همین طور هم esp رو ریست میکنه
    همون کد و سیم کشی رو با مگا که تست کردم کار داد.
    ممنون میشن اگه راهنمایی کنید

    پاسخ
  • سلام وقت دوستان بخیر
    واقعا ممنونم از این مطلب عالیتون خدا قوت

    پاسخ
  • سلام و درود
    ببخشید من وقتی فونت رو تغییر روی نمایشگر تغییر میدم
    دیگه نمی تونم متن رو وارونه نشون بدم
    میخواستم بدونم راه حلی وجود داره

    پاسخ
    • سلام و درود به شما،
      طبق بررسی که انجام دادیم همچین مشکلی وجود نداره، اما ممکنه از تابع setTextColor دوبار استفاده کرده باشی.
      توی لینک زیر کدی که برای این منظور نوشتیم رو می‌تونی ببینی، حتما بررسیش کن:
      https://wokwi.com/projects/345407422957879892

      پاسخ
  • سلام
    میشه این ماژول و ماژول بلوتوث و ماژول التراسونیک رو بطورهم زمان استفاده کرد؟؟

    پاسخ
    • سلام و درود،
      بله امکان پذیره.

      پاسخ
      • ممکنه کدش رو بفرستید؟
        من هرچی تلاش کردم نشد

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

          پاسخ
  • سلام
    من هم همین مشکل رو دارم اگر ممکنه کد راه اندازی همزمان این دوتا رو بفرستید🙏🏻

    پاسخ
    • سلام آرش عزیز،
      در حال حاضر کد آماده‌ای برای استفاده همزمان از این ماژول ها نداریم. شما می‌تونی مقاله های مرتبط رو مطالعه کنی و با درک کدهای نمونه ای که توی سایت هست، کد مناسب کاربردت رو بنویسی. اگر در مورد مقاله و کدهای اون سوال داشتی می‌تونی با ما مطرح کنی.

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

    پاسخ
    • سلام و درود به شما دوست عزیز
      در پاسخ به سوال شما باید گفت خود این ماژول نمایشگر به تنهایی هیچ قابلیت ارتباط بی‌سیمی نداره اما اگر مثلا با ماژول ESP8266 راه‌اندازی بشه، میتونید به ESP8266 از راه دور دیتا بفرستید و نمایش بدید. میتونید از ماژولهای ESP32 استفاده کنید که ارتباط بلوتوث هم دارند یا اینکه از یک برد آردوینو به همراه ماژول‌های بلوتوث HC-05 یا HC-06 استفاده کنید و…
      سپاس فروان از همراهی شما 🙂

      پاسخ
  • سلام برای من خط display.displayرو ارور میده

    پاسخ
    • سلام و درود بر شما علیرضا عزیز
      لطفا جهت راهنمایی مؤثر و بهتر، متن ارور را برای ما ارسال نمایید.
      سپاس از همراهی شما 🙂

      پاسخ
  • احسان زارعی
    خرداد ۱۵, ۱۴۰۲ ۲۰:۲۲

    سلام از رنگ زرد ماژول چجوری باید استفاده کرد؟
    و اینکه چجوری میشه یک خط کشید؟
    و خسته نباشید عرض میکنم بابت مطالب خوبتون

    پاسخ
    • درود برشما احسان عزیز
      نمایشگرهای زرد-آبی که در بازار موجود هست معمولاً قسمت بالایی زرد دارند و قسمت پایینی آبی،‌ بنابراین امکان انتخاب رنگ ندارند و هر چیزی در قسمت بالایی نمایش بدید زرد نشون داده میشه.
      برای رسم خط از تابع drawline می‌تونید استفاده کنید که پارامترهاش به شکل زیر هست:
      display.drawLine(StartX, StartY, EndX, EndY, WHITE);

      سپاس از همراهی بی‌نظیرشما

      پاسخ
  • سلام
    اگر بخواهیم که int ==۱ شد تصویر مثلث روی نمایشگر باشه باید چیکار کنم ممنون میشم اگر راهنماییم کنید

    پاسخ
    • سلام و درود بر شما دوست عزیز
      داخل loop اصلی برنامه، کدهای مربوط به نمایش دایره را داخل یک شرط بگذارید. به این شکل

      If(A==1)
      {
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println(“Circle”);
      display.drawCircle(20, 35, 20, WHITE);
      display.display();
      }

      پاسخ
  • سلام من کد رو داخل یه شبیه ساز اجرا کردم ولی فقط نیمه بالایی صفحه کار میکنه و نیمه پایینی خاموشه مشکل از کجاست؟

    پاسخ
  • سلام
    ببخشید چجوری می توانیم کد بیت مپ رو به تصویر تبدیل کرد؟

    پاسخ
    • سلام و درود بر شما دوست عزیز
      برای تبدیل کد بیت مپ به تصویر، از ابزارهای آنلاین (جستجو کنید bitmap to image online) می توانید استفاده کنید یا به شکل حرفه‌ای تر، استفاده از توابع ساده پردازش تصویر متلب یا کتابخانه‌های پایتون.

      پاسخ
  • بعد ببخشید یه سوال دیگه هم که داشتم این بود که چجوری میشه خودمون کد بیت مپ را نوشت؟

    پاسخ
    • درود بر شما
      کد بیت مپ شامل تعدادی عدده (به تعداد پیکسل‌های تصویر) که هر عدد بیانگر میزان روشنایی پیکسل مدنظر هست. بنابراین بیت مپ چیز عجیب و پیچیده‌ای نیست اما عموماً کسی خودش به طور دستی اون رو نمینویسه، معمولاً شما یک تصویر دارید که داخل فتوشاپ ساختید یا دانلود کردید یا.. و با استفاده از ابزارهایی که ذکر شد اون رو تبدیل به بیت مپ می‌کنید.

      پاسخ

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Fill out this field
Fill out this field
لطفاً یک نشانی ایمیل معتبر بنویسید.
You need to agree with the terms to proceed

پر بازدید ترین مقالات