temporizzare in consenso

salve a tutti
vi confesso che sono alle prime armi.
sto cercando di progettare :
con il telecomando della tv,gestire diverse cose con diversi tasti;
accendere e spegnere le vari luci che ho in casa.
e fin qua ci sono quasi riuscito.
il problema nasce azionando un comando per aprire e chiudere la tenda motorizzata.
in pratica ho creato due comandi che mi gestiscono la salita e la discesa, ma mi serve temporizzalre entrambi,cioè quando aziono il comando, sali: si aziona un relè e sale ma si deve fermare ad un tempo che io imposto.
ho provato con il delay ma finchè non finisce di contare non mi far fare altro.
esiste un modo diverso? vi ricordo che quello che sono riuscito a fare non affatto tutto merito mio.

grazie in anticipo

#include <IRremote.h>

int RECV_PIN = 12;



int tendasuPin = 2;                 
int tendagiuPin = 3;                
int luceAPin = 4;                
int luceBPin = 5; 
int luceCPin = 6;                
int luceDPin = 7; 
int luceEPin = 8; 
int luceFPin = 9;                
int luceGPin = 10;
int luceHPin = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn(); 
 


 
 pinMode(tendasuPin, OUTPUT); 
 pinMode(tendagiuPin, OUTPUT);      
 pinMode(luceAPin, OUTPUT);      
 pinMode(luceBPin, OUTPUT); 
 pinMode(luceCPin, OUTPUT);      
 pinMode(luceDPin, OUTPUT);
 pinMode(luceEPin, OUTPUT); 
 pinMode(luceFPin, OUTPUT);      
 pinMode(luceGPin, OUTPUT); 
 pinMode(luceHPin, OUTPUT); 
 
}

void loop() {

 if (irrecv.decode(&results)) {
   
   long int decCode = results.value;
   Serial.println(decCode);
   switch (results.value) {
     
     
     case -1524634562:
       Serial.println("tendasu");
       digitalWrite(tendasuPin, HIGH);
       digitalWrite(tendagiuPin, LOW);
     break;
       
       
       
     case -932981048:
       Serial.println("tendagiu");
       digitalWrite(tendagiuPin, HIGH);
        digitalWrite(tendasuPin, LOW);
       break;
       
       
     case 1976685926:
       Serial.println("luceA");
       digitalWrite(luceAPin, HIGH);
       delay(400);              
       digitalWrite(luceAPin, LOW);    
       break;
       
       
     case -451201714:
       Serial.println("luceB");
       digitalWrite(luceBPin, HIGH);
     delay(400);              
       digitalWrite(luceBPin, LOW);    
       break;
       
       
       
       case -520862424:
       Serial.println("luceC");
       digitalWrite(luceCPin, HIGH);
     delay(400);              
       digitalWrite(luceCPin, LOW);    
       break;
       
       
       
       case 1784778242:
       Serial.println("luceD");
       digitalWrite(luceDPin, HIGH);
     delay(400);              
       digitalWrite(luceDPin, LOW);    
       break;
       
       
       
       case -622165012:
       Serial.println("luceE");
       digitalWrite(luceEPin, HIGH);
         delay(400);
     digitalWrite(luceEPin, LOW);    
       break;
       
       case 732942060:
       Serial.println("luceF");
       digitalWrite(luceFPin, HIGH);   
       break;
       
       case -1256125018:
       Serial.println("luceG");
       digitalWrite(luceGPin, HIGH);   
       break;
       
       
       
        
     case 298013739:
       Serial.println("luceH");
       digitalWrite(luceHPin, HIGH);
       
       break;
     
       
     case -314190012:
       Serial.println("Stop");
       digitalWrite(tendasuPin, LOW);   
       digitalWrite(tendagiuPin, LOW);   
       digitalWrite(luceAPin, LOW);  
       digitalWrite(luceBPin, LOW);
       digitalWrite(luceCPin, LOW);
       digitalWrite(luceDPin, LOW);
       digitalWrite(luceEPin, LOW);
       digitalWrite(luceFPin, LOW);
       digitalWrite(luceGPin, LOW);
       digitalWrite(luceHPin, LOW);
       break;  
     default: 
       Serial.println("Waiting ...");
   }

   irrecv.resume(); // Receive the next value
 }
}
  1. usa i CODE Tag
  2. presenteti nella discusione apposta
  3. Se vuoi scrivere in italiano lo devi fare nalla parte italiana del forum
  4. usa millis() al posto del delay() vedi esempio wait without delay

Ciao Uwe

Come suggerito da Uwe, utilizza la funzione millis().

Qui una guida completa sul suo utilizzo.

scusate per l'errore
non riesco a trovare il forum di benvenuto ...
e pensavo fosse questo quello in italiano..

comunque grazie per le risposte..

scusate se continuo a scrivere qui..
ma il programma che c'è nel link di brado proprio non capisco come integrarlo nel mio .

ho provato a buttarlo nell'arduino ma c'è un led che lampeggia in continuazione. e che credo sia la sua funzione

io avrei bisogno che abilito un uscita con il telecomando (come nello schema che ho postato ) e che dopo un tot di tempo (impostato da me) si disabiliti. nonostante mi faccia fare le altre funzioni.
grazie mille per l'aiuto, e scusate ancora.

cosmiko82:
scusate se continuo a scrivere qui..
ma il programma che c'è nel link di brado proprio non capisco come integrarlo nel mio .

ho provato a buttarlo nell'arduino ma c'è un led che lampeggia in continuazione. e che credo sia la sua funzione

Beh, è ovvio e giusto che faccia così dato che il programma linkato fa proprio questo... :sweat_smile:
Quello è un "esempio"....

io avrei bisogno che abilito un uscita con il telecomando (come nello schema che ho postato ) e che dopo un tot di tempo (impostato da me) si disabiliti. nonostante mi faccia fare le altre funzioni.
grazie mille per l'aiuto, e scusate ancora.

Questo è un programma che devi scrivere tu, prendendo spunto dall'articolo che ti hanno suggerito come base per capire come si usa millis().

Immagino
ma come ripeto sono molto alle prime armi. qualcuno mi potrebbe aiutare, magari integrarlo nel mio programma.
ne sarei molto grato.

No, L'esperienza devi fartela Tu. Prendi un libro o un tutorial su internet e impara le basi.
Ciao Uwe

Suggerimento: quando premi tasto tenda su/tenda giu metti in una variabile numerica (esempio StatoTenda) un valore noto,
0=non fare nulla, 1=tenda su, 2=tenda giu.
La variabile sarà di solito 0, quando premi tenda su, la metti a 1, quando premi tenda giu la metti a 2 e fai partire il conteggio e il motore/i.

Alla fine della loop() metti un pezzo di codice che si chiede, StatoTenda>0 ?
Se si, varrà o 1 o 2, perciò verifica/conta il tempo e se passato il tempo stoppa la tenda e rimette StatoTenda=0
Per la questione del tempo devi vedere e capire l'esempio BlinkWithoutDelay