در این آموزش به معرفی و شرح کتابخانه ای خواهیم پرداخت که می توان آن را یکی از کتابخانه های قوی در دنیای برنامه نویسی امبدد سیستم دانست . U8g2 کتابخانه ای بسیار کامل جهت راه اندازی نمایشگر های مونوکروم می باشد . این کتابخانه بر خلاف اکثر کتابخنه های دیگر تنها منحصر به یک نوع نمایشگر و حتی منحصر به یک نوع میکروکنترل نمی باشد . U8g2 به عنوان کتابخانه منبع باز حاصل تلاش صد ها نفر برنامه نویس امبدد سیستم است . این کتابخانه طیف بسیار زیادی از نمایشگر های منوکروم موجود در بازار را پشتیبانی می کند (بیش از 150 نوع نمایشگر را پشتیبانی می کند ) . همچنین این کتابخانه از طیف گسترده ای از میکروکنترلر ها و چهارچوب هایی مانند آردوینو AVR ، STM32 ، LPC و… را پشتیبانی می کند . این کتابخانه با هدف ساخت یک کتابخانه همه کاره ساخته شده است در واقع عدد هشت در U8g2 نماینگر بی نهایت بودن آن است . U8g2 دائما در حال آپدیت و اضافه شدن قابلیت های بیشتری است . نکته بسیار جالب راجب به U8g2 این است که این کتابخانه دارای دو نسخه C و ++C است که شما رو مقید به یک زبان نمی کند .
یادگیری کتبخانه های جدید می تواند سطوح مختلفی از ریسک را برای شما داشته باشد چراکه شما باید زمانی را صرف یادگیری یک کتابخانه کنید و در نهایت باید از توانایی کتابخانه باید مطما باشید که ارزش وقت گذاشتن داشته باشد . به طور مثال شما با یاد گیری کتابخانه Adafruit_SSD1306 تنها قادر به راه اندازی نمایشگر های SSD1306 و آن هم تنها برای آردوینو خواهید بود . پس قبل از یادگیری و وقت گذاشتن برای همچین کتابخانه هایی حتما باید ارزش آن را مد نظر داشت .
U8g2 علاوه بر ارزش بالا برای یادگیری شاید بتوان گفت تا حد زیادی می تواند برای یک برنامه نویش امدد سیستم اجباری باشد . چراکه این کتابخانه علاوه بر تمام قابلیت هایی که گفت شد ، بسیار بهینه نوشته شده است ، حجم کمی از حافظه رو اشغال خواهد کرد لذا در شرایطی که حافظه کمی در دسترس دارید هم می توانید روی این کتابخانه حساب کنید .
نصب و راه اندازی U8g2
کتابخانه U8g2 به طور کامل یعنی شامل هردو حالت C و C++ آن در این لینک قرار دارند که می توانید آن را دانلود کیند . در برخی از IDE ها نیازی به دانلود مستقیم از گیت هاب نیست و می توانید از طریق IDE هم دانلود و نصب کتابخانه را انجام دهید . در برخی مواقع لازم است شما فایل های کتابخانه را مستقیم دانلود و آن را به برنامه خود اضافه کنید .
برای نصب U8g2 در آردوینو IDE به صورت زیر باید عمل کنید :
ابتدا به مسیرSketch->Include Library->Manage Libraries رفته و بعد از باز شدن پنجره کتابخانه ها ، U8g2 را جستوجو و در نهایت دکمه نصب را بزنید .
پس از انجام مراحل فوق کتابخانه دانلود و به لیست کتابخانه های آردوینو IDE شما افزوده شده خواهد شد .
برای نصب در PlatformIO نیز به همان صورت است . اما در IDE هایی که امکان نصب و دانلود از گیت هاب را ندارند شما باید مستقیما کتابخانه را از لینک گیت هاب دانلود و در کنار پروژ خود قرار دهید .
هدر های لازم
برای استفاده از U8g2 باید قبل از هر کاری فایل U8g2lib.h را به برنامه خود وارد کنید . در این فایل کلیه هدر های لازم برای استفاده از U8g2 فراخوانی شده اند . این فایل را با دستور زیر در ابتدای برنامه خود وارد کنید :
#include "U8g2lib.h" // Include U8g2
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
پیکربندی اولیه
در کتابخانه U8g2 برای هر مدل نمایشگر و در هر حالتی از راه اندازی ، یک کلاس تعریف شده است . شما می توانید لیست این کلاس ها را در لینک زیر مشاهده کنید . پس از پیدا کردن کلاس مربوط به نمایشگر و نیز نوع راه اندازی آن ، ابتدا باید یک شی از کلاس مورد نظر بسازید . بسته به کلاسی که مورد استفاده قرار می دهید ممکن است لازم باشد پارامتر هایی همچون پین های ارتباطی را به سازنده شی ارسال کنید . به طور مثال ما می خواهیم یک نمایشگر OLED سایز 128X64 با درایور SSD1306 را از طریق I2C راه اندازی کنیم ، پس در لیست مورد نظر به دنبال کلاس مناسب می گردیم . در نهایت برای نمایشگر ما کلاس زیر تعریف شده است :
چون نمایشگر مورد استفاده ما یک OLED SSD1306 128X64 بدون برند خاص با ارتباط I2C است پس کلاس راه اندازی آن به صورت تصویر فوق شد . در کلاس های درج شده در لینک قبلی هر کلاس بسته به نوع راه اندازی و… ممکن است که چند پارامتر را به صورت اجباری یا اختیاری لازم داشته باشد. مثلا در کلاس مورد استفاده ما اگر به داخل پرانتز نگاه کنید متوجه می شوید که این کلاس باید یک پارامتر با عنوان rotation جهت انتخاب جهت تصویر بگیرد . پارامتر های دیگری که در داخل “[]” نشان داده شده اند یعنی اجباری نیستند و می توان آن ها را وارد نکرد . پس بعد از فرا خوانی کتابخانه باید یک شی از کلاس انتخاب شده بسازیم :
#include "U8g2lib.h" // Include U8g2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C my_oled(U8G2_R0, U8X8_PIN_NONE); //My class
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
قبل از تابع اصلی ( تابع main یا تابع setup در آردوینو ) باید شی خود را بسازیم . اسم این شی اختیاری است که ما در اینجا از my_oled استفاده کرده ایم . در نهایت برای اجرای تمامی متد های کتابخانه U8g2 از این شی استفاده می کنیم .
متد .begin()
این متد کار پیکر بندی را انجام می دهد و باید قبل از هر متد دیگری این متد را در تابع اصلی فراخوانی کنیم . اگر این متد فرا خوانی نشود نمایشگر راه اندازی نخواهد شد :
#include "U8g2lib.h" // Include U8g2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C my_oled(U8G2_R0, U8X8_PIN_NONE); //My class
void setup() {
my_oled.begin(); //Begin
}
void loop() {
// put your main code here, to run repeatedly:
}
متد sendBuffer() :
ساختار کتابخانه U8g2 به گونه ای است که بخشی از حافظه میکروکنترلر را به عنوان بافر در نظر می گیرد . هر متد نمایشی را که اجرا کنیم در واقع در داخل این بافر نوشته ایم و برای نمایش آن بر روی نمایشگر باید دیتای این بافر را به نمایشگر ارسال کنیم . متد sendBuffer() این کار را انجام می دهد . در ادامه کاربرد این متد را خواهید دید :
my_oled.sendBuffer();
متد clearBuffer() :
my_oled.clearBuffer();
این متد بافر را به کلی پاک می کند . قبل از نوشتن هر چیزی در بافر باید آن را با استفاده از این متد پاک سازی کرد :
متد های رسم شکل
به طور کلی برای رسم هر شکل و تصویری می توان دیتای مربوط به آن را به صورت bitmap بر روی نمایشگر نمایش داد . این راه کار با اینکه ساده است اما می تواند حجم زیادی از حافظه و منابع را درگیر کند . در کتابخانه U8g2 متد هایی برای رسم اشکال هندسی وجود دارند که به راحتی با استفاده از ورودی هایی همچون موقعیت و اندازه می توانید اشکال هندسی مختلف را رسم کنید . این کار سرعت اجرای برنامه و نمایش تصویر را بسیار بالا می برد . در اینجا به تعداد از این متد ها خواهیم پرداخت .
متد drowBox() :
این متد در ابتدا مقادیر مربوط به موقعیت و سپس ابعاد را به آن می گیرد تا در موقعیت مشخص شده یک مستطیل با ابعاد وارد شده رسم کند .
void U8G2::drawBox(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h)
x موقعیت نقطه x بر روی نمایشگر است
y موقعیت نقطه y بر روی نمایشگر است
w عرض مستطیل
h ارتفاع مستطیل
مثال :
#include "U8g2lib.h" // Include U8g2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C my_oled(U8G2_R0, U8X8_PIN_NONE); //My class
void setup() {
my_oled.begin(); //Begin
my_oled.clearBuffer();
my_oled.drawBox(3,7,25,15);
my_oled.sendBuffer;
}
void loop() {
}
در کد فوق در تابع setup از متد رسم استفاده شده است ، این برای یک بار رسم شدن شکل بر روی نمایشگر است .
نتیجه کد فوق به صورت زیر است :
متد drawCircle() :
این متد نیز همانند متد قبل یک موقعیت و یک مقدار میگرد و در نهایت بر اساس آن یک دایره را رسم می کند . فرم آن به صورت زیر است :
void U8G2::drawCircle(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t opt = U8G2_DRAW_ALL)
x0 نقطه x مرکز دایره است
y0 نقطه y مرکز دایره می باشد
rad شعاع دایره می باشد
opt شکل دایره رسم شده را مشخص می کند که دارای پنج حالت زیر است :
U8G2_DRAW_UPPER_RIGHT
ربع بالا راست دایره را رسم می کندU8G2_DRAW_UPPER_LEFT
ربع بالا چپ را رسم می کندU8G2_DRAW_LOWER_LEFT
ربع پایین چپ دایره را رسم می کندU8G2_DRAW_LOWER_RIGHT
ربع پایین راست را رسم می کندU8G2_DRAW_ALL
دایره را به صورت کامل رسم می کند
مثال :
include "U8g2lib.h" // Include U8g2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C my_oled(U8G2_R0, U8X8_PIN_NONE); //My class
void setup() {
my_oled.begin(); //Begin
my_oled.clearBuffer();
u8g2.drawCircle(20, 25, 10, U8G2_DRAW_ALL);
my_oled.sendBuffer;
}
void loop() {
}
خروجی کد های فوق به صورت زیر است
متد drawCircle() :
از این متد برای رسم خط استفاده می شود . این متد دو موقعیت می گیرد ، موقعیت اول نقطه شروع خط و موقعیت دوم مربوط به نقطه انتهای خط است .
void U8G2::drawLine(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1)
x0 همان x نقطه شروع خط است
y0 همان y نقطه شروع خط است
x1 همان x نقطه پایان خط است
y1 همان y نقطه پایان خط است
مثال :
include "U8g2lib.h" // Include U8g2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C my_oled(U8G2_R0, U8X8_PIN_NONE); //My class
void setup() {
my_oled.begin(); //Begin
my_oled.clearBuffer();
u8g2.drawLine(20, 5, 5, 32);
my_oled.sendBuffer;
}
void loop() {
}
خروجی کد های بالا به صورت زیر است :
این تنها چند متد از صد ها قابلیت U8g2 است . در آموزش های بعدی متد های نمایش Bitmap ، ساخت منو غیره نیز آموزش داده خواهد شد .
امیدوارم این آموزش مفید بوده باشد .