Sensore ferromagnetico e relè

Buona sera a tutti…

ho una scheda con 8 relè integrati della SainSmart, in effetti mi servono solo 3 relè ma avendo la scheda in casa sto usando quella collegata ad un Arduino Mega, ho collegato anche 8 bottoni tutti con input pullup, infine ho un sensore ferromagnetico LJ18A3-8-z/by.

Il punto è questo, ho scritto lo sketch, comando i relè singolarmente con il loro bottone i relè si eccitano o meno a seconda di quante volte schiaccio il singolo bottone, ma adesso devo impostare delle routine quando per esempio ho un relè eccitato, ma voglio per esempio che torni allo stato normale quando il sensore ferromagnetico si chiude essendo un normalmente aperto. Il sensore funziona in quanto se faccio uno sketch banale che mi va ad eccitare o meno un relè quando il sensore si chiude riesco a farlo.

/* starting place */

/*-----( Import needed libraries )-----*/
/*-----( Declare Constants )-----*/
#define RELAY_ON 0
#define RELAY_OFF 1
/*-----( Declare objects )-----*/
/*-----( Declare Variables )-----*/
#define Relay_1  53  // Arduino Digital I/O pin number
#define Relay_2  51  //
#define Relay_3  49  //
#define SENSOR 7

int valpre = 0;
int vecchio_valpre = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente 
int statopre = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso

int valfork = 0;
int vecchio_valfork = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente 
int statofork = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso

int valload = 0;
int vecchio_valload = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente 
int statoload = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso

int vecchio_valsensor = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente 
int statosensor = 0;
int valsensor = 0;


void setup()   /****** SETUP: RUNS ONCE ******/
{
//-------( Initialize Pins so relays are inactive at reset)----
  digitalWrite(Relay_1, RELAY_OFF);
  digitalWrite(Relay_2, RELAY_OFF);
  digitalWrite(Relay_3, RELAY_OFF);
  
  
//---( THEN set pins as outputs )----  
  pinMode(Relay_1, OUTPUT);   
  pinMode(Relay_2, OUTPUT);  
  pinMode(Relay_3, OUTPUT);  
    
  delay(2000); //Check that all relays are inactive at Reset
  pinMode(52,INPUT_PULLUP);
  pinMode(50,INPUT_PULLUP);
  pinMode(48,INPUT_PULLUP);
  pinMode(30,INPUT_PULLUP);
}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  // preload e sua logica
  int sensorVal = digitalRead(52);
  valpre = digitalRead(52);  // legge il valore dell'input tasto pre e lo conserva  
  
  // controlla se è accaduto qualcosa  
  if ((valpre == LOW) && (vecchio_valpre == HIGH)){  
    statopre = 1 - statopre;  
    delay(200);                // attesa di 200 millisecondi  
  }   
  
  vecchio_valpre = valpre;            // ricordiamo il valore precedente di valpre 
  
  if (statopre == 1) {  
    digitalWrite(Relay_1, RELAY_ON);// set the Relay preload ON
  }  
  else {  
   digitalWrite(Relay_1, RELAY_OFF);// set the Relay preload OFF
}
{
  // fork e sua logica
  int sensorVal = digitalRead(50);
  valfork = digitalRead(50);  // legge il valore dell'input tasto fork e lo conserva  
  
  // controlla se è accaduto qualcosa  
  if ((valfork == LOW) && (vecchio_valfork == HIGH)){  
    statofork = 1 - statofork;  
    delay(200);                // attesa di 200 millisecondi  
  }   
  
  vecchio_valfork = valfork;            // ricordiamo il valore precedente di valfork 
  
  if (statofork == 1) {  
    digitalWrite(Relay_2, RELAY_ON);// set the Relay fork ON
  }  
  else {  
   digitalWrite(Relay_2, RELAY_OFF);// set the Relay fork OFF
}
{
  // load e sua logica
  int sensorVal = digitalRead(48);
  valload = digitalRead(48);  // legge il valore dell'input tasto load e lo conserva  
  
  // controlla se è accaduto qualcosa  
  if ((valload == LOW) && (vecchio_valload == HIGH)){  
    statoload = 1 - statoload;  
    delay(200);                // attesa di 200 millisecondi  
  }   
  
  vecchio_valload = valload;            // ricordiamo il valore precedente di valload
  
  if (statoload == 1) {  
    digitalWrite(Relay_3, RELAY_ON);// set the Relay load ON
  }  
  else {  
   digitalWrite(Relay_3, RELAY_OFF);// set the Relay load OFF
}

// azioni al passaggio del sensore
{
  
  
  // controlla se è accaduto qualcosa  
  if (valsensor == HIGH)   
    digitalWrite(Relay_2, RELAY_OFF);// set the Relay fork OFF

}
}
}
}



}//--(end main loop )---



//*********( THE END )***********

Non fate caso ai commenti che derivano da altri sketch o comunque da versioni precedenti, potrebbero esserci degli errori tipo On o OFF invertiti.

Qualcuno potrebbe darmi una mano per risolvere la cosa?
In poche parole per esempio quando ho il (Relay_2, RELAY_ON) e il mio sensore collegato al pin7 mi si chiude, deve semplicemente digitalWrite(Relay_2, RELAY_OFF)… ma il semplicemente non mi funziona c’è sicuramente qualcosa che mi sfugge …

ringrazio anticipatamente se qualcuno mi illuminerà.

 if (valsensor == HIGH)

forse volevi scrivere

        if (digitalRead (SENSOR) == HIGH )

e poi sei sicuro che quando il sensore rileva qualcosa la sua uscita vada in HIGH ?

ps. sistema quelle graffe

@nemoz_z: essendo il tuo primo post, ti chiederei 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 attenzione il REGOLAMENTO ... Grazie.

Guglielmo

@GBP01
Chiedo venia il post di presentazione mi è rimasto scritto ma non inviato su un’altra finestra del browser e ora l’ho inviato. Per il resto il regolamento l’ho letto punto per punto e mi pare di averli seguiti tutti. Chiedo scusa nuovamente.

Brunello:

 if (valsensor == HIGH)

forse volevi scrivere

        if (digitalRead (SENSOR) == HIGH )

e poi sei sicuro che quando il sensore rileva qualcosa la sua uscita vada in HIGH ?

ps. sistema quelle graffe

Brunello le graffe le sistemo sempre alla fine quando tutto funziona per il resto non ci faccio mai troppo caso, lo so che non è solo estetica.
Sono assolutamente sicuro che la sua uscita vada in high in quanto se carico il "classico esempio" del bottone e del led sul pin 13 e metto il mio sensore come Button con il corretto pin con INPUT_PULLUP quando legge val == HIGH il mio led si illumina . Ho anche provato a mettere LOW ma non cambia nulla.

Per completare il tutto o spero per essere più chiaro in questo modo... il problema è nella situazione statosensor ==1 e statofork == 1. Nello sketch seguente, ho volutamente trasformato la parte relativa al sensore e l'ho trasformata per farlo funzionare come bottone che cambia di stato a ogni suo azionamento.
Il sensore eccita e normalizza il relè con uno o due passaggi e lo stesso relè subisce la stessa situazione se io uso il bottone, ma se eccito il relè con il bottone e poi cerco di normalizzarlo attivando il sensore, questo sente un impulso ma va in contrasto con quello del bottone... idem se eccito il relè con l'impulso sensore poi posso normalizzarlo solo con il sensore.

/* starting place */

/*-----( Import needed libraries )-----*/
/*-----( Declare Constants )-----*/
#define RELAY_ON 0
#define RELAY_OFF 1
/*-----( Declare objects )-----*/
/*-----( Declare Variables )-----*/
#define Relay_1  53  // Arduino Digital I/O pin number
#define Relay_2  51  //
#define Relay_3  49  //
#define SENSOR 7

int valpre = 0;
int vecchio_valpre = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente 
int statopre = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso

int valfork = 0;
int vecchio_valfork = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente 
int statofork = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso

int valload = 0;
int vecchio_valload = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente 
int statoload = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso

int vecchio_valsensor = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente 
int statosensor = 0;
int valsensor = 0;


void setup()   /****** SETUP: RUNS ONCE ******/
{
//-------( Initialize Pins so relays are inactive at reset)----
  digitalWrite(Relay_1, RELAY_OFF);
  digitalWrite(Relay_2, RELAY_OFF);
  digitalWrite(Relay_3, RELAY_OFF);
  
  
//---( THEN set pins as outputs )----  
  pinMode(Relay_1, OUTPUT);   
  pinMode(Relay_2, OUTPUT);  
  pinMode(Relay_3, OUTPUT);  
    
  delay(2000); //Check that all relays are inactive at Reset
  pinMode(52,INPUT_PULLUP);
  pinMode(50,INPUT_PULLUP);
  pinMode(48,INPUT_PULLUP);
  pinMode(30,INPUT_PULLUP);
}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  // preload e sua logica
  int sensorVal = digitalRead(52);
  valpre = digitalRead(52);  // legge il valore dell'input tasto pre e lo conserva  
  
  // controlla se è accaduto qualcosa  
  if ((valpre == LOW) && (vecchio_valpre == HIGH)){  
    statopre = 1 - statopre;  
    delay(200);                // attesa di 200 millisecondi  
  }   
  
  vecchio_valpre = valpre;            // ricordiamo il valore precedente di valpre 
  
  if (statopre == 1) {  
    digitalWrite(Relay_1, RELAY_ON);// set the Relay preload ON
  }  
  else {  
   digitalWrite(Relay_1, RELAY_OFF);// set the Relay preload OFF
}
{
  // fork e sua logica
  int sensorVal = digitalRead(50);
  valfork = digitalRead(50);  // legge il valore dell'input tasto fork e lo conserva  
  
  // controlla se è accaduto qualcosa  
  if ((valfork == LOW) && (vecchio_valfork == HIGH)){  
    statofork = 1 - statofork;  
    delay(200);                // attesa di 200 millisecondi  
  }   
  
  vecchio_valfork = valfork;            // ricordiamo il valore precedente di valfork 
  
  if (statofork == 1) {  
    digitalWrite(Relay_2, RELAY_ON);// set the Relay fork ON
  }  
  else {  
   digitalWrite(Relay_2, RELAY_OFF);// set the Relay fork OFF
}
{
  // load e sua logica
  int sensorVal = digitalRead(48);
  valload = digitalRead(48);  // legge il valore dell'input tasto load e lo conserva  
  
  // controlla se è accaduto qualcosa  
  if ((valload == LOW) && (vecchio_valload == HIGH)){  
    statoload = 1 - statoload;  
    delay(200);                // attesa di 200 millisecondi  
  }   
  
  vecchio_valload = valload;            // ricordiamo il valore precedente di valload
  
  if (statoload == 1) {  
    digitalWrite(Relay_3, RELAY_ON);// set the Relay load ON
  }  
  else {  
   digitalWrite(Relay_3, RELAY_OFF);// set the Relay load OFF
}

// azioni al passaggio del sensore
{  
  
  // controlla se è accaduto qualcosa 
  sensorVal = digitalRead (30);
  valsensor = digitalRead (30); //legge il valore dell'input sensore e lo conserva 
    
    // controlla se è accaduto qualcosa  
  if ((valsensor == LOW) && (vecchio_valsensor == HIGH)){  
    statosensor = 1 - statosensor;  
     
  }   
  
  vecchio_valsensor = valsensor;            // ricordiamo il valore precedente di valsensor
  
  if (statosensor == 1)  {  
    digitalWrite(Relay_2, RELAY_ON);// set the Relay fork ON
  }  
  else {  
   digitalWrite(Relay_2, RELAY_OFF);// set the Relay fork OFF
}

}
}
}



}//--(end main loop )---



//*********( THE END )***********[code]

[/code]

Ho risolto e ho anche impostato tutte le altre funzioni che volevo. Grazie