首页 > 解决方案 > 从 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).... 等等

标签: c++arduinoraspberry-piadc

解决方案


String messageTemp仅在函数内部可用mqttCallback(),如果我理解正确,这不是你想要的。

如果你是messageTemp全局的,通过将行移动String messageTemp;到代码的顶部,就在之前setup(),你可以在你的代码中的任何地方使用它。

请注意,您现在必须在从中获取新数据之前将其清空mqttCallback(),否则新数据将添加到您已有的数据中messageTemp

您可以通过在函数messageTemp.remove(0);中删除的位置添加行来执行此操作。String messageTemp;mqttCallback()

这同样适用于在函数String中创建的其他 s 。mqttCallback()


推荐阅读