Problema Tapparelle

Ciao a tutti, ho scritto questo codice per gestire le tapparelle a tempo.
Il problema è che funziona abbastanza bene, ma in maniera randomica si attivano relè a caso e quindi di conseguenza i motori delle tapparelle.

Qualcuno potrebbe aiutarmi?

#include <elapsedMillis.h>
#define TOT_RELE 16
#define TOT_DEBUG 5000

unsigned long tapDelay[TOT_RELE] = {22000, 22000, 22000, 22000, 22000, 22000, 22000, 22000, 22000, 22000, 22000, 22000, 10000, 10000, 10000, 10000}; //Contiene i millisecondi per il caso numero 1
elapsedMillis timer[TOT_RELE]; //Array dei timer per i vari rele
elapsedMillis debugTimer;

//Arrays degli inputs e degli outputs
int inputs[TOT_RELE] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19};
int outputs[TOT_RELE] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52};

int digitalVals[TOT_RELE]; // Array dove verranno salvati i valori di input
int releVals[TOT_RELE]; //Array dei valori dei rele (1 = spento, 0 = acceso)

void setup() {
  Serial.begin(9600);
  
  //Inizializzo tutti gli input e gli output
  for(int i = 0; i < TOT_RELE; i++){
    //Outputs
    pinMode(outputs[i], OUTPUT);
    digitalWrite(outputs[i], HIGH);

    //Inputs
    pinMode(inputs[i], INPUT);
    digitalWrite(inputs[i], HIGH);

    //Inizializzo releVals, digitalVals e premuto
    releVals[i] = 1;
    digitalVals[i] = 1;
  }

}

void loop() {
  //Leggo tutti gli input
  for(int i = 0; i < TOT_RELE; i++)
    digitalVals[i] = digitalRead(inputs[i]);

  //Vado a fare tutte le azioni richieste
  for(int i = 0; i < TOT_RELE; i++){
    if(digitalVals[i] == 1) continue; //Se il pulsante era spento allora vado al rele successivo

    //Se i è pari allora è il primo della coppia di rele altrimenti è il secondo
    if(i % 2 == 0){
      if(releVals[i] == releVals[i+1])  releVals[i] = 0; //Se i valori erano uguali allora possono essere solo 1
      else if(releVals[i+1] == 0) releVals[i+1] = 1; //Se quello successivo era acceso allora lo spengo
      else  releVals[i] = 1; //Altrimenti spengo questo

      //Vado a scrivere i valori nei relè
      initialize2Vals(i, i+1);
    }
    else{
      if(releVals[i] == releVals[i-1])  releVals[i] = 0; //Se i valori erano uguali allora possono essere solo 1
      else if(releVals[i-1] == 0) releVals[i-1] = 1; //Se quello successivo era acceso allora lo spengo
      else  releVals[i] = 1; //Altrimenti spengo questo

      //Vado a scrivere i valori nei relè
      initialize2Vals(i, i-1);
    }
    if(digitalVals[i] == 0) debug(); //Fa il debug se un pulsante è stato premuto
    delay(300); //Un piccolo ritardo per evitare il problema del pulsante tenuto premuto
   }

   //Metodo per controllare tutti i timer
   controlTimer();

   //Avvio il debug ogni TOT_DEBUG millisecondi
   if(debugTimer > TOT_DEBUG){
    debug();
    debugTimer = 0;
   }
}

void initialize2Vals(int a, int b){
  //Scrivo i valori nei pin
  digitalWrite(outputs[a], releVals[a]);
  digitalWrite(outputs[b], releVals[b]);
  timer[a] = timer[b] = 0; //Inizializzo entrambi i timer delle due porte a 0
}


void controlTimer(){
  for(int i = 0; i < TOT_RELE; i++){
    if(timer[i] >= tapDelay[i]){ //Se il timer ha raggiunto il limite massimo
      timer[i] = 0; //Lo azzero
      if(releVals[i] == 0)  releVals[i] = 1; //Se il relè era acceso allora lo spengo
      digitalWrite(outputs[i], HIGH); //Vado a spegnere il relè
    }
  }
}

void debug(){
  for(int i = 0; i < TOT_RELE; i++)
    Serial.println(releVals[i]);
  Serial.println("\n");
}

è un po' difficile capire cosa fai con tutti questi relay però non scorgo particolari problemi.
Però... dici che è random...E' da escludere che ci siano disturbi elettrici sugli ingressi/uscite? I relay avendo una bobina e magari comandando motori (quindi carichi induttivi) spesso sono un po' carogne. Hai uno schema di collegamento?

Quoto quanto detto sopra, non so se sia ancora in fase di test oppure gia operativo. dove si trovano i relays? vicino alle tapparelle o vicino al tuo arduino?
Se i fili che eccitano i tuoi relay (sono a 5v?) sono lunghi e viaggiano vicino ad altri cavi prendono sicuramente delle interferenze. Io ho avuto lo stesso problema con un circuito semplicissimo ma riceveva degli impulsi da lontano con dei cavi molto lunghi che correvano vicino ad altri cavi e i relay impazzivano.

Ciao ragazzi, uno schema al momento non ce l'ho ma è un circuito molto semplice.

C'è un Arduino Mega collegato ad una piastra di 16 relè, con i fili che partono dai pin di arduino a quelli della piastra, che nello specifico è questa: Scheda

Poi dai relè partono i collegamenti elettrici ai motorini delle tapparelle.
La piastra dei relè è vicinissima all'arduino, saranno 20 cm.

Attendo vostre.
Grazie infinite

Io proverei a staccare tutti i fili che vanno ai motori e controllare se anche così i relay si comportano in maniera strana.

i cinesi: "prodotto LM2596S buck chip lieve febbre è un fenomeno normale, relè, lunghe ore di lavoro hanno un normale fenomeno febbre, sono normali;" .... e se no tachipirina e nurofen :slight_smile:
non capisco moltissimo di come è fatta la scheda relay ma il mio pensiero è che la scheda relay o i disturbi in generale agiscano negli input di arduino oppure per qualche motivo accendano il fotoaccoppiatore della scheda relay. Per questo chiedevo lo schema. Comunque se il fenomeno avviene abbastanza spesso potresti mettere un serial.print quando cambia lo stato degli input e mettere un led a luce visibile eventualmente in parallelo al led interno del fotoaccoppiattore così da renderti conto se ci sono lampeggi strani o variazioni degli input senza che nessuno tocchi i pulsanti.

Fa una prova stupida: commenta tutti i digitalwrite, in modo che arduino non possa attivare nessun relay, poi lo lasci acceso. Se è una questione di disturbi i relay inpazziranno comunque.

>netrising86: Quella scheda prevede un'alimentazione separata (come deve essere) per i relè rispetto a quanto passa nei fotoccoppiatori ... stai usando un alimentatore per Arduino, ed un alimentatore SEPARATO ed indipendete per alimentare i relè ? Perché è obbligatorio se vuoi evitare ritorno di disturbi e guai vari !!!

Guglielmo

Ragazzi scusate il ritardo, ma ho fatto qualche ulteriore prova che spero posso aiutarvi ad aiutarmi, scusate il gioco di parole.

In pratica ho tolto dal differenziale la corrente ai motori delle tapparelle, per capire se c'era un problema sui motorini.

A corrente spenta i relè si comportano in maniera perfetta (non ho dovuto cambiare la massa come suggeriva qualcuno). Ma appena dò la 220v ai motorini i relè si comportano in maniera randomica.

Il mistero è sempre più fitto... :slight_smile:

Grazie

netrising86:
" ma in maniera randomica si attivano relè a caso "

Se avessi anomalie all'eccitazione di un relè è un conto, diverso se il relè si eccita da solo.
Può essere che prendi qualche disturbo da qualche ingresso? prova a monitorare gli ingressi con un serial.write, non si sa mai.
Stefano

netrising86:
Il mistero è sempre più fitto... :slight_smile:

Grazie

no è fitto tanto quanto prima: hai un disturbo indotto dai motori. devi solo capire se il disturbo agisce sui tuoi input o sugli output. fai le prove sul codice che ti sono state suggerite così distinguerai quale caso si verifica

Mi è parso di capire che è il disturbo che muove i motori.... non viceversa.....
netrising86 confermi ?