Problema Interrupt + Serial.println

Salve ragazzi!!!
Stavo sviluppando un progetto abbastanza semplice ( una versione del Cat Feeder ormai famoso sul sito) con degli interrupt.
In pratica un sensore luminoso genera un interrupt quando c’è molta luce ( e la resistenza LDR si abbassa, tipo FALLING) , e questo evento aziona un servomotore che ,dalla posizione di riposo impostata nel loop, si apre per 5 secondi e poi si richiude.
Fino a qui tutto bene. Poi ho cominciato a “ricamare il software”, e ho inserito qualche Serial.print per tenere d’occhio alcune cose, ad esempio, quante volte era stato azionato il meccanismo. ( Gli interrupt vengono disabilitati dopo 5 eventi) .
Ebbene, da quando ho inserito i println , il codice si blocca spesso e volentieri. Nella console vengono visualizzate scritte come

“Evento Rilevato: pasto numero 1”
“Evento Rilevato: pasto numero 2”
“Ev”

E poi si blocca. Non riesco a capire perchè, e la cosa è molto fastidiosa. Qualcuno può darmi una mano?
Senza le stampe a video invece funziona perfettamente.
P.S Inoltre, se mando piu impulsi luminosi mentre il motorino è “aperto”, lui li legge come interrupt e li scala dal totale. Ho provato a giocare con NoInterrupts(), interrupts() e detachInterrupt(0) ma niente…
Vi riporto qui sotto il codice:

// Servo in posizione =33 gradi.

#include <Servo.h>

Servo myServo;            

volatile int apri,intcount=0;

void setup() {
  attachInterrupt(0,open_gate,FALLING);
  myServo.attach(9);      
  Serial.begin(9600);     
    myServo.write(33);  
}

void loop() {
  if(intcount==5){
    detachInterrupt(0);
  }
  if (apri==1){
  apriti();}
   myServo.write(33); 
 }

void open_gate(){
  apri=1;
  intcount++;
  //Serial.print("Evento Rilevato: Pasto numero ");
  //Serial.print(intcount,1);
  //Serial.println(" ");
 }

void apriti(){
myServo.write(123);
delay(5000);
apri=0;
}

Togli i serial.print da dentro gli interrupt. Siccome anche la stampa su seriale è gestita da interrupt, nel momento in cui disattivi l'interrupt blocchi anche l'invio di dati sulla seriale.

... aggiungo ... le ISR devono essere il più possibile brevi e veloci ... senza tanti fronzoli e chiamate inutili che vanno invece fatte da dentro il codice del programma.

Tipicamente aggiorni/incrementi variabili dichiarate "voliatili" e poco altro ... ;)

Guglielmo

Intanto grazie a entrambi per questa delucidazione sugli interrupt ( se non si era capito, è la prima volta che li uso :smiley: ) .
Ora invece mi resta il secondo problema, ovvero quello della ricezione degli interrupt anche quando non dovrebbe riceverne.
Io l’avevo pensata cosi: appena arriva l’interrupt parte la funzione open_gate(), dentro a questa io disabilito gli interrupts con noInterrupts(), aggiorno le variabili ecc , poi torna al loop, che chiama la funzione apriti(), la quale mi aziona il motorino, poi finisce, ritorna al loop, e qui ho provato a riabilitare gli interrupts con interrupts (). Secondo la mia logica dovrebbe funzionare, ma in pratica non lo fa . vi posto anche questa parte di codice.

#include <Servo.h>

Servo myServo;

volatile int apri,intcount=0;

void setup() {
attachInterrupt(0,open_gate,FALLING); //pin2
myServo.attach(9);
Serial.begin(9600);
myServo.write(33);

}

void loop() {
if(intcount==5){
detachInterrupt(0);
}
if (apri==1){
apriti();
interrupts();
}
myServo.write(33);
}

void open_gate(){
noInterrupts();
apri=1;
intcount++;
}

void apriti(){
myServo.write(123);
delay(5000);
apri=0;
}