Problemi di gestione del tempo con Arduino

Salve a tutti, mi sono appena iscritto su questo forum.
Ho dei problemi a gestire il tempo con Arduino. Vi spiego:
Sto cercando di costruire il cannone spara bolle che ho trovato al seguente link: http://scuola.arduino.cc/courses/lessons/view/MVxaMVd
Dopo aver deciso di apportare delle modifiche (un sensore PIR al posto della fotoresistenza, eliminare il potenziometro ventola) e aver fatto i calcoli per transistor e resistenze, sono passato alla scrittura del codice.
Inizialmente ho utilizzato il delay(10000) per far sparare bolle per 10 secondi.

const int ventola = 11;
const int potM = A0;       //Potenziometro Motorino per le bolle
const int motore = 9;      //Motorino
const int sensorPir = 8;   //Sensore di movimento

int sensorMotore = 0;         // valore letto dal potenziometro motorino
int outputMotore = 0;         // valore in uscita al motorino PWM
int sensorPirValue = 0;       //valore letto dal sensore pir

void setup() {
  pinMode(sensorPir, INPUT);
  pinMode(ventola, OUTPUT);
}

void loop() {
  //legge il valore del sensore Pir
  sensorPirValue = digitalRead(sensorPir);
  if (sensorPirValue == HIGH){
      
    //legge il valore del potenziometro del motore, lo mappa e manda in
    //uscita sul motore il segnale PWM
    sensorMotore = analogRead(potM);            
    outputMotore = map(sensorMotore, 0, 1023, 0, 255);  
    analogWrite(motore, outputMotore); 
    //fa girare la ventola 
    digitalWrite(ventola, HIGH);
    // attende 10 secondi
    delay(10000);
  }  
}

tuttavia mi sono accorto che in questo modo non sarebbe stato possibile regolare la velocità del motorino mentre questo ruotava.
Quindi ho elaborato quest'altro metodo, un po' più macchinoso:

const int ventola = 11;
const int potM = A0;       //Potenziometro Motorino per le bolle
const int motore = 9;
const int sensorPir = 8;   //Sensore di movimento

int time = 0;                 //variabile di tempo
int sensorMotore = 0;         // valore letto dal potenziometro motorino
int outputMotore = 0;         // valore in uscita al motorino PWM
int sensorPirValue = 0;       //valore letto dal sensore pir

void setup() {
  pinMode(sensorPir, INPUT);
  pinMode(ventola,OUTPUT);
}

void loop() {
  //legge il valore del sensore Pir
  sensorPirValue = digitalRead(sensorPir);
  if (sensorPirValue == HIGH){
    time = 10000;            //assegna 10000 ms
  }
  else{
    time = 0;
  }
  if (time > 0){
    //legge il valore del potenziometro del motore, lo mappa e manda in
    //uscita sul motore il segnale PWM
    sensorMotore = analogRead(potM);            
    outputMotore = map(sensorMotore, 0, 1023, 0, 255);  
    analogWrite(motore, outputMotore);  
    //attiva la ventola
    digitalWrite(ventola, HIGH);
    //attende 300 ms
    delay(300);
    //sottrae 300 ms
    time -= 300;
  }  
}

Ma nemmeno questo codice funziona correttamente.
Ho fatto diverse ricerche su Google, e molti fanno riferimento al millis() della libreria Time.h, ma non sono riuscito a capire bene come funziona. Adesso mi trovo in una situazione di stallo e non so come procedere. Per favore aiutatemi!
Grazie in anticipo :slight_smile:

Prima di tutto, essendo il tuo primo post, ti pregherei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ...

... poi ... devi studiarti come si usa la millis() prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo