Humpa
10.Июнь.2024 11:22:15
1
Помоги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]);
}
BOOM
10.Июнь.2024 11:47:46
2
1 лайк
Humpa
10.Июнь.2024 11:51:34
3
Здравствуйте! Это опять Вчерашний Я! =)
BOOM
10.Июнь.2024 11:53:25
4
Главное чтобы помогло )))
1 лайк
Humpa
10.Июнь.2024 12:20:41
5
BOOM:
atoi();
Делаю так: hum_data = atoi((char) payload[i]);
Ругается, не компилирует:
Compilation error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
MMM
10.Июнь.2024 12:31:01
6
hum_data = atoi(payload);
2 лайка
Humpa
10.Июнь.2024 12:51:53
7
Тоже ругается:
Compilation error: invalid conversion from ‘byte*’ {aka ‘unsigned char*’} to ‘const char*’ [-fpermissive]
=(
MMM
10.Июнь.2024 12:53:31
8
ну сделайте ему конверсию в конст чар… неужели все подсказывать надо?
hum_data = atoi((const char*)payload);
2 лайка
v258
10.Июнь.2024 13:03:25
9
Видимо, так будет правильнее
3 лайка
Humpa
10.Июнь.2024 13:12:26
11
Humpa:
char
Радость моя, была преждевременна…стало добавлять цифры в конце значений…первые символы правильные, а потом может 3 добавить, может 23 добавить…
MMM
10.Июнь.2024 13:21:58
12
радость моя, покажите код полностью
Humpa
10.Июнь.2024 13:36:21
13
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());
}
Humpa
10.Июнь.2024 13:38:08
14
Числа с 10 до 99 передаёт правильно…
до 10 к числам прибавляет 3 или 4…после 99 так по 3 или 2 числа прибавлять начинает к правильному числу… =(
MMM
10.Июнь.2024 13:44:17
15
Отформатируйте свой код и сразу станет видно, что за бредятина у вас написана:
Вы преобразуете строчку payload в числа столько раз, сколько у вас символов в строке?
1 лайк
Humpa
10.Июнь.2024 14:06:40
16
Вместо 1 → 13
2 ->23 и т.д
с 10 до 99 всё норм…после 100 начинает 464 добавлять, к 1000
v258
10.Июнь.2024 14:36:32
17
Вот так попробуйте
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 лайк
MMM
10.Июнь.2024 14:51:37
18
Скорее всего массив payload не имеет терминатора, поэтому atoi и глючит.
1 лайк
v258
10.Июнь.2024 14:54:40
19
Потому char *payload
было бы правильнее
1 лайк
MMM
10.Июнь.2024 14:57:01
20
какая разница? Если терминатора нет, от смены типа он не появится.
Нужно скопировать length байтов в локальный массив, добавить в конце ноль и это скормить atoi
2 лайка