Spero in una soluzione

E' un mese che cerco con arduino, leggendo tutti i topic del forum, di controllare 5 ingressi digitali insieme in un determintato periodo di tempo. Ho capito che la mia soluzione dovrebbe essere il millis, ma nonostante tutto non riesco a trovare una soluzione logica al mio problema;

ho collegato 5 pulsanti normalmente aperti tra il 5v e l'ingresso 1,2,3,4,5 digitali in parallelo con una resistenza da 680k e 5 led sull'uscita 9,10,11,12,13. Quello che non riesco a fare è:

Se chiudo il contatto dell'ingresso 1 e faccio il delay il programma si blocca per il tempo di delay quindi se l'ingresso 2 lo chiudo il programma non se ne accorge, ho utilizzato per questo motivo il millis però non sono riuscito lo stesso a risolvere il mio problema. Vi chiedo con arduino come posso fare due cose contemporaneamente in un periodo di tempo deciso da me?? Spero in una soluzione o esempi perchè sono a corto di idee...Grazie :-[

perchè non usi la libreria apposita per gestire i tasti? :) http://www.arduino.cc/playground/Code/Button

Grazie della risposta Brainbooster ma anche con questa libreria
#include <Button.h>
/*
create a Button object at pin 12
connect button between pin 12 and GND
*/
Button button = Button(12,PULLUP);
void setup(){
pinMode(13,OUTPUT); //debug to led 13
}

void loop(){
if(button.isPressed()){
digitalWrite(13,HIGH);
}else{
digitalWrite(13,LOW);
}
se premo il bottone sul pin 12 si accende il led sul pin 13 ma come faccio a dergli dei tempi?
es
se premo il bottone 12 il led 13 mi rimane acceso per 10 secondi ma se nel frattempo premo il bottone 2 il led 13 si spenge e mi si accende il led 11 :-[ :-[ :-[
grazie per l’aiuto

Ciao ARDUIX
Per primo le resistenze non devono andare in paralello ai pulsanti. Devono portare l’ ingresso a una tensione definita. puoi mettere la resistenza tra l’ entrata digitale e massa e il pulsante tra entrata e 5V cosí se il tasto non é peremuto la resistenza porta l’entrata a massa e leggi LOW. Quando premi il pulsante l’entrata di Arduino viene portata a 5V e leggi HIGH. In questo caso circola una corrente attraverso la resistenza perché é collegata tra 5V e massa.
Questa resistenza si chiama pull down ( portare in basso).
Puoi mettere la resistenza anche tra entrata e 5V e il tasto tra entrata e massa. Sempre la stessa cosa solo che col tasto premuto leggerai LOW e senó HIGH. si chiama tesistenza di pull up.
L’ ardiono puó attivare anche resistenza pull up interne. basta che definisi un pin come entrata e poi metti il pin su HIGH pinMode(pin, INPUT); // set pin to input
digitalWrite(pin, HIGH); // turn on pullup resistors

Se ho capito vuoi che un pulsante premuto accende per n secondi un LED.

Non usare i Pin 0 e 1 perche vengono usati per l’ interfaccia seriale.

Per esempio premi il pulsante sul pin 2 e accendi per 10 secondi il LED sul pin 9.
La stessa cosa col pulsante sul pin 3 e il LED sul pin 10
ecc.

Sottostante un esempio di come potrebbe funzionare (spero che non ho fatto errori perché non l’ ho testato). L’ esempio é fatto per 2 pulsanti e 2 LED; devi modificarlo se vuoi averne 5.

Come funziona:
Controlli se un pulsante é premuto. Se premuto memorizzi il tempo della funzione millis() accendi il LED e metti la variabile led per segnalare il LED acceso.
Poi controlli se il led é acceso e se il tempo é scaduto. Se sí: spegni il LED e metti la variabile led a 0.

#include <Button.h>
     
     Button pulsante1 = Button(2,PULLUP); // pulsante 1
     Button pulsante2 = Button(3,PULLUP); // pulsante 2 
      //... uguale per gli altri pulsanti
     
     unsigned long tempo1 ;  // variabile per il tempo led 1
     unsigned long tempo2 ;
     //... uguale per glia altri LED
     
     int acceso1 = 10000; //tempo di accensione led 1
     int acceso2 = 8000; //tempo di accensione led 2
     //... uguale per glia altri LED
     
     int led1 =0; // variabile per memorizzare se un led é acceso.
     int led2 =0;
          
     void setup(){
       pinMode(9,OUTPUT);  //LED 1
       pinMode(10,OUTPUT); //LED 2
       // ... uguale per gli altri led
     }
     
     void loop(){
       // controllo pulsanti e accensione LED se é spento
       if(pulsante1.isPressed()&&led1 == 0) 
         {
         digitalWrite(9,HIGH);  // accendi LED 1
         tempo1 = millis();  
         led1 = 1; // segnala led acceso  
         }
       if(pulsante2.isPressed()&&led2 ==0)
         {
         digitalWrite(10,HIGH);  // accendi LED 2
         tempo2 = millis();  
         led2 = 1;  // segnala led acceso  
         }  
       //... uguale per gli altri LED e pulsanti.
       
       if((millis() - tempo1 >= acceso1)&& led1==1)
         {
         digitalWrite(9,LOW);  // spegni LED 1  
         led1 = 0;
         }
        if((millis() - tempo2 >= acceso2)&& led2==1)
         {
         digitalWrite(10,LOW);  // spegni LED 2  
         led1 = 0;
         } 
         //... uguale per gli altri LED.
     }

Ciao Uwe

Ciao Uwe, ho provato a lavorare sul tuo codice ma non sono riuscito ad ottenere quello di cui avevo bisogno. Non riesco sempre a utilizzare alla perfezione il millis.

Ho levato il button e ho usato le resistenze pull up interne di arduino

pinMode(botton,INPUT); digitalWrite(botton,HIGH);

e poi ho adattato il tuo codice, senza però ottenere il risultato desiderato: void loop(){ stato=digitalRead(botton);// stato bottone st=digitalRead(LED);// stato LED

if((stato==1)&&(st==0)) { digitalWrite(LED,HIGH); tempo=millis(); st=1; if((millis()-tempo>=acceso)&&(st==1))// dove la variabile acceso è 5000 {

digitalWrite(LED,LOW); st=0; } }

In questo modo il led rimane accesso sempre invece di spengersi dopo 5 secondi... spero in una tua delucidazione. Grazie

Ciao ARDUIX Devi mettere il secondo if fuori dal primo. Oltre questo togli la lettura dello stato del LED visto che lo metti manualmente.

pinMode(botton,INPUT); digitalWrite(botton,HIGH); ... void loop(){ stato=digitalRead(botton);// stato bottone st=digitalRead(LED);// stato LED da cancellare!!

if((stato==1)&&(st==0)) { digitalWrite(LED,HIGH); tempo=millis(); st=1; Qua devi chiudere la if if((millis()-tempo>=acceso)&&(st==1))// dove la variabile acceso è 5000 {

digitalWrite(LED,LOW); st=0; } }

percui il codice funzionante é:

pinMode(botton,INPUT);
digitalWrite(botton,HIGH);
...
void loop(){
 stato=digitalRead(botton);// stato bottone
 if((stato==1)&&(st==0))
{
 digitalWrite(LED,HIGH);
 tempo=millis();
 st=1;
} 
if((millis()-tempo>=acceso)&&(st==1))     // dove la variabile acceso è 5000
 {
   digitalWrite(LED,LOW);
  st=0;
 }
}

Ciao Uwe