
Szeretem az I2C bővítővel szerelt LCD-kijelzőket mindenféle projektben használni. Sok szempont dominál mellette:
- meglehetősen kedvező az ára,
- hasznos a hibakereséshez vagy a végfelhasználói információkhoz,
- csak 2 kivezetést + tápfeszültséget használ (de az I2C busz lehet más I2C eszközzel megosztottan is), valamint
- kevés programmemóriával is beéri.
Hozzávalók
Eszközök
- Önálló I2C LCD modul és
- Karakteres kijelző vagy
- Egybeépített karakteres kijelző és I2CLCD modul
- Arduino UNO alaplap
- Jumper/Dupont kábel (anya-anya) – 4 érnyi
Szoftver
- Arduino IDE keretrendszer
A cikk a Windows alatti 1.8.13 verzióval készült.
Hogy néz ki az I2CLCD-vel szerelt LCD modul?
Az eszköz vagy készre szerelten érhető el, vagy ha épp speciális méret vagy csatlakozás van a karakteres kijelzőn, akkor az I2CLCD külön modullal házasítom össze. Általában valami ilyesmi lesz belőle:

Az I2CLCD modulok többféle chippel készülnek – a gyakoribb PCF8574 / PCF8574A mellett az MCP23008, MCP23016 is előfordul… A PCF8574/PCF8574A chipeknek a legjobb a támogatása – ám mindegyiknek más a címtartománya – PCF8574 (0x20-0x27), PCF8574A (0x38-0x3F)…
Probléma és megoldás
Amikor újabb eszköz kerül a készletembe – tuti más címen lehet megszólítani, mint az eddigieket. És a kódot sem örömünnep állandóan átírni….
Felmerül az ötlet: ha az I2Cdetect programmal a cím megkereshető, és utána én adom meg a következő programban – nem lehetne ezt a két lépést összevontan automatizálni?
Az ötletet tett követte, az alábbi feltételrendszert betartásával:
- csak PCF8574/PCF8574A alapú bővítőt használok,
- a bővítő bármely, a PCF8574/PCF8574A chip által biztosított címen lehet,
- csak egy LCD kijelző van az áramkörön,
- más funkcióra nem használok PCF8574/PCF8574 chipet.
Eredmény
A detektálás folyamata és utána az I2CLCD modullal az LCD kezelés az alábbi kódot eredményezte (így nem kell minden alkalommal szerkesztenem a kódot, amikor újabb adag LCD-t kapok):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | const uint8_t addresses[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f }; #include <Wire.h> #include <LiquidCrystal_I2C.h> const int numLcdCols = 16; const int numLcdrows = 2; LiquidCrystal_I2C lcd(addresses[1], numLcdCols, numLcdrows); // init lcd object (standard address) void setup() { int i; Wire.begin(); for(i = 0; i < sizeof(addresses); i++) { Wire.beginTransmission(addresses[i]); if (Wire.endTransmission() == 0) { lcd = LiquidCrystal_I2C(addresses[i], numLcdCols, numLcdrows); // reinitialise lcd with new address lcd.init(); // initialise the newly found lcd lcd.backlight(); lcd.clear(); lcd.print("Hello World!"); lcd.print (addresses[i], HEX); break; } } if (i >= sizeof(addresses)) { //Log.error("No display found"); while(1); //STOP } } void loop() { delay(1000); lcd.clear(); lcd.print("Hello World!"); } |
Magyarázat
A program elején a lehetséges I2C bővítőpanelek címei vannak megadva, majd az I2C (Wire) eszközkönyvtár és a I2C alapú LCD kezelőprogram hivatkozásai kerültek elhelyezésre. És még végül az LCD sor és oszlop méretei vannak megadva, majd végül inicializálva az alapértelmezett címen az LCD-t.
A kiválasztott címtartományban tesztelésre kerül, hogy a bővítő “megszólal”-e. Ha megszólal, ott az LCD újrabeállításra és újrainicializálásra kerül. Ha nincsen LCD bővítő egyáltalán a cemíek egyikén sem – a program leáll.
És a főprogramban látható az LCD kezelés mintája is…

Mintaprogramok
Az itt levő állományok a cikkhez kapcsolódó mintákat tartalmazzák. Az ezekben szereplő kódok szabadon felhasználhatóak – a bennük levő copyright betartásával.