想要从Arduino更改msg.payload的值并将其发送到节点。在mongodb中设置变量数据时,如何向节点发送红色或蓝色?
Aduino已成功将值发送到msg.payload,但如果使用语法,则不知道该值是否已更改。
///当从通信中接收到一个字符时,它将存储在此函数的// payload数组中。 //仅粘贴了最小的代码。
//该操作是使用mqtt通信将值发送到节点。
// Arduino源代码-------
enter code here
String sChipID;
char cChipID[20];
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[255];
//rotary encoder inputs
int S = D1; // SW, Switch
#define inputDT D2 // DT, OutA
#define inputCLK D3 // CLK, OutB
//rgb smd
int d5=D5; //B
int d6=D6; //R
int d7=D7; //G
int counter = 0;
int currentStateCLK;
int previousStateCLK;
String encdir ="";
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
String s;
deserializeJson(doc,payload);
root = doc.as<JsonObject>();
}
//A value is output to the counter using a rotary encoder
//ex)"Direction:--Value: 10
// 10
void loop(){
if (!client.connected()) {
reconnect();
}
client.loop();
currentStateCLK = digitalRead(inputCLK);
if (currentStateCLK != previousStateCLK){
if (digitalRead(inputDT) != currentStateCLK) {
counter --;
encdir ="CCW";
digitalWrite(d5,0); //B
digitalWrite(d6,255); //R
digitalWrite(d7,0); //G
sprintf(msg,"%d",counter);
} else {
counter ++;
encdir ="CW";
digitalWrite(d5,255); //B
digitalWrite(d6,0); //R
digitalWrite(d7,0); //G
sprintf(msg,"%d",counter);
}
Serial.print("Direction: ");
Serial.print(encdir);
Serial.print(" -- Value: ");
Serial.println(counter);
//
Serial.println(msg);
client.publish(outTopic, msg); // The value is sent to msg.payload.
}
previousStateCLK = currentStateCLK;
//node-red function
if(msg.payload>1)
msg.payload="{\"chipid\":\"eab916\"\, \"act\":\"write\"\,\"data\":"+1+"}";
else
msg.payload="{\"chipid\":\"eab916\"\, \"act\":\"write\"\,\"data\":"+0+"}";
return msg;
//mongodb
{
"_id" : ObjectId("5ce90950c088f32b1250a7e9"),
"name" : "rotary",
"chipid" : "eab916",
"data" : "red"
}
正如预期的那样,随着值的上升和下降,mongdb中会识别红色,并且输出将更改为节点红色,但不会更改。