Skocz do zawartości

Moduł I2C dla wyświetlacza oraz moduł PCF8574


SiaQ

Pomocna odpowiedź

Witam.

Mam problem odnośnie rozszerzenia pinów w Arduino.

Podłączyłem wyświetlacz przy pomocy modułu I2C dla wyświetlacza LCD, wykorzystując przy tym bibliotekę LiquidCrystal_I2C.h, oprócz tego chciałem dodać kilka dodatkowych pinów przy użyciu modułu PCF8574. W momencie gdy w programie dołączę bibliotekę PCF8574.h, program wyrzuca błąd, że biblioteka ta zawarta jest (niby) w bibliotece LiquidCrystal_I2C.h.

Jak rozwiązać ten problem, aby wszystko działało poprawnie i bezbłędnie?

Link do komentarza
Share on other sites

LiquidCrystal_I2C.h - bibliotekę ściągnąłem ze strony, która podana była na Botlandzie (https://botland.com.pl/konwertery-pozostale/2352-konwerter-i2c-dla-wyswietlacza-lcd-hd44780.html)

PCF8574.h - ta biblioteka była podana na jakiejś stronie, gdzie wykorzystywany był ten moduł (https://botland.com.pl/ekspandery-wyprowadzen/4455-modul-pcf8574-ekspander-wyprowadzen-mikrokontrolera.html?search_query=pcf8574&results=16)

A błąd jaki wyskakuje to :

Archiving built core (caching) in: C:\Users\Kuba\AppData\Local\Temp\arduino_cache_77816\core\core_arduino_avr_uno_0c812875ac70eb4a9b385d8fb077f54c.a
libraries\PCF8574\PCF8574.cpp.o (symbol from plugin): In function `port_to_pcmask':

(.text+0x0): multiple definition of `__vector_3'

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

libraries\PCF8574\PCF8574.cpp.o (symbol from plugin): In function `port_to_pcmask':

(.text+0x0): multiple definition of `__vector_4'

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

libraries\PCF8574\PCF8574.cpp.o (symbol from plugin): In function `port_to_pcmask':

(.text+0x0): multiple definition of `__vector_5'

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

Znaleziono wiele bibliotek w "LiquidCrystal_I2C.h"
Wykorzystane: C:\Users\Kuba\Documents\Arduino\libraries\LiquidCrystal_I2C
Niewykorzystane: C:\Users\Kuba\Documents\Arduino\libraries\jm_LiquidCrystal_I2C
exit status 1
Błąd kompilacji dla płytki Arduino/Genuino Uno.
Link do komentarza
Share on other sites

SiaQ, w kodzie błędu jest mowa o tym, że masz wgraną dwa razy bibliotekę od wyświetlacza:

Znaleziono wiele bibliotek w "LiquidCrystal_I2C.h" 
Wykorzystane: C:\Users\Kuba\Documents\Arduino\libraries\LiquidCrystal_I2C 
Niewykorzystane: C:\Users\Kuba\Documents\Arduino\libraries\jm_LiquidCrystal_I2C 

Sprawdź najpierw ten trop i usuń zbędny katalog 😉

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Po usunięciu biblioteki z folderu "libraries" wyskoczyło coś takiego :

libraries\PCF8574\PCF8574.cpp.o (symbol from plugin): In function `port_to_pcmask':

(.text+0x0): multiple definition of `__vector_3'

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

libraries\PCF8574\PCF8574.cpp.o (symbol from plugin): In function `port_to_pcmask':

(.text+0x0): multiple definition of `__vector_4'

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

libraries\PCF8574\PCF8574.cpp.o (symbol from plugin): In function `port_to_pcmask':

(.text+0x0): multiple definition of `__vector_5'

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Błąd kompilacji dla płytki Arduino/Genuino Uno.
Link do komentarza
Share on other sites

Wykorzystywałem go do podłączenia modułu GSM, który w sumie podłączyłem przy użyciu innej biblioteki (teraz moduł działa poprawnie, wtedy szwankował), ale mimo wszystko po usunięciu biblioteki SoftwareSerial.h błąd jest nadal taki sam jak powyżej. Dziwne i zarazem bardzo irytujące. Może to wina bibloteki PCF8574.h ? Masz może jakąś sprawdzoną do modułu, do którego link wrzuciłem w 2 poście?

Link do komentarza
Share on other sites

Do komunikacji Arduino z modułem GSM Sim800l, wykorzystuję bibliotekę ze strony producenta Sim800l.h, która wymaga również zastosowania biblioteki SoftwareSerial.h. Wszystko działa pięknie, do momentu gdy chcę wykorzystać ekspander wyprowadzeń PCF8574. Wrzucam do programu bibliotekę PCF8574.h, znalezioną gdzieś w internecie i wyrzuca błąd taki jak powyżej. Czemu coś takiego się dzieje? :/

Link do komentarza
Share on other sites

Ktoś miał, opisywał to na forum ArduinoPolska, zmienił bibliotekę PCF8574 na inną i tak rozwiązał problem. Jak tylko się przymierzasz to po prostu uruchom i sprawdź czy jest konflikt, może akurat od razu trafisz na zgodne. Większą pewność działania daje UART sprzętowy, np. MEGA ma 4, LEONARDO/MICRO ma jeden, ale "dodatkowy" - nieużywany do komunikacji z PC.

Link do komentarza
Share on other sites

Akurat obsługa PCF8574 to pięć linijek na krzyż i można się obyć bez żadnej biblioteki - zależy co się ma zamiar robić (w większości przypadków wystarczą odpowiedniki read8 i write8). No - chyba że jest konflikt z Wire...

  • Lubię! 1
Link do komentarza
Share on other sites

Jak mówi ethanak zależy co ma się zamiar robić. Ja w jednym ze swoich projektów wykorzystałem 5 takich ekspanderów (pracujących jako wyjścia)  i nie korzystałem z biblioteki 8574.h lecz z Wire.h. W setup oczywiście Wire.begin(), a później zapis do PCF8574 realizowałem jako:

Wire.beginTransmission(adresPCF);
Wire.write(bajt_danych);
Wire.endTransmission();

i to wszystko - działa.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Odczyt jest nawet mniej skomplikowany:

Wire.requestFrom(adresPCF, (uint8_t)1);
bajt_danych = Wire.read();

Trzeba tylko pamiętać, aby wcześniej wrzucić jedynki do bitów, które się będzie czytać.

Nie mówiłem, że to 5 linijek? 🙂

Edytowano przez ethanak
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.