Ma la funzione delay...?

Serve per bloccare uno script per un tot. secondi (ex: delay(100) ) oppure per bloccare lo script fino a quando non arriva un altro comando?

Non sono ancora riuscito a capire questa piccola/grande differenza

Grazie

la funzione delay() frizza completamente arduino per il tempo prestabilito tra le parentesi, continuando a eseguire cioè che stava facendo prima del delay senza possibilità di aquisire o computare per il periodo selezionato.

se riesci non usare delay(), usa millis(). Vittorio a.k.a. Nathanvi spiega divinamente come usare millis() in questo post.

Interessante l'articolo, l'ho letto, ma non capisco molto l'esempio, mi pare complicato. Qualcuno può darmi una mano, magari con un esempio più semplice?

Vi spiego il problema: sto realizzando un robot che può essere controllato tramite seriale. Volevo fare in modo tale che quando do tramite seriale il comando "avanti" il robot inizia a camminare. Poi dopo do il comando "luce accesa" e il robot accende la luce, ma allo stesso tempo deve fare anche quello che faceva prima senza fermare il comando precedente.

Aiuti?

posteresti il codice? Da cosa stai scirvendo sembra che in realtà ora il robot non faccia questo...

non usare i delay, usa if annidate in un for

Eccovi il codice.
Tenete presente che ancora è tutto molto spartano, mi mancano parecchi componenti, sto intanto codando, poi piano piano compro i vari componenti che mi mancano. Sarà sicuramente anche pieno di errori.

PS: In alcuni casi per accedendere il led devo scrivere “LOW” invece di “HIGH”… Come mai?

// Modello a due motori e tre sensori di ostacoli
// Utilizza una funzione random per scegliere se girare a destra o sinistra

#define MOTORED 3
#define MOTORES 2
#define LEDFUNZIONAMENTO 4
#define LEDMANUALE 5
#define LEDAUTOMATICO 6
#define LEDBUIO 7

  int ostacolod = 0;
  int ostacolos = 0;
  int ostacolocentro = 0;
  int buio = 0;
  int manuale = 0; 

void setup()
{
  
  pinMode(MOTORED, OUTPUT);
  pinMode(MOTORES, OUTPUT);
  pinMode(LEDFUNZIONAMENTO, OUTPUT); //Led verde
  pinMode(LEDMANUALE, OUTPUT); // Led giallo
  pinMode(LEDAUTOMATICO, OUTPUT); // Led rosso
  pinMode(LEDBUIO, OUTPUT); 
  Serial.begin(9600);
  
}

void loop()
{
  
  ostacolod = analogRead(0);
  ostacolos = analogRead(1);
  ostacolocentro = analogRead(2);
  buio = analogRead(3);
  
   // controlla se deve essere autonomo
   // o essere controllato tramite Wi-Fi
  manuale = Serial.read();
  
   // Partenza
  digitalWrite(LEDFUNZIONAMENTO, LOW);
  digitalWrite(LEDAUTOMATICO, LOW);
  digitalWrite(LEDMANUALE, HIGH);
  digitalWrite(MOTORED, HIGH);
  digitalWrite(MOTORES, HIGH);
  delay(50); // Anti-bouncing
  
  if (luce < 500)
  {
    digitalWrite(LEDBUIO, HIGH);
    Serial.println("Luce accesa");
    Serial.println("buio");
  }
  
    if (luce > 500)
  {
    digitalWrite(LEDBUIO, LOW);
    Serial.println("Luce spenta");
  }
  
 
    if (ostacolocentro > 70)
  {
  Serial.println(ostacolocentro);
  digitalWrite(LEDFUNZIONAMENTO, LOW);
  digitalWrite(LEDAUTOMATICO, LOW);
  digitalWrite(LEDMANUALE, LOW);
  digitalWrite(MOTORED, LOW);
  digitalWrite(MOTORES, HIGH);
  delay(1000);
  delay(50); // Anti-bouncing
  }
    /* Per ora non serve perchè ho un solo sensore posto davanti al robot 
  if (ostacolod > 70)
  {
  digitalWrite(LEDFUNZIONAMENTO, HIGH);
  digitalWrite(LEDAUTOMATICO, HIGH);
  digitalWrite(LEDMANUALE, LOW);
  digitalWrite(MOTORED, HIGH);
  digitalWrite(MOTORES, LOW);
  delay(1000);
  }
  
  if (ostacolos > 70)
  {
  digitalWrite(LEDFUNZIONAMENTO, HIGH);
  digitalWrite(LEDAUTOMATICO, HIGH);
  digitalWrite(LEDMANUALE, LOW);
  digitalWrite(MOTORED, LOW);
  digitalWrite(MOTORES, HIGH);
  delay(1000);
  }
  
  if ((ostacolod > 70) && (ostacolos > 70))
  {
  digitalWrite(LEDFUNZIONAMENTO, HIGH);
  digitalWrite(LEDAUTOMATICO, HIGH);
  digitalWrite(LEDMANUALE, LOW);
    randomSeed(analogRead(5));
    rand = long random(0, 2);  
    if (rand = 0)
    {
    digitalWrite(MOTORED, LOW);
    digitalWrite(MOTORES, HIGH);
    delay(1000);
    }
    if (rand = 1)
    {
    digitalWrite(MOTORED, HIGH);
    digitalWrite(MOTORES, LOW);
    delay(1000);
    }
  } 
  }

if (manuale = 1) //Se il robot è controllato dall'esterno
{
  Serial.println("Controllo manuale inserito, attendere la conferma");
  digitalWrite(MOTORED, LOW);
  digitalWrite(MOTORES, LOW);
  digitalWrite(LEDBUIO, LOW);
  digitalWrite(LEDFUNZIONAMENTO, HIGH);
  digitalWrite(LEDMANUALE, HIGH);
  digitalWrite(LEDAUTOMATICO, LOW);
  Serial.println("Robot manuale");
  
  if (manuale = 2)
  {
    digitalWrite(LEDFUNZIONAMENTO, HIGH);
    digitalWrite(LEDMANUALE, HIGH);
    digitalWrite(LEDAUTOMATICO, LOW);
    digitalWrite(MOTORED, HIGH);
    digitalWrite(MOTORES, HIGH);
    Serial.println("Motori inseriti manualmente");
  }
  
  if (manuale = 3)
  {
    digitalWrite(LEDFUNZIONAMENTO, HIGH);
    digitalWrite(LEDMANUALE, HIGH);
    digitalWrite(LEDAUTOMATICO, LOW);
    digitalWrite(MOTORED, LOW);
    digitalWrite(MOTORES, LOW);
    Serial.println("Motori arrestati manualmente");
  }
  
    if (manuale = 4)
  {
    digitalWrite(LEDFUNZIONAMENTO, HIGH);
    digitalWrite(LEDMANUALE, HIGH);
    digitalWrite(LEDAUTOMATICO, LOW);
    digitalWrite(MOTORED, LOW);
    digitalWrite(MOTORES, HIGH);
    Serial.println("Il robot sta girando versa destra.");
  }
  
    if (manuale = 5)
  {
    digitalWrite(LEDFUNZIONAMENTO, HIGH);
    digitalWrite(LEDMANUALE, HIGH);
    digitalWrite(LEDAUTOMATICO, LOW);
    digitalWrite(MOTORED, HIGH);
    digitalWrite(MOTORES, LOW);
    Serial.println("Il robot sta girando versa sinistra.");
  }
  
      if (manuale = 6)
  {
    digitalWrite(LEDFUNZIONAMENTO, HIGH);
    digitalWrite(LEDMANUALE, HIGH);
    digitalWrite(LEDAUTOMATICO, LOW);
    digitalWrite(MOTORED, LOW);
    digitalWrite(MOTORES, LOW);
    Serial.println("Motori fermi");
  }
  
 
} */
}

PS: In alcuni casi per accedendere il led devo scrivere "LOW" invece di "HIGH"... Come mai?

Hai montato il LED a rovescio ??????????? :-)

No, non è montato al contrario, per sicurezza ho anche provato a cambiare il verso, ma è montato correttamente

era una risposta ironica :-)

quale led ti da il problema ? Ho notato che li hai messi sugli ingressi analog, che definisci i pin 2 e3 come output ma poi usi gli stessi pin con analog ead, probabilmente il problema e' nel codice.

No, i pin analogici non vanno definiti, ma faccio direttamente analogRead(2) e mi legge dal pin analogico, invece quelli dichiarati sono i digitali

all'inizio del codice definisci motored e motores come 2 e 3, poi dai il comando pinmode(motored, OUTPUT) e uguale per motores. quindi hai messo i pin 2 e 3 come uscite digitali, subito dopo nel codice leggi i pin 2 e 3 con analogread.