В тази публикация ще разгледаме модула за LCD адаптер, базиран на „I2C“ или „IIC“ или „I square C“, който ще намали жичните връзки между Arduino и LCD дисплея до само 2 проводника, като също така ще спестите тонове GPIO щифтове за други сензори / задвижвания и т.н.
Преди да обсъдим модула за I2C LCD адаптер, е важно да разберем какво представлява I2C шината и как работи.
Но така или иначе не е нужно да сте експерт с I2C протокол, за да работите с този споменат LCD адаптер.
Илюстрация на I2C връзка:
I2C или IIC означава „Inter-Integrated Circuit“ е серийна компютърна шина, изобретена от полупроводници Philips, днес известни като NXP полупроводници. Тази автобусна система е изобретена през 1982г.
Какво е автобус?
Bus е група кабели / проводници, които пренасят данни от един чип към друг чип / една платка към друга платка.
Основното предимство на I2C bus протокола е, че поддържаният микроконтролер или сензори или чипове могат да бъдат свързани помежду си само с два проводника. Предимството на този протокол е, че можем да свържем 127 различни чипа или сензори / драйвери към едно главно устройство, което обикновено е микроконтролер само с 2 проводника.
Какви са двата I2C проводника?
Двата проводника са SDA и SCL, които са съответно серийни данни и сериен часовник.
Серийният часовник или SCL се използва за синхронизиране на комуникацията на данни през I2C шина. SDA или серийните данни е линията за данни, в която действителните данни се предават от главен към подчинен и обратно. Главното устройство контролира серийния часовник и решава за кое подчинено устройство трябва да комуникира. Никое подчинено устройство не може първо да инициира комуникация, само главното устройство може да направи.
Линията за серийни данни е двупосочна и стабилна, след като всеки набор от 8-битови данни е изпратен, приемащото устройство изпраща обратно бит за потвърждение.
Колко бърз е протоколът I2C?
Оригиналната версия на протокола I2C, разработен през 1982 г., поддържа 100 Kbps. Следващата версия е стандартизирана през 1992 г., която поддържа 400Kbps (бърз режим) и поддържа до 1008 устройства. Следващата версия е разработена през 1998 г. с 3,4 Mbps (високоскоростен режим).
Няколко други версии на I2C са разработени през 2000, 2007, 2012 (с 5Mbps Ultra-Fast режим), а последната версия на I2C е разработена през 2014.
Защо изтеглящи резистори в I2C шина?
SDA и SCL са „с отворено източване“, което означава, че и двете линии могат да отидат НИСКО, но не могат да задвижват линиите ВИСОКО, така че на всяка от линиите е свързан издърпващ резистор.
Но с повечето модули I2C като LCD или RTC има вградени съпротивления за изтегляне, така че не е необходимо да свързваме един, освен ако не е посочено.
Издърпващ / издърпващ резистор: Издърпващият резистор е резистор, свързан към + Ve линия на захранването, за да поддържа логическото ниво на линия до HIGH, ако линията не е нито висока, нито ниска.
Падащ резистор е резистор, свързан към –Ve линия на захранването, за да поддържа логическото ниво на линия до LOW, ако линията не е нито висока, нито ниска.
Това също така предотвратява навлизането на шум в линиите.
Надяваме се, че сме надраскали повърхността на протокола I2C, ако имате нужда от повече информация за протокола I2C, моля сърфирайте
YouTube и Google.
Сега нека да разгледаме I2C LCD модула:
Има 16 изходни щифта за LCD дисплей, които могат да бъдат запоени директно към задната част на 16 X 2 LCD модула.
Входните щифтове са + 5V, GND, SDA и SCL. SDA и SCL щифтовете на Arduino Uno са съответно щифтове A4 и A5. За Arduino mega SDA е ПИН # 20, а SCL е ПИН # 21.
Нека сравним как изглежда, когато свързваме LCD към Arduino без адаптера I2C и с адаптера.
Без I2C адаптер:
С I2C адаптер:
Адаптерът е запоен на гърба на LCD дисплея и както виждаме, че спестихме много GPIO пинове за други задачи, а също така можем да продължим да добавяме още 126 I2C устройства към щифтове A4 и A5.
Моля, обърнете внимание, че стандартната библиотека Liquid Crystal няма да работи с този I2C LCD адаптер, има специална библиотека за това, която скоро ще бъде разгледана и ние ще ви покажем как да използвате този модул с пример за кодиране.
Как да свържете I2C адаптер към дисплей 16 x 2
В горните раздели на статията научихме основите на I2C протокола и направихме основен преглед на I2C LCD адаптерния модул. В тази публикация ще научим как да свържете I2C LCD адаптерния модул към 16 x 2 LCD дисплей и ще видим как програмираме с пример.
Основното предимство на протокола I2C е, че можем да свържем поддържаните сензори / входно / изходни устройства само в два реда и е полезно за Arduino, тъй като има ограничени GPIO пинове.
Сега нека видим как да свържете модула към LCD.
Модулът има 16 изходни щифта и 4 входни щифта. Можем просто да запоим адаптера в задната част на 16 x 2 LCD дисплея. От 4-те входни щифта, двата са + 5V и GND, останалите два са SDA и SCL.
Виждаме, че спестихме много щифтове в Arduino за други входно / изходни задачи.
Можем да регулираме контраста на дисплея, като регулираме потенциометъра с малка отвертка (маркирана в червено поле).
Подсветката вече може да се контролира в самия програмен код:
lcd. backlight ()
Това ще включи подсветката на LCD дисплея.
lcd.noBacklight ()
Това ще изключи подсветката на LCD дисплея.
Виждаме, че има свързан джъмпер, който е маркиран в червено, ако джъмперът бъде премахнат, подсветката остава ИЗКЛЮЧЕНА независимо от командата на програмата.
Сега хардуерната настройка е завършена, сега нека видим как да кодираме. Моля, не забравяйте, че I2C LCD модулът се нуждае от специални
библиотеката и предварително инсталираната библиотека „liquidcrystal“ няма да работят.
Можете да изтеглите I2C LCD библиотеката от тук и да добавите към Arduino IDE:
github.com/marcoschwartz/LiquidCrystal_I2C
От предишната публикация научихме, че I2C устройствата имат адрес, по който капитанът или микроконтролерът могат да идентифицират устройството и да комуникират.
В повечето случаи за I2C LCD модула адресът ще бъде '0x27'. Но различното производство може да има различен адрес. Трябва да въведем правилния адрес в програмата само тогава вашият LCD дисплей ще функционира.
За да намерите адреса, просто свържете 5V към Vcc и GND към GND на Arduino и SCL щифт на I2C модул към A5 и SDA към A4 и качете кода по-долу.
Това ще сканира свързаните I2C устройства и ще покаже техния адрес.
// -------------------------------- //
#include
void setup()
{
Wire.begin()
Serial.begin(9600)
while (!Serial)
Serial.println('-----------------------')
Serial.println('I2C Device Scanner')
Serial.println('-----------------------')
}
void loop()
{
byte error
byte address
int Devices
Serial.println('Scanning...')
Devices = 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(' !')
Devices++
}
else if (error == 4)
{
Serial.print('Unknown error at address 0x')
if (address <16)
Serial.print('0')
Serial.println(address, HEX)
}
}
if (Devices == 0)
{
Serial.println('No I2C devices found
')
}
else
{
Serial.println('-------------- done -------------')
Serial.println('')
}
delay(5000)
}
// -------------------------------- //
Качете кода и отворете серийния монитор.
Както виждаме, две устройства бяха открити и адресите им се показват, но ако искате да намерите само адреса на I2C LCD модула, не трябва да свързвате други устройства I2C по време на сканиране.
В заключение получихме адреса „0x27“.
Сега ще направим цифров часовник като пример, защото има две I2C устройства, LCD модулът и RTC или модул с часовник в реално време. И двата модула ще бъдат свързани с два проводника.
Изтеглете следната библиотека:
RTC библиотека: github.com/PaulStoffregen/DS1307RTC
TimeLib.h: github.com/PaulStoffregen/Time
Как да зададете време за RTC
• Отворете Arduino IDE и отворете File> Example> DS1307RTC> задайте час.
• Качете кода с завършен хардуер и отворете сериен монитор и сте готови.
Електрическа схема:
Програма:
//------------Program Developed by R.Girish-------//
#include
#include
#include
#include
LiquidCrystal_I2C lcd(0x27, 16, 2)
void setup()
{
lcd.init()
lcd.backlight()
}
void loop()
{
tmElements_t tm
lcd.clear()
if (RTC.read(tm))
{
if (tm.Hour >= 12)
{
lcd.setCursor(14, 0)
lcd.print('PM')
}
if (tm.Hour <12)
{
lcd.setCursor(14, 0)
lcd.print('AM')
}
lcd.setCursor(0, 0)
lcd.print('TIME:')
if (tm.Hour > 12)
{
if (tm.Hour == 13) lcd.print('01')
if (tm.Hour == 14) lcd.print('02')
if (tm.Hour == 15) lcd.print('03')
if (tm.Hour == 16) lcd.print('04')
if (tm.Hour == 17) lcd.print('05')
if (tm.Hour == 18) lcd.print('06')
if (tm.Hour == 19) lcd.print('07')
if (tm.Hour == 20) lcd.print('08')
if (tm.Hour == 21) lcd.print('09')
if (tm.Hour == 22) lcd.print('10')
if (tm.Hour == 23) lcd.print('11')
}
else
{
lcd.print(tm.Hour)
}
lcd.print(':')
lcd.print(tm.Minute)
lcd.print(':')
lcd.print(tm.Second)
lcd.setCursor(0, 1)
lcd.print('DATE:')
lcd.print(tm.Day)
lcd.print('/')
lcd.print(tm.Month)
lcd.print('/')
lcd.print(tmYearToCalendar(tm.Year))
} else {
if (RTC.chipPresent())
{
lcd.setCursor(0, 0)
lcd.print('RTC stopped!!!')
lcd.setCursor(0, 1)
lcd.print('Run SetTime code')
} else {
lcd.clear()
lcd.setCursor(0, 0)
lcd.print('Read error!')
lcd.setCursor(0, 1)
lcd.print('Check circuitry!')
}
}
delay(1000)
}
//------------Program Developed by R.Girish-------//
Забележка:
LiquidCrystal_I2C lcd (0x27, 16, 2)
„0x27“ е адресът, който намерихме при сканиране, а 16 и 2 са броят на редовете и колоните на LCD дисплея.
За RTC не е необходимо да намираме адреса, но намерихме, докато сканирахме „0x68“, но така или иначе RTC библиотеката ще се справи.
Сега нека видим доколко намалихме задръстванията на проводниците и запазихме GPIO пинове на Arduino.
Само 4 проводника са свързани към LCD дисплея, маркирани в червено поле.
Също така само 4 проводника са свързани от Arduino и RTC модулът споделя същите линии.
Досега сте придобили основни познания за I2C и как да използвате I2C LCD адаптерния модул.
Харесвате ли тази публикация? Имате ли някакви въпроси? Моля, изразете в раздела за коментари, може да получите бърз отговор.
Предишна: Обикновена схема на тестер за транзисторен диод Напред: Направете тази верига за удължаване на обхвата на IR дистанционно управление