Ho fatto una prova e sono riuscito ad ottenere l'effetto desiderato, utilizzando millis().
Il problema è che il codice è proprio brutto da vedere e sono sicuro che si potrebbe snellire in qualche operazione.
Di questo ne risente il movimento dei servo che non è fluido quando si stanno muovendo tutti e 5.
Avete qualche consiglio?
int start[9][5] = { ... {50, 50, 30, 130, 95} ... };
int finish[9][5] = { ... {140, 180, 150, 30, 1} ... }
int angle[5];
int servodelay = 50;
int servostep = 1;
unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period[5] = {20000, 20000, 20000, 20000, 20000}; \\ durata del movimento
int interval[5] = {0, 2000, 4000, 6000, 8000}; \\ instanti di partenza
void setup() {
s1.attach(13); s1.write(start[0][0]);
s2.attach(12); s2.write(start[0][1]);
s3.attach(9); s3.write(start[0][2]);
s4.attach(10); s4.write(start[0][3]);
s5.attach(11); s5.write(start[0][4]);
}
void loop() {
...
startMillis = millis();
...
while ((angle[0] < finish[6][0]) || (angle[1] < finish[6][1]) || (angle[2] < finish[6][2]) || (angle[3] > finish[6][3]) || (angle[4] > finish[6][4]) ) {
currentMillis = millis(); //get the current time
if ((currentMillis - startMillis > interval[0]) && (currentMillis - startMillis < period[0] + interval[0])) {
s1.write(angle[0]);
delay(servodelay);
angle[0] += servostep;
currentMillis = millis();
}
if ((currentMillis - startMillis > interval[1]) && (currentMillis - startMillis < period[1] + interval[1])) {
s2.write(angle[1]);
delay(servodelay);
angle[1] += servostep;
currentMillis = millis();
}
if ((currentMillis - startMillis > interval[2]) && (currentMillis - startMillis < period[2] + interval[2])) {
s3.write(angle[2]);
delay(servodelay);
angle[2] += servostep;
currentMillis = millis();
}
if ((currentMillis - startMillis > interval[3]) && (currentMillis - startMillis < period[3] + interval[3])) {
s4.write(angle[3]);
delay(servodelay);
angle[3] -= servostep;
currentMillis = millis();
}
if ((currentMillis - startMillis > interval[4]) && (currentMillis - startMillis < period[4] + interval[4])) {
s5.write(angle[4]);
delay(servodelay);
angle[4] -= servostep;
currentMillis = millis();
}
}
Dove ci sono i puntini (...) è perchè ci sono altri pezzi di codice che servono per altro.
--- ti rammento che, da regolamento, è permesso fare "up" solo dopo 48 ore dall'ultimo post. Grazie - gpb01