Как данные char из mqtt изменить в int?

Помогиnе разобраться. Слушаю топик на mqtt сервере, когда данные приходят то имеют формат char. Не могу переделать их в Int, чтобы дальше использовать.

void mqttCallback(char *topic, byte *payload, unsigned int length) {
Serial.print("Message received on topic: ");
Serial.println(topic);
Serial.print(“Message:”);
for (unsigned int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
if(String(topic) == “Hum”)
{
hum_data = ((char) payload[i]);
}

atoi();

http://cppstudio.com/post/803/

1 лайк

Здравствуйте! Это опять Вчерашний Я! =)

Главное чтобы помогло )))

1 лайк

Делаю так: hum_data = atoi((char) payload[i]);
Ругается, не компилирует:
Compilation error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]

hum_data = atoi(payload);

2 лайка

Тоже ругается:
Compilation error: invalid conversion from ‘byte*’ {aka ‘unsigned char*’} to ‘const char*’ [-fpermissive]

=(

ну сделайте ему конверсию в конст чар… неужели все подсказывать надо?
hum_data = atoi((const char*)payload);

2 лайка

Видимо, так будет правильнее

3 лайка

Огромное СПАСИБО!

Радость моя, была преждевременна…стало добавлять цифры в конце значений…первые символы правильные, а потом может 3 добавить, может 23 добавить…

радость моя, покажите код полностью

int test1_data;
int test2_data;
#include <microDS3231.h>
MicroDS3231 rtc;

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// WiFi settings
const char *ssid = "xxxx";             // Replace with your WiFi name
const char *password = "xxxx";   // Replace with your WiFi password

// MQTT Broker settings
const char *mqtt_broker = "x.x.x.x";  // EMQX broker endpoint
const char *mqtt_topic = "Hum";     // MQTT topic
const char *mqtt_topic_2 = "Tmp";     // MQTT topic
const char *mqtt_topic_3 = "Test_1";     // MQTT topic
const char *mqtt_topic_4 = "Test_2";     // MQTT topic
const char *mqtt_username = "xxxx";  // MQTT username for authentication
const char *mqtt_password = "xxxxx";  // MQTT password for authentication
const int mqtt_port = xxxx;  // MQTT port (TCP)

WiFiClient espClient;
PubSubClient mqtt_client(espClient);
void connectToWiFi();
void connectToMQTTBroker();
void mqttCallback(char *topic, byte *payload, unsigned int length);


#include <Arduino.h>
#include <SensirionI2cSht3x.h>
#include <Wire.h>

SensirionI2cSht3x sensor;

static char errorMessage[64];
static int16_t error;

void setup() {

    Serial.begin(115200);
    
    while (!Serial) {
        delay(100);
    }
    Wire.begin();
    sensor.begin(Wire, SHT30_I2C_ADDR_44);

    sensor.stopMeasurement();
    delay(1);
    sensor.softReset();
    delay(100);
    uint16_t aStatusRegister = 0u;
    error = sensor.readStatusRegister(aStatusRegister);
    if (error != NO_ERROR) {
        Serial.print("Error trying to execute readStatusRegister(): ");
        errorToString(error, errorMessage, sizeof errorMessage);
        Serial.println(errorMessage);
        return;
    }
    Serial.print("aStatusRegister: ");
    Serial.print(aStatusRegister);
    Serial.println();
    error = sensor.startPeriodicMeasurement(REPEATABILITY_MEDIUM,
                                            MPS_ONE_PER_SECOND);
    if (error != NO_ERROR) {
        Serial.print("Error trying to execute startPeriodicMeasurement(): ");
        errorToString(error, errorMessage, sizeof errorMessage);
        Serial.println(errorMessage);
        return;
    }

    connectToWiFi();
    mqtt_client.setServer(mqtt_broker, mqtt_port);
    mqtt_client.setCallback(mqttCallback);
    connectToMQTTBroker();
}

void connectToWiFi() {
    WiFi.begin(ssid, password);
    Serial.print("Connecting to WiFi");
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("\nConnected to the WiFi network");
}

void connectToMQTTBroker() {
    while (!mqtt_client.connected()) {
        String client_id = "esp8266-client-" + String(WiFi.macAddress());
        Serial.printf("Connecting to MQTT Broker as %s.....\n", client_id.c_str());
        if (mqtt_client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
            Serial.println("Connected to MQTT broker");
            mqtt_client.subscribe(mqtt_topic_3);
            mqtt_client.subscribe(mqtt_topic_4);
           // Publish message upon successful connection
            mqtt_client.publish(mqtt_topic_3, "333");
            mqtt_client.publish(mqtt_topic_4, "444");
        } else {
            Serial.print("Failed to connect to MQTT broker, rc=");
            Serial.print(mqtt_client.state());
            Serial.println(" try again in 5 seconds");
            delay(5000);
        }
    }
}

void mqttCallback(char *topic, byte *payload, unsigned int length) {
    Serial.print("Message received on topic: ");
    Serial.println(topic);
    Serial.print("Message:");
    for (unsigned int i = 0; i < length; i++) {
        Serial.print((char) payload[i]);
    if(String(topic) == "Test_1") // проверяем из нужного ли нам топика пришли данные 
  {
  test1_data = atoi((const char*)payload);
  }
  if(String(topic) == "Test_2") // проверяем из нужного ли нам топика пришли данные 
  {
  test2_data = atoi((const char*)payload); // преобразуем полученные данные в тип integer
  }
    

    }
    Serial.println();
    Serial.println("-----------------------");

}


void loop() {


  
  if (!mqtt_client.connected()) {
        connectToMQTTBroker();
    }
    mqtt_client.loop();

    float aTemperature = 0.0;
    float aHumidity = 0.0;
    error = sensor.blockingReadMeasurement(aTemperature, aHumidity);
    if (error != NO_ERROR) {
        Serial.print("Error trying to execute blockingReadMeasurement(): ");
        errorToString(error, errorMessage, sizeof errorMessage);
        Serial.println(errorMessage);
        return;
    }
    Serial.print("aTemperature: ");
    Serial.print(aTemperature);
    Serial.print("\t");
    Serial.print("aHumidity: ");
    Serial.print(aHumidity);
    Serial.println();
    Serial.print("Test_1: ");
    Serial.println(test1_data);
    Serial.print("Test_2: ");
    Serial.println(test2_data);


String Hum;
Hum=aHumidity;
mqtt_client.publish(mqtt_topic, (char*) Hum.c_str());

String Tmp;
Tmp=aTemperature;
mqtt_client.publish(mqtt_topic_2, (char*) Tmp.c_str());

}

Числа с 10 до 99 передаёт правильно…
до 10 к числам прибавляет 3 или 4…после 99 так по 3 или 2 числа прибавлять начинает к правильному числу… =(

Отформатируйте свой код и сразу станет видно, что за бредятина у вас написана:

Вы преобразуете строчку payload в числа столько раз, сколько у вас символов в строке?

1 лайк

Вместо 1 → 13
2 ->23 и т.д
с 10 до 99 всё норм…после 100 начинает 464 добавлять, к 1000

Вот так попробуйте

void mqttCallback(char *topic, byte *payload, unsigned int length)
{
    Serial.print("Message received on topic: ");
    Serial.println(topic);
    Serial.print("Message:");
    for (unsigned int i = 0; i < length; i++)
    {
        Serial.print((char)payload[i]);
    }
    if (String(topic) == "Test_1") // проверяем из нужного ли нам топика пришли данные
    {
        test1_data = atoi((const char *)payload);
    }
    else if (String(topic) == "Test_2") // проверяем из нужного ли нам топика пришли данные
    {
        test2_data = atoi((const char *)payload); // преобразуем полученные данные в тип integer
    }

    Serial.println();
    Serial.println("-----------------------");
}
1 лайк

Скорее всего массив payload не имеет терминатора, поэтому atoi и глючит.

1 лайк

Потому char *payload было бы правильнее

1 лайк

какая разница? Если терминатора нет, от смены типа он не появится.
Нужно скопировать length байтов в локальный массив, добавить в конце ноль и это скормить atoi

2 лайка