Опубликовать чип в mqtt с помощью ESP32-CAM

Я пытался отправить данные о температуре, влажности и давлении с датчика в MQTT с помощью ESP 32Cam и смог сделать это с помощью следующего кода:

pressure = bme.readPressure();

//Преобразуем значение в массив символов
char preString[16];
dtostrf(pressure, 1, 2, preString);
Serial.print("Pressure: ");
Serial.println(preString);
client.publish("esp32/pressure", preString);

Когда я начал со следующего кода для получения mac-адреса:

chipid=ESP.getEfuseMac();//The chip ID is essentially its MAC address(length: 6 bytes).
Serial.printf("ESP32 Chip ID = %04X",(uint16_t)(chipid>>32));//print High 2 bytes
Serial.printf("%08X\n",(uint32_t)chipid);//print Low 4bytes.

Но когда я попытался опубликовать идентификатор чипа, который я получал на последовательном мониторе, в MQTT, возникла следующая ошибка:

вызов перегруженной строки 'String(uint64_t)' неоднозначен

Вот мой код, который я попробовал:

char macValue[16];
String(ESP.getEfuseMac()).toCharArray(macValue,16);
client.publish("esp32/ChipID", macValue);

, 👍2


1 ответ


Лучший ответ:

2

Вам лучше отформатировать его красиво, чем полагаться на String...

char macValue[17]; // Не забудьте один байт для завершающего NULL...
uint64_t mac = ESP.getEFuseMac();
sprintf(macValue, "%016x", mac);
client.publish("esp32/ChipID", macValue);

Однако я не уверен, что sprintf может напрямую справиться с таким 64-битным значением. Если нет, вы можете разделить его:

char macValue[17]; // Не забудьте один байт для завершающего NULL...
uint64_t mac = ESP.getEFuseMac();
uint32_t hi = mac >> 32;
uint32_t lo = mac;
sprintf(macValue, "%08x%08x", hi, lo);
client.publish("esp32/ChipID", macValue);
,

поскольку MAC-адрес имеет длину 6 байт, вам нужно всего 12 шестнадцатеричных цифр, поэтому достаточно macValue[13] и либо %012x, либо %04%08x в качестве формата sprintf, @Jaromanda X