به نام خدا
راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو
اکثر ما به صفحه نمایش dot 2×16 آشنا هستیم، و در اکثر پروژه ها برای نمایش برخی از اطلاعات از آن استفاده میکنیم. صفحه نمایش LCD محدودیت های زیادی برای ما دارد. در این پروژه ما قصد داریم با نمایشگر OLED و نحوه استفاده ی آن در کنار آردوینو آشنا شویم. انواع مختلفی از صفحه نمایش های OLED در بازار موجود است، راه های زیادی هم برای کار با آن موجود است. در این آموزش ما در مورد طبقه بندی آن و این که کدام یک از آن ها برای پروژه ی شما مناسب است بحث خواهیم کرد.
قطعات مورد نیاز پروژه ی راه اندازی صفحه نمایش OLED SSD1306 با استفاده از آردوینو:
- ماژول صفحه نمایش OLED ، ۷ پین ۶۴X128 (SSD1306)
- بورد Arduino UNO/Nano
- برد بورد
- سیم برای اتصال
- کامپیوتر یا لپ تاب
اطلاعاتی در مورد صفحه نمایش OLED:
اصطلاح OLED به معنای “Organic Light emitting diode” (نور شیمیای خارج شده از دیود) وتکنولوژِی ساخت آن مشابه تکنولوژی ساخت تلویزیون های است که ما استفاده میکنیم ولی در مقایسه با آن ها تعداد پیکسل های کمتری دارد.
ما از صفحه نمایش ۷ پین 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 برای ارتباط با آردوینو بسیار ساده است،در شکل زیر نشان داده شده است.
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) برای این کار استفاده کنید. دوکتابخانه را به صورت جداگانه نصب کنید.
مرحله سوم : برنامه نمونه را از مسیر (File->Examples->Adafruit SSD1306 -> SSD1306_128*64_SPI.ino ) انتخاب کنید، همانطور که در تصویر زیر نشان داده شده است.
مرحله چهارم : داخل برنامه ی نمونه بالای خط ۶۴ام خط زیر را به برنامه اضافه کنید . همانطور که در تصویر زیر نشان داده شده است.
“#define SSD1306_LCDHEIGHT 64”
مرحله پنجم: برنامه را آپلود کنید.
نمایش کارکتر های متغیر:
برای نمایش یه مقدار متغیر میتوانید از کد زیر استفاده کنید.
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)