relè a tempo

salve a tutti
avevo gia scritto questo argomento,ma è sparito dal forum.booo
volevo un vostro aiuto:
ho progettato un piccolo arduino con un ricevitore ad IR di cui poter comandare delle luci tramite il telecomando della tv.
fin qui tutto oh.
vorrei comandare anche la tenda motorizzata: sale e scende.
con un comando tramite il tasto del T.C. si eccita un relè e parte la tenda, ma devo peterla temporizzare fino alla chiusura.
ho gia provato con dylay, ma nel tempo che la tenda scende o sale non posso fare altro e neppure bloccarla alla posizione desiderata.
qualcuno mi ha detto di millis. ma io non ho capito dove infilarli nel programma.
ne sarei molto grado del vostro aiuto.
dimenticavo :non sono un programmatore e non me la cavo per niente bene. il mio primo progettino.

questo e il progetto.
grazie attendo risposte.

#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
 }
}

Non è una questione di tempo (delay o millis), ma di posizione, metti dei sensori di finecorsa sulla tenda, uno su e uno giu, e fai andare il motore fino a che non hai raggiunto la posizione.

Premetto che non sono esperto di Arduino, ma esperto di programmazione.

Detto questo, triac probabilmente ha ragione, dal punto di vista logico credo che non sia l'approccio più adatto.

Comunque, qualora tu volessi "temporizzare" il comando, io userei i millis.

Il millis ti ritorna un numero intero (esattamente un long) che identifica i millisecondi dalla data utc... per farla semplice è un numero che aumenta di 1 ogni millisecondo.

il che significa che se tu ti salvi il millis appena fai partire la tendina, e nel loop fai il controllo, puoi decidere per esempio di bloccarla dopo 5 secondi.

per scriverti due righe su cui puoi basarti

long starttime;
long now;

void setup(){
   starttime =-1;
}


void loop(){

   //Inizializzo starttime solo una volta
   if(starttime == -1)
       starttime=millis();


   now = millis();

   //Se sono passati più di 5 secondi da quando hai contato lo starttime
   if(now-starttime >=5000){
      //Fai qualcosa
   }
 
}
long int decCode = results.value;

userei un unsigned long per memorizzare i valori trasmessi. cosí non hai numeri negativi.
Ciao Uwe

buon giorno
con il discorso dei fine corsa esistono di già:
e lavorano se uso la tenda con i suoi pulsanti.
solo che se aziono arduino la tenda va tutta giù con i suoi fine corsa si ferma,ma se poi per sbaglio aziono il pulsante manuale su, mi ritroverei corrente su tutte e due le velocità.
per questo voglio darli un tempo prestabilito.

ripeto non capisco niente di programmazione.,
dove devo infilare i millis nel mio programma.
grazie in anticipo…

I millis li devi infilare nel loop, quando azioni il motore memorizzi in una tua variabile i millis() di quel momento, e poi controlli nel loop se sono trascorsi i tuoi millisecondi, a quel punto esegui la tua azione.
Io sono contrario a utilizzare un tempo per controllare una condizione logica, è un controsenso.
Non si capisce esattamente chi, come e quando aziona il motore e con quali modalità, spiegati meglio, facci capire.

avevo gia scritto questo argomento,ma è sparito dal forum.booo

Non so se questa è una scusa per riaprire un altro treadh dato che nell'altro non hai trovato una risposta esauriente e completa.

Quando perdi un post ti è sufficiente cliccare sul tuo nick e selezionare la voce "Show Post" e li puoi leggere tutto quello che hai scritto tu da quando sei iscritto
qui http://forum.arduino.cc/index.php?action=profile;area=showposts;u=303701

il tuo treadh precedente è questo (se non lo trovi più) :slight_smile:

che dalla sezione software hai spostato alla sezione Generale modificandone il titolo, ma restando sempr nell'argomento medesimo

Tornando al tuo quesito, ti è stato esposto come procedere per temporizzare un OUTPUT, ma a prescindere da come si fa, se posso permettermi stai perdendo il tuo tempo per l'utilizzo che vuoi farne.

In sostanza non puoi selezionare la posizione di una tenda o serranda con la semplice misurazione del tempo ON SU o ON GIU' .... ci sono troppe variabili imperfette in gioco date dal software, dall'hardware e da condizioni impreviste che in pochi cicli su/giù sballano tutto.

I finecorsa del motore sono montati all'interno del motore infilato nel tubolare di avvolgimento che non ha uscite a te disponibili per la rilevazione .... in poche parole non ti è permesso nemmeno sapere se la tenda è tutta SU o tutta GIU', il controllo dei finecorsa è integrato e tarato da viti senza fine e non raggiungibile elettricamente.
In sostanza, aggiungi tu dispositivi (analogici o digitali) che ne determinano la reale posizione in qualunque momento (anche al reset del micro), misurare un tempo ON è altamente impreciso, non è la via migliore.

ciao

buon giorno Pablos
innanzi tutto grazie per le risposte riguardo al forum.

Per quanto riguarda il tempo io voglio far diseccitare il relè dopo un tot di tempo ,per il semplice motivo :
se il relè in salita mi rimane eccitato e quindi corrente fissa sulla tenda ,anche se è ferma a causa del suo fine corsa;
vado ad azionare in terrazza, il pulsante manuale di discesa, mi troverei corrente su tutte e due le velocità.
e quindi se il relè in precedenza si era diseccitato anche dopo 5 minuti del fine corsa della tenda non avrei questo problema.

il tempo non mi serve per far fermare la tenda ma bensì per per disalimentare la tenda quando ha finito,che poi sia un minuto o 5 non importa non si parla di fine corsa e quindi di secondi.

spero che sono stato chiaro.
se qualcuno mi puo aiutare a programmarlo ne sarei grado.
ripeto non so programmare.
grazie.

Doppione di

Chiudo.