Соединение 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);
}
}
@Ajay Raj, 👍2
Обсуждение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
- esp32-cam публикует изображение в mqtt
- Контакты ESP32 не помещаются в беспаянную макетную плату
- Публиковать данные json в mqtt
- Не удалось подключиться к брокеру MQTT через esp8266/32 и pub/sub client
- После восстановления смещения BNO055 на датчике все значения калибровки равны 0.
- Увеличить частоту дискретизации на плате ESP32
- PubSubClient: Подписка работает, но обратный вызов никогда не вызывался
- Подключение ESP32 через MQTT
Я считаю, что между
username
и частьюfeeds /..." в вашем определении канала должно быть
/. Т.е.:
Adafruit_MQTT_Publish feed=Adafruit_MQTT_Publish(&mqtt, username"/ feeds/accelerodata");`, @StarCatЯ думаю, это не должно иметь значения, пока они находятся внутри " ". В любом случае, я тоже попытался это изменить..., @Ajay Raj
Это имеет значение, потому что имя пользователя и строка, заключенная в кавычки, образуют (более длинную) единую строку. Adafruit IO использует первую часть строки (вплоть до первого
/
) для идентификации отдельных пользователей, использующих их сервис. Часть после первого/
используется для поиска канала, который вы (как пользователь Adafruit IO) определили самостоятельно. Посмотрите на примеры, поставляемые с библиотекой ввода-вывода Adafruit. Все они используют символ/
., @StarCat