[Risolto] Far rimanere il segnale digitale a 1 per un po' di tempo in più?

Salve a tutti, sto realizzando un arpa laser con arduino UNO. Per non farla in modo troppo complicato ho usato delle fotoresistenze,con incollato un pezzo di plexiglass opaco per aumentare la superficie sensibile, montate su un supporto di legno, collegate agli ingressi digitali arduino, sulle quali sono puntati i raggi del proiettore laser. Le fotoresistenze sono collegate agli ingressi digitali come nell’immagine,perchè ci sono solo 6 ingressi analogici e non mi bastavano per tutti i raggi. Quando non viene puntata la luce sulla fotoresistenza la nota si accende mandando con l’interfaccia seriale il comando ON in midi, quando la luce è puntata sulla fotoresistenza la nota si spegne.L’ho provato usando dei led puntati sulle fotoresistenze e funziona tutto benissimo.Il problema c’è con il proiettore laser perchè mentre fa 12 raggi ha uno scan rate variabile ,anche se sembra ci sia un raggio fisso in realtà il raggio si accende e si spegne più volte ogni secondo e quindi immagino sia per questo che anche il segnale rilevato dagli ingressi va da 0 a 1 apparentemente in modo casuale facendo suonare le note anche quando non dovrebbero :disappointed_relieved:. Ho provato a campionare la durata di un impulso, con la funzione pulseIn, ma ho ottenuto dei valori diversi ogni volta. Vorrei trovare un modo per far restare a 1 il segnale nel tempo tra il raggio spento e il raggio acceso, anche se ci resta un po’ di più non sarebbe un problema.Vorrei avere un delay massimo di 30/50 ms da quando tolgo la luce, mettendo la mano sul raggio, a quando parte il suono .Io non so molto di elettronica. C’è un componente hardware che potrei usare per farlo? Perchè via software non penso che si riesca a fare nulla dato che la durata dell’impulso è variabile e ci sono più sensori da controllare. Ci ho provato con le funzioni millis() e con delay(), ho provato ad implementare una specie di filtro anti rimbalzo,ma non sono riuscito in nessun modo a farlo funzionare senza che mi suonasse delle note ogni tanto per conto suo. Il codice che funzionava con i led, ma che con il laser mi fa suonare ogni tanto note a caso, è qui sotto.

const int buttonPinUp = A2;                 //bottone ottava su
const int buttonPinDown = A1;               //bottone ottava giu

const int pinCount =7; //l'ultimo pin usato a partire da 2 compreso 
int octave=0;

struct luca{
int Fotopin;
int Fotovalue;
int Note;
int Stato;
}  Foto[pinCount];       //array di struct di tipo "luca" lunga "pinCount"

int buttonStateUp= 0;
int buttonStateDown= 0;
int buttonconstup=0;
int buttonconstdown=0;


void setup() {
  //  Set MIDI baud rate:
  Serial.begin(9600);
  //Set tutti i pin in INPUT mode
  for (int thisPin = 0; thisPin < pinCount; thisPin++)  {
  Foto[thisPin].Fotopin=thisPin+2;
  pinMode(Foto[thisPin].Fotopin, INPUT);  
  Foto[thisPin].Note=50+thisPin;
  Foto[thisPin].Stato=0;
  
}
 pinMode(buttonPinUp, INPUT); 
 pinMode(buttonPinDown, INPUT);    
}
//fine setup





//*******************************************************


 


 int velocity = 100;//velocity of MIDI notes, must be between 0 and 127
 //higher velocity usually makes MIDI instruments louder
 
 
 //******Funzione MIDIMessage******//
 void MIDImessage(int command, int MIDInote, int MIDIvelocity) {
  Serial.write(command);//send note on or note off command 
  Serial.write(MIDInote);//send pitch data
  Serial.write(MIDIvelocity);//send velocity data
}
//*******Fine funzione MIDIMessage*********//


 int noteON = 144;//144 = 10010000 in binary, note on command
 int noteOFF = 128;//128 = 10000000 in binary, note off command
 
void loop(){
  
  for (int i = 0; i < pinCount; i++)  {
    delay(1);
    
  Foto[i].Fotovalue= digitalRead(Foto[i].Fotopin);
    
    // read the state of the pushbutton value:
  buttonStateDown = digitalRead(buttonPinDown);
  buttonStateUp = digitalRead(buttonPinUp);
  
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonStateUp == HIGH && buttonconstup==0) {   
      octave+=12; 
      buttonconstup++;
  } 
  else if(buttonStateUp == LOW && buttonconstup==1)
  {
  buttonconstup--;
  }
  else{}
  
  if (buttonStateDown == HIGH && buttonconstdown==0){
       // check if the pushbutton is pressed.
   octave-=12;
   buttonconstdown++;  
  }
  else if (buttonStateDown == LOW && buttonconstdown==1)
{
buttonconstdown--;

}
else{}

  
  if (Foto[i].Fotovalue == LOW && Foto[i].Stato==0){
    MIDImessage(noteON, Foto[i].Note+octave, velocity);//turn note on
   // Serial.print(Foto[i].Stato);
    Foto[i].Stato=1;
  }
  else if(Foto[i].Fotovalue == HIGH && Foto[i].Stato==1){
    MIDImessage(noteOFF, Foto[i].Note+octave, velocity);//turn note off
    Foto[i].Stato=0;
  }
  
  else{}


  }
}

Benvenuto. :) Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0 e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0 - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0 - qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0 - qui una serie di link generici utili: http://forum.arduino.cc/index.php?topic=126861.0

Un semplice circuito RC dovrebbe fare al caso tuo.

In pratica è un circuito anti rimbalzo per pulsanti, ma puoi ottenere lo stesso risultato, in modo più elegante e funzionale, via software.

Grazie del consiglio :), ormai avevo abbandonato l’idea che si potesse fare via software.
Ho adattato un po’ di codice che ho trovato su internet http://arduino.cc/en/Tutorial/Debounce https://github.com/thomasfredericks/Bounce-Arduino-Wiring/wiki e adesso funziona :D.

const int buttonPinUp = A2;                 //bottone su
const int buttonPinDown = A1;               //bottone giu
const unsigned long time_delay=10;
const int pinCount =7; //l'ultimo pin usato a partire da 2 comprso 
int octave=0;

struct luca{
int Fotopin;
int Fotovalue;
int Note;
int Stato;
unsigned long current_time;
unsigned long tempo_accumulato;
unsigned long tempo;
}  Foto[pinCount]; //array di struct di tipo "luca" lunga "pinCount"

int buttonStateUp= 0;
int buttonStateDown= 0;
int buttonconstup=0;
int buttonconstdown=0;


void setup() {
  //  Set MIDI baud rate:
  Serial.begin(9600);
  //Set tutti i pin in INPUT mode
  for (int thisPin = 0; thisPin < pinCount; thisPin++)  {
  Foto[thisPin].Fotopin=thisPin+2;
  pinMode(Foto[thisPin].Fotopin, INPUT);  
  Foto[thisPin].Note=50+thisPin;
  Foto[thisPin].Stato=0;
  Foto[thisPin].tempo_accumulato=0;
  Foto[thisPin].tempo=0;
  Foto[thisPin].current_time=0;
  
}
 pinMode(buttonPinUp, INPUT); 
 pinMode(buttonPinDown, INPUT);    
}
//fine setup





//*******************************************************


 


 int velocity = 100;//velocity of MIDI notes, must be between 0 and 127
 //higher velocity usually makes MIDI instruments louder
 
 
 //******Funzione MIDIMessage******//
 void MIDImessage(int command, int MIDInote, int MIDIvelocity) {
  Serial.write(command);//send note on or note off command 
  Serial.write(MIDInote);//send pitch data
  Serial.write(MIDIvelocity);//send velocity data
}
//*******Fine funzione MIDIMessage*********//


 int noteON = 144;//144 = 10010000 in binary, note on command
 int noteOFF = 128;//128 = 10000000 in binary, note off command
 
void loop(){
  
  for (int i = 0; i < pinCount; i++)  {
    Foto[i].current_time=millis();
     Foto[i].Fotovalue= digitalRead(Foto[i].Fotopin);
     if (Foto[i].Fotovalue == HIGH){
       Foto[i].tempo=millis()-Foto[i].current_time+Foto[i].tempo_accumulato;
       if ((Foto[i].tempo>=time_delay)&&(Foto[i].Stato==0))
       {
         MIDImessage(noteON, Foto[i].Note+octave, velocity);//turn note on
         // Serial.print(Foto[i].Stato);
         Foto[i].Stato=1;
       }
       else{
         Foto[i].tempo_accumulato=Foto[i].tempo;
       }
     }
     else if((Foto[i].Fotovalue == LOW)&&(Foto[i].Stato==1)){
      Foto[i].tempo_accumulato=0;
      MIDImessage(noteOFF, Foto[i].Note+octave, velocity);
      Foto[i].Stato=0;
 }
 else {
 Foto[i].tempo_accumulato=0;
 }
  }
}