ОШИБКА: вернуть reinterpret_cast<T>(pgm_read_ptr(p));

arduino-uno esp8266 web-server esp8266webserver dht11

Мне нужно обновить данные датчика DHT на веб-сервере в формате JSON, используя ESP8266. Это мой код.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#include <ArduinoJson.h>

const char* ssid = "YOUR_SSID";
const char* password = "YOUR PASSWORD";
const int dhtPin = D4;
DHT dht(dhtPin, DHT11);
ESP8266WebServer server(80);

void handleRoot() {
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();

  if (isnan(temperature) || isnan(humidity)) {
     server.send(500, "text/plain", "Failed to read from DHT sensor");
    return;
  }

  StaticJsonDocument<200> jsonDoc;
  jsonDoc["temperature"] = temperature;
  jsonDoc["humidity"] = humidity;

  String jsonString;
  serializeJson(jsonDoc, jsonString);

  server.send(200, "application/json", jsonString);
}

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }

  Serial.println("Connected to WiFi");
  dht.begin();
  server.on("/", handleRoot);
  server.begin();
  Serial.println("Server started");
}

void loop() {
  server.handleClient();
}

Но я получил ошибку типа:

In file included from c:\Users\Kuralmozhi.R\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Polyfills/static_array.hpp:11:0,
                 from c:\Users\Kuralmozhi.R\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Numbers/FloatTraits.hpp:14,
                 from c:\Users\Kuralmozhi.R\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Numbers/FloatParts.hpp:8,
                 from c:\Users\Kuralmozhi.R\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Json/TextFormatter.hpp:11,
                 from c:\Users\Kuralmozhi.R\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Json/JsonSerializer.hpp:7,
                 from c:\Users\Kuralmozhi.R\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Variant/ConverterImpl.hpp:7,
                 from c:\Users\Kuralmozhi.R\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson.hpp:37,
                 from c:\Users\Kuralmozhi.R\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson.h:9,
                 from C:\Users\Kuralmozhi.R\Downloads\ID_2\ID_2.ino:5:
c:\Users\Kuralmozhi.R\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Polyfills/pgmspace_generic.hpp: In instantiation of 'typename ArduinoJson6193_F1::enable_if<ArduinoJson6193_F1::is_pointer<T>::value, T>::type ArduinoJson6193_F1::pgm_read(const void*) [with T = const __FlashStringHelper*; typename ArduinoJson6193_F1::enable_if<ArduinoJson6193_F1::is_pointer<T>::value, T>::type = const __FlashStringHelper*]':
c:\Users\Kuralmozhi.R\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Deserialization/DeserializationError.hpp:85:12:   required from here
c:\Users\Kuralmozhi.R\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Polyfills/pgmspace_generic.hpp:15:45: error: 'const void*' is not a pointer-to-object type
   return reinterpret_cast<T>(pgm_read_ptr(p));
                                             ^

exit status 1

Compilation error: exit status 1

Я не знаю, как устранить эту ошибку. Пожалуйста, предложите мне несколько идей!


Я пытался обновить ESP8266. Но сейчас это выглядит вот так:

Variables and constants in RAM (global, static), used 28984 / 80192 bytes (36%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ DATA     1504     initialized variables
╠══ RODATA   1376     constants       
╚══ BSS      26104    zeroed variables
Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 60439 / 65536 bytes (92%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ ICACHE   32768    reserved space for flash instruction cache
╚══ IRAM     27671    code in IRAM    
Code in flash (default, ICACHE_FLASH_ATTR), used 273120 / 1048576 bytes (26%)
║   SEGMENT  BYTES    DESCRIPTION
╚══ IROM     273120   code in flash 

, 👍0

Обсуждение

Пожалуйста, скопируйте и вставьте фактическую ошибку, включая номер строки, а не что-то вроде ошибки. Отредактируйте свой вопрос, чтобы сделать это., @Nick Gammon

Похоже на [эту проблему](https://github.com/bblanchon/ArduinoJson/issues/1442)., @Fahad

Я не могу понять эту проблему. Можете ли вы объяснить вкратце?, @Kuralmozhi

Какую версию Arduino IDE вы используете?, @Nick Gammon

На странице, на которую ссылается Фахад, предлагается: Я предлагаю вам обновить или переустановить ядро ESP8266 для Arduino. Если это по-прежнему не работает, вы можете отключить поддержку PROGMEM, пока мы не выясним, в чем дело (см. ARDUINOJSON_ENABLE_PROGMEM)., @Nick Gammon

Какая у вас проблема с выводом после обновления? На мой взгляд, это удачная сборка., @the busybee


1 ответ


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

4

Используя информацию из ссылки, которую Фахад предоставил в комментариях, я могу только предположить: ваш ESP8266 определения плат устарели, а старая версия определений плат ESP8266 содержит ошибку.

В сети имеется устаревший URL-адрес JSON определения платы ESP8266. Я думаю, что вы нашли его. URL-адрес все еще работает, но больше не обновляется. Проверьте версию определений вашей платы ESP8266: откройте диспетчер плат (Инструменты -> Плата -> Менеджер плат), найдите ESP8266 и убедитесь, что версия не ниже 3.1.2 (текущая версия). версию на момент написания этой статьи; я не знаю самой низкой версии, в которой исправлена эта ошибка).

Если Board Manager не предлагает обновиться до версии 3.1.2 (или более поздней), вам может потребоваться указать текущий URL-адрес определений платы в Файл -> > Настройки -> Вкладка «Настройки»; -> Дополнительные URL-адреса менеджера плат. Удалите старый URL-адрес ESP8266, но не удаляйте URL-адреса других плат. Затем попробуйте еще раз обновиться с помощью Board Manager:

https://arduino.esp8266.com/stable/package_esp8266com_index.json
,

Это работает! Огромное спасибо, Оритена!!, @Kuralmozhi