• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь ESP8266+MH-Z14A+Mqtt

Jeugenius

New member
Всем привет!
Обращаюсь с проблемой, которую как оказалось не могу решить самостоятельно, т.к. не имею достаточного опыта в программировании.
Суть такова: использую NodeMCU v3 (ESP 12F) в связке с датчиком CO2. Кое как сваял работающий скетч (подключение к WiFi, считывание данных с датчика и отправка в сериал).
Загвоздка в том, что в примерах кода для MQTT (PubSubClient) использованы строки и символы для отправки данных MQTT брокеру, а в моем случае данные с датчика я получаю числовые! Соответственно при компиляции скетча выскакивает ошибка интерпретации данных!
invalid conversion from 'unsigned int' to 'const char*' [-fpermissive]

Знающие и умеющие подскажите пожалуйста как решить проблему в коде!
Код:
#include <SoftwareSerial.h>; //подключаем библиотеки
#include <ESP8266WiFi.h> //подключаем библиотеки
#include <PubSubClient.h> //подключаем библиотеки

const char *ssid = "xxxx"; // Имя вайфай точки доступа
const char *password = "xxxxxxxxxx"; // Пароль от точки доступа
const char *mqtt_server = "xxxxxxxx"; // Имя сервера MQTT

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

SoftwareSerial mySerial(13, 15); // A0 - к TX сенсора, A1 - к RX
byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
unsigned char response[9];

void setup() {
  Serial.begin(9600);
  setup_wifi();
  mySerial.begin(9600);
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

// Функция подключения к WiFi
void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
// Функция получения данных от брокера
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

// Функция переподключения к MQTT брокеру
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void loop() {
  mySerial.write(cmd, 9);
  memset(response, 0, 9);
  mySerial.readBytes(response, 9);
  int i;
  byte crc = 0;
  for (i = 1; i < 8; i++) crc+=response[i];
  crc = 255 - crc;
  crc++;

  if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {
    Serial.println("CRC error: " + String(crc) + " / "+ String(response[8]));
  } else {
    unsigned int responseHigh = (unsigned int) response[2];
    unsigned int responseLow = (unsigned int) response[3];
    unsigned int ppm = (256*responseHigh) + responseLow;
    Serial.println (ppm);
    client.publish("test", ppm);
  }
  delay(10000);
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}
 

Юрий Ботов

Moderator
Команда форума
попробуйте client.publish("test", String(ppm)), если не съест (никогда не работал с mqqt...) придется так:

String ppms = String(ppm);
int ppml = ppms.length() + 1;
char databuf[ppml];
ppms.toCharArray(databuf, ppml);
client.publish("test", databuf);
 

Jeugenius

New member
попробуйте client.publish("test", String(ppm)), если не съест (никогда не работал с mqqt...) придется так:

String ppms = String(ppm);
int ppml = ppms.length() + 1;
char databuf[ppml];
ppms.toCharArray(databuf, ppml);
client.publish("test", databuf);
Огромное человеческое спасибо! Прекрасно заработало! Просто client.publish("test", String(ppm)) не прошло. А все остальное на ура!
 

Jeugenius

New member
Юрий, простите за назойливость, не могли бы вы помочь и сдругой проблемкой преобразования?:
Считываю данные с BME280, конвертирую вышеуказанным способом и отправляю в топик MQTT
Код:
int pres = bme.readPressure();
    String presss = String(pres);
    int presl = presss.length() + 1;
    char presa[presl];
    presss.toCharArray(presa, presl);
    client.publish("Pressure", presa);
Все бы хорошо но данные приходят с запятой (998,03), а после преобразования в char для топика (99803) запятая теряется. Я так понимаю это тип float? Достаточно ли мне объявить переменную float pressl?
 
Сверху Снизу