首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Arduino MQTT同步性

Arduino MQTT同步性
EN

Stack Overflow用户
提问于 2022-05-11 11:23:16
回答 1查看 34关注 0票数 0

我试图在一个ubuntu20系统上的Arduino WifiRev2和python脚本之间建立一个MQTT连接。

为了测试目的,arduino连接了3个超声波传感器和一个陀螺传感器。

mqtt-连接似乎运行良好,arduino确实发布了传感器数据,并且还接收来自python脚本的命令。

但是传感器数据不是同步发送的。首先发送的传感器比其他传感器数据收到的频率要高得多(大约是faktor 4)。

该脚本是从下面的示例代码中采用的:https://docs.arduino.cc/tutorials/uno-wifi-rev2/uno-wifi-r2-mqtt-device-to-device

下面是我的arduino脚本中的循环:

代码语言:javascript
运行
复制
const long interval = 30;
unsigned long previousMillis = 0;
void loop() {

  mqttClient.poll();

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time a message was sent
    previousMillis = currentMillis;

    //record random value from A0, A1 and A2
    //int Rvalue = analogRead(A0);
    int gyroSCL = digitalRead(gryoSCL_PIN);
    int gyroSDA = digitalRead(gryoSDA_PIN);
    int l_distance = getUSensDistance(USens_L_Trig_Pin,USens_L_Echo_Pin);
    int r_distance = getUSensDistance(USens_R_Trig_Pin,USens_R_Echo_Pin);
    int f_distance = getUSensDistance(USens_F_Trig_Pin,USens_F_Echo_Pin);
    int g_value = getGyro();

    mqttClient.beginMessage(topicL);
    mqttClient.print(l_distance);
    mqttClient.endMessage();

    mqttClient.beginMessage(topicR);
    mqttClient.print(r_distance);
    mqttClient.endMessage();

    mqttClient.beginMessage(topicF);
    mqttClient.print(f_distance);
    mqttClient.endMessage();

    mqttClient.beginMessage(topicG);
    mqttClient.print(g_value);
    mqttClient.endMessage();

    //Serial.println();
  }
}

python脚本基于以下示例:https://www.emqx.com/en/blog/how-to-use-mqtt-in-python

python订阅服务器中的打印示例如下所示:

代码语言:javascript
运行
复制
Connected to MQTT Broker!
Received `44` from `usens_l` topic (timeDiff: 678024
Received `25` from `usens_f` topic (timeDiff: 882899
Received `44` from `usens_l` topic (timeDiff: 87380
Received `49` from `usens_l` topic (timeDiff: 274183
Received `44` from `usens_l` topic (timeDiff: 501763
Received `44` from `usens_l` topic (timeDiff: 702241
Received `44` from `usens_l` topic (timeDiff: 911118
Received `44` from `usens_l` topic (timeDiff: 113206
Received `44` from `usens_l` topic (timeDiff: 316174
Received `45` from `usens_l` topic (timeDiff: 521477
Received `45` from `usens_l` topic (timeDiff: 725778
Received `45` from `usens_l` topic (timeDiff: 930363
Received `-1` from `gyro` topic (timeDiff: 135167
Received `45` from `usens_l` topic (timeDiff: 354054
Received `54` from `usens_l` topic (timeDiff: 647140
Received `42` from `usens_r` topic (timeDiff: 647306
Received `41` from `usens_r` topic (timeDiff: 852423
Received `55` from `usens_l` topic (timeDiff: 58828
Received `55` from `usens_l` topic (timeDiff: 261107
Received `55` from `usens_l` topic (timeDiff: 465823
Received `55` from `usens_l` topic (timeDiff: 671458

因此,显然有些传感器数据没有发送(或未接收)。我尝试了不同的间隔,但无论如何,usens_l似乎比其他数据频繁得多。

可以有一种更简单的方法来同步发送数据,但是构建一个字符串或计算到单个值来集成数据并立即发送。也许这就是我目前问题的解决方案。但我想了解,为什么这种沟通不像预期的那样有效。

谢谢你的提示!

EN

回答 1

Stack Overflow用户

发布于 2022-05-11 15:18:44

好吧,我找到了解决办法,这比预期的要容易得多:

我只需安装本地的蚊子服务器(作为ubuntu服务),现在日志如下所示:

代码语言:javascript
运行
复制
Received `49` from `usens_l` topic (timeDiff: 305325
Received `82` from `usens_r` topic (timeDiff: 305449
Received `16` from `usens_f` topic (timeDiff: 307354
Received `-1` from `gyro` topic (timeDiff: 309461
Received `49` from `usens_l` topic (timeDiff: 334474
Received `82` from `usens_r` topic (timeDiff: 337135
Received `16` from `usens_f` topic (timeDiff: 337257
Received `-1` from `gyro` topic (timeDiff: 339283
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72200178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档