prendiamo di esempio il blinkwithoutdelay
const int ledPin = 13; // the number of the LED pin
// Variables will change:
int ledState = LOW; // ledState used to set the LED
long previousMillis = 0; // will store last time LED was updated
// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000; // interval at which to blink (milliseconds)
void setup() {
// set the digital pin as output:
pinMode(ledPin, OUTPUT);
}
void loop()
{
// here is where you'd put code that needs to be running all the time.
// check to see if it's time to blink the LED; that is, if the
// difference between the current time and last time you blinked
// the LED is bigger than the interval at which you want to
// blink the LED.
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if the LED is off turn it on and vice-versa:
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
}
}
scorporiamo il codice in modo da capirlo per bene tutto in ogni sua parte
const int ledPin = 13;
int ledState = LOW;
long previousMillis = 0;
long interval = 1000;
allora in questo caso crea 4 variabili:
1 con lo stato attuale del led (HIGH acceso, LOW spento)
poi ledPin che è dove ha connesso il led
previousMillis che è il tempo rispetto all'accensione di arduino in cui ha cambiato lo stato al led per l'ultima volta
infine interval che è il tempo in millisecondi per cui vuole che il led sia acceso/spento
il setup immagino si possa saltare
ora passiamo al loop
unsigned long currentMillis = millis();
assegna ad ogni inizio ciclo il valore di quel momento (sempre rispetto all'accensione, misurato in millisecondi) ad una variabile, infatti il ciclo ci mette del tempo ad eseguirsi sulla base di quanto "pesante" è il codice (il tempo dei loop si misura in genere in cicli di clock necessari per le istruzioni ma a noi non interessa).
quindi passiamo alla parte forte:
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);
}
il primo if fa un controllo e dice "se io al tempo attuale elimino il tempo dell'ultimo cambio del led, questo è superiore all'intervallo che devo aspettare?", insomma è passato un tempo interval dall'ultima istruzione?
se si allora dobbiamo fare 3 cose:
- assegnare il valore attuale a previousMillis, infatti noi ora andiamo a dare un'istruzione al led quindi ora è il momento in cui è stata fatta l'ultima istruzione
previousMillis = currentMillis;
- cambiare lo stato alla variabile ledState che contiene come dovrebbe essere il nostro led, quindi andiamo ad invertirne il valore (se prima il led era acceso ora settiamo la variabile a spento e vice versa)
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
- andare a cambiare lo stato al led assegnandogli il valore di ledState appena cambiato
digitalWrite(ledPin, ledState);
di per se potresti fare un copia incolla del codice iniziale ma non capiresti quindi te l'ho scorporato
mettiamo invece che tu voglia far lampeggiare 2 led con velocità diverse dovrai rifare lo stesso codice 2 volte (quindi avrai un tempo di delay del led 1 e uno del led 2, un check per il led 1 e uno per il led 2 ed un tempo di istruzione per il led 1 e per il led 2), con 3 led 3 volte(3 tempi di delay ecc..)
capito?