Hallo,
ich hab dir das mal für einen Servo zusammen gebaut, erweitern kannst Du es dann selber auf 4.
Es gibt wie immer mehrere Lösungen, ich hab jetzt mal eine gewählt die sicher programmtechnisch nicht optimal ist aber eventuell leicht verständlich, meine ich jedenfalls.
Ich hab mal zwei Funktonen erstellt damit das Program übersichtlich bleibt. Eine zum einlesen und auswerten der Zeichen, eine Zweite zur Ansteuerung des Motors.
Bei den Einstellungen am Termial. unten in der Statuszeile gibt es mehrere Einstellungen. Abgeschlossen wir eine Eingabe immer mit der Enter Taste, je nach Einstellung wir diese Abschluss mit übertragen oder auch nicht. Standard ist sicher das CR+NL gesendet wird.( Wagenrücklauf+neue Zeile, die Bezeichnungen stammen noch aus der Zeit in der es Telex gab, so bis 1980 etwa ) Damit kommen also drei Zeichen an. Der Sketch zeigt den Hex Code dazu mit an.
Der Motor startet direkt nach Erkennung des Startzeichens "1" und fährt auf pos 180. nach 3 s fährt er dann wieder zurück. Ich denke das war das was Du wolltest.
Der nächste Step für Dich wird ja sein das der Motor auch langsam fahren kann. Da wird dann aber etwas komplizierter. Das geht dann nicht mehr ganz so einfach. Dazu muss man den Motor von der aktuelle Position in kleinen Schritten auf eine Endposition fahren lassen und dazwischen eine Pause machen. natürlich sinvoller Weise mit millis() und nicht mit delay. In dem Fall setzt man aber besser eine State Mashine , Ablaufsteuerung, Schrittkette ein.
Das mit den millis() ist doch eigendlich ganz einfach, man muss es halt nur verstehen. Immer dann wenn die Verzögerungszeit nicht gebraucht oder gestartet werden soll macht man.
startzeit=millis()
wenn man die Zeit dann abfragen will
if (millis()-startzeit >= delayzeit) tu was
oder
if (millis()-startzeit <= impulszeit) tu was
so jetzt aber der Sketch
// aus den Beispielen in der IDE zusammen gebastelt
// Terminal Einstellung NL+CR oder NL senden erfolgt nach Enter
// es müssen mehrer Zeichen eingelesen und ausgewertet werden
//
#include <Servo.h>
Servo servo1; //Objekt erstellen
String eingabe;
bool startServo1;
unsigned long startzeit1;
void setup() {
Serial.begin(9600);
servo1.attach(3); // Pin setzen
servo1.write(0); // auf Pos 0 fahren
}
void loop() {
Eingabelesen(); // Serielle schnittstelle lesen und auswerten
if (startServo1) runServo1(); // Servo 1 soll fahren
else startzeit1 = millis(); //wenn nicht benötigt reset Timer
}
//=============== Funktionen ==============
void Eingabelesen() {
// schnittstelle lesen und auswerten Eingabe wird mit
// DA Hex abgeschlossen.
// Vorlage Beispiel / SerialEven
while (Serial.available()) {
char zeichen = char(Serial.read());
eingabe += zeichen; // alle Zeichen lesen
Serial.print(zeichen, HEX); // Zeichen ausgeben
if (zeichen == '\n') { // enter erkannt
Serial.println(); // neue Zeile auf Monitor
// auswerten
if ( eingabe.startsWith("1")) { // erstes Zeichen ist "1"
startServo1 = true; // Status setzten
Serial.println("1 erkannt Servo1 fährt vor");
}
if (eingabe.startsWith("2")) {
// hier eingabe für zweiten Servo erkennen
}
eingabe = "";// Reset Eingabe
}
}
}
// Function Servo 1 fahren
void runServo1() {
servo1.write(180); // vor
if ((millis() - startzeit1 >= 3000)) { // Zeit abgelaufen
servo1.write(0); // wieder zurück
Serial.println ("Servo 1 zurück");
startServo1 = false; // Status beendet
}
}