رباتیک و هوافضا

راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو

راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو

به نام خدا

راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو

راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو

 

اکثر ما به صفحه نمایش dot 2×16 آشنا هستیم، و در اکثر پروژه ها برای نمایش برخی از اطلاعات از آن استفاده میکنیم. صفحه نمایش LCD محدودیت های زیادی برای ما دارد. در این پروژه ما قصد داریم با نمایشگر OLED و نحوه استفاده ی آن در کنار آردوینو آشنا شویم. انواع مختلفی از صفحه نمایش های OLED در بازار موجود است، راه های زیادی هم برای کار با آن موجود است. در این آموزش ما در مورد طبقه بندی آن و این که کدام یک از آن ها برای پروژه ی شما مناسب است بحث خواهیم کرد.

قطعات مورد نیاز پروژه ی راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو:

  1. ماژول صفحه نمایش OLED ، ۷ پین ۶۴X128 (SSD1306)
  2. بورد Arduino UNO/Nano
  3. برد بورد
  4. سیم برای اتصال
  5. کامپیوتر یا لپ تاب

 

 اطلاعاتی در مورد صفحه نمایش OLED:

 

اصطلاح OLED به معنای “Organic Light emitting diode” (نور شیمیای خارج شده از دیود) وتکنولوژِی ساخت آن مشابه تکنولوژی ساخت تلویزیون های است که ما استفاده میکنیم ولی در مقایسه با آن ها تعداد پیکسل های کمتری دارد.

راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو

 

 

راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو

 

ما از صفحه نمایش ۷ پین SSD1306 0.96” OLED استفاده میکنیم .دلیل انتخاب آن این است که می تواند روی سه پروتکل ارتباطی مختلف مانند حالت سه گانه SPI ، حالت چهارگانه SPI و حالت CII کار کند. ما در این آموزش از حالت چهار گانه SPI استفاده کرده ایم، زیر سریع ترین حالت ارتباطی پیش فرض را دارد.

پین ها و نوع عملکرد آن ها در جدول زیر توضیح داده شده است.

 

Pin Number Pin Name Other Names Usage
۱ Gnd زمین پین زمین ماژول
۲ Vdd Vcc, 5V پین مثبت ماژول (مقدار قابل تحمل ۳-۵ ولت)
۳ SCK D0,SCL,CLK به عنوان پین CLOCK  و برای ارتباط I2C و SPI مورد استفاده قرار میگیرد
۴ SDA D1,MOSI پین داده ماژول است که برای ارتباط CII و SPI استفاده میشود
۵ RES RST,RESET ماژول را باز نشانی میکند (مفید در ارتباط SPI)
۶ DC A0 پین دستور داده ها ،مود استفاده در پروتکل SPI
۷ CS Chip Select وقتی بیش از یک ماژول مورد استفاده قرار میگیرد مفید است.

 

 

سخت افزار و اتصالات آن:

 

شکل مدار SSD1306 OLED برای ارتباط با آردوینو بسیار ساده است،در شکل زیر نشان داده شده است.

 

راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو

 

 

S.No پین های ماژول OLED پین های آردوینو
۱ Gnd, Ground زمین
۲ Vdd, Vcc, 5V ۵V
۳ SCK, D0,SCL,CLK ۱۰
۴ SDA, D1,MOSI ۹
۵ RES, RST,RESET ۱۳
۶ DC, A0 ۱۱
۷ CS, Chip Select ۱۲

 

توجه :تا اینجا شما تنها قادر خواهید بود که نور پس زمینه ی OLED را ببینید (OLED را روشن کنید). شما باید بورد را به درستی برنامه ریزی کنید تا بتوانید اطلاعات یا تغییرات دلخواه خود را روی صفحه نمایش OLED ببینید.

 

برنامه ی آردوینو برای صفحه نمایش SSD1306 OLED :

 

مرحله اول : کتابخانه های Adafruit SSD11306 وAdafruit GFX  را دانلود کنید.

کتابخانه Adafruit SSD11306

 

کتابخانه Adafruit GFX

 

 

بیشتر بخوانید...  پروژه ی ساخت موتور پمپ کنترلی با استفاده از آردوینو

مرحله دوم: باید فایل های zip دانلود شده را به نرم افزار آردوینوی خود اضافه کنید. از مسیر (Sketch->Include Library -> Add Zip library) برای این کار استفاده کنید. دوکتابخانه را به صورت جداگانه نصب کنید.

 

راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو

 

 

مرحله سوم : برنامه نمونه را از مسیر (File->Examples->Adafruit SSD1306 -> SSD1306_128*64_SPI.ino ) انتخاب کنید، همانطور که در تصویر زیر نشان داده شده است.

 

راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو

 

 

مرحله چهارم : داخل برنامه ی نمونه بالای خط ۶۴ام خط زیر را به برنامه اضافه کنید . همانطور که در تصویر زیر نشان داده شده است.

“#define SSD1306_LCDHEIGHT 64

 

راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو

 

مرحله پنجم: برنامه را آپلود کنید.

 

 

نمایش کارکتر های متغیر:

 

برای نمایش یه مقدار متغیر میتوانید از کد زیر استفاده کنید.

 

char i=5; //the variable to be displayed
  display.setTextSize(1);  //Select the size of the text
  display.setTextColor(WHITE);  //for monochrome display only whit is possible
  display.setCursor(0,0); //0,0 is the top left corner of the OLED screen
  display.write(i); //Write the variable to be displayed

 

رسم یک خط، دایره ، مستطیل و مثلث :

 

اگه میخواهید اشکالی را در صفحه نمایش خود نمایش دهید میتوانید از کد هایی که در زیر آمده استفاده کنید.

 

display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE);
//void drawLine( x0,  y0,  x1,  y1, color);

display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE);
//void drawRect( x0, y0,  w, h,  color);

display.drawTriangle(display.width()/2, display.height()/2-i,display.width()/2-i,display.height()/2+i,     display.width()/2+i, display.height()/2+i, WHITE);
//void drawTriangle( x0,  y0,  x1,  y1,  x2,  y2,  color);

display.drawCircle(display.width()/2, display.height()/2, i, WHITE);
//void drawCircle( x0,  y0,  r,  color);

 

نمایش یک ردیف در صفحه نمایش :

 

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

 

  display.setTextSize(2); //set the size of the text
  display.setTextColor(WHITE); //color setting
  display.setCursor(10,0); //The string will start at 10,0 (x,y)
  display.clearDisplay(); //Eraser any previous display on the screen
  display.println("Circuit Digest"); //Print the string here “Circuit Digest”
  display.display(); //send the text to the screen

 

 

 

دانلود کد :

دانلود فایل

کد:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// If using software SPI (the default case):
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
/* Uncomment this block to use hardware SPI
#define OLED_DC     6
#define OLED_CS     7
#define OLED_RESET  8
Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);
*/
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16 
#define LOGO16_GLCD_WIDTH  16 
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };
#define SSD1306_LCDHEIGHT 64
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup()   {                
  Serial.begin(9600);
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC);
  // init done
  
  // Show image buffer on the display hardware.
  // Since the buffer is intialized with an Adafruit splashscreen
  // internally, this will display the splashscreen.
  display.display();
  delay(2000);
  // Clear the buffer.
  display.clearDisplay();
  // draw a single pixel
  display.drawPixel(10, 10, WHITE);
  // Show the display buffer on the hardware.
  // NOTE: You _must_ call display after making any drawing commands
  // to make them visible on the display hardware!
  display.display();
  delay(2000);
  display.clearDisplay();
  // draw many lines
  testdrawline();
  display.display();
  delay(2000);
  display.clearDisplay();
  // draw rectangles
  testdrawrect();
  display.display();
  delay(2000);
  display.clearDisplay();
  // draw multiple rectangles
  testfillrect();
  display.display();
  delay(2000);
  display.clearDisplay();
  // draw mulitple circles
  testdrawcircle();
  display.display();
  delay(2000);
  display.clearDisplay();
  // draw a white circle, 10 pixel radius
  display.fillCircle(display.width()/2, display.height()/2, 10, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();
  testdrawroundrect();
  delay(2000);
  display.clearDisplay();
  testfillroundrect();
  delay(2000);
  display.clearDisplay();
  testdrawtriangle();
  delay(2000);
  display.clearDisplay();
   
  testfilltriangle();
  delay(2000);
  display.clearDisplay();
  // draw the first ~12 characters in the font
  testdrawchar();
  display.display();
  delay(2000);
  display.clearDisplay();
  // draw scrolling text
  testscrolltext();
  delay(2000);
  display.clearDisplay();
  // text display tests
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Hello, world!");
  display.setTextColor(BLACK, WHITE); // 'inverted' text
  display.println(3.141592);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("0x"); display.println(0xDEADBEEF, HEX);
  display.display();
  delay(2000);
  display.clearDisplay();
  // miniature bitmap display
  display.drawBitmap(30, 16,  logo16_glcd_bmp, 16, 16, 1);
  display.display();
  // invert the display
  display.invertDisplay(true);
  delay(1000); 
  display.invertDisplay(false);
  delay(1000); 
  display.clearDisplay();
  // draw a bitmap icon and 'animate' movement
  testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
}
void loop() {
}
void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  uint8_t icons[NUMFLAKES][3];
 
  // initialize
  for (uint8_t f=0; f< NUMFLAKES; f++) {
    icons[f][XPOS] = random(display.width());
    icons[f][YPOS] = 0;
    icons[f][DELTAY] = random(5) + 1;
    
    Serial.print("x: ");
    Serial.print(icons[f][XPOS], DEC);
    Serial.print(" y: ");
    Serial.print(icons[f][YPOS], DEC);
    Serial.print(" dy: ");
    Serial.println(icons[f][DELTAY], DEC);
  }
  while (1) {
    // draw each icon
    for (uint8_t f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE);
    }
    display.display();
    delay(200);
    
    // then erase it + move it
    for (uint8_t f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK);
      // move it
      icons[f][YPOS] += icons[f][DELTAY];
      // if its gone, reinit
      if (icons[f][YPOS] > display.height()) {
        icons[f][XPOS] = random(display.width());
        icons[f][YPOS] = 0;
        icons[f][DELTAY] = random(5) + 1;
      }
    }
   }
}
void testdrawchar(void) {
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  for (uint8_t i=0; i < 168; i++) {
    if (i == '\n') continue;
    display.write(i);
    if ((i > 0) && (i % 21 == 0))
      display.println();
  }    
  display.display();
}
void testdrawcircle(void) {
  for (int16_t i=0; i<display.height(); i+=2) {
    display.drawCircle(display.width()/2, display.height()/2, i, WHITE);
    display.display();
  }
}
void testfillrect(void) {
  uint8_t color = 1;
  for (int16_t i=0; i<display.height()/2; i+=3) {
    // alternate colors
    display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
    display.display();
    color++;
  }
}
void testdrawtriangle(void) {
  for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) {
    display.drawTriangle(display.width()/2, display.height()/2-i,
                     display.width()/2-i, display.height()/2+i,
                     display.width()/2+i, display.height()/2+i, WHITE);
    display.display();
  }
}
void testfilltriangle(void) {
  uint8_t color = WHITE;
  for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) {
    display.fillTriangle(display.width()/2, display.height()/2-i,
                     display.width()/2-i, display.height()/2+i,
                     display.width()/2+i, display.height()/2+i, WHITE);
    if (color == WHITE) color = BLACK;
    else color = WHITE;
    display.display();
  }
}
void testdrawroundrect(void) {
  for (int16_t i=0; i<display.height()/2-2; i+=2) {
    display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, WHITE);
    display.display();
  }
}
void testfillroundrect(void) {
  uint8_t color = WHITE;
  for (int16_t i=0; i<display.height()/2-2; i+=2) {
    display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color);
    if (color == WHITE) color = BLACK;
    else color = WHITE;
    display.display();
  }
}
   
void testdrawrect(void) {
  for (int16_t i=0; i<display.height()/2; i+=2) {
    display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE);
    display.display();
  }
}
void testdrawline() {  
  for (int16_t i=0; i<display.width(); i+=4) {
    display.drawLine(0, 0, i, display.height()-1, WHITE);
    display.display();
  }
  for (int16_t i=0; i<display.height(); i+=4) {
    display.drawLine(0, 0, display.width()-1, i, WHITE);
    display.display();
  }
  delay(250);
  
  display.clearDisplay();
  for (int16_t i=0; i<display.width(); i+=4) {
    display.drawLine(0, display.height()-1, i, 0, WHITE);
    display.display();
  }
  for (int16_t i=display.height()-1; i>=0; i-=4) {
    display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
    display.display();
  }
  delay(250);
  
  display.clearDisplay();
  for (int16_t i=display.width()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
    display.display();
  }
  for (int16_t i=display.height()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
    display.display();
  }
  delay(250);
  display.clearDisplay();
  for (int16_t i=0; i<display.height(); i+=4) {
    display.drawLine(display.width()-1, 0, 0, i, WHITE);
    display.display();
  }
  for (int16_t i=0; i<display.width(); i+=4) {
    display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE); 
    display.display();
  }
  delay(250);
}
void testscrolltext(void) {
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(10,0);
  display.clearDisplay();
  display.println("scroll");
  display.display();
 
  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();
}

 

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

 

دیدگاه‌ها (0)

*
*