Update:
Ich habe es jetzt endlich am Laufen.
Aber ausgerechnet mit der Version ohne rs485.
Ich habe entsprechend der Libraray es nochmal auf TTL Basis probiert.
Anschluss ist dann:
Arduino -> DPM
RX1 -> A
TX1 -> B
GND -> GND
Aber es war nicht nur der Anschluss der Kabel. Ich habe auch nochmal in die Library geschaut und dort die read() Funktion angeschaut. Nachdem ich dort nochmal neu Ausgaben eingefügt habe, hat der Arduino den Code wohl nochmal neu eingebunden. Danach klappte es nämlich plötzlich.
Programmiertechnisch gibt es keinen Grund, wieso "Serial.println(processString(response));" das Ergebnis von response von 28 auf 500 ändert.
Der einzig logische Grund dafür ist, dass der Arduino die lib vorher nicht korrekt eingebunden hatte und damit immer die gleiche response bekam.
Nachtrag:
Programmiertechnisch gibt es für das Verhalten keinen Grund:
float DPM8600::read(char cmd)
{
int8_t retry = 0;
bool completed = false;
String response = "";
String command = "";
// Getting the correct command number
switch (cmd) {
case 'v': case 'V': command = "30"; break; // Voltage
case 'c': case 'C': command = "31"; break; // Current
case 'p': case 'P': command = "12"; break; // Power
case 's': case 'S': command = "32"; break; // CC/CV
case 'm': case 'M': command = "01"; break; // Max Current
default: command = "33"; break; // Internal temperature
}
do
{
// Clear response
//response = "";
// Send a command
_serial->println(":" + _address + "r" + command + "=0,");
// Listen for a reply
completed = listen(response);
1! Serial.println(processString(response));
// Add a retry
retry += 1;
} while ((!completed) && (retry < _maxRetry)); // Stop running either when data received or max attempts happened.
if (!completed) {
switch (cmd) {
case 'v': case 'V': return -10; // Voltage reading error
case 'c': case 'C': return -11; // Current reading error
case 'p': case 'P': return -12; // Power reading error
case 's': case 'S': return -13; // CC/CV reading error
case 'm': case 'M': return -14; // Max current reading error
default: return -15; // Internal temperature reading error
}
}
2! Serial.print("response vor: ");
3! Serial.println(response);
float result = processString(response);
4! Serial.print("response nach: ");
5! Serial.println(response);
switch (cmd) {
case 'v': case 'V': return result/100; // Voltage has 2 decimals
case 'c': case 'C': case 'm': case 'M': return result/1000; // Current has 3 decimals
default: return result;
}
}
Die Zeilen, die ich mit 1! bis 5! sind Sonderkommentare für hier. Der Code selbst ist so nicht Lauffähig und dient der schnelleren Lesbarkeit.
Aktuell scheinen diese 5 Zeilen zwingend notwendig zu sein im Code. Wenn ich eine dieser Zeilen abändere wir z.B. Zeile 1! zu "processString(response);" oder eine der 5 Zeilen auskommentiere, dann liefert response wieder falsche Werte. Mal 27.00, mal 28.00 oder auch gerne 30.00. Jedenfall nicht die Spannung, die eingestellt ist.
Update um 23:37 nach 3 Bier... Fehler gefunden.
Ich habe den Code nochmal kopiert und als My... Funktionen parallel zum Debuggen eingefügt. Der Fehler war so simpel wie schwer zu finden.
"v = converter.read('v');" != "v = converter.read("v");"
In meinem Hauptcode habe ich den Input an Read in "" übergeben. Das interpretiert die lib falsch und der case Fall wird nicht korrekt ausgelesen.
Dadurch kam dieses unlogische und zufällige Verhalten zustande. Mit einer Übergabe der Char Variablen in '' klappt es jetzt und ich kann v, c und p auslesen.
Verrückt, wie kompliziert sich manchmal kleinste Fehler gestalten...