ESP32 com PN5180 -> Compilation error: cannot convert 'ISO15693ErrorCode' to 'ISO15693ErrorCode* (*)()'

Olá Pessoal, estou trabalhando em um projeto pessoal e nele estou usando a lib
PN5180-Library, para leitura do sensor FreeStyle Libre. O código funcionava sem esse erro há uns 2 meses atrás, voltei a trabalhar nele e agora esta dando o seguinte erro.

O que estou usando: ESP32, PN5180 com a lib mencionada a cima.

D:\_Projects\iot\nfc-esp32-pn5180\nfc-esp32-pn5180.ino: In function 'void loop()':
D:\_Projects\iot\nfc-esp32-pn5180\nfc-esp32-pn5180.ino:61:32: error: cannot convert 'ISO15693ErrorCode' to 'ISO15693ErrorCode* (*)()'
   61 |      Serial.print(nfc.strerror(rc));
      |                                ^~
      |                                |
      |                                ISO15693ErrorCode
In file included from c:\users\user\appdata\local\arduino15\packages\esp32\tools\esp-x32\2302\xtensa-esp32-elf\sys-include\errno.h:9,
                 from C:\Users\User\AppData\Local\Arduino15\packages\esp32\tools\esp32-arduino-libs\idf-release_v5.1-33fbade6\esp32/include/newlib/platform_include/errno.h:10,
                 from C:\Users\User\AppData\Local\Arduino15\packages\esp32\tools\esp32-arduino-libs\idf-release_v5.1-33fbade6\esp32/include/lwip/port/esp32xx/include/arch/cc.h:12,
                 from C:\Users\User\AppData\Local\Arduino15\packages\esp32\tools\esp32-arduino-libs\idf-release_v5.1-33fbade6\esp32/include/lwip/lwip/src/include/lwip/arch.h:48,
                 from C:\Users\User\AppData\Local\Arduino15\packages\esp32\tools\esp32-arduino-libs\idf-release_v5.1-33fbade6\esp32/include/lwip/lwip/src/include/lwip/debug.h:40,
                 from C:\Users\User\AppData\Local\Arduino15\packages\esp32\tools\esp32-arduino-libs\idf-release_v5.1-33fbade6\esp32/include/lwip/lwip/src/include/lwip/opt.h:52,
                 from C:\Users\User\AppData\Local\Arduino15\packages\esp32\tools\esp32-arduino-libs\idf-release_v5.1-33fbade6\esp32/include/lwip/lwip/src/include/lwip/ip_addr.h:40,
                 from C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.5\cores\esp32/IPAddress.h:25,
                 from C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.5\cores\esp32/Arduino.h:196,
                 from C:\Users\User\AppData\Local\Temp\arduino\sketches\E7AE8DAD514D68427A21B455B3E0B512\sketch\nfc-esp32-pn5180.ino.cpp:1:
c:\Users\User\Documents\Arduino\libraries\PN5180-Library/PN5180ISO15693.h:67:57: note:   initializing argument 1 of 'const __FlashStringHelper* PN5180ISO15693::strerror(ISO15693ErrorCode* (*)())'
   67 |   const __FlashStringHelper *strerror(ISO15693ErrorCode errno);
      |                                                         ^

exit status 1

Compilation error: cannot convert 'ISO15693ErrorCode' to 'ISO15693ErrorCode* (*)()'

O erro ocorre na chamado para mostrar o erro.

Serial.print(nfc.strerror(rc));

Código:

#include <PN5180ISO15693.h>

const byte nssPin = 5;
const byte busyPin = 16;
const byte resetPin = 17;

PN5180ISO15693 nfc(nssPin, busyPin, resetPin);

void setup() {
    Serial.begin(115200);
    Serial.println("Inicializando o leitor...");
    
    nfc.begin();
    Serial.println("Redefinindo o leitor...");
    nfc.reset();
    Serial.println("Habilitando o campo NFC...");
    
    uint8_t productVersion[2];
    nfc.readEEprom(PRODUCT_VERSION, productVersion, sizeof(productVersion));
    if (0xff == productVersion[1]) {
        Serial.println(F("Falha na inicialização do leitor!"));
        Serial.println(F("Pressione reset para tentar novamente..."));
        Serial.flush();
        exit(-1);
    }

    Serial.println("Pronto para utilização...");
    nfc.setupRF();
}

void loop() {
    uint8_t uid[8];
    ISO15693ErrorCode rc = nfc.getInventory(uid);
    
    if (rc == ISO15693_EC_OK) {
        Serial.print(F("Dispositivo NFC Detectado... ID: "));
        for (int j = 0; j < sizeof(uid); j++) {
            Serial.print(uid[j], HEX);
            Serial.print(" ");
        }
        Serial.println();
    } else {
        Serial.print(nfc.strerror(rc));
    }

    delay(1000);
}

Esquema pin.

Podemos esperar para ver se alguém mais experiente em programação responde.

Em outro tópico, da seção em inglês, um usuário bem experiente disse que nfc é uma matriz, de modo que essa linha aqui:

ISO15693ErrorCode rc = nfc.getInventory(uid);

deveria ser na verdade:

ISO15693ErrorCode rc = nfc[i].getInventory(uid);

mas o programa usado no outro tópico é diferente do seu, pois a configuração do erro está dentro de um loop for e é de 2022.

O que parece para mim é que a função strerror esperava receber um ponteiro como argumento.

Se o mesmo código funcionava antes e deixou de funcionar é sinal de que a atualização de firmware das placas ESP32 de 2.x para a 3.x pode ter prejudicado a biblioteca. Verifique na IDE do Arduino qual é a versão do firmware ESP32 e, se for o caso, retorne para a versão 2.x e veja se funciona.

@Brazilino, obrigado por responder. Pelo que entendi, vendo o código do tópico que mencionou, estão sendo usados mais de um módulo PN5180, e por isso era necessário especificar a posição."

nfc[i].getInventory(uid);

Agradeço muito a sua disponibilidade.

Vou experimentar a questão do firmware, mas acredito que seja o caso, pois é o mesmo esp que usava antes e ele não teve mudança.

Caso você ou alguém tenha mais sugestões, seria de grande apreço.

Solução!

Em teste realizado pelo colega Dejair, a solução é fazer um down das boards para o esp32, conforme print a baixo.

1.0.6 é a versão que deu certo com a PN5180-Library.

Bacana! Obrigado por dar o feedback. Pode ajudar outras pessoas.

Por outro lado, a versão 1.0.6 do software das placas ESP32 foi lançada há mais de 2 anos atrás. Eu acho que seria interessante tentar buscar outra biblioteca mais moderna, se houver, ou tentar trabalhar nela para adequá-la às funções mais modernas.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.