آموزش Espآموزش ESP32آموزش اینترنت اشیاپروژه های Esp

اتصال نمایشگر OLED SSD1306 به ESP32 (آموزش جامع)

همانطور که میدانیم، استفاده از ابزار بصری مانند نمایشگرها در هرگونه رابط انسان و ماشین اجتناب ناپذیر است. امروزه این ابزار در تمام دستگاه های الکترونیکی از اسباب بازی های ساده گرفته تا تلفن های همراه هوشمند، کامپیوترها و حتی دستگاه های پزشکی بسیار مهم و حیاتی نیز یافت میشوند. نمایشگر، انتقال تمام اطلاعات به کاربر را برای دستگاه آسان تر میکند. اگر به نمایشگرها نگاهی بیندازید، میبینید که امروزه انواع مختلفی از آن ها در بازار موجود هستند. از نمایشگرهای سون سگمنت معمولی گرفته تا نمایشگرهای پیشرفته AMOLED. در این آموزش، به این نوع نمایشگرها که به OLED یا Organic Light Emitting Diode و یا دیود نورگسیل ارگانیک هم معروف هستند، میپردازیم.

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

ماژول OLED که در این پروژه استفاده میکنیم برای ارتباط با میکروکنترلر از I2C بهره میگیرد. شما میتوانید نمایشگرهای مشابهی را بیابید که با رابط SPI یا I2C و یا هر دو اینها روی یک PCB کار میکنند. ماژولی که ما از آن استفاده میکنیم، در مجموع چهار پایه دارد. پین اوت یک ماژول نمایشگر OLED در تصویر زیر نشان داده شده است.

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

  • GND: این پایه، اتصال زمین ماژول را تامین میکند و باید به پایه GND میکروکنترلر ESP32 Devkit متصل شود.
  • VCC: این پایه، تغذیه ماژول را تامین میکند و باید به پایه 3.3 ولت ESP32 Devkit وصل شود.
  • SCL: این پایه، پایه کلاک سریال است. این پایه برای تامین کلاک پالس ارتباط I2C استفاده میشود.
  • SDA: این پایه، پایه داده سریال است. این پایه برای انتقال داده از طریق ارتباط I2C استفاده میشود.

در نظر داشته باشید که ممکن است محل قرارگیری بعضی از پایه های ماژول شما با این ماژول متفاوت باشد. پس همیشه پیش از اینکه اتصالات را انجام دهید، نام های نوشته شده روی ماژول را چک کنید. بعضی از ماژول ها، روی بورد خود یک رگولاتور ولتاژ 3.3 ولت داشته و بعضی دیگر این رگولاتور را روی بورد خود ندارند. اگر ماژول شما این رگولاتور را ندارد، میتوانید از آن تنها برای کار با دستگاه های 3.3 ولتی استفاده کنید. در غیر این صورت، ممکن است به آن آسیب برسانید. اما اگر ماژول شما این رگولاتور را روی بورد خود دارد، (با علامت  622K) میتوانید از آن برای کار با دستگاه های 5 ولتی هم استفاده کنید.

اجزای ماژول OLED

تصویر زیر، قطعات موجود روی PCB ماژول نمایشگر OLED را نشان میدهد.

اجزای ماژول OLED

رگولاتور ولتاژ XC6206P332، ولتاژ ورودی را تا 3.3 ولت کاهش میدهد. وجود این رگولاتور ولتاژ باعث میشود که بتوانیم ماژول OLED را حتی به میکروکنترلرها یا مدارهای 5 ولت هم وصل کنیم.

همچنین میتوانیم با تغییر موقعیت مقاومت انتخابگر آدرس، آدرس I2C ماژول OLED را تنظیم کنیم. آدرس پیش فرض، 0x78 است. (0x3C در 7 بیت) و میتواند به 0x7A ( 0*3D در 7 بیت) تغییر کند.

مدار داخلی ماژول 0.96 اینچی OLED

شماتیک مدار ماژول OLED در تصویر زیر نشان داده شده است. این مدار با حداقل قطعات ساخته شده است.

مدار اتصال ماژول 0.96 اینچی OLED

همانگونه که مشاهده میکنید، بورد از تعداد کمی قطعه تشکیل شده است. اغلب این قطعات هم مقاومت ها و خازن های بسیار ارزان برای کنترل کننده نمایشگر SSD1306 درپنل OLED هستند.

دیگر قطعات شامل یک رگولاتور ولتاژ 3.3 ولت (XC6206P332)، مقاومت های پول آپ برای ریل I2C و مقاومت انتخابگر آدرس هستند.

سوالات متداول درباره ماژول OLED

1-ماژول نمایشگر OLED چیست؟

OLED یک دیود نورگسیل ارگانیک است. نمایشگر OLED یک تکنولوژی خود نورگسیل است که از یک فیلم ارگانیک بسیار نازک چندلایه که بین یک آند و کاتد قرار گرفته، تشکیل شده است. برخلاف تکنولوژی LCD، OLED نیازی به نور پس زمینه ندارد.

2-کدام راه انداز یا کنترل کننده نمایشگر در ماژول OLED استفاده شده است؟

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

SSD1306 و SH1106 متداول ترین دایورهای نمایشگری هستند که در ماژول OLED کوچک استفاده میشوند.

3-ماژول های OLED از کدام پروتکل استفاده میکنند؟

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

4-نمایشگر OLED معمولا در کدام اندازه و رزولوشن بیشتر کاربرد دارند؟

اگرچه نمایشگرهای OLED در اندازه ها و رزولوشن های متفاوتی وجود دارند اما پراستفاده ترین آن ها، ماژول های 0.96 و 1.3 اینچی با رزولوشن 64*128 هستند. ماژول هایی با رزولوشن 32*128 هم در بین جامعه DIY معروف و پرکاربرد هستند.

مدار اتصال ماژول OLED به ESP32

در تصویر زیر، نحوه اتصال ماژول OLED به ESP32 Devkit را مشاهده میکنید.

مدار اتصال ماژول OLED به ESP32

از آنجایی که ما از ماژول OLED با پروتکل I2C استفاده میکنیم، تنها باید 4 اتصال انجام دهیم. پایه های VCC و GND ماژول به ترتیب به پایه 3.3 ولت و GND میکروکنترلر ESP32 متصل میشوند. پایه SCL به پایه GPIO22 و پایه SDA هم به پایه GPIO21  وصل میشود.

مدار اتصال ماژول OLED به ESP32

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

حال که اتصالات لازم را انجام دادیم، بیایید نگاهی به قسمت کدنویسی این پروژه بیندازیم. برای راحتی کار، باید دو کتابخانه Adafruit SSD1306 و Adafruit GFX را نصب کنیم. برای اینکار در IDE آردوینو ابتدا به منوی Sketch رفته، سپس در Include Library قسمت Manage Libraries را انتخاب کنید. اندکی صبر کنید تا Library manager  ایندکس کتابخانه ها را دانلود کرده و لیست کتابخانه های نصب شده را به روز کند. سپس کتابخانه موردنظر را جست و جو کرده و آن را نصب کنید.

تست نمایشگر OLED

برای تست نمایشگر OLED و مطمئن شدن از اینکه ماژول به درستی کار میکند، ابتدا اتصالات را مانند مداری که قرار داده ایم، انجام دهید. پس انجام اتصالات، کد نمونه را با رفتن به منو File، بخش Examples و با انتخاب کتابخانه Adafruit SSD1306 و سپس مثال ssd1306_128*64_i2c انتخاب کنید. پس از باز کردن نمونه کد، آدرس OLED را به 0x3C تغییر دهید. سپس کد را کامپایل کرده و آن را روی ESP32 آپلود کنید. نتیجه این مرحله مانند تصویر زیر میشود.

تست نمایشگر OLED

کد آردوینو برای گرافیک و متن ساده

برای آموزش کاربردهای ساده این نمایشگر، کد زیر را کپی کرده و آن را در IDE آردوینو پیست کنید. سپس آن را روی ESP32 آپلود کنید. نتیجه مانند گیف زیر میشود.

#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)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino resetpin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup()
{
  Serial.begin(115200);
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }
  // 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(1);
  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(4500);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x07);
  delay(4500);
  display.stopscroll();
  delay(1000);
  display.startscrolldiagright(0x00, 0x07);
  delay(4500);
  display.startscrolldiagleft(0x00, 0x07);
  delay(4500);
  display.stopscroll();
  display.clearDisplay();
  //draw rectangle
  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();
  //draw filled rectangle
  display.setCursor(0, 0);
  display.println("Filled Rectangle");
  display.fillRect(0, 15, 60, 40, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();
  //draw rectangle with rounded corners
  display.setCursor(0, 0);
  display.println("Round Rectangle");
  display.drawRoundRect(0, 15, 60, 40, 8, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();
  //draw filled rectangle with rounded corners
  display.setCursor(0, 0);
  display.println("Filled Round Rectangle");
  display.fillRoundRect(0, 15, 60, 40, 8, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();
  //draw circle
  display.setCursor(0, 0);
  display.println("Circle");
  display.drawCircle(20, 35, 20, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();
  //draw filled circle
  display.setCursor(0, 0);
  display.println("Filled Circle");
  display.fillCircle(20, 35, 20, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();
  //draw triangle
  display.setCursor(0, 0);
  display.println("Triangle");
  display.drawTriangle(30, 15, 0, 60, 60, 60, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();
  //draw filled triangle
  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() {}

حال بیایید نگاهی به کد بیندازیم. طبق معمول در ابتدای کار، باید تمام کتابخانه های لازم را فراخوانی کرده و تمام متغیرهای سراسری را تعریف کنیم.

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

در قسمت بالا، کتابخانه Wire.h را فراخوانی کرده ایم. زیرا میخواهیم از پروتکل I2C استفاده کنیم. همچنین کتابخانه های Adafruit را برای ارتباطات ضروری فراخوانی کردیم.

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

در قسمت بالا رزولوشن صفحه نمایش را با SCREEN_WIDTH و SCREEN_HEIGHT تعریف کرده ایم، از آنجایی که از پایه ریست استفاده نمیکنیم، مقدار آن را 1- گذاشتیم تا کتابخانه دچار مشکل نشود. سپس آدرس OLED را به 0x3C تغییر دادیم. این آدرس را براساس ماژولی که از آن استفاده میکنید، جاگذاری کنید. اگر از آدرس ماژول خود مطمئن نیستید، میتوانید از نمونه کد I2C scanner برای تشخیص آدرس I2C ماژول استفاده کنید.

سپس، یک نمونه به نام display  ساختیم که در طول کد استفاده میشود. ما از این نمونه برای دسترسی به تمام ویژگی های کتابخانه Adafruit GFX استفاده میکنیم.

void setup()  
{               
  Serial.begin(115200);
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }
  // Clear the buffer.
  display.clearDisplay();

در ابتدای تابع ()setup، ارتباط سریال و کتابخانه Adafruit GFX را شروع کردیم. سپس به کمک تابع ()clearDisplay، بافر نمایشگر را پاک کردیم. با اینکار اگر نمایشگر قبلا ریست نشده باشد، تمام داده موجود روی صفحه آن را پاک میکنیم. در طول کد برای پاک کردن صفحه نمایشگر از این تابع بارها استفاده خواهیم کرد. حال بیایید نگاهی به کد هر قسمت و توابع و کاربرد آن ها بیندازیم.

نمایش متن

نمایش متن

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

با استفاده از قطعه کد بالا، عبارت !Hello World را روی نمایشگر چاپ میکنیم. پس از چاپ متن، چند تابع دیگر را فراخوانی کردیم. تابع display.setTextSize(Size) اندازه متن و تابع display.setTextColor(Colour) رنگ متن را به سفید تنظیم میکند و در نهایت تابع display.setCursor(x,y) هم کرسور را به مختصات x  و y ای که به آن داده ایم، میبرد. پس از فراخوانی تابع print، تابع ()display.display را فراخوانی میکنیم که به کنترل کننده نمایشگر میگوید که محتویات بافر را روی صفحه نمایش، نشان دهد. اگر این تابع را فراخوانی نکنیم، آنچه که به بافر منتقل شده است، نمایش داده نمیشود.

نمایش متن معکوس

نمایش متن معکوس

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

در این بخش، از تابع ()setTextcolor  برای مشخص کردن رنگ متن و همچنین رنگ زمینه متن استفاده کردیم. کدی که به شکل بالا نوشته شده، متن را به رنگ مشکی و زمینه اش را به رنگ سفید چاپ خواهد کرد.

افزایش اندازه متن

تست نمایشگر OLED

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

در این بخش از کد، نشان میدهیم که چگونه سایز و اندازه متن را بزرگ کنیم. همانطور که مشاهده میکنید، با افزایش مقداری که به ورودی تابع setTextSize داده ایم، متن دو برابر بزرگتر شده است.

نمایش اعداد

نمایش اعداد

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

نمایش اعداد به نمایش متن شباهت دارد. میتوانیم از تابع ()print یا ()println برای چاپ کردن عدد روی نمایشگر استفاده کنیم.

نمایش عدد در یک مبنا یا پایه

نمایش عدد در یک مبنا یا پایه

// 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();

این بخش از کد به شما کمک میکند تا هر عدد را همانگونه که هست چاپ کنید. برای مثال اگر میخواهید یک مقدار hex را چاپ کنید ( یک عدد در مبنای 16)، میتوانید اینکار را تنها با ذکر پایه یا مبنای عدد درون تابع ()print یا ()println مطابق نمونه زیر انجام دهید.

Print(value,base)

نمایش گلیف یا کاراکترهای ASCII

نمایش گلیف یا کاراکترهای ASCII

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

فایل های فونت تنها شامل کاراکترهای الفبایی نیستند بلکه سمبل های کوچک و کاراکترهای گرافیکی را هم در خود جای میدهند. برای نمایش آن ها میتوان از تابع write استفاده کرد. با نوشتن کد ASCII هر کاراکتر، میتوانیم آن را در فایل فونت خود نشان دهیم. در مثال بالا، ما یک smiley face را با کد اسکی 0x01 چاپ کرده ایم.

در تصویر زیر میتوانیم جدول کاراکترهای اسکی را برای فونت پیش فرض کتابخانه Adafruit GFX ببینیم. شما میتوانید از فایل های فونت خود استفاده کنید که احتمالا آن ها هم از گیلف های مختلف با کدهای اسکی متفاوت تشکیل شده اند.

جدول کاراکتر های اسکی

اسکرول کردن یا پیمایش صفحه

اسکرول کردن یا پیمایش صفحه

// 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(4500);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x07);
  delay(4500);
  display.stopscroll();
  delay(1000);
  display.startscrolldiagright(0x00, 0x07);
  delay(4500);
  display.startscrolldiagleft(0x00, 0x07);
  delay(4500);
  display.stopscroll();
  display.clearDisplay();

دقیقا مانند LCD های کاراکتری، میتوانیم با استفاده از کتابخانه Adafruit GFX یک متن یا حتی کل صفحه نمایشگر را اسکرول کنیم. توابع ()startscrollright و ()startscrollleft به ترتیب صفحه نمایشگر را به سمت راست و چپ اسکرول میکنند. پارامترهای این توابع شماره صفحه ابتدایی و انتهایی است. برای مثال، مقادیری که در حال حاضر در کد وجود دارند، 8 صفحه را به طور کامل اسکرول میکنند.

رسم مستطیل

رسم مستطیل

//draw rectangle
  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();

این تابع ساده است. شما تنها باید مختصات گوشه بالایی سمت چپ، عرض، طول و رنگ مستطیل را مطابق الگو زیر به تابع بدهید.

drawRect(x,y,width,height,colour)

رسم مستطیل توپر

رسم مستطیل توپر

 //draw filled rectangle
  display.setCursor(0, 0);
  display.println("Filled Rectangle");
  display.fillRect(0, 15, 60, 40, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

این تابع، به تابع drawRect شباهت دارد. تنها تفاوت آن ها در این است که تابع fillRect یک مستطیل توپر رسم میکند. شما در اینجا هم باید مختصات گوشه بالایی سمت چپ، عرض، طول و رنگ مستطیل را مطابق الگو زیر به تابع بدهید.

fillRect(x,y,width,height,colour)

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

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

//draw rectangle with rounded corners
  display.setCursor(0, 0)
  display.println("Round Rectangle");
  display.drawRoundRect(0, 15, 60, 40, 8, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

این تابع هم به تابع drawRect شباهت دارد. در اینجا باید مختصات گوشه بالایی سمت چپ، عرض، طول، شعاع گوشه و رنگ مستطیل را مطابق الگو زیر به تابع بدهید.

drawRoundRect(x,y,width,height,radius,colour)

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

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

 //draw filled rectangle with rounded corners
  display.setCursor(0, 0);
  display.println("Filled Round Rectangle");
  display.fillRoundRect(0, 15, 60, 40, 8, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

این تابع، به تابع drawRoundRect شباهت دارد و تنها تفاوت آن ها در این است که تابع fillRoundRect یک مستطیل توپر با گوشه های گرد رسم میکند. تنها کافی است که مختصات گوشه بالایی چپ، عرض، طول، شعاع گوشه و رنگ مستطیل را مطابق الگو زیر به تابع بدهید.

fillRoundRect(x,y,width,height,radius,colour)

رسم دایره

رسم دایره

//draw circle
  display.setCursor(0, 0);
  display.println("Circle");
  display.drawCircle(20, 35, 20, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

برای رسم دایره از تابع drawCircle استفاده میکنیم. این تابع به سه پارامتر یا ورودی نیاز دارد. x و y که مختصات مرکز دایره هستند و شعاع دایره. فرمت این تابع به شکل زیر است:

drawCircle(x,y,radius)

رسم دایره توپر

رسم دایره توپر

//draw filled circle
  display.setCursor(0, 0);
  display.println("Filled Circle");
  display.fillCircle(20, 35, 20, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

برای رسم یک دایره توپر، از تابع fillCircle استفاده میکنیم. این تابع هم به سه پارامتر نیاز دارد. x  و y که مختصات مرکز دایره هستند و شعاع دایره. فرمت این تابع به شکل زیر است:

fillCircle(x,y,Radius)

رسم مثلث

رسم مثلث

//draw triangle
  display.setCursor(0, 0);
  display.println("Triangle");
  display.drawTriangle(30, 15, 0, 60, 60, 60, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

برای رسم مثلث از تابع ()drawTriangle که 7 پارامتر میپذیرد استفاده میکنیم. این پارامترها x و y های سه گوشه مثلث و رنگ مثلث هستند. فرمت این تابع هم به شکل زیر است:

drawTriangle(x1,y1,x2,y2,x3,y3,Colour)

رسم مثلث توپر

رسم مثلث توپر

//draw filled triangle
  display.setCursor(0, 0);
  display.println("Filled Triangle");
  display.fillTriangle(30, 15, 0, 60, 60, 60, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

مشابه تابع drawTriangle تابع fillTriangle هم 7 ورودی میپذیرد. x و y هایی که مختصات سه گوشه مثلث را تعیین میکنند و رنگ مثلث. فرمت این تابع هم به شکل زیر است :

fillTriangle(x1,y1,x2,y2,x3,y3,Colour)

نمایش تصویر در نمایشگر OLED

برای نمایش یک عکس ابتدا باید مطمئن شویم که رزولوشن تصویر در محدوده سایز OLED است. برای مثال، ما باید تمامی عکس هایی را که میخواهیم روی نمایشگر نشان دهیم، به رزولوشن 64*128 پیکسل تغییر دهیم. سپس باید عکس را به یک آرایه از داده های HEX تبدیل کنیم تا بتوانیم این عکس را درون کد ذخیره کرده و هر وقت که به آن نیاز داریم، فراخوانی اش کنیم. برای انجام این مراحل، روش های متعددی وجود دارند اما من آسان ترین روش را به شما نشان خواهم داد. به سایت https://javl.github.io/image رفته و عکس خود را آپلود کنید.

نمایش تصویر در نمایشگر OLED

Canvas size را روی 64*128 تنظیم کنید. میتوانید با گزینه scaling اندازه تصویر را تغییر دهید. تا زمانی که از نتیجه کار راضی نیستید، به تغییرات و تنظیمات ادامه دهید. پس از اینکه تمام تغییرات لازم را انجام دادید، کد آردوینو را به عنوان code output format انتخاب کرده و بر generate code کلیک کنید. آرایه حاوی داده تصویر شما در قسمت پایینی صفحه نشان داده خواهد شد. این کد را کپی کرده و در قسمت متغیر سراسری کد پیست کنید. سپس نام آرایه را در تابع drawBitmap(x,y,array_name,width,height,colour) وارد کنید. در قسمت پایین، کد کامل نمایش تصویر را مشاهده میکنید. برای نمایش تصویر دلخواهتان روی نمایشگر کافی است که آرایه تصویر را تغییر دهید و آرایه تصویر خود را در کد پیست کنید.

#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)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NUMFLAKES     10 // Number of snowflakes in the animation example
#define LOGO_HEIGHT   64
#define LOGO_WIDTH    128
// 'CD_new_Logo', 128x64px
static const unsigned char PROGMEM logo [] PROGMEM = {
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0xff, 0xcf, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xce, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xce, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xc6, 0x38, 0xff, 0xff, 0xff, 0xc0, 0x7c, 0x70, 0x03, 0xf8, 0x0f, 0x8f, 0xc7, 0x10, 0x00,
  0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0x80, 0x3c, 0x70, 0x01, 0xf0, 0x07, 0x8f, 0xc7, 0x10, 0x00,
  0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x0e, 0x1c, 0x71, 0xf1, 0xe1, 0xc3, 0x8f, 0xc7, 0x1f, 0x8f,
  0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfe, 0x1f, 0x1c, 0x71, 0xf0, 0xc3, 0xe3, 0x8f, 0xc7, 0x1f, 0x8f,
  0xf8, 0xff, 0xff, 0x8f, 0xff, 0xfe, 0x3f, 0xfc, 0x71, 0xf8, 0xc7, 0xff, 0x8f, 0xc7, 0x1f, 0x8f,
  0xf9, 0xc0, 0x00, 0xc7, 0xff, 0xfe, 0x3f, 0xfc, 0x71, 0xf1, 0xc7, 0xff, 0x8f, 0xc7, 0x1f, 0x8f,
  0xf1, 0x80, 0x00, 0x67, 0xff, 0xfe, 0x3f, 0xfc, 0x70, 0x01, 0xc7, 0xff, 0x8f, 0xc7, 0x1f, 0x8f,
  0xf1, 0x00, 0x00, 0x63, 0xff, 0xfe, 0x3f, 0xfc, 0x70, 0x03, 0xc7, 0xff, 0x8f, 0xc7, 0x1f, 0x8f,
  0x03, 0x0f, 0x80, 0x20, 0x7f, 0xfe, 0x3f, 0xfc, 0x70, 0x0f, 0xc7, 0xff, 0x8f, 0xc7, 0x1f, 0x8f,
  0x03, 0x1f, 0xc0, 0x20, 0x7f, 0xfe, 0x3f, 0xbc, 0x71, 0xc3, 0xc7, 0xf3, 0x8f, 0xc7, 0x1f, 0x8f,
  0xf3, 0x18, 0xe0, 0x23, 0xff, 0xfe, 0x3f, 0x1c, 0x71, 0xe3, 0xc3, 0xe3, 0x8f, 0xcf, 0x1f, 0x8f,
  0xf3, 0x18, 0xe0, 0x27, 0xff, 0xff, 0x0e, 0x1c, 0x71, 0xe1, 0xe1, 0xc3, 0xc7, 0x8f, 0x1f, 0x8f,
  0xf3, 0x39, 0xf8, 0x27, 0xff, 0xff, 0x00, 0x3c, 0x71, 0xf0, 0xf0, 0x07, 0xc0, 0x0f, 0x1f, 0x8f,
  0x03, 0x19, 0x8c, 0x20, 0x7f, 0xff, 0xc0, 0x7c, 0x71, 0xf8, 0xf8, 0x0f, 0xe0, 0x1f, 0x1f, 0x8f,
  0x03, 0x19, 0x84, 0x20, 0x7f, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xf8, 0x7f, 0xff, 0xff,
  0x03, 0x1d, 0x86, 0x20, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xf3, 0x0d, 0x86, 0x27, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff,
  0xf3, 0x01, 0x84, 0x27, 0xff, 0xfe, 0x03, 0xef, 0x80, 0xe0, 0x1e, 0x03, 0x00, 0x7f, 0xff, 0xff,
  0xf3, 0x01, 0x8c, 0x23, 0xff, 0xfe, 0xf9, 0xef, 0x3e, 0x67, 0xfc, 0xf3, 0xf7, 0xff, 0xff, 0xff,
  0x03, 0x01, 0xfc, 0x20, 0x7f, 0xfe, 0xfc, 0xee, 0x7e, 0x67, 0xfc, 0xfb, 0xf7, 0xff, 0xff, 0xff,
  0x03, 0x01, 0xf0, 0x20, 0x7f, 0xfe, 0xfe, 0xee, 0xff, 0xe7, 0xfc, 0xff, 0xf7, 0xff, 0xff, 0xff,
  0xf1, 0x00, 0x00, 0x63, 0xff, 0xfe, 0xfe, 0xee, 0xff, 0xe0, 0x1e, 0x0f, 0xf7, 0xff, 0xff, 0xff,
  0xf9, 0x80, 0x00, 0x67, 0xff, 0xfe, 0xfe, 0xee, 0xf0, 0x60, 0x1f, 0x83, 0xf7, 0xff, 0xff, 0xff,
  0xf9, 0xc0, 0x01, 0xc7, 0xff, 0xfe, 0xfe, 0xee, 0xf8, 0x67, 0xff, 0xf1, 0xf7, 0xff, 0xff, 0xff,
  0xf8, 0x7f, 0xff, 0x8f, 0xff, 0xfe, 0xfc, 0xee, 0x7f, 0x67, 0xfd, 0xf9, 0xf7, 0xff, 0xff, 0xff,
  0xfc, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0xfc, 0xee, 0x7e, 0x67, 0xfc, 0xf9, 0xf7, 0xff, 0xff, 0xff,
  0xff, 0x00, 0x00, 0x3f, 0xff, 0xfe, 0x71, 0xef, 0x1c, 0x67, 0xfc, 0x73, 0xf7, 0xff, 0xff, 0xff,
  0xff, 0xc6, 0x38, 0xff, 0xff, 0xfe, 0x03, 0xef, 0x81, 0xe0, 0x0f, 0x07, 0xf7, 0xff, 0xff, 0xff,
  0xff, 0xc6, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xce, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xce, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xcf, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void setup() {
  Serial.begin(115200);
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }
  // Clear the buffer
  display.clearDisplay();
  display.drawBitmap(0, 0, logo, LOGO_WIDTH,LOGO_HEIGHT,WHITE);
  display.display();
}
void loop()
 {
  delay(1);
}

نتیجه را در گیف پایین مشاهده میکنید.

موارد موجود در فایل : سورس کامل

 

3.3 (3 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

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

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