Ich habe für meinen Counter den Datenstring soweit funktionsfähig aufgeteilt.
Nur am Schluss des Datenstrings (, <Modus> CRLF) habe ich einen Fehler, den ich nicht lösen konnte, weil mir keine Lösung eingefallen ist.
WiFiClient wifiClient;
PubSubClient mqttClient;
SoftwareSerial geigerCounterSerial(PIN_UART_RX, PIN_UART_TX);
int lastCPS = 0, currentCPS = 0;
int lastCPM = 0, currentCPM = 0;
float lastUSVHR = 0, currentUSVHR = 0;
unsigned long lastPublishMs = 0;
// ### CPS, #####, CPM, #####, uSv/hr, ###.##, <Modus> CRLF
// <Modus> LOW – 60 Sekunden, FAST, INST
void publishValues() {
char tmp[8];
if (currentCPS != lastCPS) {
sprintf(tmp, "%d", currentCPS);
mqttClient.publish(MQTT_TOPIC_CPS, tmp, true);
}
if (currentCPM != lastCPM) {
sprintf(tmp, "%d", currentCPM);
mqttClient.publish(MQTT_TOPIC_CPM, tmp, true);
}
if (currentUSVHR != lastUSVHR) {
sprintf(tmp, "%.2f", currentUSVHR);
mqttClient.publish(MQTT_TOPIC_USVHR, tmp, true);
}
if (currentMODUS != lastMODUS) {
sprintf(tmp, "%d", currentMODUS);
mqttClient.publish(MQTT_TOPIC_MODUS, tmp, true);
}
lastCPS = currentCPS;
lastCPM = currentCPM;
lastUSVHR = currentUSVHR;
lastMODUS = currentMODUS;
}
void parseReceivedLine(char* input) {
char segment = 0;
char *token;
float cps = 0;
float cpm = 0;
float usvhr = 0;
token = strtok(input, ", ");
while (token != NULL) {
switch (segment) {
case IDX_CPS_KEY: if (strcmp(token, "CPS") != 0) return; break;
case IDX_CPM_KEY: if (strcmp(token, "CPM") != 0) return; break;
case IDX_USVHR_KEY: if (strcmp(token, "uSv/hr") != 0) return; break;
case IDX_MODUS_KEY: if (strcmp(token, " ") != 0) return; break;
case IDX_CPS:
Serial.printf("Current CPS: %s\n", token);
cps = atoi(token);
break;
case IDX_CPM:
Serial.printf("Current CPM: %s\n", token);
cpm = atoi(token);
break;
case IDX_USVHR:
Serial.printf("Current uSv/hr: %s\n", token);
usvhr = atof(token);
break;
case IDX_MODUS:
Serial.printf("Current : %s\n", token);
modus = atof(token);
break;
}
if (segment > 7) {
// Nicht mehr als 7 Segmente
return;
}
token = strtok(NULL, ", ");
segment++;
}
currentCPS = cps;
currentCPM = cpm;
currentUSVHR = usvhr;
currentMODUS = modus;
}
Vielleicht hat jemand einen Tipp für mich.