Опубликовать чип в 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);
@sanil jain, 👍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);
,
@Majenko
Смотрите также:
- Считывание данных нескольких датчиков из текстового файла, расположенного на SD-карте в Arduino/ESP32
- Не могу скомпилировать .ino с помощью библиотеки ArduinoJson
- Подключение к MQTT приводит к тому, что датчик DHT11 перестает работать?
- Как запрограммировать ардуино на чистом C/C++?
- esp32 Stack canary watchpoint срабатывает
- Преобразование byte* в int в Arduino
- Ошибка Cast from 'char*' to 'uint8_t {aka unsigned char}' loses precision [-fpermissive]
- Почему функция server.on() из "ESPAsyncWebServer.h" выполняется на стороне setup(), а не на стороне loop()?
поскольку MAC-адрес имеет длину 6 байт, вам нужно всего 12 шестнадцатеричных цифр, поэтому достаточно
macValue[13]
и либо%012x
, либо%04%08x
в качестве формата sprintf, @Jaromanda X