Tapparella temporizzata

Salve, ho realizzato una tapparella automatizzata con motore controllato attraverso scheda rele di arduino comandata attraverso un telecomando a infrarossi(ho usato il sensore infrarossi TSOP31236 per ricevere i dati). In più ho implementato il tutto con un rtc st1307 per il conteggio del tempo in modo che ogni giorno alle ore 2 di notte, la serranda si chiude atomaticamente.
Per ora uso 3 pulsanti del telecomando infrarossi per comandare la tapparella:
-1° pulsante la tapparella va su
-2° pulsante la tapparella va giu
-3° pulsante ferma il tutto ovvero il motore si ferma
Il problema è che se voglio chiudere o aprire solo parzialmente la tapparella devo schiacciare pulsante 1 o 2 ,aspettare che si apra a piacimento e premere il pulsante 3 per fermare il movimento.
Mi piacerebbe invece che una volta premuto il pulsante 1 o 2 del telecomando, dopo un tot di secondi scelti da me il motore si fermasse automaticamente.
Ho gia provato con la funzione delay ma ha il problema di fermare tutti gli altri compiti che sta svolgendo arduino. Conoscete un altro metodo per fare quanto scritto sopra magari anche sfruttando l' rtc st1307?

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Porto la tua attenzione sul punto 15 del regolamento ed in particolare sul punto 15.3 ... mi raccomando ... non vorrei dover chiudere il post ... :wink:

Carbo9797:
Salve, ho realizzato una tapparella automatizzata con motore controllato attraverso scheda rele di arduino comandata attraverso un telecomando a infrarossi(ho usato il sensore infrarossi TSOP31236 per ricevere i dati). In più ho implementato il tutto con un rtc st1307 per il conteggio del tempo in modo che ogni giorno alle ore 2 di notte, la serranda si chiude atomaticamente.
Per ora uso 3 pulsanti del telecomando infrarossi per comandare la tapparella:
-1° pulsante la tapparella va su
-2° pulsante la tapparella va giu
-3° pulsante ferma il tutto ovvero il motore si ferma
Il problema è che se voglio chiudere o aprire solo parzialmente la tapparella devo schiacciare pulsante 1 o 2 ,aspettare che si apra a piacimento e premere il pulsante 3 per fermare il movimento.
Mi piacerebbe invece che una volta premuto il pulsante 1 o 2 del telecomando, dopo un tot di secondi scelti da me il motore si fermasse automaticamente.
Ho gia provato con la funzione delay ma ha il problema di fermare tutti gli altri compiti che sta svolgendo arduino. Conoscete un altro metodo per fare quanto scritto sopra magari anche sfruttando l' rtc st1307?

ciao Carbo, ho realizzato anch'io un sistema di domotica, tapparelle comprese!!
Io mi interfaccio al sistema con una pagina html, per la gestione tapparelle ho tre tasti "apri" "chiudi" "stop" per ogni tapparella e poi altri tre tasti per il comando simultaneo di tutte le tapparelle.
Premendo apri o chiudi, l'impulso al relè dura un tot di secondi, necessari ad aprire o chiudere completamente la tapparella.
Quindi quello che ti occorre!! Faccio mente locale e ti posto la mia soluzione..

Salve,
Un metodo veloce che mi viene in mente é usare una specie di de contatore, vale a dire una variabile che prende un certo valore che rappresenta i millisecondi di durata di una certa azione. La variabile può, facciano, prendere il valore n alla pressione di un pulsante, per poi decrescere lentamente usando una roba tipo

long decontatore=2000;
long time_prec;
void setup()
{
time_prec=millis()
}
void loop()
{
if (millis() !=time_prec)
{
decontatore --;
millis_prec=millis()
}
if (decontatore==0)
{
//azione
}
}

Dovrebbe funzionare, anche se lo ho scritto al volo. Il vantaggio é che intanto la loop continua a ciclare. Il problema é che deve essere mediamente più veloce di un millisecondo (tranne quando la situazione richiede cambiamenti, come tasti premuti ecc)

allora..proverò a spiegarti prima a parole.
Ogni qual volta viene attivato il pin per comandare la tapparella, che sia per chiudere o per aprire, memorizzo il "millis" di partenza in una variabile e poi torno nella funzione principale "loop", in quest'ultima ad ogni inizio ciclo vado a verificare quando tempo è passato dall'attivazione della tapparella, se è passato un tot secondi che decido io..la fermo!!
Naturalmente, l'intero sketch,complesso che sia deve essere fatto in modo che torni sempre nel loop principale con una frequenza idonea..

Che ne dici?? mi segui?!

giovepluvio:
Salve,
Un metodo veloce che mi viene in mente é usare una specie di de contatore, vale a dire una variabile che prende un certo valore che rappresenta i millisecondi di durata di una certa azione. La variabile può, facciano, prendere il valore n alla pressione di un pulsante, per poi decrescere lentamente usando una roba tipo

long decontatore=2000;

long time_prec;
void setup()
{
time_prec=millis()
}
void loop()
{
if (millis() !=time_prec)
{
decontatore --;
millis_prec=millis()
}
if (decontatore==0)
{
//azione
}
}



Dovrebbe funzionare, anche se lo ho scritto al volo. Il vantaggio é che intanto la loop continua a ciclare. Il problema é che deve essere mediamente più veloce di un millisecondo (tranne quando la situazione richiede cambiamenti, come tasti premuti ecc)

ciao giovepluvio...
io ho fatto più o meno come la tua soluzione...memorizzo il millis di partenza e ad ogni loop verifico se è trascorso un certo numero di secondi..

Ciao ragazzi innanzitutto vi ringrazio per aver risposto cosi velocemente!
Non sono sicuro di aver capito bene, provo a scrivere qualcosa ditemi se può andare o sto sbagliando qualcosa.

long decontatore=2000;
long time_prec;
void setup()
{
time_prec=millis()
}

void loop()
{
if ( results.value == 0xFF28D7) //se il valore che riceve il sensore a infrarossi è quello del pulsante 1
  {
     if (millis() !=time_prec)
      {
         decontatore --;
         millis_prec=millis()
       }
          if (decontatore==0)
            {
              digitalWrite(RELE4,HIGH);//combinazione che mi fa
              digitalWrite(RELE3,HIGH);//fermare il motore della tapparella
            }
          else
            {
              digitalWrite(RELE3,LOW); // combinazione che mi permette di
              digitalWrite(RELE4,HIGH);// far andare la tapparella su
             }
       
   }

}

Usare il tempo di movimento non mi piace molto, e poi bisogna fare attenzione al reset di millis()...

Anche io a suo tempo pensai ad una automazione delle tapparelle, ma pensavo ad un sensore di fine corsa superiore ed inferiore mettendo dal lato libero della tapparella (quello opposto al cordone per intenderci) due piccoli magneti adesivi ed un sensore reed che segnala il fine corsa quando una calamita passa accanto al reed.

Non dovrebbero esserci problemi per il filo (se la tapparella è motorizzata ci sono già canaline o corrugati che arrivano ad Arduino), ma per capire la fattibilità (ed affidabilità) qualcuno ha mai pensato/provato qualcosa del genere?

Carbo9797:
provo a scrivere qualcosa ditemi se può andare o sto sbagliando qualcosa

Diversi errori e/o omissioni.
1)Le variabili tempo devono essere senza segno.
2)Cosa succede se decontatore va sotto zero?
3)Cosa succede quando results.value != 0xFF28D7 ?
4)Cosa succede se il resto del loop impiega più di 1ms a ciclare?

docdoc:
Anche io a suo tempo pensai ad una automazione delle tapparelle, ma pensavo ad un sensore di fine corsa superiore ed inferiore mettendo dal lato libero della tapparella (quello opposto al cordone per intenderci) due piccoli magneti adesivi ed un sensore reed che segnala il fine corsa quando una calamita passa accanto al reed.

Ma quanta risoluzione di posizione serve alle vostre tapparelle? :smiley:
Con una colonna di 9 reed si può rilevare la posizione (e fermare sul punto) a passi di un ottavo della corsa totale (12.5%).

docdoc:
Usare il tempo di movimento non mi piace molto, e poi bisogna fare attenzione al reset di millis()...

Concordo, e non è il primo post che evedo in tale senso ...

... non capisco quale sia invece la difficoltà nel montare, coassialmente all'asse della tapparella, un potenziometro multigiri che, una volta effettuata la dovuta calibrazione, indica con buona precisione la posizione della tapparella, indipendetemente dal tempo e dal fatto che ... se va via la corrente uno non saprebbe più dove è la tapparella. ::slight_smile:

Guglielmo

Claudio_FF:
Ma quanta risoluzione di posizione serve alle vostre tapparelle? :smiley:
Con una colonna di 9 reed si può rilevare la posizione (e fermare sul punto) a passi di un ottavo della corsa totale (12.5%).

Dipende da cosa si vuole fare, per ora si parlava solamente di fine corsa per fare "apri tutto" e "chiudi tutto" ed evitare attivazioni inutili (anche se i motori delle tapparelle hanno i loro fermi), se si volesse rilevare la posizione ci sono varie soluzioni, da quella che dici tu ma anche al calcolo in base al tempo possibile con maggiore precisione dopo una prima calibrazione (rilevando il tempo intercorso tra i trigger di inizio e fine corsa, ovviamente poi memorizzata in EEPROM).

Altrimenti l'altra soluzione che avevo pensato era usare un filo di quelli degli antifurto per tapparelle (un rocchetto con molla, e un filo che si allunga e ritrae perché fissato con una piccola vite alla fine della tapparella): questi mandano un impulso ogni "x" centimetri, per cui lo si può usare come un encoder rotativo e calcolare quindi la posizione in tempo reale. Essendo però "inerziale", deve quantomeno memorizzare da qualche parte (EEPROM o forse meglio una piccola SD) il valore corrente per poter riprendere al ritorno della corrente, o in alternativa far fare anche in questo caso una calibrazione manuale all'occorrenza.

La soluzione del potenziometro multigiri sarebbe la migliore, ma purtroppo non tutti i sistemi di motorizzazione lo consentono, alcune volte non e' proprio accessibile l'asse dell'avvolgitore per via del tipo di supporti usato ... se invece si parla di sistemi a tempo, due finecorsa secondo me sono indispensabili "a prescindere", perche' quando si tratta di un sistema motorizzato che puo essere messo in funzione anche da remoto, senza la presenza dell'operatore, fosse anche una semplice tapparella io senza finecorsa non mi fiderei ... ricordiamoci che per quanti sforzi uno faccia per costruire qualcosa di buono, l'imprevisto ed il guasto accidentale saranno sempre li in agguato, dietro l'angolo, aspettando che non guardiate ... :wink: