/*
- * Interrupt base
- *
- * Utilizzo di un interrupt ala Arduino per intercettare
- * la pressione di un bottone.
- *
+ Interrupt base
+
+ Utilizzo di un interrupt ala Arduino per intercettare
+ la pressione di un bottone.
+
+ Un momentary switch e' collegato in PULL UP al PIN D2
+ La Interrupt Service Routine reazioneISR viene associata all'interrupt 0
+ che reagisce al passaggio di stato 5v -> 0v del PIN D2
+
+ La pressione del bottone causa l'accensione del bottone
+ che viene spento periodicamente ogni 3 secondi nel loop,
+ il delay non pregiudica la percezione dell'evento.
+
+Schema: https://www.arduino.cc/en/uploads/Tutorial/inputPullupButton.png
+
*/
int ledPin = 13;
void setup()
{
pinMode(ledPin, OUTPUT);
- attachInterrupt(0, eventoAttivo, RISING); // 0 e' l'interrupt numero 0
+ pinMode(2, INPUT_PULLUP);
+ attachInterrupt(0, reazioneISR, FALLING); // 0 e' l'interrupt numero 0
// connesso al PIN D2, l'interrupt 1 e' connesso al PIN D3
// eventoAttivo : nome della funzione da richiamare
// per un ISRs e' sempre VOID
void loop()
{
// Varie altre cose che da cui non dipende la gestione dell'interrupt
- delay(5000);
+ delay(3000);
digitalWrite(ledPin,LOW);
}
-void eventoAttivo() // Sempre VOID
+void reazioneISR() // Sempre VOID
{
digitalWrite(ledPin, HIGH);
}
/*
- * Interrupt doppia ISR
- *
- * Utilizzo di un interrupt ala Arduino per intercettare
- * la pressione di un bottone.
- *
- * Doppia ISR: la prima ISR intercetta FALLING
- * e riconfigura l'interrupt con RISING a una seconda
- * ISR che a sua volta ripristina il comportamento
- * precedente.
+ Interrupt doppia ISR
+
+ Utilizzo di un interrupt ala Arduino per intercettare
+ la pressione di un bottone in PULL UP.
+
+ Doppia ISR: la prima ISR intercetta FALLING
+ e riconfigura l'interrupt con RISING per una seconda
+ ISR che a sua volta ripristina il comportamento
+ precedente.
+
+Schema: https://www.arduino.cc/en/uploads/Tutorial/inputPullupButton.png
*/
int ledPin = 13;
* e riconfigura l'interrupt con RISING a una seconda
* ISR che a sua volta ripristina il comportamento
* precedente.
+
+ In questa versione le ISRs modificano una variabile state
+ corrispondente allo stato del bottone, impostato nel loop.
*/
const byte ledPin = 13;
digitalWrite(ledPin, state);
// La variabile state viene richiamata fuori dalla ISR
// quindi deve essere dichiarata volatile
+// altrimenti il compilatore potrebbe decidere di trattarlo come constante
+// in fase di ottimizzazione
+// oppure si potrebbe creare un dualismo tra il valore di questa
+// storato in SRAM o in un registro
}
void eventoFall() // Sempre VOID
led.Green();
if (millis() - timer >= pausa * 2/3) {
state = wait_button ;
- timer = millis();
+ timer += pausa * 2/3;
}
break;
case wait_button:
if (digitalRead(input) == LOW) {
state = turn_yellow ; // Il passaggio di stato avviene alla pressione di un bottone
- timer = millis();
delay(20); // Debouncing, si potrebbe fare con millis()
+ timer = millis();
};
break;
led.Yellow();
if (millis() - timer >= pausa * 2/3) {
state = turn_red ;
- timer = millis();
+ timer += pausa * 2/3;
}
break;
led.Red();
if (millis() - timer >= pausa) {
state = turn_green ;
- timer = millis();
+ timer += pausa ;
}
break;
// Illumina il led a 500ms
if(millis() + shift - previousMillis > interval) {
- // save the last time you blinked the LED
- previousMillis = millis();
// if the LED is off turn it on and vice-versa:
ledState = !ledState ; // Inverti il LED
+ // set the LED with the ledState of the variable:
+ digitalWrite(ledPin, ledState);
+ // save the last time you blinked the LED
+ previousMillis += interval;
}
- // set the LED with the ledState of the variable:
- digitalWrite(ledPin, ledState);
};
void Lampeggiatore::Blink(long time, long drift ) {
shift = drift;
if(millis() + shift - previousMillis > time) {
- // save the last time you blinked the LED
- previousMillis = millis();
-
// if the LED is off turn it on and vice-versa:
ledState = !ledState ; // Inverti il LED
- }
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
+ // save the last time you blinked the LED
+ previousMillis += time;
+ }
};
void Lampeggiatore::Blink(long up, long down, long drift ) {
shift = drift;
if((ledState == HIGH)&& (millis() + shift - previousMillis > up)) {
// save the last time you blinked the LED
- previousMillis = millis();
+ previousMillis += up;
ledState = LOW ;
}
else if((ledState == LOW)&& (millis() + shift - previousMillis > down)) {
- previousMillis = millis();
+ previousMillis += down;
ledState = HIGH ;
}
void Pwm::lSet(byte brightness) {
- // Imposta il valore del PWM
+ // Imposta il valore del PWM con correzione luminosita' LED
analogWrite(ledPin, lum(brightness));
}
void loop() {
led.Blink(); // Lampeggia con un default di 1sec (0.5 HI 0.5 LOW)
// led.Blink(400); // Lampeggia ogni 400ms
-// led.Blink(400,200); // Imposta il tempo acceso e il tempo spento a 400ms, 200ms di ritardo
+// led.Blink(400,200); // Imposta il tempo acceso a 400ms, 200ms di ritardo
// led.Blink(300,700,0); // acceso per 300ms, spento per 700 ms, ritardo = 0ms
// led.Blink(300,700,500); // acceso per 300ms, spento per 700 ms, ritardo = 500s
// led.High(); // Stato su HI
PWM per un LED: aumentare progressivamente la luminosita'.
Utilizza la funzione millis() invece che un delay()
in modo da non blocare il processore.
+
+ La durata del ciclo e' pero' molto approssimativa in multipli di 256ms
+ quindi con errore di +-128ms, inoltre si possono accumulare ulteriori
+ ritardi se la funzione non viene eseguita regolarmente ogni ms.
*/
// nell'intervallo discreto con minimo 0 (spento) e massimo 255 (acceso).
if ((millis() - previousMillis) > speed / 256) {
- brightness = brightness + 1; // Incrementiamo la luminosita'
+ brightness++ ; // Incrementiamo la luminosita'
previousMillis = millis();
};
}
-