/* Blink without Delay - Pulizia Semplificato il ciclo condizionale, la seconda funzione non necessita di una variabile di stato per tracciare il LED. */ // constants won't change. Used here to // set pin numbers: // First LED const int ledA = 13; // the number of the LED pin // Variables will change: int ledStateA = LOW; // ledState used to set the LED long previousMillisA = 0; // will store last time LED was updated // Second LED data const int ledB = 12; //Secondo LED // int ledStateB = LOW; // Possiamo leggere lo stato del registro del LED // con digitalRead() unsigned long previousMillisB = 0; // millis() ritorna sempre un unsigned long void setup() { // set the digital pin as output: pinMode(ledA, OUTPUT); pinMode(ledB, OUTPUT); } void loop() { lightLedA(1000); lightLedB(500); } //////////////// // Funzioni void lightLedA (int interval) { // Illumina il ledA secondo un intervallo passato come argomento if (millis() >= previousMillisA + interval) { // save the last time you blinked the LED previousMillisA += interval; // if the LED is off turn it on and vice-versa: ledStateA = !ledStateA ; // Inverti il LED } digitalWrite(ledA, ledStateA); } void lightLedB (int interval) { // Illumina il ledB secondo un intervallo passato come argomento if (millis() - previousMillisB >= interval) { previousMillisB += interval; digitalWrite(ledB, !digitalRead(ledB)); // Leggiamo direttamente il registro di ledB e scriviamo il suo opposto, // questo ci permette di non dover avere una variabile per tracciare lo stato. } } /* Domande: 1. E' possibile avere una sola funzione che permetta di gestire qualunque LED io voglia aggiungere? . . . . . . . . . . . . Risposte: 1. Allo stato attuale la funzione lightLed deve avere una variabile univoca previousMillis per ogni LED che gestisce. Servirebbe un costrutto che permetta di raggruppare le proprieta' di ogni LED (es. struct) da associare poi alla unziona che aggiorna il LED. Ancora meglio un costrutto (oggetto) che associ sia le proprita' che le azioni in un unico oggetto. /* Ulteriori approfondimenti - integrazione tra funzioni e dati: programmazione a oggetti - Uso di pointers per modificare dati esterni allo scope della funzione, static - Uso di forme di dati strutturate (array, struct) per scambiare dati tra funzioni e programma */