Go Down

Topic: Switch Case - in Funktion gefangen (Read 664 times) previous topic - next topic

Ratpack

Hallo Zusammen,

vielen Dank für die zahlreichen Antworten die mir sehr geholfen haben.

Bei meinem ersten Projekt habe ich immer zuerst die Funktion ausgestaltet und dann das Hauptgerüst erstellt, mittlerweile denke ich da eher andersherum desshalb habe ich das große ganze auch noch nicht erklären wollen, da grobe Fehler enthalten sind.


Soll-Funktion meines Programms.

1) Seriell soll eines von vier Programmen angesteuert werden: 1. Schrittmotor rechtsherum 2. Schrittmotor linksherum 3. messen 4. kalibireren. Nie müssen zwei Funktionen gleichzeitig ausgeführt werden.


2) Es wird analog die Spannung eines Positionssensors gemessen. Eine Messung generiert 250 Werte (von 0 bis 1023). Die Abtastfrequenz soll 1ms betragen. Die Werte sollen entweder in einem array oder einem string gespeichert werden da ich noch nicht weiß ob ich darauf verzichten kann. Im Anschluss soll dieser seriell zurückgegeben werden. Ein zweiter Arduino soll die Messwerte aufnehmen und weiterverarbeiten (andere Baustelle).

Die Funktionen für den Schrittmotor habe ich fertig (rein / raus sind zwei Funktionen analog aufgebaut).
Das funktioniert soweit gut.

Die Auswahl meiner Funktion habe ich jetzt wie vorgeschlagen gelöst:
Code: [Select]
void loop()
{
  char input;
  static boolean Flag;
  // Case Auswahl
  if (Serial.available() > 0) {
    input = Serial.read();
    Serial.println(input);
    Flag = true;
  }

  if (Flag) {
    switch (input) {
      case '1': rausdrehen(); Flag = false; break;
      case '2': reindrehen(); Flag = false; break;
      case '3': messen();     Flag = false; break;
      case '4': kalibrieren(); Flag = false; break;
    }
  }

}


Dabei ist aber noch ein Problem aufgetaucht. Wenn ich die Messwerte mit Serial.print ausgebe, wird eine Funktion aktiviert die gar nicht aktiviert werden soll, da die Zahlen zur Case Auswahl einer Untermenge meines Wertebereichs der Messung ist. Hier muss ich also entweder meine inputs auf >1023 legen oder anders programmieren.

@Serenify:
Die Werte kann ich mir generell aussuchen. An Ende des Lieds wird per UDP ein Wert an den Arduino gesendet um eine Funktion auszuwählen.

Für die Aufnahme und Speicherung der Messwerte muss ich mir was eleganteres wie bisher überlegen. Vielen Dank Heinz, ich werde es mit deinem Vorschlag mal versuchen und dann berichten.
Meine Funktion wird nie mehr als 1x hintereinander aufgerufen.


Noch eine Frage: Wenn ich möchte, dass ein zweiter Arduino die Messwerte Seriell einliest, reicht es aus, diese mit Serial.print auszugeben oder muss ich serial.write verwenden? Soweit bin ich noch nicht, aber die Nacht ist ja lang :)




Beste Grüße und vielen Dank,
Tim

postmaster-ino

#16
Sep 25, 2019, 06:55 pm Last Edit: Sep 25, 2019, 06:59 pm by postmaster-ino
Hi

Da ich mich früher viel mit händischer Zeicheneingabe in Assembler beschäftigt habe (8086 ... schon etwas her), sah ich in der 48 (=0x30 = '0') direkt das Zeichen Null, wie bei der 50 eine Zwei.

Also eine Wahl der Aktion per Zahlzeichen - ein Kommentar hätte Das allerdings auch dem Rest schnell vor's geistige Auge bringen können.

@TO: Kommentare erleichtern auch später Dir die Arbeit mit dem Sketch - aber bitte sinnvoll kommentieren ;)
i=5; //i 5 zuweisen
wäre Nix - Das kann man so sogar selber lesen ;)
i=5; //i - die Anzahl der benötigten/erwarteten Zeichen
... wenn jetzt statt 'i' noch ein sinnvoller Name gewählt wurde, wird's noch klarer.

MfG

*Edit*
Serial.print(wert) gibt den Wert als String in Zahlzeichen aus - eine 65 wird als '6' '5' ausgegeben.
Serial.write(65) ergibt in jedem Fall ein A (ASCII-Code 65 -> großes A, .write schreibt genau diese Zahl, keine Interpretationen dabei.
... kA, was .write bei >255 macht, denke, dann splittet der Kram in die Einzel-Bytes auf, wobei bei Little-Endian (wie im Arduino) die Bytes vom Niederen zum Höchsten Byte ausgegeben werden.
255 -> FF
256 -> 00 01
257 -> 01 01  *Edit* 267 -> 257 !!
...
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Doc_Arduino

Die Werte kann ich mir generell aussuchen. An Ende des Lieds wird per UDP ein Wert an den Arduino gesendet um eine Funktion auszuwählen.
Mich interessiert wo die Werte aktuell, also jetzt, herkommen?
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

#18
Sep 25, 2019, 07:54 pm Last Edit: Sep 25, 2019, 07:59 pm by Serenifly
Noch eine Frage: Wenn ich möchte, dass ein zweiter Arduino die Messwerte Seriell einliest, reicht es aus, diese mit Serial.print auszugeben oder muss ich serial.write verwenden?
print() sendet ASCII. write() sendet Binär

Wenn man Dinge also ASCII sendet hat man mehr Daten, aber die Synchronisation auf Anfang und Ende ist viel einfacher. Ich habe die gesagt wie man berechnet wie lange die Übertragung dauert. Wenn du zwischenspeicherst und einmal am Ende sendest ist es auch nicht so kritisch. Aber so oder so solltest du mal von den 9600 Baud wegkommen

Wenn ich im seriellen Monitor 50 eingebe und Enter drücke, dann liest er eine 5 und eine 0 getrennt ein.
Das macht er aber nicht. Er gibt '0' ein und wird dann mal Serial.print(c, DEC) gemacht haben. Dann kommt 48 raus. Und das verwirrt Anfänger sehr gerne

Doc_Arduino

Das macht er aber nicht. Er gibt '0' ein und wird dann mal Serial.print(c, DEC) gemacht haben. Dann kommt 48 raus. Und das verwirrt Anfänger sehr gerne
Jetzt habe ich das geschnallt. Danke. Echt verwirrend.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

michael_x

OT

Quote
Aber so oder so solltest du mal von den 9600 Baud wegkommen
Wir haben üblicherweise 300 Baud verwendet. Das war langsam. Als Mensch, bei nicht so genauem Hinschauen, kann man sogar bis 9600 Baud mitlesen. Jetzt im Alter wird das "nicht so genaue Mitlesen" gröber.

Wenn für Ausgaben, die laufend mitgelesen werden sollen, 9600 nicht ausreicht, sollte man sich Gedanken machen, was man anzeigen will...

Serenifly

#21
Sep 26, 2019, 11:16 am Last Edit: Sep 26, 2019, 11:18 am by Serenifly
Wenn für Ausgaben, die laufend mitgelesen werden sollen, 9600 nicht ausreicht, sollte man sich Gedanken machen, was man anzeigen will...
Wenn man etwas am Stück ausgibt mag 1ms pro Zeichen reichen. Aber wenn man alle 1ms messen will und zwischen den Messungen die Daten direkt ausgibt ist 9600 Baud definitiv zu langsam.

Mir geht es auch darum dass er sich mal über die Problematik bewusst wird und überlegt ob und wie das sein Programm beeinflusst. Das ist überhaupt erst ein vernünftiger Grund weshalb man vielleicht alle Daten erst mal abspeichern will.

Doc_Arduino

Hallo,

man kann sich einen seriellen Monitor bauen der aller x ms/s eine Zeile mit den gewünschten Daten raushaut.
Oder man baut sich einen Monitor der nur bei Änderung eines Wertes eine Zeile raushaut.
In beiden Fällen kann man mit höheren Baudraten fahren und mitlesen.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

postmaster-ino

Hi

Die Baudrate sollte doch für das Mitlesen ziemlich egal sein - oder wollt Ihr hier nur ein delay verstecken, daß die Ausgaben 'nicht zu schnell' kommen?

DANN dürft Ihr Euch aber doch nicht wundern, daß der Knabe lahmaschig wie ne Schnecke ist!

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Doc_Arduino

Hallo,

von delay hat niemand etwas geschrieben.
Nur wenn er 250 Werte aller 1 Sekunde messen und ausgeben möchte, dann wird es knapp mit 9600 Baud ...
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Tommy56

Nach #5 will er 250 Werte aller 1 ms messen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Rentner

Hallo,

ich hatte es so verstanden:

auf ein bestimmtes Ereigniss hin, in dem Fall Emfang einer "3" über die Serielle , soll einmalig eine Messung von 250 Messwerten mit einer Abtastrate von 1ms erfolgen. Anschliessend sollen die Daten Seriell an einen zweiten Arduino gegeben werden. Eventuell kommen letztlich auch die Steuer-Befehle von diesem.

Darauf ist der Vorgang beendet und und der Motor kann wieder verfahren werden,(einfahren / ausfahren ) durch den Steuerbefehl von "1" oder "2" über die Serielle.

Wozu auch immer das gut sein mag.

ich könnte mit halt nur vorstellen das mit dem Motor ein Messfühler an eine bestimmte Position gefahren wird, dann wird da eine Mesreihe gemacht und anschliessend der Motor wieder in seine Grundstellung zurück gefahren. Aber das ist eigentlich auch nur Glaskugel  :) lesen, würde aber die Sache mit dem Motor erklären.

Heinz

postmaster-ino

Hi
...
von delay hat niemand etwas geschrieben.
...
Wenn ich Serial.print mit 9600 Baud benutze, ist Das WIE delay - man muß halt nur nicht 'delay' im Sketch schreiben.

Das 'delay' kam somit, statt von Niemandem, von mir und ist 'wie Serial.print mit 9600Baud'.

... und schon wieder schrieb Er 'delay' ...

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

michael_x

#28
Sep 27, 2019, 07:30 pm Last Edit: Sep 27, 2019, 07:35 pm by michael_x
Quote
Wenn ich Serial.print mit 9600 Baud benutze, ist Das WIE delay
Falsch
Jedenfalls, wenn du weniger als 64 Buchstaben am Stück ausgibst und dann was anderes machst. Der Arduino ist dann (mit dem anderen) nicht langsamer als bei 115200 Baud und fängt auch sofort damit an.

postmaster-ino

Hi

Ok, Das ist ein Argument (die Puffergröße, die 64 Byte) - ok, zu kurz gedacht :)

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Go Up