آردوینوپروژه آردوینو
موضوعات داغ

آموزش جامع راه‌اندازی ماژول نمایشگر OLED با آردوینو

مقدمه

سلام به همه عاشقان علم ودانش ، امروز با شما هستیم تا با یک پروژه عالی ، دانش و تجربه شما را در زمینه الکترونیک و آردوینو بالا ببریم پروژه ای که امروز برای شما آماده نموده‌ایم با عنوان ” راه‌اندازی نمایشگر OLED با آردوینو ” می باشد . ماژول نمایشگر OLED یا همان LCD کاراکتری نمایشگری می باشد که با پروتکل I2C کار می نماید ، این مقاله نحوه استفاده از نمایشگر OLED SSD1306 0.96 اینچ با سریال I2C به وسیله ی آردوینو را نشان می دهد. ما برخی از ویژگی های صفحه نمایش OLED ، نحوه اتصال آن به صفحه Arduino و نحوه نوشتن متن ، رسم اشکال و نمایش تصاویر bitmap را در این پست به شما نشان خواهیم داد. در آخر ، ما یک نمونه پروژه خواهیم ساخت که قرائت دما و رطوبت را نشان می دهد .

مشخصات فنی ماژول نمایشگر OLED

یک صفحه نمایش تک رنگ ، ۰.۹۶ اینچی با ۱۲۸ × ۶۴ پیکسل

مدل OSD SSD1306 I2C

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

مدلی که ما در اینجا استفاده می کنیم فقط چهار پایه دارد و با استفاده از پروتکل ارتباطی I2C با Arduino ارتباط برقرار می کند. مدل هایی وجود دارند که دارای یک پین RESET اضافی هستند. نمایشگرهای OLED دیگری نیز وجود دارند که با استفاده از ارتباطات SPI ارتباط برقرار می کنند.

مرحله اول تامین قطعات مورد نیاز

مرحله دوم بستن مدار

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

  • GND به GND ( سیم سیاه )
  • VCC به ۵v ( سیم قرمز )
  • SCL به A5 در برد های UNO و NANO ( سیم سفید )
  • SCL به ۲۱ در برد های MEGA و Leonardo ( سیم سفید )
  • SDA به A4 در برد های UNO و NANO ( سیم زرد )
  • SDA به ۲۰ در برد های MEGA و Leonardo ( سیم زرد )
اتصالات ماژول نمایشگر OLED به آردوینو مدار و سیم بندی
اتصالات ماژول OLED به آردوینو

اضافه نمودن کتابخانه ماژول نمایشگر OLED

برای کنترل نمایشگر OLED به کتابخانه های adafruit_SSD1306.h و adafruit_GFX.h احتیاج هست . برای نصب کتابخانه های نامبرده ، ۴ دستور العمل زیر را به ترتیب انجام دهید .

  1. Arduino IDE خود را باز کرده و به Sketch> Include Library> Manage Libraries بروید. مدیر کتابخانه باید باز شود. منظور از مدیر کتابخانه همان LIBRARY MANAGER می‌باشد .
  2. “SSD1306” را در کادر جستجو تایپ کنید و کتابخانه SSD1306 را از Adafruit نصب نمایید .

نصب کتابخانه ی adafruit_SSD1306.h به وسیله ی Library Manager
نصب کتابخانه ی adafruit_SSD1306.h

۳. حالا بعد از نصب adafruit_SSD1306.h نوبت نصب کتابخانه ی adafruit_GFX.h رسیده است ، در جعبه جستجو واژه ی “GFX” را تایپ نموده و کتابخانه را نصب نمایید .

نصب کتابخانه ی adafruit_GFX.h  به وسیله ی Library Manager
نصب کتابخانه ی adafruit_GFX.h

۴. پس از نصب کتابخانه ها ، Arduino IDE خود را ریست نمایید .

نکات مهم کد نویسی کتابخانه ها

در اینجا برخی کد توابع آورده شده است که به شما کمک می‌نماید تا نمایشگر OLED خود را برای نوشتن متن یا نشان دادن رسم گرافیک ساده پیکر‌بندی نمایید .

display.clearDisplay() // همه پیکسل ها را خاموش می نماید
display.drawPixel(x,y, color) // رسم می‌نماید x و y یک پیکسل را در مختصات 
display.setTextSize(n) // اندازه فونت را میتوانیم مشخص نماییم ( ۱ تا ۸ ) 
display.setCursor(x,y) // x و y شروع نوشتن متن در مختصات 
display.print(“message”) //نوشتن متن دلخواه 
display.display() // این تابع را برای نمایش تغییرات بر روی نمایشگر فراخوانی می نماییم

تست ماژول نمایشگر OLED

پس از سیم کشی نمایشگر OLED به Arduino و نصب همه کتابخانه های مورد نیاز ، می توانید از یک نمونه کتابخانه استفاده نمایید تا ببینید آیا همه چیز درست است یا خیر .

در Arduino IDE خود ، به File> Examples> Adafruit SSD1306 بروید و نمونه کد نمایشگر مورد استفاده خود را انتخاب کنید .

انتخاب نمونه کد ماژول نمایشگر OLED در IDE آردوینو انتخاب درایور SSD 1306
انتخاب نمونه کد ماژول نمایشگر OLED در IDE آردوینو

مرحله سوم کد نویسی پروژه

کد هایی که در ابتدا بایستی لود شوند .

/*********
این یک مثال برای راه اندازی نمایشگر های بر پای اولد می باشد برای آموزش های بیشتر به سایت
datosrobo.com
. مراجعه نمایید . امید‌وارم که این آموزش به کارتان بیاید  
*********/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // عرض نمایشگر اولد به پیکسل 
#define SCREEN_HEIGHT 64 // طول نمایشگر اولد به پیکسل
 
#define OLED_RESET     -1 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define NUMFLAKES     10 

#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16
static const unsigned char PROGMEM logo_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 };

void setup() {
  Serial.begin(115200);

  
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }


  display.display();
  delay(2000); // تاخیر برای ۲ ثانیه

  display.clearDisplay();


  display.drawPixel(10, 10, WHITE);

 
  display.display();
  delay(2000);
  // display.display() این تابع که کارش نشون دادن پیکسل شما روی نمایشگر است  را لازم نیست بعد از هر بار دادن مختصات پیکسل فراخوانی نمایید ، در انتهای کار برای جلوگیری از تکرار می توان با یک بار فراخوانی همه پیکسل ها را نمایش داد

  testdrawline();      // ایجاد خط

  testdrawrect();      // ایجاد چهارگوش های گوشه تیز تو خالی

  testfillrect();      // ایجاد چهارگوش های گوشه تیز تو پر

  testdrawcircle();    // ایجاد دایره های تو خالی

  testfillcircle();    // ایجاد دایره های تو پر

  testdrawroundrect(); // ایجاد چهارگوش های گوشه گرد تو خالی

  testfillroundrect(); // ایجاد چهارگوش های گوشه گرد تو پر

  testdrawtriangle();  // ایجاد مثلل های تو خالی

  testfilltriangle();  // ایجاد مثلث های تو پر

  testdrawchar();      // ایجاد یک کاراکتر با فونت ثبت شده

  testdrawstyles();    // ایجاد یک کاراکتر سبک سازی شده

  testscrolltext();    // یک متن چرخان در صفحه ایجاد نمایید

  testdrawbitmap();    // یک عکس به فرمت بیت مپ میتوانید رسم نمایید

  // !!! معکوس نمودن صفحه نمایشگر همراه با تاخیر که واقعا خیلی کاربردیه
  display.invertDisplay(true);
  delay(1000);
  display.invertDisplay(false);
  delay(1000);

  testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // متحرک نمودن تصاویر بیت مپ
}

void loop() {
}

void testdrawline() {
  int16_t i;

  display.clearDisplay(); // پاک نمودن بافر نمایشگر

  for(i=0; i<display.width(); i+=4) {
    display.drawLine(0, 0, i, display.height()-1, WHITE);
    display.display(); // بروزرسانی نمایشگر بعد از ایجاد هر خط
    delay(1);
  }
  for(i=0; i<display.height(); i+=4) {
    display.drawLine(0, 0, display.width()-1, i, WHITE);
    display.display();
    delay(1);
  }
  delay(250);

  display.clearDisplay();

  for(i=0; i<display.width(); i+=4) {
    display.drawLine(0, display.height()-1, i, 0, WHITE);
    display.display();
    delay(1);
  }
  for(i=display.height()-1; i>=۰; i-=4) {
    display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
    display.display();
    delay(1);
  }
  delay(250);

  display.clearDisplay();

  for(i=display.width()-1; i>=۰; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
    display.display();
    delay(1);
  }
  for(i=display.height()-1; i>=۰; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
    display.display();
    delay(1);
  }
  delay(250);

  display.clearDisplay();

  for(i=0; i<display.height(); i+=4) {
    display.drawLine(display.width()-1, 0, 0, i, WHITE);
    display.display();
    delay(1);
  }
  for(i=0; i<display.width(); i+=4) {
    display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE);
    display.display();
    delay(1);
  }

  delay(2000); // تاخیر برای ۲ ثانیه
}

void testdrawrect(void) {
  display.clearDisplay();

  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(); //  بروزرسانی نمایشگر بعد از ایجاد هر مستطیل
    delay(1);
  }

  delay(2000);
}

void testfillrect(void) {
  display.clearDisplay();

  for(int16_t i=0; i<display.height()/2; i+=3) {
    //تبدیل هر نقطه ی سیاه به سفید و هر نقطه ی سفید به سیاه در صفحه نمایشگر برای مستطیل ها  
    display.fillRect(i, i, display.width()-i*2, display.height()-i*2, INVERSE);
    display.display(); // بروزرسانی نمایشگر بعد از برعکس  نمودن رنگ ها
    delay(1);
  }

  delay(2000);
}

void testdrawcircle(void) {
  display.clearDisplay();

  for(int16_t i=0; i<max(display.width(),display.height())/2; i+=2) {
    display.drawCircle(display.width()/2, display.height()/2, i, WHITE);
    display.display();
    delay(1);
  }

  delay(2000);
}

void testfillcircle(void) {
  display.clearDisplay();

  for(int16_t i=max(display.width(),display.height())/2; i>۰; i-=3) {
    // تبدیل هر نقطه ی سیاه به سفید و هر نقطه ی سفید به سیاه در صفحه نمایشگر برای دایره ها
    display.fillCircle(display.width() / 2, display.height() / 2, i, INVERSE);
    display.display(); // بروزرسانی نمایشگر بعد از برعکس  نمودن رنگ ها
    delay(1);
  }

  delay(2000);
}

void testdrawroundrect(void) {
  display.clearDisplay();

  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();
    delay(1);
  }

  delay(2000);
}

void testfillroundrect(void) {
  display.clearDisplay();

  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, INVERSE);
    display.display();
    delay(1);
  }

  delay(2000);
}

void testdrawtriangle(void) {
  display.clearDisplay();

  for(int16_t i=0; i<max(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();
    delay(1);
  }

  delay(2000);
}

void testfilltriangle(void) {
  display.clearDisplay();

  for(int16_t i=max(display.width(),display.height())/2; i>۰; 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, INVERSE);
    display.display();
    delay(1);
  }

  delay(2000);
}

void testdrawchar(void) {
  display.clearDisplay();

  display.setTextSize(1);      // مقیاس ۱ به ۱ 
  display.setTextColor(WHITE); // ایجاد متن با رنگ سفید
  display.setCursor(0, 0);     // شروع از گوشه بالا سمت چپ
  display.cp437(true);         // می توانید از ۲۵۶ کاراکتر مختلف استفاده بنمایید (کد پیج ۴۳۷)

  
  for(int16_t i=0; i<256; i++) {
    if(i == '\n') display.write(' ');
    else          display.write(i);
  }

  display.display();
  delay(2000);
}

void testdrawstyles(void) {
  display.clearDisplay();

  display.setTextSize(1);             // مقیاس ۱ به ۱
  display.setTextColor(WHITE);        // ایجاد متن با رنگ سفید
  display.setCursor(0,0);             // شروع از گوشه بالا سمت چپ
  display.println(F("DatosRobo"));

  display.setTextColor(BLACK, WHITE); // !ایجاد نوشته ی با رنگ برعکس
  display.println(3.141592);

  display.setTextSize(2);             // مقیاس ۱به ۲
  display.setTextColor(WHITE);
  display.print(F("0x")); display.println(0xDEADBEEF, HEX);

  display.display();
  delay(2000);
}

void testscrolltext(void) {
  display.clearDisplay();

  display.setTextSize(2); // مقیاس ۱ به ۲
  display.setTextColor(WHITE);
  display.setCursor(10, 0);
  display.println(F("DATOSROBO"));
  display.display();      // نمایش نوشته ی اولیه
  delay(100);

  // پیمایش در جهات مختلف همراه با تاخیر
  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);
}

void testdrawbitmap(void) {
  display.clearDisplay();

  display.drawBitmap(
    (display.width()  - LOGO_WIDTH ) / 2,
    (display.height() - LOGO_HEIGHT) / 2,
    logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
  display.display();
  delay(1000);
}

#define XPOS   0 // برای ایندکس دو بعدی آرایه ی آیکون را در تابع زیر استفاده می شود
#define YPOS   1
#define DELTAY 2

void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  int8_t f, icons[NUMFLAKES][3];

  // Initialize 'snowflake' positions
  for(f=0; f< NUMFLAKES; f++) {
    icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
    icons[f][YPOS]   = -LOGO_HEIGHT;
    icons[f][DELTAY] = random(1, 6);
    Serial.print(F("x: "));
    Serial.print(icons[f][XPOS], DEC);
    Serial.print(F(" y: "));
    Serial.print(icons[f][YPOS], DEC);
    Serial.print(F(" dy: "));
    Serial.println(icons[f][DELTAY], DEC);
  }

  for(;;) { // Loop forever...
    display.clearDisplay();

    // Draw each snowflake:
    for(f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE);
    }

    display.display(); 
    delay(200);        

    // ! به روز نمودن مختصات هر پوسته ، خودم هم می دونم توضیح جالبی برای این کد نیست
    for(f=0; f< NUMFLAKES; f++) {
      icons[f][YPOS] += icons[f][DELTAY];
      // If snowflake is off the bottom of the screen...
      if (icons[f][YPOS] >= display.height()) {
        // Reinitialize to a random position, just off the top
        icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
        icons[f][YPOS]   = -LOGO_HEIGHT;
        icons[f][DELTAY] = random(1, 6);
      }
    }
  }
}

احیانا اگر نمایشگر اولد شما پین ریست ندارد ، بایستی کد زیر حذف نمایید .

#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)

 جایگاه و نشانی کد مربوط به ریست ماژول نمایشگر OLED
جایگاه و نشانی کد مورد نظر

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

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

عیب یابی !

چنان چه صفحه LCD کاراکتری شما چیزی را نشان نمی دهد ،

  1. اتصالات فیزیکی مثل سیم ها و پین ها را بررسی نمایید و از اتصال آنها مطمئن شوید .

۲.کد زیر را لود نموده و مانیتور سریال IDE را دوباره بررسی نمایید .

/*********

 Complete project by DATOSROBO.COM  
*********/
#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(115200);
  Serial.println("\nI2C Scanner");
}
 
void loop() {
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
      nDevices++;
    }
    else if (error==4) {
      Serial.print("Unknow error at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  }
  else {
    Serial.println("done\n");
  }
  delay(5000);          
}

و در آخر آدرس I2C که سریال مانیتور به شما می دهد بایستی در کد اصلی جایگزین آدرس قبلی شود .

کد زیر جایگاه آدرس I2C را در کد اصلی نشان می دهد .

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {

نوشتن متن با ماژول نمایشگر OLED

کتابخانه Adafruit برای صفحه نمایش OLED دارای چندین توابع برای نوشتن متن است . کلا این کتابخانه از این نظر خیلی کامل می‌باشد ، در این بخش نحوه نوشتن و پیمایش متن را با استفاده از توابع کتابخانه یاد خواهید گرفت .

نوشتن متن “! Hello, world”

شما با لود نمودن کد زیر می توانید هر نوشته ای که از کد پیج ۴۳۷ را پشتیبانی بنماید را به نمایش دربیاورید !!!

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // عرض نمایشگر به پیکسل
#define SCREEN_HEIGHT 64 // طول نمایشگر به پیکسل 
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, 10);
  // Display static text
  display.println("Hello, world!");
  display.display(); 
}
void loop() {
  
}

بعد ار لود نمودن کد ، تصویری مانند تصویر زیر ، مشاهده می‌نمایید .

نمایش Hello, world!

سخن پایانی

قطعا از این پروژه بسیار خوششتان آمده و لذت برده اید ! ، با ما در قسمت نظرات در ارتباط باشید و سوال های احتمالی و مشکلاتتون رو برای ما بفرستید تا ما در اولین فرصت پاسخ دهیم . تا آموزش و پروژه بعدی خدانگهدار .

نمایش بیشتر

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

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

دکمه بازگشت به بالا