Relay shield e millis

Salve raga,
da poco smanetto con arduino e vi chiedo consiglio sul progetto che sto tentando di relaizzare.
Sto usando arduino uno rev 3+relay shield per cercare di pilotare le serrande motorizzate di casa.
SOno ancora in fase di test e non ho ancora collegato nulla alla 220V,
lo sketch che ho realizzato dovrebbe avere l'intento di abilitare un relay per la salita per 20 secondi(tempo cronometrato x l'apertura) ed un secondo relay per 20 secondi per la chiusura, in modo da poter far coesistere gli interruttori di casa mettondili in parallelo.
In piu' vorrei fare in modo che per esempio sto tirando su la serranda per bloccarla ad un altezza x premo il bottone di discesa è disabilito il relay,
Il problema che ho pero' è che usando millis anche quando disabilito il relay arduino continua a contare fino a 20 secondi impedendomi di premere altri pulsanti.
qualcuno mi puo dare un dritta, please????

const int buttonPin1 = 8;     // the number of the pushbutton pin
const int buttonPin2 = 9;
const int ledPin1 =  4;  // the number of the LED pin
const int ledPin2 =  5;
unsigned long off_time1;
unsigned long off_time2;

boolean ledState1=false;
boolean ledState2=false;

int buttonState1 = 0;    // variable for reading the pushbutton status
int buttonState2 = 0;

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);  
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);  
  digitalWrite(ledPin1, LOW); 
  digitalWrite(ledPin2, LOW);

}

void loop(){
 
if ((ledState1) && (millis()>=off_time1)) /* is it on and is it later or equal to off_time */
{
    digitalWrite(ledPin1,LOW);
    ledState1 = false;
}
else if (!ledState1) /* is it off? */
{
    buttonState1 = digitalRead(buttonPin1);
    if(buttonState1 == HIGH)
    {
        digitalWrite(ledPin1, HIGH);
        ledState1 = true;
        off_time1 = millis() + 20000;
    }
}


if (buttonState1==HIGH && buttonState2==HIGH)
{
  digitalWrite(ledPin1,LOW);
  digitalWrite(ledPin2,LOW);
 // off_time = millis() + 0;
}

if ((ledState2) && (millis()>=off_time2)) /* is it on and is it later or equal to off_time */
{
    digitalWrite(ledPin2,LOW);
    ledState2 = false;
}
else if (!ledState2) /* is it off? */
{
    buttonState2 = digitalRead(buttonPin2);
    if(buttonState2 == HIGH)
    {
        digitalWrite(ledPin2, HIGH);
        ledState2 = true;
        off_time2 = millis() + 20000;
    }
}

}

A naso penso che dovresti far sapere ad arduino che stai premendo il pulsante (di salita o discesa)

Manca la parte che testa se un pulsante è stato premuto e un azione è già stata intrapresa, inoltre ti consiglio di leggere lo stato dei pulsanti con la libreria debounce altrimenti è certo che avrai letture falsate.

Ciao

lo sketch che ho realizzato dovrebbe avere l'intento di abilitare un relay per la salita per 20 secondi(tempo cronometrato x l'apertura) ed un secondo relay per 20 secondi per la chiusura, in modo da poter far coesistere gli interruttori di casa mettondili in parallelo.

e' questa cosa che non e' chiara....
Cosa succede se mentre stai premendo il pulsante di salita, l'automatismo chiude il rele' di discesa ?

grazie delle risposte,
sono agli inizi quindi non so bene come procedere.

@Brunello l'idea del funzionamento era premo il pulsante per tirarla su se voglio interrompere senza aspettare i 20 secondi premo il punsante per tirarla giu ma senza farla andare giu solo per stopparla in quella posizione.

@fabpolli mi dici dove trovare la libreria debounce?????

qualche dritta sul codice?????

Qlc sa darmi una drittta anche su come collegare i fili per comendare le serrande

smontando la presa ho questo:

http://img546.imageshack.us/img546/1186/20130503175449.jpg

i fili blu e nero che comandano i due pulsanti, per collegarli al relay necessitano del comune.
da dove lo prendo?????
mi spiego nel relay uno andrà al normamente chiuso ed uno al comune.
questo fa fatto per entrambi i fili , ma il comune dove lo prendo??????

piergixxer76:
....mi dici dove trovare la libreria debounce?????
...

Guarda QUI : Arduino Playground - Bounce

Guglielmo

Io non userei i timeout per fermare le operazioni di salita e discesa, in questo modo non hai nessun riscontro oggettivo su dove effettivamente sia la serranda. Se qualcuno, mentre la stai azionando, regge con una mano per un paio di secondi la serranda, il motore sforza ma non riavvolge nulla. Dopo 20 secondi hai magari 5 cm di luce.
Non puoi mettere 2 finecorsa, uno in cima ed uno in fondo alla serranda?

In questo modo:

  1. elimini i problemi che ti ho esposto
  2. togli i controlli con il tempo e puoi snellire il controllo del codice perché diventa semplicemente un problema di lettura di 4 pulsanti (2 sono i finecorsa, 2 sono i pulsanti su/giù originali)

i fili blu e nero che comandano i due pulsanti, per collegarli al relay necessitano del comune.
da dove lo prendo?????

Il comune è sempre la fase prelevata dall'impianto forza motrice (che va al centrale o comune del modulo pulsanti <>), il blu del motore va al neutro dell'impianto forza motrice, il marrone del motore fa una direzione "va sul pulsante >" e il nero del motore fa la direzione opposta "va sul pulsante <"

i pulsanti che usi sono ad autoritenuta o se li rilasci tornano indietro? perchè farebbe una certa differenza se vuoi applicare un automazione

Con serrande intendi i rotolanti o cosa? Se sono rotolanti un metodo di controllo della posizione potrebbe essere quella di mettere un sensore che conta i punti di giuntura tra i vari pezzi così puoi regolare anche l'altezza magari in base alla luminosità.

Rotolanti? .... le tapparelle da che mondo e mondo sono sempre state avvolgibili :smiley: :smiley: :smiley:

regolare anche l'altezza magari in base alla luminosità.

sicuro che puoi mantenere lo stesso rapporto con il sole perpendicolare tipo le 13:00 e al tramonto? o magari di notte...

ciao

Ovviamente la mia era una idea moooolto teorica che ovviamnte in pratica è moooolto più complessa da realizzare :).

raga grazie a tutti x le dritte,
ma ritornando ai problemi contingenti di realizzazione mi servirebbero delle proposte per aggiustare lo skecth.
cosi come l'ho postato funziona, l'ho testato sulla breadboard accendendo del led che dovrebbero simulare i comandi della serranda.
Solo che come dicevo prima quando interrompo la salita o la discesa con il tasto opposto( se sale premo discesa, se scende premo salita)
una volta fermato per poter operare di nuovo devo x forza aspettare i 20 secondi per poter riativare i tasti.

Qualcuno mi saprebbe evidenziare una proposta nel codice????

@Yoshy93 le serrande sono quelle che si avvolgono :stuck_out_tongue: e la chiusura con un fotoresistore puo' essere un alternitava ma al momento sto ecrcando di fare le cose semplici

@Pablos, non so se hai visto la foto che ho postato. Sicuramente sei piu esperto di me, magari provo a dirti quello che ho capito e tu correggimi se sbaglio.
nella presa a muro ci sono 2 frutti che contengono 4 pulsanti che comandano su e giu due serrande.
Se prendiamo come esempio il primo da sinistra la configurazione è la seguente:
ci sono 4 buchi con serraggio, nel frutto:

Uploaded with ImageShack.us

l'immagine rudimentale serve x dare l'idea, i due fori sulla diagonale sono collegati con il nero, gli altri due il blu ed il marrone sono inseriti negli altri due buchi.
La cosa che non mi è chiara ora è se io voglio collegare il mio relay a questi cavi , devo lasciare cosi come sta il nero e prendere il blu ed il marrone da inserire nel relay??????
se facessi cosi, per usare il relay mi servirebbe un filo da mettere nel normalmente chiuso ed uno da mettere nel comune??questo usando 2 relay uno che comandi la salita ed uno che comandi la discesa,
quindi oltre al blu ed il marrone, il comune da dove lo prendo???????
spero di essere stato chiaro nelle domande

sarebbe stata meglio una foto, comunque il comune qui mi pare sia il nero, percui contatto del relè(1) NA tra nero-blu e contatto del relè(2) NA tra nero-marrone ... nessun contatto normalmente chiuso.
Normalmente chiuso si intende relè a riposo.
ciao

Nella foto nel frutto di sinistra avevo staccato il blu ed il marrone(in foto sembra nero) per attaccarli al rele mentre avevo lasciato inalterato il nero che come dici tu funge da comune.
Da quello che mi hai scritto pero' mi sembra di capire che ladciando sempre il nero cosi come in foto dovre aggiungere due fili che fungano da comune che partano dai due fori dove sta il nero in foto e che raggiungano i relay nella posizione comune.

Il grigio è la fase che ti arriva dall'impianto, il blu e il marrone(che sembra nero) sono discesa e salita... Stacca l'interruttore generale (scusa ma la raccomandazione è d'obbligo) poi prendi il grigio e lo colleghi al comune di due relè (facendo un ponticello), il blu lo colleghi al normalmente aperto di un relè, il marrone lo colleghi al normalmente aperto del secondo relè. Per l'altra avvolgibile fai uguale con altri due relè, sempre usando il grigio come comune. Per la cronaca, l'elettricista che ha fatto l'impianto ha usato il blu per una fase (anche se comandata), cosa che non si dovrebbe mai fare.

infatti quella riga nera diagonale che collega 2 morsetti nel disegno che hai fatto finisce sul grigio che è il comune

Minkia........Quindi stando alle vosre ultime news....
il grigio è la Fase(cioe che alimenta le serrande) e che va messo al comune del relay.
Mentre il marrone(nero) ed il blu salita è discesa al normalmente aperto.
Collego tutto al piu presto e vi faccio sapere.
Grazie in ogni caso