interblocco rele

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.

grazie

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.

se capisco bene...dovrei usare dei digital.read, ??? e salvarli in vari bool di stato.
non capisco perchè dici di usare dei cicli " for "

grazie

Non sono sicuro di aver capito:

  1. 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.

  2. quando il rele viene spento ?

ciao, si tutto giusto. il rele lo spengo con lo stesso pulante che lo accende.
se creo questo va bene?

int status[] = {0,0,0,0};

grazie

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.

ok provo a mettere giu qualcosa...un attimo
grazie

ho messo giu questo e sembra che funzioni

#include <IRremote.h>      //including infrared remote header file

#define code1  0xFF09F6   // code received from button 1
#define code2  0xFF31CE    // code received from button 2
#define code3  0xFF31DE   // codice "power button"

int RECV_PIN = 11;        // the pin where you connect the output pin of IR sensor 
IRrecv irrecv(RECV_PIN);
decode_results results;

int fan = 3;         //fan pin
int bulb = 2;         //bulb pin
int status[] = {0,0,0,0};
 
void setup()
{
  Serial.begin(9600);
        
  irrecv.enableIRIn();        // Start the IR receiver
  pinMode(fan, OUTPUT);
  pinMode(bulb, OUTPUT);
}
 
void loop() 
{
 if (irrecv.decode(&results)) {
    unsigned int value = results.value;
    switch (value) {

      case code1:
        if (status[1] == 0 && status[2] == 0) {
          digitalWrite(fan, HIGH);
          status[1] = 1;
          relays( fan, HIGH);
        }

        else {
          digitalWrite(fan, LOW);
          status[1] = 0;
          relays( fan, LOW);

        }
        break;

      case code2:
        if (status[1] == 0 && status[2] == 0) {
          digitalWrite(bulb, HIGH);
          status[2] = 1;
          relays( bulb, HIGH);

        }

        else {
          digitalWrite(bulb, LOW);
          status[2] = 0;
          relays( bulb, LOW);
        }
        break;
 }
    // Serial.println(value);
    irrecv.resume();       // Receive the next value
  }
}

void relays( int a, int b) {
  digitalWrite(a, b);
  Serial.print(a); Serial.print(" -- "); Serial.print(b);
}

posso apportare miglioramenti?????

grazie

  1. Non capisco perchè fai due volte la digitalWrite, visto che dentro la funzione relays() di nuovo chiami la digitalWrite su stesso pin

  2. 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;)

  3. 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

  4. 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)

modifiche effettuate, il controllo dei vari stati lo faccio per inibire gli altri rele mentre ce nè attivo uno...sbaglio??

[code]
#include <IRremote.h>      //including infrared remote header file

#define BTN_ON 0x6804847B
#define BTN_V_UP 0x6804C43B
#define BTN_V_DOWN 0x680424DB
#define BTN_TAPE 0x6804807F
#define BTN_AUX 0x680440BF
#define BTN_TUNER 0x6804C03F
#define BTN_CD 0x680420DF
#define BTN_PHONO 0x6804A05F

int SensorIR = 11;
int Rele_ON = 2;
int Rele_TAPE = 3;
int Rele_AUX = 4;
int Rele_TUNER = 5;
int Rele_CD = 6;
int Rele_PHONO = 7;


int RECV_PIN = 11;        // the pin where you connect the output pin of IR sensor
IRrecv irrecv(RECV_PIN);
decode_results results;

int status[] = {0,0,0,0,0,0};
/* the initial state of appliances is OFF (zero)
  the first zero must remain zero but you can
  change the others to 1's if you want a certain
  appliance to be ON when the board is powered */

void setup()
{
  Serial.begin(115200);
  irrecv.enableIRIn();        // Start the IR receiver

  pinMode (Rele_ON, OUTPUT) ;
  pinMode (Rele_TAPE, OUTPUT) ;
  pinMode (Rele_AUX, OUTPUT) ;
  pinMode (Rele_TUNER, OUTPUT) ;
  pinMode (Rele_CD, OUTPUT) ;
  pinMode (Rele_PHONO, OUTPUT) ;

}

void loop()
{
 if (irrecv.decode(&results)) {
    unsigned int value = results.value;
 switch (value) {

   case BTN_ON:
       if (status[0] == 1) {
           digitalWrite(Rele_ON, LOW);
            status[1] = 0;
           Serial.println("Rele_ON -- OFF ");
       }
        else {
          digitalWrite(Rele_ON, HIGH);
           status[0] = 1;
          Serial.println("Rele_ON -- ON ");
        }
        break;

   case BTN_TAPE:
         if (status[1] == 0 && status[2] == 0 && status[3] == 0 && status[4] == 0 && status[5] == 0) {
         status[1] = 1;
          relays( Rele_TAPE, HIGH);
        }
        else {
          status[1] = 0;
          relays( Rele_TAPE, LOW);
        }
        break;

   case BTN_AUX:
         if (status[1] == 0 && status[2] == 0 && status[3] == 0 && status[4] == 0 && status[5] == 0) {
         status[2] = 1;
          relays( Rele_AUX, HIGH);
        }
        else {
          status[2] = 0;
          relays( Rele_AUX, LOW);
        }
        break;

   case BTN_TUNER:
         if (status[1] == 0 && status[2] == 0 && status[3] == 0 && status[4] == 0 && status[5] == 0) {
         status[3] = 1;
          relays( Rele_TUNER, HIGH);
        }
        else {
          status[3] = 0;
          relays( Rele_TUNER, LOW);
        }
        break;

   case BTN_CD:
        if (status[1] == 0 && status[2] == 0 && status[3] == 0 && status[4] == 0 && status[5] == 0) {
         status[4] = 1;
          relays( Rele_CD, HIGH);
        }
        else {
          status[4] = 0;
          relays( Rele_CD, LOW);
        }
        break;

   case BTN_PHONO:
         if (status[1] == 0 && status[2] == 0 && status[3] == 0 && status[4] == 0 && status[5] == 0) {
         status[5] = 1;
          relays( Rele_PHONO, HIGH);
        }
        else {
          status[5] = 0;
          relays( Rele_PHONO, LOW);
        }
        break;

 }
    //Serial.printlnln(value);
    irrecv.resume();       // Receive the next value
}
}
void relays( int a, int b) {
  digitalWrite(a, b);
  Serial.print(a); Serial.print(" -- "); Serial.println(b);
}

[/code]

scusa ma non capisco
grazie

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?

grazie

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

la tua modifica non funge rimetto la mia
grazie

kemosabesay:
si mi ero dimenticato che il rele on non dipende dalle impostazioni degli altri
grazie

Hai scritto questo, il mio codice (se lo hai copiato giusto) presume i rele siano TUTTI ad esclusione

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

ok fatto!! funziona..
ho anche inserito il comando per lo stepper(non è il massimo) ma è un buon compromesso

se ti interessa lo posto

comunque grazie

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.