یکی از روش‌های اتصال LCD به بوردهای آردوینو، استفاده از ماژول I2C است که این فرآیند را بسیار ساده می‌کند و به علاوه نیازی به استفاده از مقاومت یا پتانسیومتر برای تنظیم کردن کنتراست ندارید. با استفاده از این ماژول، تنها دو پین آنالوگ اشغال می‌شود و می‌توانید پین‌های دیجیتال را برای امور کنترلی متنوع‌تری استفاده کنید.

در ادامه به معرفی ماژول I2C و نحوه‌ی اتصال نمایشگر پرکاربرد و ارزان LCD 16x2 به آردوینو و چاپ متن روی آن می‌پردازیم.

آشنایی با ماژول I2C

یکی از روش‌های اتصال نمایشگر LCD به بوردهای میکروکنترلر Arduino استفاده از ماژول I2C است. برای اتصال نمایشگر LCD معمولاً باید از چند پین دیجیتال و همین‌طور پین ۵ ولت و پین زمین یا Ground و گاهی پین ۳.۳ ولت استفاده کرد. حتی برای تنظیم میزان کنتراست LCD که موجب خوانایی حروف می‌شود، به مقاومت یا پتانسیومتر برای تأمین ولتاژ موردنظر نیاز است. اما در صورت استفاده از ماژول I2C می‌توانید تنها از دو پین آنالوگ استفاده کنید و LCD را روشن کرده و روی آن کاراکتر و گرافیک چاپ کنید. دقت کنید که این ماژول هم مثل اغلب ماژول‌ها به اتصال زمین یا ولتاژ ۰ و اتصال ۵ ولت برای تغذیه نیاز دارد.

آموزش اتصال LCD 16×2 با ماژول I2C به آردوینو NANO و UNO و غیره

اما سوال مهم: کنتراست LCD را چطور تنظیم کنیم؟

روی ماژول I2C یک پتانسیومتر کوچک و ساده موجود است که با چرخاندن پیچ کوچک آن، می‌توانید کنتراست نمایشگر را به راحتی تنظیم کنید. لذا مقاومت و پتانسیومتر نیاز نیست.

مدار تست و یافتن آدرس I2C

قطعات مورد نیاز:

بورد آردوینو

نمایشگر LCD 16*2

ماژول I2C

۴ سیم دو سر جامپر مادگی

برای اتصال LCD می‌توانید از آردوینو نانو، UNO یا سایر مدل‌ها استفاده کنید و روش کار کاملاً مشابه است. با توجه به تنوع LCDها و در واقع پین‌های ال‌سی‌دی‌ها، به آدرس I2C در نوشتن برنامه نیاز داریم، ابتدا مدار را به صورت زیر ببندید:

پورت آنالوگ شماره ۴ یا A4 به پین SDA

A5 به پین SCL

ولتاژ تغذیه یا VCC به پین 5v

زمین مدار یا GND به GND

در بوردهایی که تراشه‌ی مرکزی ATMega328 است، پین A4 و A5‌ به SDA و SCL اختصاص پیدا می‌کند و در واقع اگر پین آنالوگ برای اتصال حسگرها نیاز داشته باشید، می‌بایست از ۴ پین قبلی یا پین‌های بعدی استفاده کنید. در بوردهای دیگر مثل Leonardo که تراشه‌ی مرکزی ATMega32U4 است، می‌بایست از پین‌های D2 و D3 استفاده کنید و به همین ترتیب در بوردهای دیگر، پین مناسب برای اتصال ماژول I2C متفاوت است.

به شماتیک زیر توجه کنید که به آردوینو UNO و بوردهای مشابه آن مربوط می‌شود:

آموزش اتصال LCD 16×2 با ماژول I2C به آردوینو NANO و UNO و غیره

در مورد Arduino Nano نیز مدار به همین صورت بسته می‌شود و صرفاً باید به نام پین‌ها توجه کرد:

آموزش اتصال LCD 16×2 با ماژول I2C به آردوینو NANO و UNO و غیره

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

در نرم‌افزار Arduino IDE از منوی Tools مدل بورد و شماره‌ی پورت و در صورت نیاز مدل پردازنده و بوت‌لودر را انتخاب کنید. سپس کد زیر را در ادیتور کد پیست کنید:

// اسکنر I2C

//کتابخانه‌ی موردنیاز
#include //نام کتابخانه‌های موردنیاز

void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);//انتظار برای پورت سریال
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");//چاپ متن در کنسول مانیتورینگ سریال

  nDevices = 0;
  for(address = 1; address < 127; address++ )  //حلقه‌ی فور برای تست کردن آدرس‌های احتمالی ماژول

  {
    // اسکنر از مقدار برگشتی
    // Write.endTransmisstion
    // متوجه می‌شود که آیا ماژول به آدرس در حال تست، پاسخ می‌دهد یا خیر
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown 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);//تأخیر ۵ ثانیه‌ای قبل از اسکن بعدی
}

در بخش کتابخانه‌ها پس از include می‌بایست دو کتابخانه را وارد کنید. لذا دو خط زیر را در ابتدای کد فوق قرار بدهید:

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

دانلود فایل زیپ این کتابخانه‌ها:

حال در نرم‌افزار Arduino IDE از منوی Tools گزینه‌ی Serial Monitor را انتخاب کنید.

آموزش اتصال LCD 16×2 با ماژول I2C به آردوینو NANO و UNO و غیره

شورت‌کات باز کردن پنجره‌ی مانیتورینگ سریال، Ctrl + Shift + M است.

همان‌طور که در تصویر زیر مشاهده می‌کنید، در LCD مورداستفاده در این پروژه، آدرس 0x27 است.

آموزش اتصال LCD 16×2 با ماژول I2C به آردوینو NANO و UNO و غیره

چاپ متن روی LCD 16x2 متصل به آردوینو

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

lcd.setCursor(x,y);

و برای نوشتن عبارتی مثل ZagrosRobotics.ir از دستور زیر استفاده کنید:

lcd.print("ZagrosRobotics.ir");

البته عبارت موردبحث بیش از ۱۶ کاراکتر است و در نتیجه حرف آخر چاپ نمی‌شود!

برای اعمال تأخیر برای نوشتن متن به صورت متحرک یا با تأخیر، از دستور زیر استفاده کنید و به جای ۱۰۰۰ میلی‌ثانیه، عدد موردنظر را بر حسب میلی‌ثانیه تایپ کنید:

delay(1000);

برای پاک کردن صفحه نیز می‌توانید از دستور زیر استفاده کنید:

lcd.clear();

و اما یک نمونه کد ساده و کاربردی برای مرور کردن دستورات فوق:

/* ZagrosRobotics.ir */
/* ابتدا اضافه کردن کتابخانه‌های موردنیاز*/
#include //نام کتابخانه‌های موردنیاز

//تعریف پین‌های ماژول
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //0x27 آدرس فرضی است

void setup() 
{

lcd.begin(16,2);//تعریف کردن ۱۶ ستون و ۲ ردیف نمایشگر
lcd.backlight();//برای روشن کردن بک‌لایت
//lcd.backlight();//برای خاموش کردن بک‌لایت

}

void loop() 
{
//دستورات برنامه
lcd.setCursor(0,0); //تعریف کردن محل نوشتن متن
lcd.print("ZagrosRobotics"); //نوشتن متن ... ۱۶ حرف در هر خط
delay(1000);//زمان تأخیر برای دینامیک و زیبا شدن متن
lcd.setCursor(0,1);  //تعریف کردن محل نوشتن که ابتدای خط دوم یا به عبارت دیگر ستون صفر و ردیف ۱ است
lcd.print("Arduino I2C LCD");
delay(3000); 

lcd.clear();//پاک کردن صفحه نمایش
lcd.setCursor(0,0); 
lcd.print("     Zagros");//فاصله‌های خالی اضافی برای وسط‌چین کردن متن
lcd.setCursor(0,1);
lcd.print("    Robotics");//چند اسپیس ابتدای عبارت برای وسط‌چین کردن متن
delay(3000);
}

و کتابخانه‌ی موردنیاز در این نمونه کد:

#include <Wire.h>

نتیجه چاپ شدن عبارت‌هایی روی LCD است که با تأخیری کوتاه تغییر می‌کنند:

آموزش اتصال LCD 16×2 با ماژول I2C به آردوینو NANO و UNO و غیره