Skocz do zawartości
SiaQ

Moduł I2C dla wyświetlacza oraz moduł PCF8574

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?

Udostępnij ten post


Link to post
Share on other sites

SiaQ, które konkretnie biblioteki używasz, skąd je pobrałeś? Jak dokładnie brzmi błąd wyświetlany w Arduino?

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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 😉

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

SiaQ, a skąd tam się bierze cały czas jeszcze SoftwareSerial? Używasz go w programie?

Udostępnij ten post


Link to post
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?

Udostępnij ten post


Link to post
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? :/

Udostępnij ten post


Link to post
Share on other sites

Wykopaliska, 

też mam zamiar użyć pcf8574, też korzystam z softwareSerial do komunikacji z sim800l... 

Ktoś miał podobne problemy jak założyciel wątku? 

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


Link to post
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!

Gość
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...