# Problema delay nel combinare due sketch

**URL:** <https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284>\
**Category:** Software\
**Created:** [September 9, 2022, 1:50pm UTC](https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284 "2022-09-09T13:50:12Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![quintoquarto](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/quintoquarto/32/690874_2.png) [@quintoquarto](https://forum.arduino.cc/u/quintoquarto)\
**Post date:** [September 9, 2022, 1:50pm UTC](https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284/1 "2022-09-09T13:50:12Z")

</div>

Salve a tutti, ho un problema a collegare due sketch perchè i cicli si incrociano.  
Spiego meglio, ho uno sketch per far illumminare una stripled tipo respiro:

```cpp
#include <Adafruit_NeoPixel.h>

#define PIN 8
Adafruit_NeoPixel strip = Adafruit_NeoPixel(150, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.setBrightness(85); // Lower brightness and save eyeballs!
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
int TOTAL_LEDS = 150;
float MaximumBrightness = 255;
float SpeedFactor = 0.03; // I don't actually know what would look good
float StepDelay = 10; // ms for a step delay on the lights

for (int i = 0; i < 65535; i++) {
float intensity = MaximumBrightness /2.0 * (1.0 + sin(SpeedFactor * i));
strip.setBrightness(intensity);
for (int ledNumber=0; ledNumber<TOTAL_LEDS; ledNumber++) {
strip.setPixelColor(ledNumber, 255,0, 0); //strip.setPixelColor(ledNumber, 0, 0, 255);
}

strip.show();
//Wait a bit before continuing to breathe
delay(StepDelay);
}
}

```

Poi un altro sketch per far girar in modo casuale 3 servo:

```cpp
#include <Servo.h>

static const int servosPins[5] = {4, 16, 17};

Servo servos[5];

void setServos(int degrees) {
    for(int i = 0; i < 5; ++i) {
        servos[i].write((degrees + (35 * i)) % 180);
    }
}

void setup() {
    Serial.begin(115200);

    for(int i = 0; i < 5; ++i) {
        if(!servos[i].attach(servosPins[i])) {
            Serial.print("Servo ");
            Serial.print(i);
            Serial.println("attach error");
        }
    }
}

void loop() {
    for(int posDegrees = 0; posDegrees <= 180; posDegrees++) {
        setServos(posDegrees);
        Serial.println(posDegrees);
        delay(20);
    }

    for(int posDegrees = 180; posDegrees >= 0; posDegrees--) {
        setServos(posDegrees);
        Serial.println(posDegrees);
        delay(20);
    }
}

```

Unendo il codice prima si muovono i servo poi si interrompono e la striscia inizia il suo ciclo! Dove sta l'errore?

```cpp
#include <Adafruit_NeoPixel.h>
#include <Servo.h>

static const int servosPins[3] = {11, 12, 13};
#define PIN 8
Servo servos[3];

// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(150, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.setBrightness(85); // Lower brightness and save eyeballs!
  strip.show(); // Initialize all pixels to 'off'
  
  Serial.begin(115200);
    for(int i = 0; i < 5; ++i) {
        if(!servos[i].attach(servosPins[i])) {
            Serial.print("Servo ");
            Serial.print(i);
            Serial.println("attach error");
        }
    }
    
}

void setServos(int degrees) {
    for(int i = 0; i < 5; ++i) {
        servos[i].write((degrees + (35 * i)) % 180);
    }
}

void loop() {
//Written by: Jason Yandell
    for(int posDegrees = 0; posDegrees <= 180; posDegrees++) {
        setServos(posDegrees);
        Serial.println(posDegrees);
        delay(20);
    }

    for(int posDegrees = 180; posDegrees >= 0; posDegrees--) {
        setServos(posDegrees);
        Serial.println(posDegrees);
        delay(20);
    }
    
int TOTAL_LEDS = 150;
float MaximumBrightness = 255;
float SpeedFactor = 0.03; // I don't actually know what would look good
float StepDelay = 10; // ms for a step delay on the lights

// Make the lights breathe
for (int i = 0; i < 65535; i++) {
// Intensity will go from 10 - MaximumBrightness in a "breathing" manner
float intensity = MaximumBrightness /2.0 * (1.0 + sin(SpeedFactor * i));
strip.setBrightness(intensity);
// Now set every LED to that color
for (int ledNumber=0; ledNumber<TOTAL_LEDS; ledNumber++) {
strip.setPixelColor(ledNumber, 255,0, 0); //strip.setPixelColor(ledNumber, 0, 0, 255);
}

strip.show();
//Wait a bit before continuing to breathe
delay(StepDelay);
}
}

```

---

<div class="post-metadata">

**Author:** ![docdoc](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/docdoc/32/220907_2.png) [@docdoc](https://forum.arduino.cc/u/docdoc)\
**Post date:** [September 9, 2022, 2:23pm UTC](https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284/2 "2022-09-09T14:23:55Z")

</div>

> [@quintoquarto](#):
>
> Dove sta l'errore?

Ovviamente nel fatto che se Arduino deve fare più cose "contemporaneamente" (in realtà non è mai contemporaneo ma "molto velocemente") non devi mai usare il delay perché questo interrompe l'elaborazione fino all'intervallo di tempo specificato, e non fa altro.  
Devi imparare ad utilizzare la funzione [millis()](https://www.arduino.cc/reference/en/language/functions/time/millis/), se cerchi in questo forum o con google trovi valanghe di esempi e descrizioni, magari inizia da [questo](https://forum.arduino.cc/t/using-millis-for-timing-a-beginners-guide/483573) ad esempio.

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [September 9, 2022, 2:29pm UTC](https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284/3 "2022-09-09T14:29:31Z")

</div>

... aggiung la mia solita "_frasetta_" che metto da anni su questo forum 😁

... devi studiarti come si usa la funzione [millis()](https://www.arduino.cc/reference/en/language/functions/time/millis/), prima [QUI](https://www.leonardomiliani.com/?p=576), poi [QUI](https://www.leonardomiliani.com/?p=758) e [QUI](https://docs.arduino.cc/built-in-examples/digital/BlinkWithoutDelay) e [QUI](http://www.baldengineer.com/pushbutton-and-flashing-led-tutorial-with-millis.html) e tutti gli articoli che sono in [QUESTA](https://www.baldengineer.com/arduino-millis-examples.html) pagina ... vedrai che poi ti sarà tutto più chiaro 😉

---

<div class="post-metadata">

**Author:** ![quintoquarto](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/quintoquarto/32/690874_2.png) [@quintoquarto](https://forum.arduino.cc/u/quintoquarto)\
**Post date:** [September 9, 2022, 3:22pm UTC](https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284/4 "2022-09-09T15:22:59Z")

</div>

Studierò, prometto, ma intanto ho risolto così:

```cpp
#include <Adafruit_NeoPixel.h>
#include <Servo.h>

static const int servosPins[5] = {11, 12, 13};
#define PIN 8
Servo servos[5];
Adafruit_NeoPixel strip = Adafruit_NeoPixel(150, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.setBrightness(85); // Lower brightness and save eyeballs!
  strip.show(); // Initialize all pixels to 'off'
  Serial.begin(115200);
    for(int i = 0; i < 5; ++i) {
        if(!servos[i].attach(servosPins[i])) {
            Serial.print("Servo ");
            Serial.print(i);
            Serial.println("attach error");
        }
    }
}

void setServos(int degrees) {
    for(int i = 0; i < 5; ++i) {
        servos[i].write((degrees + (35 * i)) % 180);
    }
}

void lampeggia(){
int TOTAL_LEDS = 150;
float MaximumBrightness = 255;
float SpeedFactor = 0.03;
float StepDelay = 10;

  for (int i = 0; i < 65535; i++) {
  float intensity = MaximumBrightness /2.0 * (1.0 + sin(SpeedFactor * i));
  **setServos(i);**
  strip.setBrightness(intensity);
    for (int ledNumber=0; ledNumber<TOTAL_LEDS; ledNumber++) {
    strip.setPixelColor(ledNumber, 255,0, 0); //strip.setPixelColor(ledNumber, 0, 0, 255);
    }
  strip.show();
  delay(StepDelay);
  }
}

void loop() {
   for(int posDegrees = 0; posDegrees <= 180; posDegrees++) {
        setServos(posDegrees);
        Serial.println(posDegrees);
        delay(20);
    }
     for(int posDegrees = 180; posDegrees >= 0; posDegrees--) {
        setServos(posDegrees);
        Serial.println(posDegrees);
        delay(20); lampeggia();
    } 
}

```

In pratica ho messo il lampeggio in una funzione chiamata lampeggia ed al suo interno viene chiamata la funzione dei servo!

---

<div class="post-metadata">

**Author:** ![cotestatnt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/cotestatnt/32/238781_2.png) [@cotestatnt](https://forum.arduino.cc/u/cotestatnt)\
**Post date:** [September 11, 2022, 11:29am UTC](https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284/5 "2022-09-11T11:29:18Z")

</div>

Non capirò mai perché negli esempi mettono sempre la movimentazione dei servo in dei cicli bloccanti...

Una volta che hai impostato la posizione di un servo con l'istruzione specifica, l'elettronica e la meccanica del servo farà tutto quello che serve, non c'è alcun bisogno di usare degli inutili cicli `for` o `delay()`.

---

<div class="post-metadata">

**Author:** ![Claudio\_FF](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/claudio_ff/32/239118_2.png) [@Claudio\_FF](https://forum.arduino.cc/u/Claudio_FF)\
**Post date:** [September 11, 2022, 12:52pm UTC](https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284/6 "2022-09-11T12:52:06Z")

</div>

Suppongo per fare gli sweep della posizione, che scriverli in modo non bloccante sarebbe una complicazione inutile nel contesto dell'esempio.

---

<div class="post-metadata">

**Author:** ![Datman](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/datman/32/219519_2.png) [@Datman](https://forum.arduino.cc/u/Datman)\
**Post date:** [September 13, 2022, 7:31am UTC](https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284/7 "2022-09-13T07:31:24Z")

</div>

> [@quintoquarto](#):
>
> In pratica ho messo il lampeggio in una funzione chiamata lampeggia ed al suo interno viene chiamata la funzione dei servo!

Mi sa che non hai riportato il programma giusto!  
Riguardo millis(), leggi anche qui:

> [@Problema con delay!!](https://forum.arduino.cc/t/problema-con-delay/595094/4):
>
> \>Domi02: Devi studiarti come si usa la funzione [millis()](https://www.arduino.cc/en/Reference/Millis), prima [QUI](http://www.leonardomiliani.com/2012/come-gestire-loverflow-di-millis/), poi [QUI](http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/) e [QUI](http://arduino.cc/en/Tutorial/BlinkWithoutDelay) e [QUI](http://www.baldengineer.com/pushbutton-and-flashing-led-tutorial-with-millis.html) e tutti gli articoli che sono in [QUESTA](https://www.baldengineer.com/arduino-millis-examples.html) pagina ... vedrai che ti sarà tutto più chiaro. Guglielmo P.S.: ... oltre che a quei link, prova a dare un occhiata anche [QUI](http://forum.arduino.cc/index.php?topic=491944.msg3361369#msg3361369).

> [@ritardo che non mi blocchi il loop](https://forum.arduino.cc/t/ritardo-che-non-mi-blocchi-il-loop/700795/8):
>
> millis() è come un cronometro che parte da 0 all'accensione e va avanti fino alla fine dell'unsigned int che esprime in millisecondi il tempo trascorso. Raggiunto il limite dei 32 bit (oltre 4 miliardi, pari a circa 50 giorni) ricomincia da zero. Per usarlo, quindi, devi solo prendere il tempo all'inizio di qualcosa e poi verifichi ciclicamente se è trascorso il tempo prefissato con la forma: if(millis()-t\_iniziale \> DURATA) {}; Supponi di infornare una torta, accendere il fuoco al caffè e met…

Se LED e servo devono fare passi contemporanei, però, puoi anche usare la stessa temporizzazione per entrambi e, a quel punto, il delay() funziona ugualmente:

```arduino
loop()
{
- Fai un passo alle luci
- Fai un passo al servo
- Aspetta un momento
}

```

Naturalmente non puoi usare dei for(): devi incrementare le variabili a ogni giro di loop e azzerarle quando raggiungono il valore massimo.  
Per fare avanti e indietro, puoi incrementare da 0 a 360 e mettere:

```arduino
if(degrees>180) valore=360-degrees;
else valore=degrees;

```

---

<div class="post-metadata">

**Author:** ![quintoquarto](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/quintoquarto/32/690874_2.png) [@quintoquarto](https://forum.arduino.cc/u/quintoquarto)\
**Post date:** [September 13, 2022, 8:11am UTC](https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284/8 "2022-09-13T08:11:28Z")

</div>

Lo sketch come da me modificato funziona. La luce di sfondo deve lampeggiare effetto "breath", mentre i servo devono effettuare movimenti random tutti diversi!

---

<div class="post-metadata">

**Author:** ![Datman](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/datman/32/219519_2.png) [@Datman](https://forum.arduino.cc/u/Datman)\
**Post date:** [September 13, 2022, 8:13am UTC](https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284/9 "2022-09-13T08:13:12Z")

</div>

Ah! Non avevo visto lampeggia(); in fondo.

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [March 12, 2023, 8:14am UTC](https://forum.arduino.cc/t/problema-delay-nel-combinare-due-sketch/1030284/10 "2023-03-12T08:14:05Z")

</div>

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
