Płytka interfejsu szeregowego I2C LCD nie wyświetla tekstu (nieprawidłowe styki?)


9

Mam ekran LCD 1602, który sam działa dobrze. Chciałem jednak uwolnić niektóre piny za pomocą kontrolera LCD I2C / IIC, który kupiłem osobno.

Podczas gdy sterownik wydaje się komunikować z moim Arduino UNO pod właściwym adresem, nie mogę wyświetlić tekstu do wyświetlenia. Domyślnie (bez kodu) wydaje się, że LCD będzie miał 1 linię 16 pełnych „kwadratów”. Gdy użyję adresu 27 w moim kodzie, wyświetlacz LCD zmieni się na 2 wiersze po 16 kwadratów (patrz zdjęcie poniżej). Kod wzywa również, aby podświetlenie migało 3 razy, co działa. Nie mogę jednak dostać nic oprócz 2 linii kwadratów. (Pełny kod znajduje się na dole tego pytania).

Używam biblioteki LiquidCrystal_I2C przez F Malpartida, który wydaje się być powszechnie stosowane.
Czy jest lepsza biblioteka, której powinienem używać?

Zastanawiam się, czy w kodzie są użyte niewłaściwe piny. Wszystkie szkice, które widzę online, używają następujących szpilek:

//                    addr,en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Set the LCD I2C address

Ale wszystkie 1602 wyświetlacze LCD, które widzę online, mają takie same styki jak moje, jak widać na moim zdjęciu poniżej:

Kontroler LCD I2C

Te szpilki wydają się być standardowe:
1602 LCD Pinout

Aby jeszcze bardziej pomylić, piny na płycie LCD zaczynają się od 1 po lewej, ale piny kodu domyślnego zaczynają się od 0! Próbowałem więc zmienić piny kodu na liczby na płycie LCD. Wyświetlacz LCD nie zmienia się już w 2 linie kwadratów i nie miga już podświetlenie. Następnie próbowałem odjąć 1 od każdego pinu (aby zacząć od 0), ten sam wynik. Następnie spróbowałem użyć domyślnych pinów minus 1, ten sam wynik. Zatem domyślne szpilki są jakoś bardziej poprawne ?! Co ja robię źle?

Czy ktoś jeszcze zatrudnił jeden z tych kontrolerów I2C, a jeśli tak, to w jaki sposób?

Pełny kod:

/* YourDuino.com Example Software Sketch
 16 character 2 line I2C Display
 Backpack Interface labelled "YwRobot Arduino LCM1602 IIC V1"
 terry@yourduino.com */

/*-----( Import needed libraries )-----*/
#include <Wire.h>  // Comes with Arduino IDE
// Get the LCD I2C Library here: 
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
#include <LiquidCrystal_I2C.h>

/*-----( Declare objects )-----*/
// set the LCD address to 0x27 for a 20 chars 2 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);  // Used to type in characters
  lcd.begin(16,2);   // initialize the lcd for 16 chars 2 lines, turn on backlight

// ------- Quick 3 blinks of backlight  -------------
  for(int i = 0; i< 3; i++) {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on  

//-------- Write characters on the display ------------------
// NOTE: Cursor Position: (CHAR, LINE) start at 0  
  lcd.setCursor(0,0); //Start at character 4 on line 0
  lcd.print("Hello, world!");
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print("HI!YourDuino.com");
  delay(8000);  

// Wait and then tell user they can start the Serial Monitor and type in characters to
// Display. (Set Serial Monitor option to "No Line Ending")
  lcd.clear();
  lcd.setCursor(0,0); //Start at character 0 on line 0
  lcd.print("Use Serial Mon");
  lcd.setCursor(0,1);
  lcd.print("Type to display");  

}/*--(end setup )---*/

void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  {
    // when characters arrive over the serial port...
    if (Serial.available()) {
      // wait a bit for the entire message to arrive
      delay(100);
      // clear the screen
      lcd.clear();
      // read all the available characters
      while (Serial.available() > 0) {
        // display each character to the LCD
        lcd.write(Serial.read());
      }
    }
  }

}/* --(end main loop )-- */

Czy pamiętasz, aby dodać pullups?
Ignacio Vazquez-Abrams


1
Prawdopodobnie nie jest to problem, ale czy próbowałeś wyregulować kontrast za pomocą potencjometru? Cyfry w kodzie odnoszą się do tego, który pin w układzie PCF8574 jest podłączony do którego pinu na płycie lcd. P3 na płycie I2C jest najwyraźniej podłączony do styku podświetlenia na ekranie LCD. Ale myślę, że inne szpilki są w jakiś sposób błędne. Spróbuj użyć multimetru, aby zobaczyć, gdzie styki P0-P7 w PCF8574 idą do których styków w nagłówku lcd.
Gerben

2
Chociaż może to nie być problem, należy zwrócić uwagę na wlutowane złącza pinów na ekranie LCD, z widocznego zdjęcia nie pokrywają całkowicie miedzi wokół otworu; Najpierw spróbuję poprawić te punkty lutownicze.
jfpoilpret

1
@Gerben, derp. Przetestowałem układ za pomocą multimetru, ale nadal jestem całkowicie zdezorientowany. Piny 9-12 na chipie odpowiadają D4-D7 na lCD. Pin 6 = E, 5 = RW, a 4 = RS. Nie mogę zrozumieć, czym tak naprawdę jest pin 7. Użycie tych wartości nie daje mi żadnej odpowiedzi z ekranu LCD. Czy mam też odjąć 1 od tych pinów? Ponownie, wszystkie domyślne kody mają pin 0 = RS. Ale tak nie może być, ponieważ pierwszy pin na chipie to A0 (adres). Zasadniczo zmiana dowolnego pojedynczego pinu albo zabije reakcję podświetlenia, albo powstrzyma 2. wiersz przed pokazaniem znaków bloku.
Bort

Odpowiedzi:


3

Przede wszystkim wygląda na to, że te przewody nie są prawidłowo podłączone:

wprowadź opis zdjęcia tutaj

Nie zdemontowałem wcześniej skoczka, więc może to nie być problem. Wydaje się jednak prawdopodobne, że może to być przyczyna.

Ponadto musisz wyregulować kontrast, obracając trymer (niebieska rzecz, która wygląda trochę tak, jakby miała śrubę). Wyświetlacze LCD albo nie wyświetlają niczego, wypranej wersji tekstu, ani niebieskich pól, jeśli kontrast nie jest ustawiony prawidłowo. To prawdopodobnie przyczyna.


Zworki są takie tylko dlatego, że przesunąłem planszę do zdjęcia. Również dostosowałem już trymer i to albo pełne bloki, albo nic.
Bort

3

Kupiłem SainSmart 20x04 i musiałem również zmienić adres na 0x3F. Brakowało zworki mojego podświetlenia, ten mały nagłówek po prawej stronie płyty I2C zapewnia moc podświetlenia. Znalazłem trochę kodu:

lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);

1

Mam ten sam problem i naprawiam go, zmieniając adres LCD 1602A, który znajduje się w tutorialach 0x27, ale w moim urządzeniu jest 0x3F.

Powodzenia!


Samo w moim przypadku, pracował przy zmianie tej linii: LiquidCrystal_I2C lcd(0x3F,16,2);. Wielkie dzięki!
Stefan

0

O ile mi wiadomo, rezystory podciągające powinny być zintegrowane z wyświetlaczem.

Próbowałeś różnych adresów? Mam podobny, który działa pod adresem 0x3F. Może to pomaga.


Płyta została sprzedana jako „adres 27”, a 27 to jedyny adres, który w ogóle odpowiada. W rzeczywistości można go dostosować, lutując styki A1 A2 i A3 tuż nad donicą przycinania widoczną na zdjęciu.
Bort

0

Zmień ten kod:

LiquidCrystal_I2C lcd(0x26, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

Do tego:

LiquidCrystal_I2C lcd(0x26, 2, 1, 0, 4, 5, 6, 7, 8, POSITIVE);

(Argument przed „POZYTYWNY” zmienia się z 3 na 8)


1
Jakieś wyjaśnienie, dlaczego? Na PCF8574 nie ma P8.
tcurdt


-2
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 6, 5, 7, 3, POSITIVE);  // Set the LCD

Moduł I2C D6-> P5 to D5-> P6 (odwrócony).


1
Czy możesz to bardziej wyjaśnić?
Bort

2
Proszę edytować swój post i formatowanie kodu za pomocą kodu formatowania przecen (cztery spacje). Aby uzyskać pomoc, zobacz Pomoc Markdown . Powinieneś być w stanie to zrobić, wybierając kod i naciskając, Ctrl+Kaby Twoja przeglądarka zrobiła to za Ciebie. Twoja odpowiedź byłaby bardziej pomocna, gdybyś podał więcej szczegółów.
Nick Gammon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.