در این جلسه قصد داریم آموزش راه اندازی lcd کاراکتری با i2c و آردوینو رو آموزش بدیم.
در این آموزش ما فقط با 2 سیم و با کمک ماژول i2c lcd راه اندازی میکنیم و باید به این نکته اشاره کنم که تابع هایی که استفاده میکنیم با آموزش راه اندازی lcd کاراکتری با آردوینو تفاوتی ندارن (بجز چند مورد که در ادامه توضیح میدم) پس فقط نوع ارتباطمون و کتابخونه مورد استفادمون متفاوته.
کتابخونه راه اندازی lcd کاراکتری با i2c
گفتیم که نوع ارتباطمون متفاوته و از I2C استفاده میکنیم پس لازمه که از 2 معرفی زیر استفاده کنیم:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
و برای تعریف سطر و ستون ها در حلقه setup باید از کد زیر استفاده کنیم:
LiquidCrystal_I2C lcd(0x3F,16,2); البته آدرس ها ممکن است یکی از این دسته باشند : LiquidCrystal_I2C lcd(0x27,16,2);////////FOR REAL LCD LiquidCrystal_I2C lcd(0x20,16,2);/////FOR PROTEUS LCD در آموزش i2c در آردوینو گفتیم میشه روی این 2 خط سیم چند ماژول ، قطعه یا هر وسیله ای که قابلیت ارتباط i2c دارن رو قرار داد. |
در پروتکل i2c هر قطعه یک آدرس داره ، عدد اولی که قبل از سطر و ستون (16 ستون و 2 سطر) قرار داره آدرس lcd هست، در ماژولی که من دارم این مقدار 0x3F هستش.
ماژول های بازار 2 مدل هستن PCF8574A که جدید تره و آدرسش 0x3F هست و مدل های قدیمی که PCF8574 بودن و آدرسشون 0x27 بود .
اگر هم ماژول رو خودتون درست کردین باید
طبق نکته زیر این عدد رو ایجاد کنید
تصویر بالا شکل پایه های PCF8574 هستش ، پایه های A0وA1وA2 رو اگر زمین کنین یا به vcc وصل کنین ، طبق جدول زیر میتونین مقدار آدرس اون رو تغییر بدین:(بر حسب high یا low بودن از بخش هگزادسیمال باید عدد رو انتخاب کنین)
برای PCF8574
و برای PCF8574A
برای هر ال سی دی باید کلاس خودشو تعریف کنین(به همین خاطر میتونین چند تا ال سی دی هم وصل کنین)
مثلا :
lcd.init();
و اگر 2 تا lcd داشتین:
lcd1.init();
lcd2.init();
چون اینجا نور پس زمینه (backlight) رو هم با ic کنترل میکنیم در نتیجه با دستور های زیر میتونیم خاموش و روشنش کنیم:
lcd.backlight();
lcd.noBacklight();
پروژه راه اندازی lcd کاراکتری با i2c و آردوینو
برای انجام پروژه هم طبق آموزش بخش i2c باید از سخت افزار زیر استفاده کنیم:
و اگر پایه های ماژول رو لحیم کنین به
این شکل در میاد
پروژه اول:
برای نوشتن یک خط روی ال سی دی از کد زیر استفاده میکنیم:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
void setup()
{
lcd.init();
lcd.backlight();
lcd.print("Levinic.ir");
delay(2000);
lcd.noBacklight();
}
void loop(){}
پروژه 2:
و یا برای نمایش متن دریافتی از ارتباط سریال آردوینو میتونیم از پروژه زیر استفاده کنیم: ( هر متنی از طریق ارتباط سریال بفرستین روی ال سی دی نمایش داده میشه!)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);
void setup() {
lcd.begin();
lcd.backlight();
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
delay(100);
lcd.clear();
while (Serial.available() > 0) {
lcd.write(Serial.read());
}
}
}
پروژه 3 :
و پروژه آخر هم برای اتصال 2 تا lcd :
توی این پروژه فقط دقت کنین که آدرس هر lcd باید متفاوت باشه :
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd1(0x3F,16,2);
LiquidCrystal_I2C lcd2(0x38,16,2);
void setup()
{
lcd1.init();
lcd2.init();
lcd1.backlight();
lcd2.backlight();
lcd1.print("Levinic");
lcd2.print("Arduino is sweet");
}
void loop(){}
منبع :
http://levinic.ir/character-lcd-with-i2c-and-arduino/
در این شبیه سازی از وقفه خارجی INT0 در اردویینو U9 جهت شمارش استفاده شده است
دستور وقفه بفرم زیر است :
attachInterrupt(interrupt, ISR, mode);
interrupt : شماره وقفه ای که میخواین ازش استفاده کنید، دو تا وقفه داریم،
وقفه ۰ و ۱ (جدول بالا)
mode : توسط این قسمت نوع تحریک شدن وقفه
رو تعیین میکنیم، مثلا به ازای هر تغییر ولتاژی(CHANGE) وقفه
رخ بده یا وقتی ولتاژ ۰ منطقی هستش(LOW) یا
وقتی که ولتاژ ۱ منطقی هستش(HIGH) یا وقتی که از ۰
منطقی میریم به ۱ منطقی(RISING) و یا برعکس(FALLING)…..این کلمات پر رنگ رو بسته به نیازتون یکیشون و در
mode قرار بدید.
ISR : نام تابع وقفه، این نام اختیاری هستش،
فقط شما این نامی که این جا میدید رو باس یه تابع تعریف کنید با این نام و کد هایی
که دوس دارید در صورت تحریک شدن وقفه اجرا بشن رو توش قرار بدید.
لازم بذکر است که LCD در این مدار I2C بوده و شکل مداری آن بفرم زیر است :
از کد زیر می توان جهت پیدا کردن آدرس تجهیز i2c استفاده کرد :
/*I2C_scanner This sketch tests standard 7-bit addresses. Devices with higher bit address might not be seen properly.*/
#include <Wire.h>
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++ ) { 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); } |
شبیه سازی با نرم افزار PROTEUS & ARDUINO
قیمت 15000 ت