c++ - 从 mqtt 打印后保持值
问题描述
我有一个问题要问大家,打印后是否可以在内存中保存一个值。我给你举个例子:
Nodered 创建的界面有一个滑块,其数字从 20 到 30。你滑动它并选择一个像 25 这样的值,然后将该值发送回 arduino 或 esp 串行监视器,有一个命令可以为它创建一个变量数字 25。好吧,一切都很好,但我知道,当您发送数字时,它会触发变量 1 次。而且我需要一个可以在使用它时记住该值的函数
我正在建造一个温室(多么原始),我想无线使用它,比如在温度为 22 C 时设置植物浇水,光照百分比为 10%,时间从 19:00 到 22:00 浇水
问题是我如何使用由节点中的滑块设置的变量在设置的确切温度下给我的植物浇水
这是我将在最后使用的代码我mqttFloodInterval
可以设置我将从 nodered 获得的变量
void mqttCallback(char* topic, byte* message, unsigned int length) {
Serial.print("MQTT message received on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
Serial.println(messageTemp);
if (String(topic) == mqttFloodInterval) {
Serial.print("*** (Flood Interval Received)");
}
}
为 ocrdu 编辑如下内容:
if (String(topic) == mqttFloodInterval) {
Serial.print("*** (Flood Interval Received)");
mqttFloodInterval = wtrtemp;
}
if(wtrtemp == 23){
digitalWrite(RELAY_PIN, HIGH); // turn on pump 5 seconds
delay(5000);
}
else {
digitalWrite(RELAY_PIN, LOW); // turn off pump 5 seconds
delay(5000);
}
做所有的 if 就像 if(wtrtemp == 24), if(wtrtemp == 25).... 等等
解决方案
String messageTemp
仅在函数内部可用mqttCallback()
,如果我理解正确,这不是你想要的。
如果你是messageTemp
全局的,通过将行移动String messageTemp;
到代码的顶部,就在之前setup()
,你可以在你的代码中的任何地方使用它。
请注意,您现在必须在从中获取新数据之前将其清空mqttCallback()
,否则新数据将添加到您已有的数据中messageTemp
。
您可以通过在函数messageTemp.remove(0);
中删除的位置添加行来执行此操作。String messageTemp;
mqttCallback()
这同样适用于在函数String
中创建的其他 s 。mqttCallback()
推荐阅读
- bash - 如何通过 terraform 停止/开始运行 ec2 实例
- java - 为什么 JVM 不能将 byteArray 转换为 String 并重新转换为 byteArray
- python - 在 Python 中从 for 转换为 while 循环
- java - CarouselView 中的卡片?
- amazon-web-services - Openshift 将图像复制到另一个图像存储库
- ruby-on-rails - 在保持数据完整的同时将现有时间迁移到 Rails 中的 DateTime
- express - CORS 仅阻止 localhost 请求
- regex - Postgres 函数将单词拆分为具有额外逻辑的数组
- java - 使用 Spring Web 服务为每个请求提供不同的 ClientInterceptor
- python - VSCode 没有为大型 Jupyter 笔记本文件运行内核(仅显示为 html)