• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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?
 
Сверху Снизу