Недопустимое преобразование из int в char * в Arduino IDE

#arduino #arduino-esp8266

#arduino #arduino-esp8266

Вопрос:

Я попытался закодировать датчик CO2 с помощью ESP 01, который каждые 10 секунд публикует значение ppm для брокера MQTT. Все работает, кроме части публикации. Я всегда получаю сообщение об ошибке, которое сообщает мне, что я не могу преобразовать int в char *. Я пробовал много вещей, но ничего не получалось.

Можете ли вы мне помочь? Если вам нужна дополнительная информация, просто спросите.

Это ошибка, полученная:

 Arduino: 1.8.13 (Windows 10), Board: "Generic ESP8266 Module, 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), dtr (aka nodemcu), 26 MHz, 40MHz, DOUT (compatible), 1MB (FS:64KB OTA:~470KB), 2, nonos-sdk 2.2.1 100 (190703), v2 Lower Memory, Disabled, None, Only Sketch, 115200"





















C:UserssevisDesktopco2 - Kopieco2co2.ino: In function 'void loop()':

co2:53:26: error: invalid conversion from 'uint16_t {aka short unsigned int}' to 'char*' [-fpermissive]

     sCO2 = sensor.getCO2();

                          ^

exit status 1

invalid conversion from 'uint16_t {aka short unsigned int}' to 'char*' [-fpermissive]



This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

  

Вот код:

 #include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <Adafruit_MQTT_FONA.h>
#include <Wire.h>
#include "SparkFunCCS811.h"

#define CCS_ADDR 0x5B

#define AIO_SERVER      "192.168.1.123"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "****"
#define AIO_KEY         "**********"

char* sCO2;
int timer;

CCS811 sensor(CCS_ADDR);

WiFiManager wifiManager;

WiFiClient client;

Adafruit_MQTT_Client mqtt(amp;client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

void setup() {
    Wire.begin(0, 2);
    Serial.begin(9600);
    
    wifiManager.autoConnect("AutoConnectAP");
    Serial.println("Wifi connected!");
    
    MQTT_connect();

    while(sensor.begin() == false) {
    Serial.println("No Sensor");
    mqtt.publish("Raum1_co2", "No Sensor");
    delay(5000);
  }
}

void loop() {
  MQTT_connect();
  
  //mqtt.publish("Raum1_co2", "1050");
  
  if (sensor.dataAvailable()) {
    sensor.readAlgorithmResults();

    sCO2 = sensor.getCO2();
    mqtt.publish("Raum1/CO2", sCO2);
    Serial.print(sCO2);
    Serial.println("ppm : Data published");
  }
  delay(10000);
}

void MQTT_connect() {
  int8_t ret;

  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }
  while (mqtt.connect()) {
       mqtt.disconnect();
       delay(5000);
  }
}
  

Ответ №1:

Существует число, возвращаемое датчиком, и есть указатель на символы, которые вы хотите использовать для его сохранения. Указатель неинициализирован и указывает в никуда (ну, это глобальная переменная, поэтому она указывает на адрес 0, но может быть что угодно).

Вы пытаетесь изменить это местоположение, используя какое-то «почти» случайное число, возвращаемое датчиком. Это недопустимо (не без явного приведения к типу — в данном случае «да, я хочу выстрелить себе в голову»).

Быстрое исправление будет изменено char* sCO2; на String sCO2; поскольку класс String реализует присваивание из uint16_t. И функция печати может обрабатывать печать переменной строкового типа.

Медленное исправление использует char sCO2[6]; // должно быть достаточно большим, чтобы хранить символ завершения 0 ..65535 ноль, и вам нужно преобразовать это целое число без знака в это пространство в вашем массиве символов. В основном используется функция utoa(value, sCO2, 10); (10 является основанием результирующей строки — она же decadic)