در این آموزش قصد داریم به نحوه راه اندازی OLED های با درایور SD1306 بپردازیم . این OLED ها سایز کوچکی داشته و با تراکم پیکسل بالایی که دارند می توانند تصایور را با کیفیت بالاتری نسبت به LCD های گرافیکی نمایش دهند . می توانید از این OLED ها در پروژه های مبتنی بر ESP32 استفاده کنید . حتی در بسیاری از برد های با هسته ESP32 از این OLED ها استفاده شده است ( برد های مانند Heltek و TTGO ) . در این آموزش از کتابخانه Adafruit_SD1306 استفاده میکنیم که امکانات خوبی دارد . این کتابخانه سازگاری خوبی با هسته های AVR و ESP ها دارد همچنین از الگو هایی برای بالا بردن سرعت اجرا و کاهش استفاده از RAM استفاده می کند . اگر از نمایشگر های مونو مانند OLED ها و LCD های گرافیکی در پروژه های خود استفاده میکنید می توانید از کتابخانه U8g2 استفاده کنید که یک کتابخانه یکپارچه و کامل برای نمایشگر های تک رنگ است .
در این آموزش از برد ESP32 و OLED با درایور SD1306 استفاده خواهیم کرد . SD1306 توانای ارتابط از طریق رابط های SPI و I2C را دارد اما اغلب از رابط I2C به دلیل پین های کمتر ، استفاده می شود . در جدول زیر نحوه اتصال پین های I2C ماژول OLED به برد ESP32 نشان داده شده است :
شرح کتابخانه Adafruit_SSD1306 :
برای استفاده از کتابخانه OLED لازم است کتابخانه های زیر را به برنامه خود اضافه کنید (ابتدا باید آن ها را نصب کنید ) :
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>
کتابخانه Wire جهت ارتباط I2C و نیز کتابخانه GFX شامل توابع مشترک نمایشگر های مونو کالر می باشد ( توابعی مانند رسم خط ، نقطه و…) .
برای کار با متد های کتابخانه ابتدا یک شی از کلاس Adafruit_SD1306 باید بسازید . تابع سازنده ای نکلاس خود شامل سه پارامتر است که شامل سطر ، ستون و پین RESET نمایشگر می باشد . در صورتی که پین RESET نمایشگر به جایی متصل نباشد می توانید این پارامتر را 1- قرار دهید :
Adafruit_SSD1306 display(تعداد سطر ، تعداد ستون, &Wire, -1);
از تابع زیر برای شروع کار با OLED استفاده می شود . این تابع را باید در روتین Setup فراخوانی کنید :
display.begin(SSD1306_SWITCHCAPVCC, 0x3C)
مقدار 0x3C مربوط به آدرس OLED می باشد کهممکن است متفاوت باشد . قبل از راه اندازی OLED از طریق برنامه های اسکنر آدرس I2C می توانید آدرس OLED خود را پیدا کنید .
بهتر است همیشه از یک شرط برای انجام صحیح پیکر بندی OLED استفاده کید تا از خطا های احتمالی آگاه بشید :
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("SSD1306 allocation failed"); for(;;); // Don't proceed, loop forever }
از تابع clearDisplay برای پاک کردن و ریست OLED استفاده می شود . قبل از شروع به کار بهتر است یک بار از این تابع استفاده کنید :
display.clearDisplay();
برای نمایش متن ابتدا باید سایز فونت را مشخص کنید :
display.setTextSize(1);
سپس رنگ متن را انتخاب می کنید :
display.setTextColor(WHITE);
پس از اجرای توابع فوق می توانید با استفاده از تا زیر مکان مکان نما را مشخص کنید :
display.setCursor(X,Y);
با تعیین موقعیت مکان نما ، می توانید توسط تابع print هر متنی را بر روی نمایشگر چاپ کنید :
display.println("Hello, world!");
کد زیر را می توانید بر ردوی برد ESP32 خود آپلود کنید تا عملکرد هر کدام از توابع را ببینید :
/********* Rui Santos Complete project details at https://randomnerdtutorials.com *********/ #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); void setup() { Serial.begin(115200); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); for(;;); } delay(2000); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); // Display static text display.println("Scrolling Hello"); display.display(); delay(100); } void loop() { // Scroll in various directions, pausing in-between: display.startscrollright(0x00, 0x0F); delay(2000); display.stopscroll(); delay(1000); display.startscrollleft(0x00, 0x0F); delay(2000); display.stopscroll(); delay(1000); display.startscrolldiagright(0x00, 0x07); delay(2000); display.startscrolldiagleft(0x00, 0x07); delay(2000); display.stopscroll(); delay(1000); }