راهاندازی صفحهنمایش OLED با آردوینو
حوصلهی استفادهی مکرر از نمایشگر LCD در پروژههای آردوینو را دارید؟ خوب! LCDها قطعات بد و به دردنخوری نیستند و ما هنوز هم از آنها در پروژههایمان استفاده میکنیم اما نوع جدید و فوقالعادهای از نمایشگرها عرضه شدند که کار ما را آسانتر از قبل کردهاند. نام این نمایشگرها OLED میباشد. آنها بسیار سبک، نازک، از نظر تئوری انعطافپذیر هستند و تصویری واضحتر و روشنتر تولید میکنند.
درایور OLED SSD1306 و رابطهای آن
در قلب ماژول، یک تراشهی قدرتمند و کنترلکنندهی درایور COMS OLED_SSD1306 وجود دارد که میتواند به چندین روش از جمله I2C و SPI با میکروکنترلر ارتباط برقرار کند. SPI بهطور کلی سریعتر از I2C است اما به پایههای ورودی/خروجی بیشتری نیاز دارد. درحالی که I2C فقط به دو پایه نیاز دارد و میتوان آن را با سایر وسایل جانبی I2C به اشتراک گذاشت. در نهایت این انتخاب شما است که کدام روش را انتخاب کنید.
به لطف تنوعپذیری کنترلر SSD1306، این ماژول در اندازهها و رنگهای مختلف ارائه میشود. بهعنوان مثال ۱۲۸ ×۶۴، ۱۲۸ × ۳۲، OLEDهای سفید، OLEDهای آبی و OLEDهای دو رنگ. خبر خوب این است که همهی این نمایشگرها قابل تعویض هستند.
منبع تغذیه
نمایشگر OLED بدون نور پسزمینه کار میکند و برای تولید نور خود نیاز به منبع نور مستقل ندارد. به همین دلیل صفحه نمایش دارای کنتراست بسیار بالا، زاویه دید بسیار گسترده و توانایی نمایش سطوح عمیق سیاه است. عدم وجود نور پسزمینه بهطور قابل توجهی نیروی مورد نیاز برای اجرای OLED را کاهش میدهد و این صفحه نمایش بهطور متوسط از جریان ۲۰ میلیآمپر استفاده میکند. اگرچه به میزان روشن بودن نمایشگر بستگی دارد.
ولتاژ کاری کنترلر SSD1306 از ۱.۶۴ ولت تا ۳.۳ ولت است درحالی که پنل OLED به ولتاژ تغذیهی ۷ ولت تا ۱۵ ولت نیاز دارد. تمام این نیازهای مختلف برق با استفاده از مدار پمپ شارژ داخلی برطرف میشود. این مدار این امکان را فراهم میکند تا بتوانید بهراحتی و بدون استفاده از مبدل سطح منطقی، آن را به یک میکروکنترلر منطقی آردوینو یا ولتاژ ۵ ولت متصل کنید.
نقشهی حافظهی OLED
صرف نظر از اندازهی ماژول OLED، درایور SSD1306 دارای یک RAM ۱ کیلوبایتی GDDRAM (Graphic Display Data Ram) برای صفحه نمایش است که الگوی بیت گرافیک نمایش داده شده را ذخیره میکند. این حافظهی ۱ کیلوبایتی در ۸ صفحه ( از ۰ تا ۷) سازمان یافته است. هر صفحه شامل ۱۲۸ ستون/ بخش (بلوک ۰ تا ۱۲۷ ) است و هر ستون میتواند ۸ بیت داده ذخیره کند. تمامی اینها به ما نشان میدهند که:
۱ کیلوبایت حافظه = ۱۰۲۴ بایت = ۸۱۹۲ بیت = ۸ بیت داده × ۱۲۸ بلوک × ۸ صفحه
کل حافظهی ۱ کیلوبایتی با صفحات، بخشها و دادهها در زیر نشان داده شدهاست.
هر بیت نشاندهندهی پیکسل خاص OLED برروی صفحه است که میتواند از طریق برنامه روشن یا خاموش شود. صفحهی OLED ۱۲۸ × ۶۴ تمام محتویات RAM را نشان میدهد درحالی که صفحهی OLED ۱۲۸ × ۳۲ فقط نصف محتوای RAM را نشان میدهد.
در زیر مشخصات کامل نشان داده شدهاست:
OLED (Organic LED) |
فناوری نمایشگر |
I2C/SPI |
رابط MCU |
۰.۹۶ اینچ |
اندازهی صفحهنمایش |
۶۴ × ۱۲۸ پیکسل |
Resolution (وضوح) |
۳.۳ ولت تا ۵ ولت |
ولتاژ عملیاتی |
ماکزیمم ۲۰ میلیآمپر |
جریان عملیاتی |
۱۶۰ درجه |
زاویه دید |
۲۱ |
کاراکترها در هر ردیف |
۷ |
تعداد ردیف کاراکترها |
معرفی پینهای ماژول OLED
قبل از راهاندازی OLED، بیایید ابتدا پینهای آن را معرفی و بررسی کنیم.
· GND: باید به پین GND برد آردوینو متصل شود.
· VCC: منبع تغذیهی صفحه نمایش است که ما پایهی ۵ ولت را بر روی آردوینو به آن وصل میکنیم.
· SCL: پین کلاک سریال برای رابط I2C است.
· SDA: پین دادهی سریال برای رابط I2C است.
سیمکشی ماژول OLED به برد آردوینو UNO
حال بیایید نمایشگر را به آردوینو وصل کنیم. اتصالات نسبتاً ساده هستند. با اتصال پایهی VCC به پین ۵ ولت در برد آردوینو UNO شروع میکنیم. پس از آن GND را به پایهی همنام خود در برد وصل میکنیم.
اکنون پینهای مربوط به ارتباطات I2C باقی ماندهاند. توجه داشته باشید که هر برد آردوینو دارای پینهای I2C مختلف است که باید به همین ترتیب متصل شوند. در بردهای آردوینو SDA، R3 (خط داده) و SCL (خط کلاک) روی هدرهای پین نزدیک به پایهی AREF قرار دارند. آنها همچنین در دو پایهی A5 (SCL) و A4 (SDA) قابل استفاده هستند. برای درک سریعتر به جدول زیر مراجعه کنید.
SDA |
SCL |
|
A4 |
A5 |
آردوینو UNO |
A4 |
A5 |
آردوینو NANO |
۲۰ |
۲۱ |
آردوینو MEGA |
۲ |
۳ |
LEONARDO/MICRO |
مدار زیر نحوهی اتصالات را به شما نشان میدهد.
نصب کتابخانه برای ماژول نمایش OLED
کنترلر SSD1306 نمایشگر OLED دارای درایورهای انعطافپذیر و در عین حال پیچیده است. برای استفاده از کنترلکنندهی SSD1306 دانش گستردهای در مورد آدرسدهی حافظه لازم است. خوشبختانه کتابخانهی Adafruit SSD1306 برای پنهان کردن پیچیدگیهای کنترلکنندهی SSD1306 نوشته شدهاست تا بتوانیم دستورات سادهای برای کنترل صفحهنمایش صادر کنیم. برای نصب کتابخانه، بهترتیب به sketch > Include Library > Manage Library بروید. منتظر بمانید تا Manage Library فهرست کتابخانهها را بارگیری کند و لیست کتابخانههای نصبشده را بهروز کند.
در قسمت سرچ عبارت adafruit ssd1306 را تایپ کنید. چندین مورد به شما نمایش داده خواهدشد. به دنبال adafruit ssd1306 باشید. روی آن کلیک کرده و سپس install را انتخاب کنید.
این کتابخانهی Adafruit SSD1306 یک کتابخانهی مربوط به سختافزار است که کارهای در سطح سیستم را مدیریت میکند. برای نمایش اصول ابتدایی گرافیکی مانند نقاط، خطوط، دایرهها، مستطیلها و... باید با Adafruit GFX Library جفت شود. پس این کتابخانه را هم نصب کنید.
مشکل شناختهشدهی کنترلر SSD1306
اگرچه SSD1306 دارای یک GDDRAM داخلی برای صفحهنمایش است، اما ما نمیتوانیم محتوای آن را بخوانیم (طبق گفتهی Adafruit). بنابراین، نمیتوان بافر(buffer) صفحه را برای انجام عملیات ریاضی دستکاری کرد. بهعنوان جایگزین، کتابخانه ۱ کیلوبایت حافظه را از ATmega328 به عنوان بافر(buffer) استفاده میکند. بنابراین میتوان بافر(buffer) صفحه را دستکاری کرده و سپس یک انتقال انبوه(bulk transfer) از حافظهی داخلی کنترلر SSD1306 را انجام دهد.
اصلاح کتابخانهی Adafruit SSD1306
کتابخانهی Adafruit SSD1306 برای نمایشگرهای OLED ۱۲۸ × ۶۴ تنظیم نشدهاست (چیزی که اکنون از آن استفاده میکنیم). اندازهی صفحه نمایش باید در فایل هدر Adafruit_SSA1306.h تغییر یابد تا برای ما کارساز باشد. درصورت عدم تغییر، ممکن است یک پیام خطا هنگام تلاش برای تأیید طرح اولیه در Arduino IDE ظاهر شود.
بهمنظور تغییر فایل هدر Adafruit_SSD1306.h، Sketchbook خود را باز کنید. بهطور کلی وارد قسمت Documents شده و بعد از آن به پوشهی Arduino رفته بروید. حال Library را باز کرده و به Adafruit_SSD1306 بروید.
فایل Adafruit_SSD1306.h را در یک Text Editor باز کنید. به پایین فایل بروید تا بخشی را با نام نمایشگرهای SSD1306 پیدا کنید یا مستقیماً به خط شمارهی ۷۳ بروید. #define SSD1306_128_32 را کامنت کنید و #define SSD1306_128_64 را لغو کامنت کنید تا کد این قسمت به این شکل باشد:
اکنون فایل را ذخیره کرده و Arduino IDE خود را مجدداً راهاندازی کنید.
نمایش متن
حال به سراغ چیزهای جالب میرویم! کد زیر متن “Hello World!” را بر روی صفحه نمایش چاپ میکند. همچنین شامل موارد زیر نیز هست:
· نمایش متن معکوس
· نمایش اعداد
· نمایش اعداد با پایه (hex ، dec)
· نمایش نمادهای ASCLL
· scroll متن بهصورت افقی و عمودی
· scroll بخشی از صفحه نمایش
این کد به شما اطلاعات کاملی در مورد نحوهی استفاده از نمایشگر OLED میدهد و میتواند پایهی پروژهای عملی بیشتر باشد. کد را امتحان کنید. سپس ما آن را با جزئیات تشریح خواهیمکرد.
هنگام نوشتن کد، IDE پیام هشدار کم حافظه را نمایش میدهد. این به این دلیل است که کتابخانه ۱ کیلوبایت حافظه از ATmega328 را بهعنوان بافر(buffer) اختصاص میدهد. میتوانید آن را نادیده بگیرید.
#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,10);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();
// Display Inverted Text
display.setTextColor(BLACK, WHITE); // 'inverted' text
display.setCursor(0,10);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();
// Changing Font Size
display.setTextColor(WHITE);
display.setCursor(0,10);
display.setTextSize(2);
display.println("Hello!");
display.display();
delay(2000);
display.clearDisplay();
// Display Numbers
display.setTextSize(1);
display.setCursor(0,10);
display.println(123456789);
display.display();
delay(2000);
display.clearDisplay();
// Specifying Base For Numbers
display.setCursor(0,10);
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,10);
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() {}
کد در ابتدا با فراخوانی چهار کتابخانه آغاز میشود. Wire.h، SPI.h، Adafruit_SSD1306.h و Adafruit_GFX.h. اگرچه برای نمایشگرهای OLED I2C به کتابخانهی SPI.h نیازی نیست اما به دلیل تدوین برنامه باید آن را اضافه کنیم.
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
سپس باید یک شیء (object) از Adafruit_SSD1306.h ایجاد کنیم. Constructor (مربوط به برنامهنویسی شیءگرا است) Adafruit_SSD1306.h شمارهی پین آردوینو را که پین RESET به آن متصل است، میپذیرد. از آنجا که صفحه نمایش OLED که ما از آن استفاده میکنیم پین RESET ندارد، ما ۱- را به constructor میفرستیم تا هیچ یک از پایههای آردوینو بهعنوان RESET صفحه نمایش استفاده نشود.
Adafruit_SSD1306 display(-1);
در setup ما باید شیء OLED را با استفاده از تابع begin() مقدار دهی اولیه کنیم. این تابع دو پارمتر را میگیرد. پارامتر اول SSD1306_SWITCHCAPVCC مدار پمپ داخلی را روشن میکند درحالی که پارامتر دوم آدرس I2C نمایشگر OLED را مییابد. آدرس I2C ماژول نمایش OLED ما ، 0x3C است. این آدرس معمولا ثابت و غیر قابل تغییر است.
سپس، قبل از چاپ اولین پیام خود روی صفحه، بافر(bufer) را پاک میکنیم.
// initialize with the I2C addr 0x3C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer.
display.clearDisplay();
نمایش متن سادهی Hello World
// Display Text
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,10);
display.println("Hello world!");
display.display();
delay(2000);
برای نمایش متن روی صفحه، باید اندازهی قلم را تنظیم کنید. این کار را میتوان با فراخوانی setTextSize() و پاس دادن اندازهی فونت قلم (شروع از ۱) بهعنوان یک پارامتر به آن، انجام داد.
در مرحلهی بعدی، باید رنگ فونت را با فراخوانی تابع setTextColor() تنظیم کنیم. پارامتر WHITE را برای پس زمینهی تیره و BLACK را برای پس زمینهی روشن قرار دهید. اکنون قبل از چاپ پیام باید مکاننما را با فراخوانی تابع setCursor (X,Y) تنظیم کنیم. پیکسلهای روی صفحه با مختصات افقی (X) و عمودی (Y) آنها، آدرس داده میشوند. سیستم، مختصات مبدا (۰و۰) را در گوشهی بالا سمت چپ قرار میدهد، با X مثبت به سمت راست و Y مثبت به سمت پایین افزایش مییابد. ما میتوانیم از print(“”) یا println(“”) برای چاپ پیام روی صفحه استفاده کنیم، دقیقاً مانند چاپ داده روی سریال مانیتور. به یاد داشته باشید، println() مکاننما را به خط جدید منتقل میکند.
برای اینکه کتابخانه بتواند عملیات ریاضی خیلی سریع روی بافر(buffer) صفحه ( بیش از ۱۰۰ فریم در ثانیه) انجام دهد، فراخوانی توابع چاپ بلافاصله محتوای بافر(buffer) صفحه را به کنترلر SSD1306 منتقل نمیکند. برای راهنمایی کتابخانه برای انجام انتقال انبوه(transfer) از بافر(buffer) صفحه در ATmega328 به حافظهی داخلی کنترلر SSD1306، یک دستور display() لازم است. به محض انتقال حافظه، پیکسلهای مربوط به بافر(buffer) صفحه در صفحهنمایش OLED نشان داده میشوند.
نمایش متن معکوس
// Display Inverted Text
display.clearDisplay();
display.setTextColor(BLACK, WHITE); // 'inverted' text
display.setCursor(0,10);
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,10);
display.setTextSize(2);
display.println("Hello!");
display.display();
delay(2000);
در اوایل این آموزش، ما تابع setTextSize() را برای تنظیم اندازهی قلم فراخوانی کردیم و ۱ را بهعنوان پارامتر قرار میدهیم. با استفاده از هر عدد صحیح غیرمنفی میتوانید از این تابع برای مقیاسبندی فونت استفاده کنید. کاراکترها با نسبت ۷:۱۰ ارائه میشوند. یعنی عبور از اندازهی قلم ۱، متن را به ابعاد ۷ × ۱۰ پیکسل برای هر کاراکتر، با عبور از ۲، متن را به ابعاد ۱۴ × ۲۰ پیکسل برای هر کاراکتر و ... ارائه میدهد.
کتابخانهی Adafruit_GFX وظیفهی ارائهی فونت را برعهده دارد. بهطور پیشفرض فونت تک فاصله انتخاب شدهاست. با این حال، نسخههای جدیدتر کتابخانه Adafruit_GFX توانایی استفاده از فونتهای جایگزین را ارائه میدهند. چندین فونت جایگزین با کتابخانه ارائه میشوند. به علاوه امکان افزودن موارد جدید وجود دارد.
نمایش اعداد
// Display Numbers
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,10);
display.println(123456789);
display.display();
delay(2000);
فقط با فراخوانی تابع print() یا println() میتوان اعداد را برروی صفحهنمایش OLED نمایش داد. فراخوانی بیش از حد این توابع (طبق مفهوم overloading گفتهشده در قسمت قبل)، میتواند یک ورودی unsigned int ۳۲ بیتی را قبول میکند. بنابراین شما فقط میتوانید اعداد از ۰ تا ۴۲۹۴۹۶۷۲۹۵ را نمایش دهید.
تعیین پایه برای اعداد
// 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 (باینری یا پایهی ۲)، OCT (اکتال یا پایهی ۸)، DEC (دسیمال یا پایهی ۱۰)، HEX (هگزادسیمال یا پایهی ۱۶). برای اعداد اعشاری، این پارامتر تعداد رقم اعشار را برای استفاده مشخص میکند. مثلاً:
· Print(78,BIN) مقدار “۱۰۰۱۱۱۰” را میدهد.
· Print(78,OCT) مقدار “۱۱۶” را میدهد.
· Print(78,DEC) مقدار “۷۸” را میدهد.
· Print(78,HEX) مقدار “4E” را میدهد.
· Print(1.23456,0) مقدار “۱” را میدهد.
· Print(1.23456,2) مقدار “۱.۲۳” را میدهد.
· Print(1.23456,4) مقدار “۱.۲۳۴۶” را میدهد.
نمایش نمادهای ASCll
// Display ASCII Characters
display.clearDisplay();
display.setCursor(0,10);
display.setTextSize(2);
display.write(3);
display.display();
delay(2000);
توابع print() و println() دادهها را بهعنوان متن قابل خواندن ASCll به صفحهنمایش میفرستد درحالی که تابع write() دادههای باینری را به صفحهنمایش میفرستد. بنابراین، میتوانید از این تابع برای نمایش نمادهای ASCll استفاده کنید. در مثال ما، ارسال شمارهی ۳ نماد قلب را نشان میدهد.
scroll تمام صفحه
// 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()
با فراخوانی توابع startscollright() و startscrollleft() بهصورت افقی و با فراخوانی توابع startscrolldiagright() و startscrolldiagleft() بهصورت مورب میتوانید نمایشگر را scroll کنید. همهی این توابع دو پارامتر را میپذیرند. یعنی start صفحه و stop صفحه. برای توضیحات صفحات به بخش نقشهی حافظهی OLED مراجعه کنید. از آنجا که از ۰ تا ۷ صفحه در صفحهنمایش وجود دارد، میتوانید با scroll در تمام صفحات، یعنی عبور از پارامترهای OxOO و OxO7، کل صفحه را scroll کنید. برای جلوگیری ازscroll صفحهنمایش میتوانید از تابع stopscroll() استفاده کنید.
قسمت خاص scroll
// 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);
بعضی اوقات نمیخواهیم کل صفحهنمایش را scroll کنیم. میتوانید این کار را با واردکردن پارامترها و ورودیهای مناسب برای شروع صفحه و آخر صفحه به توابع scroll انجام دهید. برای توضیح صفحات به بخش نقشهی حافظهی OLED مراجعه کنید. از آنجا که از ۰ تا ۷ صفحه در صفحهنمایش وجود دارد، میتوانید با پاس دادن شمارهی صفحات بهعنوان پارامتر، بخشی از صفحه را scroll کنید. در مثال ما، هر دو پارامتر را به صورت OxOO قرار دادیم. این کار باعث میشود فقط صفحهی اول (۸ ردیف اول) نمایشگر را scroll کنیم.
کد آردوینو – نقاشیها
در این مثال، ما قصد داریم برخی از نقاشیهای اساسی را امتحان کنیم. این کد بسیاری از توابع رسم را نشان میدهد. ازجمله مستطیل، مستطیل با گوشههای گرد، دایره و مثلث. کد را تست کنید و سپس ما آن را با جزئیات تشریح خواهیمکرد.
#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, 40, 15, 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, 40, 15, 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, 40, 15, 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, 40, 15, 8, WHITE);
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Circle");
display.drawCircle(20, 20, 10, WHITE);
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Filled Circle");
display.fillCircle(20, 20, 10, 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, 30, 60, 30, 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, 30, 60, 30, WHITE);
display.display();
delay(2000);
display.clearDisplay();
}
void loop() {}
بیشتر کدهای موجود (از جمله کتابخانهها و نمایش اولیه) همانند کد بالاست به جز قطعههای کد زیر که برای ترسیم نقاشیهای اساسی است.
رسم مستطیل
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Rectangle");
display.drawRect(0, 15, 40, 15, 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, 40, 15, WHITE);
display.display();
delay(2000);
با استفاده از تابع drawRect() میتوانید مستطیل را روی صفحهنمایش رسم کنید. این تابع پنج پارامتر را میگیرد. مختصات x، مختصات y، عرض، ارتفاع و رنگ. درواقع این تابع مستطیل توخالی با مرز ۱ پیکسل ترسیم میکند. با استفاده از تابع fillRect() میتوانید مستطیل توپر رسم کنید.
رسم مستطیل گرد
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Round Rectangle");
display.drawRoundRect(0, 15, 40, 15, 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, 40, 15, 8, WHITE);
display.display();
delay(2000);
با استفاده از تابع drawRoundRect() میتوانید مستطیل با گوشههای گرد را روی صفحه نمایش رسم کنید. این تابع علاوهبر پارامترهای تابع drawRect() یک پارامتر اضافه تحت عنوان شعاع گرد کردن گوشه دارد. در واقع این تابع مستطیل با گوشههای گرد تو خالی با حاشیهی ۱ پیکسل را ترسیم میکند. با استفاده از تابع fillRoundRect() میتوانید این مستطیل توپر رسم کنید.
رسم دایره
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Circle");
display.drawCircle(20, 20, 10, WHITE);
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Filled Circle");
display.fillCircle(20, 20, 10, WHITE);
display.display();
delay(2000);
با استفاده از تابع drawCircle() میتوانید روی صفحه دایره رسم کنید. این تابع چهار پارامتر را میگیرد. یعنی مختصات x مرکز، مختصات y مرکز، شعاع و رنگ. این تابع دایرهی توخالی با حاشیهی ۱ پیکسل را ترسیم میکند. با استفاده از تابع fillCircle() میتوانید دایرهی توپر را رسم کنید.
رسم مثلث
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Triangle");
display.drawTriangle(30, 15, 0, 30, 60, 30, 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, 30, 60, 30, WHITE);
display.display();
delay(2000);
با استفاده از تابع drawTriangle() میتوانید مثلث را روی صفحهنمایش رسم کنید. این تابع هفت پارامتر را میگیرد. یعنی مختصات x و y (x0 و x1 و x2 و y0 و y1 و y2) از رئوس مثلث و رنگ. (y0 و x0) نمایانگر رأس بالا، (y1 و x1) نمایانگر رأس چپ و (y2 و x2) نمایانگر رأس راست است. این تابع مثلث تو خالی با حاشیهی ۱ پیکسل ترسیم میکند. با استفاده از تابع fillTriangle() میتوانید مثلث توپر را ترسیم کنید.
کد آردوینو – نمایش Bitmap
این مثال آخر نحوهی ترسیم تصاویر Bitmap در صفحهنمایش OLED را نشان میدهد. این مورد برای ایجاد اشکال مختلف گرفیکی مفید است. کد زیر را کپی کنید، آن را در Arduino IDE وارد و آپلود کنید.
#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, 256, 128, WHITE);
display.display();
// Invert Display
//display.invertDisplay(1);
}
void loop() {}
خروجی به صورت زیر خواهدبود.
برای نشان دادن تصویر Bitmap روی صفحه نمایش OLED، باید تابع drawBitmap() را فراخوانی کنیم. شش پارامتر میپذیرد. یعنی گوشهی سمت چپ بالا مختصات x، گوشهی سمت چپ بالا مختصات y، آرایه بایت Bitmap تک رنگ، عرض Bitmap در پیکسل، ارتفاع Bitmap در پیکسل و رنگ.
در مثال ما، اندازهی تصویر Bitmap 256 × 128 است. بنابراین، مختصات y و x روی O تنظیم میشوند درحالی که عرض و ارتفاع روی 256 و 128 تنظیم میشوند.
// Display bitmap
display.drawBitmap(0, 0, MarilynMonroe, 256, 128, WHITE);
display.display();
قبل از اینکه بتوانیم تابع drawBitmap() را فراخوانی کنیم، ابتدا به یک تصویر برای ترسیم نیاز داریم. به یاد داشته باشید، وضوح صفحهنمایش OLED 256 × 128 پیکسل است. بنابراین تصاویر بزرگتر آن به درستی نمایش داده نمیشوند. برای بهدست آوردن یک تصویر با اندازهی مناسب، میتوانید از برنامههای نقاشی مورد علاقهی خود مانند Inkscap، photoshop، paint و ... استفاده کنید. اندازهی بوم را روی 256 × 128 پیکسل تنظیم کنید.
ما تصویر خندان مرلین مونرو را بهعنوان مثال درنظر گرفتیم و با استفاده از paint به 256 × 128 پیکسل تبدیل کردیم و بهعنوان bmp ذخیره کردیم.
پس از داشتن یک Bitmap، زمان آن فرا رسیده است که آن را به آرایهای تبدیل کنید که کنترلر SSD1306 بتواند آن را درک کند. این کار را میتوان با استفاده از دو روش انجام داد: روش آنلاین با استفاده از image2cpp و روش آفلاین با استفاده از LCD Assistant. میتوانید با لینک زیر آن را دانلود کنید.
http://javl.github.io/image2cpp/
ژنراتور آرایهی Bitmap آنلاین – image2cpp
یک برنامهی آنلاین به نام image2cpp وجود دارد که میتواند تصویر شما را به یک آرایه تبدیل کند. Image2cpp جدیدتر و بسیار قدرتمندتر از LCD Assistant است. به شما این امکان را میدهد که:
· تبدیل چند تصویر بهطور همزمان
· چند برابر کردن مقیاس فایل عکس، کشش عکس و...
· آستانهی روشنایی را بین سیاه و سفید تنظیم کنید.
· تنظیم عکس بهصورت افقی یا عمودی در وسط صفحه
· عکسها معکوس کنید.
این ابزار به قدری قدرتمند است که میتواند بهصورت آفلاین نیز کار کند. به سادگی صفحه را در رایانهی خود ذخیره کرده و آن را در مرورگر خود باز کنید. هر تصویری را که میخواهید در صفحهی OLED نمایش داده شود، انتخاب کنید.
ابعاد تصویر شما در گزینهی Canvas size در تنظیمات تصویر، قابل تغییر است. اگر تصویری بزرگتر از ۱۲۸ × ۶۴ را انتخاب کردهاید، آن را به ۱۲۸ × ۶۴ تغییر دهید و گزینهی مناسب مقیاسگذاری را انتخاب کنید. میتوانید خروجی را در قسمت پایین نمایش مشاهده کنید. درصورت لزوم میتوانید رنگ پسزمینه را تغییر دهید یا رنگ تصویر را معکوس کنید.
سرانجام، مهمترین گزینه یعنی آستانهی روشنایی را طبق نیاز خود تغییر دهید. آستانهی تنظیم پیکسلهای بالاتر از این سطح را سفید و کمتر را سیاه میکند. درمورد مثال ما، ما آن را روی ۱۷۱ تنظیم کردهایم تا جزئیات خوبی از تصویر داشته باشیم.
این پیشنمایش کوچک هر تغییری را که در تنظیمات خود ایجاد میکنید، منعکس میکند. درحالی که جلوی چشمتان است و آن را میبینید، میتوانید تنظیمات آن را تغییر دهید.
هنگامی که از نتیجه راضی بودید، میتوانید آرایهی داده را تولید کنید. به سادگی قالب خروجی Code را بهعنوان Arduino Code انتخاب کرده و بر روی دکمهی Generate Code کلیک کنید. فقط برای اطلاع شما، گزینهای به نام حالت رسم وجود دارد. در واقع با توجه به اسکن صفحه نمایش، تصویر ایجاد میکند. اگر بهنظر میرسد تصویر شما روی صفحه نمایش شما بههم ریخته است، حالت را تغییر دهید.
خودشه! آرایهی بایت Bitmap شما تولید میشود. میتوانید مستقیماً با کد مثال ما از خروجی استفاده کنید. فقط حتما آن را بهطور مناسب نامگذاری کنید. سپس آرایهی خود را در داخل تابع drawBitmap() فراخوانی کنید.
ژنراتور آرایهی Bitmap آفلاین – LCD Assistant
برنامهی دیگری بهنام دستیار LCD وجود دارد که میتواند تصویر Bitmap شما را به آرایهی داده تبدیل کند. به اندازهی image2cpp قدرتمند نیست اما همچنان در بین علاقهمندان محبوب است. برای شروع، شما باید تصویر خود را به عکسهای مونوکروم و bitmap تک بیتی با سایز ۱۲۸ × ۶۴ تبدیل کنید. برای این کار میتوانید از برنامههای نقاشی مورد علاقهی خود مانند photoshop، inkscape، paint و ... استفاده کنید. دقیقاً مانند آنچه در MS paint انجام دادیم. برای دانلود آن از لینک زیر استفاده کنید.
http://en.radzio.dxp.pl/bitmap_converter/
پروندهی خود را در MS paint باز کرده و اندازهی آن را به ۱۲۸ × ۶۴ تغییر دهید.
اکنون، فایل خود را بهعنوان Bitmap ذخیره کنید. هنگام ذخیرهی فایل، save as type را انتخاب کنید و گزینهی monochrome bitmap (*.bmp;*.dib) را بزنید. با این کار یک عکس دودویی (باینری) ۱ بیتی تولید میشود که فقط دو مقدار ممکن برای هر پیکسل دارد. یعنی ۰ (سیاه) یا ۱ (سفید).
تنها نکتهی منفی در اینجا این است که شما نمیتوانید سطح آستانهی روشنایی را تنظیم کنید. بهصورت پیشفرض روی ۵۰٪ تنظیم شده است و قابل تغییر نیست. به هرحال اکنون، برنامهی LCD Assistant را بارگیری کنید. قابلیت اجرایی را باز کرده و Bitmap خود را از فهرست File بارگیری کنید.
با این ابزار کار زیادی نمیتوانید انجام دهید. بنابراین، فقط به منوی File بروید و بر روی گزینهی Save output کلیک کنید. فایل را به عنوان فایل متنی ذخیره کنید. فقط برای اطلاع شما، گزینهای به نام Byte Orientation وجود دارد. درواقع با توجه به اسکن صفحه نمایش، تصویر ایجاد میکند. اگر بهنظر میرسد تصویر شما روی صفحه نمایش شما بههم ریخته است، حالت را تغییر دهید.
خودشه! با ایجاد آرایه، آن را در کد خود جایگذاری کنید.
فقط حتما آن را بهطور مناسب نامگذاری کنید. سپس آرایهی خود را در داخل تابع drawBitmap() فراخوانی کنید.
خُب! این پست هم به انتهای خود رسید. امیدوارم که از خواندن آن لذت برده باشید.