Соединение MQTT не распознается в void loop()

Я пытаюсь опубликовать показания MPU 9250 в Adafruit IO, отправляя данные из ESP32. Соединение Wi-Fi устанавливается, но код не входит в if(mqtt.connected()) внутри void loop(), тогда как он входит в ту же команду внутри void setup().

Я уверен, что проблем с подключением нет, потому что как только я меняю if(mqtt.connected()) на while(mqtt.connected()) внутри setup(), код непрерывно переходит в цикл while.

Почему код не входит в команду if и как это можно решить?

#include <WiFi.h >
#include <Adafruit_MQTT_Client.h>
#include <MPU9250.h>

#define wifi "********"
#define password "********"
#define server "io.adafruit.com"
#define port 1883
#define username "*******"
#define key "********"

WiFiClient esp;
MPU9250 IMU(Wire,0x68);
Adafruit_MQTT_Client mqtt(&esp, server, port, username, key);
Adafruit_MQTT_Publish feed = Adafruit_MQTT_Publish(&mqtt, username"feeds/accelerodata");

void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println("Adafruit MQTT Demo");
  Serial.println("Connecting to");
  Serial.println(wifi);
  WiFi.begin(wifi,password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting...");
  }
  Serial.println("Connected");
  Serial.println("IP Address: ");
  Serial.println(WiFi.localIP());
  Serial.println("Connecting to MQTT");
  
  if (mqtt.connect()) {
    Serial.println("MQTT Connected");
  }
} 

void loop () {
  Serial.println("Test line to check if code reaches inside loop");
  delay(1000);

  if (mqtt.connected()) {
    int data=IMU.getAccelX_mss();
    Serial.println("\nSending accelero data");
    Serial.println(data);
    Serial.println("....");
    if (feed.publish(data)) {
      Serial.println("Success");
    } else {
      Serial.println("Fail");
    }
    delay(800);
  }
}

, 👍2

Обсуждение

Я считаю, что между username и частью feeds /..." в вашем определении канала должно быть /. Т.е.: Adafruit_MQTT_Publish feed=Adafruit_MQTT_Publish(&mqtt, username"/ feeds/accelerodata");`, @StarCat

Я думаю, это не должно иметь значения, пока они находятся внутри " ". В любом случае, я тоже попытался это изменить..., @Ajay Raj

Это имеет значение, потому что имя пользователя и строка, заключенная в кавычки, образуют (более длинную) единую строку. Adafruit IO использует первую часть строки (вплоть до первого / ) для идентификации отдельных пользователей, использующих их сервис. Часть после первого / используется для поиска канала, который вы (как пользователь Adafruit IO) определили самостоятельно. Посмотрите на примеры, поставляемые с библиотекой ввода-вывода Adafruit. Все они используют символ /., @StarCat


1 ответ


1

Я считаю, что ваша проблема заключается в том, что вы пытаетесь использовать соединение MQTT до того, как оно будет подключено. Итак, ваш чек:

if(mqtt.connected())

это всегда ЛОЖЬ, так как на самом деле она не связана. Информация о библиотеке Adafruit здесь:

Adafruit MQTT

Говорит инициализировать MQTT следующим образом:

// Функция подключения и повторного подключения по мере необходимости к серверу MQTT.
// Должен быть вызван в функции цикла, и он позаботится о подключении.
void MQTT_connect() {
  int8_t ret;

  // Стоп, если уже подключен.
  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to MQTT... ");

  while ((ret = mqtt.connect()) != 0) { // connect вернет 0 для подключенного
       Serial.println(mqtt.connectErrorString(ret));
       Serial.println("Retrying MQTT connection in 5 seconds...");
       mqtt.disconnect();
       delay(5000);  // подождите 5 секунд
  }
  Serial.println("MQTT Connected!");
}
,

Спасибо за ссылку.. Но соединение не устанавливается. Приведенная выше функция выводит сообщение "сбой подключения". Какие могут быть возможные проблемы? Как устранить проблему, @Ajay Raj

Вы использовали правильное имя пользователя и ключ? Попробуйте использовать некоторые примеры кода из библиотеки ввода-вывода Adafruit., @StarCat

Если у вас есть бесплатная учетная запись Adafruit IO, также следите за тем, чтобы не превышать максимальную скорость передачи данных (30 точек данных в минуту)., @StarCat

Ключ правильный.. На самом деле частота сбора данных изначально была выше (выше 30 баллов в минуту), которую я уменьшил. Однако никакого улучшения в состоянии не произошло., @Ajay Raj