Hallo,
ich habe folgendes System:
Ein Sensor schaltet zwischen an und aus unregelmäßig hin und her. Diesen Sensor habe ich an einen Arduino Uno angeschlossen. Der Arduino soll die Zeit ermitteln, die zwischen zwei aus/an-Schaltungen vergeht. Also immer wenn der Sensor von "aus" auf "an" springt, soll das Programm die Zeit bis zum nächsten "aus" zu "an" messen und per USB ausgeben. Dazu habe ich folgenden Code für den Arduino:
const int inputPin = 3; // Pin 3 als Eingang für das Signal festlegen
int previousState = LOW; // Vorheriger Zustand des Eingangs
unsigned long previousTime = 0; // Vorherige Zeit des Zustandswechsels
void setup() {
pinMode(inputPin, INPUT); // Pin als Eingang festlegen
Serial.begin(9600); // Serielle Kommunikation starten
}
void loop() {
int currentState = digitalRead(inputPin); // Aktuellen Zustand des Eingangs lesen
if (currentState != previousState) { // Wenn sich der Zustand geändert hat
if (currentState == HIGH) { // Wenn der Zustand "an" ist
unsigned long currentTime = millis(); // Aktuelle Zeit erfassen
unsigned long elapsedTime = currentTime - previousTime; // Zeitdifferenz berechnen
Serial.print(elapsedTime); // Zeitdifferenz über die serielle Schnittstelle ausgeben
Serial.println(";"); // Terminator hinzufügen (vermutlich unnötig)
previousTime = currentTime; // Vorherige Zeit aktualisieren
}
previousState = currentState; // Vorherigen Zustand aktualisieren
}
}
Das Ergebnis will ich mit Matlab auslesen und habe dazu folgenden Code:
% Serielle Verbindung zum Arduino herstellen
arduino = serial('COM3', 'BaudRate', 9600);
fopen(arduino);
% Startzeitpunkt festlegen
startTime = tic;
% Endlosschleife zum Lesen der Daten vom Arduino für 60 Sekunden
while toc(startTime) < 60
% Daten vom Arduino lesen
data = fscanf(arduino, '%s');
% ASCII-Code anzeigen
fprintf('Zeit: %s\n', data);
end
% Serielle Verbindung schließen
fclose(arduino);
Die Ausgabe funktioniert, allerdings nur für die erste Schaltung, danach kommt eine Fehlermeldung, dass Matlab keine Daten mehr auslesen kann:
">> chat
Warning: serial will be removed in a future release. Use serialport instead.
Zeit: 2522;
Warning: Unsuccessful read: A timeout occurred before the Terminator was reached.
'serial' unable to read any data. For more information on possible reasons, see Serial Read Warnings.
Zeit:
Warning: Unsuccessful read: A timeout occurred before the Terminator was reached.
'serial' unable to read any data. For more information on possible reasons, see Serial Read Warnings.
Zeit: "
Die ein mal ausgegebene Zeit (2522) in ms passt. Weiterhin habe ich festgestellt, dass der Wert auch beim ersten mal nur ausgegeben wird, wenn der Arduino neu angeschlossen ist. Wenn ich das Matlabprogramm nach Beendigung (60s Laufzeit) erneut starte, kommt folgendes Ergebnis:
">> chat
Warning: serial will be removed in a future release. Use serialport instead.
Zeit: 0;
Warning: Unsuccessful read: A timeout occurred before the Terminator was reached.
'serial' unable to read any data. For more information on possible reasons, see Serial Read Warnings.
Zeit: "
Es wird also wieder ein mal etwas vom Arduino ausgelesen "0;", aber eben nicht der richtige Wert und danach gibt es wieder kein Signal. Leider konnt ich bisher keine Lösung finden. Kann mir jemand sagen, warum weitere Schaltvorgänge nicht zu einer erneuten Signalausgabe führen? Und warum der Arduino beim zweiten Lauf des Programms nur "0;" ausgibt? Denn die Verbindung wird ja am Ende des Matlabprogramms geschlossen und dann beim 2. Durchlauf wieder neu geöffnet. Wenn ich den USB Stecker ziehe (auch Stromverbindung) und den Arduino somit neu starte, klappt es wieder für den 1. Wert.
Viele Grüße und schon mal Danke für die Mühe,
Simon