ciao a tutti, vorrei capire come affrontare la logica per poter programmare vari rele con i relativi ingressi da un telecomando a infrarossi, ma con un interblocco,
ovvero,
pulsante 1 seleziona rele 1
pulsante 2 seleziona rele 2
ecc
ma vorrei che se ho selezionato esempio rele 2, anche premendo gli altri pulsanti i rele non si attivino fino allo spegnimento del rele 2.
ciao...devi "salvarti" lo stato dei vari PIN e fare tanti AND per verificare che uno di questi non sia già attivo.
se lo gestisci bene, forse, te la cavi con uno o due cicli for()...dico forse perchè non ho mai provato a gestire segnali da un telecomando...quindi non so di preciso cosa sia implicato...ma non dovrebbe essere impossibile.
quindi quando accendi un rele, escludi l'accensione degli altri, giusto ?
Se è si, allora crea una unica variabile booleana, partenza a false. Ovunque accendi un rele, lo fai solo se la booleana è ==false e la se accendi la metti a true. Quando spegni il rele acceso, la rimetti a false.
kemosabesay:
ciao, si tutto giusto. il rele lo spengo con lo stesso pulante che lo accende.
Ah, allora si complica leggermente.
Io farei una cosa più semplice. Unica variabile numerica (byte) di nome stato
Se 0 vuol dire nessun rele acceso.
ogni volta che premi un tasto telecomando, dovrai vedere se stato è 0 oppure il valore del rele associato, cioè:
Quando accendi rele1 stato=1 prima però verifica se stato==0 o stato==1
quando accendi rele2 stato=2 prima però verifica se stato==0 o stato==2
etc.
Se stato==0 accendi il rele, se stato==X allora il rele lo spegni e imposti stato=0
Il codice poi in teoria si potrebbe ottimizzare con degli array/vettori e dei cicli, ma ci penserei in un secondo momento.
Non capisco perchè fai due volte la digitalWrite, visto che dentro la funzione relays() di nuovo chiami la digitalWrite su stesso pin
non capisco come fa a funzionare, visto che questa variabile è di tipo errato:
unsigned int value = results.value;
DEVE essere unsigned long (se spulci dentro la libreria trovi uint32_t value;)
di sicuro rendere le variabili/costanti più chiare, ad esempio: #define code1 0xFF09F6 // code received from button 1 #define code2 0xFF31CE // code received from button 2 #define code3 0xFF31DE // codice "power button"
che senso ha avere dei nomi che NON dicono nulla a chi legge il codice dello switch ?
Meglio: #define K_CODE_BUTTON1 0xFF09F6 // code received from button 1 #define K_CODE_BUTTON2 0xFF31CE // code received from button 2 #define K_CODE_POWER 0xFF31DE // codice "power button"
P.S. di solito le costanti define si mettono in maiuscolo
ed anche i nomi dei pin, con nomi che dicono che è un pin ed usando const (e poi basta byte)
const byte pinFan = 3; //fan pin
avere una array di stati, uno per ogni pin, non ha senso se i relay sono ad esclusione uno dall'altro. Basta una variabile semplice, 0=nessun relay acceso, altrimenti il numero del relay acceso (stato==2 quindi relay due acceso)
Cioè, essendo ad esclusione: status==0 tutti rele spenti
...
case BTN_TAPE: // status=1
if(status!=0 && status!=1) break; // non prosegue
// entro qui per 0 e 1
if (status==0)
{ status=1;
relays( Rele_TAPE, HIGH);
}
else
{ status=0;
relays( Rele_TAPE, LOW);
}
break;
case BTN_AUX: // status=2
if(status!=0 && status!=2) break; // non prosegue
// entro qui per 0 e 2
if (status==0)
{ status=2;
relays( Rele_AUX, HIGH);
}
else
{ status=0;
relays( Rele_AUX, LOW);
}
break;
etc. etc. etc.
PERO': dal TUO codice vedo che il Rele_ON NON è esclusivo, quindi lo gestisci in maniera diversa ?? avevi detto che tutti i rele potevano essere solo 1 acceso alla volta (oppure tutto spento)
si mi ero dimenticato che il rele on non dipende dalle impostazioni degli altri
grazie
adesso provo le modifiche,
anche se mi sto impiantando con un'altro problema legato al fatto che non trovo nessun esempio utile per far funzionare con due pulsati del telecomando, un motore passo passo, ovvero premo " su" il motore gira a sinistra e quando lo lascio si ferma.
naturalmente il contrario con il tasto "giu"
avresti qualche idea da suggerirmi?
Vuoi gestire il fatto di mantenere il tasto premuto ? Con i telecomandi non è semplice. Anche perchè a seconda del telecomando, alcuni sparano di continuo sempre lo stesso codice, alcuni invece sparano una volta il codice del tasto e poi finchè tieni premuto sparano un codice unico, mi pare 0xFFFFFF o qualcosa del genere
ti chiedo scusa, ma quando ho provato la tua modifica, non arrivava l'alimentazione alla breadboard dove ho messo il sensore infrarosso, oggi riprovo......
grazie