آردوینو, پروژه آردوینو

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

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

مقدمه

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

فهرست مطالب

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

سایز: 0.96 اینچ

رزولوشن: 128 × 64 پیکسل

نوع: صفحه نمایش تک رنگ

مدل: OSD SSD1306

پروتکل ارتباطی: I2C

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

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

مرحله اول؛ تامین قطعات مورد نیاز برای راه اندازی ماژول نمایشگر OLED با آردوینو

مرحله دوم؛ بستن مدار برای راه اندازی ماژول نمایشگر OLED با آردوینو

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

  • GND به GND (سیم سیاه)
  • VCC به 5v (سیم قرمز)
  • SCL به A5 در بردهای UNO و NANO (سیم سفید)
  • SCL به 21 در بردهای MEGA و Leonardo (سیم سفید)
  • SDA به A4 در بردهای UNO و NANO (سیم زرد)
  • SDA به 20 در بردهای MEGA و Leonardo (سیم زرد)

اتصالات نمایشگر اولد با آردوینو به منظور راه اندازی ماژول نمایشگر OLED با آردوینو

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

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

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

نصب کتابخانه ssd1306 adafruit library به منظور راه اندازی ماژول نمایشگر OLED با آردوینو

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

نصب کتابخانه جی اف ایکس adafruit برای راه اندازی ماژول نمایشگر OLED با آردوینو

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

نکات مهم کدنویسی کتابخانه‌ها پیش از راه‌اندازی ماژول نمایشگر OLED با آردوینو

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

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

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

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

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

oled example esp8266

مرحله سوم؛ کد نویسی پروژه برای راه اندازی ماژول نمایشگر OLED با آردوینو

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

/*********
این یک مثال برای راه‌اندازی نمایشگرهای بر پایه اولد می‌باشد
*********/ #include #include #include #include #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); // تاخیر به مدت 2 ثانیه 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>=0; 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>=0; i-=4) { display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE); display.display(); delay(1); } for(i=display.height()-1; i>=0; 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); // تاخیر برای 2 ثانیه } 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&lt;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&lt;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>0; 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>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, INVERSE); display.display(); delay(1); } delay(2000); } void testdrawchar(void) { display.clearDisplay(); display.setTextSize(1); // مقیاس 1 به 1 display.setTextColor(WHITE); // ایجاد متن با رنگ سفید display.setCursor(0, 0); // شروع از گوشه بالا سمت چپ display.cp437(true); // می‌توانید از 256 کاراکتر مختلف استفاده کنید (کد پیج 437) 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); // مقیاس 1 به 1 display.setTextColor(WHITE); // ایجاد متن با رنگ سفید display.setCursor(0,0); // شروع از گوشه بالا سمت چپ display.println(F(“limoopi”)); display.setTextColor(BLACK, WHITE); // !ایجاد نوشته با رنگ برعکس display.println(3.141592); display.setTextSize(2); // مقیاس 1 به 2 display.setTextColor(WHITE); display.print(F(“0x”)); display.println(0xDEADBEEF, HEX); display.display(); delay(2000); }

void testscrolltext(void) { display.clearDisplay(); display.setTextSize(2); // مقیاس 1 به 2 display.setTextColor(WHITE); display.setCursor(10, 0); display.println(F(“limoopi”)); 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); } } } }

چنان‌چه نمایشگر OLED شما پین ریست ندارد، بایستی کد زیر را حذف کنید.

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

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

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

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

  1. اتصالات فیزیکی مانند سیم‌ها و پین‌ها را بررسی کنید و از اتصال آنها مطمئن شوید.
  2. کد زیر را لود کرده و مانیتور سریال IDE را دوباره بررسی کنید.
/*********
 Complete project by limoopi.COM
*********/
#include
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 foundn");
  }
  else {
    Serial.println("donen");
  }
  delay(5000);
}

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

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

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

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

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

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

شما با لود کردن کد زیر می‌توانید هر نوشته‌ای که از کد پیج 437 پشتیبانی کند را به نمایش دربیاورید!!!

#include
#include
#include
#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() {
}

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

بازگشت به لیست

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

نشانی ایمیل شما منتشر نخواهد شد.