Add motor paramter control via MQTT

master
Tom Wilson 4 years ago
parent 9582fd53af
commit 83548dc5f9

@ -163,6 +163,46 @@ void onRollerManualMessage(const String &topicStr, const String &message) {
}
}
bool motor_parameters_retrieved = false;
motor_parameters_t motor_parameters[3];
motor_parameters_group_t motor_parameters_to_send;
// Handler for MQTT messages at `airseeder/set/roller[1,2,3]params`
// Message format: [kp] [ki] [kd] [min_duty]
void onRollerParamsMessage(const String &topicStr, const String &message) {
int r_id = 0;
if (topicStr == "airseeder/set/roller1params") {
r_id = 0;
} else if (topicStr == "airseeder/set/roller2params") {
r_id = 1;
} else if (topicStr == "airseeder/set/roller3params") {
r_id = 2;
} else {
// MQTT error
return;
}
if (parse_message(message) >= 4) {
// Don't set parameters if we haven't received the existing ones yet
if (motor_parameters_retrieved) {
motor_parameters[r_id].kp = msg_segments[0].toFloat();
motor_parameters[r_id].ki = msg_segments[1].toFloat();
motor_parameters[r_id].kd = msg_segments[2].toFloat();
motor_parameters[r_id].min_duty = msg_segments[3].toFloat();
motor_parameters_to_send.motor_1 = motor_parameters[0];
motor_parameters_to_send.motor_2 = motor_parameters[1];
motor_parameters_to_send.motor_3 = motor_parameters[2];
set_motor_parameters(motor_parameters_to_send);
}
}
}
// Builtin function name used by EspMQTTClient
void onConnectionEstablished() {
Serial.println("Connected to MQTT broker");
@ -173,6 +213,10 @@ void onConnectionEstablished() {
mqtt_client.subscribe("airseeder/set/roller2manual", onRollerManualMessage);
mqtt_client.subscribe("airseeder/set/roller3manual", onRollerManualMessage);
mqtt_client.subscribe("airseeder/set/roller1params", onRollerParamsMessage);
mqtt_client.subscribe("airseeder/set/roller2params", onRollerParamsMessage);
mqtt_client.subscribe("airseeder/set/roller3params", onRollerParamsMessage);
sprintf(msg_buffer, "%u", mqtt_client.getConnectionEstablishedCount());
mqtt_client.publish("airseeder/status/connect_count", msg_buffer, true);
}
@ -250,6 +294,12 @@ void loop() {
motor_status.motor_3_control.desired_speed, motor_status.roller_3_speed, motor_status.roller_3_revs,
motor_status.motor_3_duty);
mqtt_client.publish("airseeder/status/roller3", msg_buffer, true);
// Need to save the motor parameters somewhere, so that modification to one of them keeps the old ones
motor_parameters[0] = motor_status.motor_1_params;
motor_parameters[1] = motor_status.motor_2_params;
motor_parameters[2] = motor_status.motor_3_params;
motor_parameters_retrieved = true;
}
// Periodically request a pipe pressure update via I2C

Loading…
Cancel
Save