【问题标题】:ESP32 with MPU9250 doesn't publish sensor readings to MQTT(mosquitto) broker & to node-red带有 MPU9250 的 ESP32 不会将传感器读数发布到 MQTT(mosquitto) 代理和节点红色
【发布时间】:2021-08-26 12:04:45
【问题描述】:
#include <MPU9250_asukiaaa.h>
#include <WiFi.h>             //for wifi connection
#include <PubSubClient.h>     //pubsub model
#define mqtt_server "127.0.0.1"
#define mqttaX  "val/aX"
#define mqttaY  "val/aY"
#define mqttaZ  "val/aZ"
#define mqttaSqrt  "val/Sqrt"
#define mqttgX  "val/gX"
#define mqttgY "val/gY"
#define mqttgZ  "val/gZ"
#define mqttmDirection "val/Dir"
#define mqttmX "val/mX"
#define mqttmY "val/mY"
#define mqttmZ "val/mZ"

const char *ssid ="";             //network sample
const char *password ="";

WiFiClient espClient;
PubSubClient client(espClient);



#ifdef _ESP32_HAL_I2C_H_
#define SDA_PIN 22
#define SCL_PIN 21
#endif

MPU9250_asukiaaa mySensor;
float aX, aY, aZ, aSqrt, gX, gY, gZ, mDirection, mX, mY, mZ;      //mpu9250 readings



void setup() {

  Serial.begin(115200);
  while (!Serial);
  Serial.println("started");

  //begin wifi connection
  Serial.print("Connecting to : ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(2000);
  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());

  client.setServer(mqtt_server,1883);
 

  // end of wifi connection
  
  

#ifdef _ESP32_HAL_I2C_H_ // For ESP32
  Wire.begin(SDA_PIN, SCL_PIN);
  mySensor.setWire(&Wire);
#endif

  mySensor.beginAccel();
  mySensor.beginGyro();
  mySensor.beginMag();

  // You can set your own offset for mag values
  // mySensor.magXOffset = -50;
  // mySensor.magYOffset = -55;
  // mySensor.magZOffset = -10;
  
  
 
}

/*
void reconnect() {                                //RECONNECT TO WIFI-FUNCTION
  // Loop until we're reconnected
  int counter = 0;
  while (!client.connected()) {
    if (counter==5){
      ESP.restart();
    }
    counter+=1;
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
   
    if (client.connect("mpu9250")) {
      Serial.println("connected");
    } 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() {
  
  /*if(!client.connected())
  {
    reconnect(); 
  }*/
  uint8_t sensorId;
  if (mySensor.readId(&sensorId) == 0) {
    Serial.println("sensorId: " + String(sensorId));
  } else {
    Serial.println("Cannot read sensorId");
  }

  if (mySensor.accelUpdate() == 0) {
    aX = mySensor.accelX();
    aY = mySensor.accelY();
    aZ = mySensor.accelZ();
    aSqrt = mySensor.accelSqrt();
    Serial.println("accelX: " + String(aX));
    Serial.println("accelY: " + String(aY));
    Serial.println("accelZ: " + String(aZ));
    Serial.println("accelSqrt: " + String(aSqrt));
  } else {
    Serial.println("Cannot read accel values");
  }

  if (mySensor.gyroUpdate() == 0) {
    gX = mySensor.gyroX();
    gY = mySensor.gyroY();
    gZ = mySensor.gyroZ();
    Serial.println("gyroX: " + String(gX));
    Serial.println("gyroY: " + String(gY));
    Serial.println("gyroZ: " + String(gZ));
  } else {
    Serial.println("Cannot read gyro values");
  }

  if (mySensor.magUpdate() == 0) {
    mX = mySensor.magX();
    mY = mySensor.magY();
    mZ = mySensor.magZ();
    mDirection = mySensor.magHorizDirection();
    Serial.println("magX: " + String(mX));
    Serial.println("maxY: " + String(mY));
    Serial.println("magZ: " + String(mZ));
    Serial.println("horizontal direction: " + String(mDirection));
  } else {
    Serial.println("Cannot read mag values");
  }

  Serial.println("at " + String(millis()) + "ms");
  Serial.println(""); // Add an empty line
  delay(1000);
  
  client.publish(mqttaX,String(aX).c_str(),true);     //VALUES TO STRING 
  client.publish(mqttaY,String(aY).c_str(),true);
  client.publish(mqttaZ,String(aZ).c_str(),true);
  client.publish(mqttaSqrt,String(aSqrt).c_str(),true);
  client.publish(mqttgX,String(gX).c_str(),true);
  client.publish(mqttgY,String(gY).c_str(),true);
  client.publish(mqttgZ,String(gZ).c_str(),true);
  client.publish(mqttmX,String(mX).c_str(),true);
  client.publish(mqttmY,String(mY).c_str(),true);
  client.publish(mqttmZ,String(mZ).c_str(),true);  
}

尽管代码似乎运行良好,但我在 mqtt 蚊子代理方面遇到了一段时间的问题。过去我没有将 esp32 和 mpu9250 用于物联网项目,我也从未使用过 mqtt 代理和节点-红色,所以这些工具对我来说是新的。

节点红色 json :

[{"id":"aeb0197d.7d1fd8","type":"tab","label":"Flow 2","disabled":false,"info":""},{"id":"aeb99911.35b6c8","type":"debug","z":"aeb0197d.7d1fd8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":600,"y":280,"wires":[]},{"id":"c040a897.3ffcb8","type":"mqtt in","z":"aeb0197d.7d1fd8","name":"","topic":"val/aY","qos":"2","datatype":"auto","broker":"3d5e34f4.9a452c","x":210,"y":320,"wires":[["aeb99911.35b6c8"]]},{"id":"e55bea67.26a468","type":"mqtt in","z":"aeb0197d.7d1fd8","name":"","topic":"val/aZ","qos":"2","datatype":"auto","broker":"3d5e34f4.9a452c","x":210,"y":360,"wires":[["aeb99911.35b6c8"]]},{"id":"73f7e2ae.656dec","type":"mqtt in","z":"aeb0197d.7d1fd8","name":"","topic":"val/Sqrt","qos":"2","datatype":"auto","broker":"3d5e34f4.9a452c","x":210,"y":400,"wires":[["aeb99911.35b6c8"]]},{"id":"1e0a6d12.2e52b3","type":"mqtt in","z":"aeb0197d.7d1fd8","name":"","topic":"val/gX","qos":"2","datatype":"auto","broker":"3d5e34f4.9a452c","x":210,"y":440,"wires":[["aeb99911.35b6c8"]]},{"id":"7ddbd3f1.96af2c","type":"mqtt in","z":"aeb0197d.7d1fd8","name":"","topic":"val/gY","qos":"2","datatype":"auto","broker":"3d5e34f4.9a452c","x":210,"y":480,"wires":[["aeb99911.35b6c8"]]},{"id":"da0d3584.28d648","type":"mqtt in","z":"aeb0197d.7d1fd8","name":"","topic":"val/gZ","qos":"2","datatype":"auto","broker":"3d5e34f4.9a452c","x":210,"y":520,"wires":[["aeb99911.35b6c8"]]},{"id":"194c2ff8.99737","type":"mqtt in","z":"aeb0197d.7d1fd8","name":"","topic":"val/Dir","qos":"2","datatype":"auto","broker":"3d5e34f4.9a452c","x":210,"y":560,"wires":[["aeb99911.35b6c8"]]},{"id":"18feeaeb.442e15","type":"mqtt in","z":"aeb0197d.7d1fd8","name":"","topic":"val/mX","qos":"2","datatype":"auto","broker":"3d5e34f4.9a452c","x":210,"y":600,"wires":[["aeb99911.35b6c8"]]},{"id":"43022acf.d59cb4","type":"mqtt in","z":"aeb0197d.7d1fd8","name":"","topic":"val/mY","qos":"2","datatype":"auto","broker":"3d5e34f4.9a452c","x":210,"y":640,"wires":[["aeb99911.35b6c8"]]},{"id":"d4ebb01f.70055","type":"mqtt in","z":"aeb0197d.7d1fd8","name":"","topic":"val/mZ","qos":"2","datatype":"auto","broker":"3d5e34f4.9a452c","x":210,"y":680,"wires":[["aeb99911.35b6c8"]]},{"id":"ba8c7b79.8cc218","type":"mqtt in","z":"aeb0197d.7d1fd8","name":"","topic":"val/aX","qos":"2","datatype":"auto","broker":"3d5e34f4.9a452c","x":210,"y":280,"wires":[["aeb99911.35b6c8"]]},{"id":"3d5e34f4.9a452c","type":"mqtt-broker","name":"MQTT BROKER","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]

【问题讨论】:

  • 欢迎来到 Stack Overflow。请阅读the help pages,接受SO tour,阅读How to Ask,以及this question checklist。最后请学习如何创建minimal reproducible example,重点是minimal部分。
  • 您需要自己将其分解为可管理的块,在您 100% 确定消息实际上离开了 arduino 并使其发送到之前,甚至开始查看 Node-RED 部分都没有意义经纪人。
  • 1) 您注释掉与 MQTT 设置相关的大部分代码并重新连接。 2) 缺少 MQTT 回调函数设置(您将不知道您的消息是否实际发送出去),3) 您的代码还缺少 mqttClinet.loop() 调用,该调用是维护与 MQTT 代理的心跳所需的。我建议您先运行PubSubClient 附带的示例代码来了解 MQTT 的工作原理。 4) 暂时忘记 Node-RED,首先使用面向公众的 MQTT 代理(如 test.mosquitto.org)测试您的 ESP 代码。

标签: c arduino mqtt esp32


【解决方案1】:

您永远不会调用 PubSub 客户端 loop() 函数。

来自docs

布尔循环 ()

这应该定期调用以允许客户端处理 传入消息并保持其与服务器的连接。

返回

  • false - 客户端不再连接
  • true - 客户端仍处于连接状态

【讨论】:

  • 他们也在尝试连接到 127.0.0.1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2013-09-24
  • 2017-08-12
  • 1970-01-01
相关资源
最近更新 更多