Programmazione pulsanti problema da risolvere

Bungiorno,

ho un problema da risolvere urgentemente a livello hardware è un po complesso, cerco qualcuno che mi dia una mano a livello software.

il mio problema è il seguente ho installato 2 arduino e 2 schede a 16 relè, dal pin 22 al 37 ho configurato le uscite che vanno alla scheda relè,e dal pin 38 al 53 ho configurato input (pulsanti).

siccome non sono stato molto preciso nel realizzare l'istallazione ho dei problemi di induzione sui pin di input dei pulsanti, in quanto mi si accendono dei relè involutamente.

ho pensato di inibire tramite programmazione gli input troppo brevi (come penso che siano quelli dovuti a induzioni) e di invece far ricevere come comando degli input un po piu lunghi tipo 1 o 1,5 secondi di input.

il problema è che non riesco a capire come scrivere il programma,se non erro devo usare la funzione millis.

sarei molto grato se qualcuno mi aiutasse

grazie

in allegato ho messo il mio programma (scusate gli errori)

full_relel_54.ino (10.1 KB)

innanzi tutto, visto che il pulsante pare collegato tra il pin e il GND, attiva la resistenza di PullUp
pinMode( digital1, INPUT_PULLUP );
almeno in condizioni di riposo hai uno stato logico ben definito
e comunque, senza un controllo del debounce https://www.arduino.cc/en/Tutorial/Debounce
avrai sempre il problema dei disturbi provocati dal rimbalzo dei pulsanti

Hai aperto un altro treadh inutilmente, visto che il problema è lo stesso che hai evidenziato qui.
http://forum.arduino.cc/index.php?topic=357592.msg2468156#msg2468156

Quindi ti ritrovi gli schemi e le foto di la e spiegazioni parziali di qua, tra l'altro ti è stata detta quale soluzione adottare, ma non l'hai letta.
Hai già fatto un pasticcio nel solo chiedere aiuto.

Prima di tutto dovresti fare una corretta configurazione hardware poi una corretta configurazione software

include <SoftwareSerial.h> // includo la libreria per la comunicazione seriale

perchè usi una seriale virtuale quando la mega dispone a bordo di 4 seriali?

https://www.arduino.cc/en/Main/arduinoBoardMega

Serial: 0 (RX) and 1 (TX); Serial 1: 19 (RX) and 18 (TX); Serial 2: 17 (RX) and 16 (TX); Serial 3: 15 (RX) and 14 (TX). Used to receive (RX) and transmit (TX) TTL serial data. Pins 0 and 1 are also connected to the corresponding pins of the FTDI USB-to-TTL Serial chip.

Non vorrei deluderti, ma quella scatola che contiene schede relay e gli arduini complete di morsettiere cabur mi sa che la devi smontare e rifare, perchè se hai usato i 5v di arduino per andare ai pulsanti transitando per tutta la rete elettrica della casa di disturbi e commutazioni casuali ne avrai a vita.
Le porte logiche di arduino possono commutare da low ad high con un minimo di 1.9 - 2.0v
Tralascio l'elenco di normative trascurate e regola d'arte che è da processo :slight_smile:

ciao Pablos grazie per l'interesse e mi scuso ancora per il doppio trhead che ho aperto.

adesso ho modificato il quadro come consigliato comunque il problema è rimasto e penso che sia dato proprio al fatto che ho fatto passare i fili di comune dei pulsanti insieme a quello delle prese e delle luci.

vedi foto allegate

L' idea iniziale era di mettere dei relè a passo passo nel quadro e alimentare i pulsanti a 12 V,con i quali avrei comandato direttamente i relè e in parallelo avrei attaccato i contatti dei relè comandati da arduino.

ma dato il costo ho pensato di montare solo le schede relè e arduino, ho voluto provare, sapevo che avrei avuto dei problemi di induzioni, adesso mi trovo in punto di stallo.

Sto valutando la soluzione migliore non troppo onerosa, ma funzionante.

Per quanto riguarda la serial,dovrei leggere ancora un po di informazioni per capire perché non sono ancora molto esperto,ho trovato uno sketch con il quale sono riuscito a far funzionare tramite bluethoot e un app android.

Le foto non bastano per avere un quadro complessivo

  1. un conto è pensare, progettare e realizzare un impianto da zero comandato sia da una macchina che da una persona
  2. un altro conto è riparare/correggere un impianto già sviluppato non funzionante come si vorrebbe

il punto 2 risulta essere molto più difficile e impegnativo, servono analisi visive fornite solo da un sopralluogo eseguito di persona.

Il software al momento è l'ultimo dei problemi se non si possiede prima uno schema esecutivo dell'impianto su cui lavorare.

  • Il testo della domanda dice "pulsanti problema da risolvere"
  • Il testo delle descrizioni parla di "comandare dei relè passo-passo"

Quindi in definitiva non si comprende se:

  • arduino lavora in parallelo ad un impianto elettrico civile realizzato e funzionante con relè PP indipendente da qualsiasi elettronica aggiunta (soluzione corretta e vantaggiosa)
  • se i pulsanti di comando della serie civile entrano direttamente nelle porte input del micro dando compito poi ai relè degli shield relay di comandare in modo impulsivo i passo-passo tramite software (pessima idea)

Dove si dice "pessima idea" non significa non funziona o non è a norma, ma semplicemente vanno prese altre precauzioni e vanno sviluppati sistemi più complessi che aumentano i costi, questa soluzione nel suo insieme offre comunque svantaggi considerevoli rispetto alla prima.

ho pensato di inibire tramite programmazione gli input troppo brevi (come penso che siano quelli dovuti a induzioni) e di invece far ricevere come comando degli input un po piu lunghi tipo 1 o 1,5 secondi di input.

Dopo aver visto le foto ( anche quelle nell'altro Thread ) non e' che puoi risolvere da software, i problemi son ben altri.
Comunque, se vuoi, puoi sempre provare a vedere cosa succede. Eccoti lo sketch

byte pulsanti[] = {  43, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53 };
byte pulsanti_totali = 16;
byte rele[] = { 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37 };
byte rele_totali = 16;
byte statoLed[17];
byte stato_pulsante = 0;
long prev = 0;
int durata_ritardo = 1000; // tempo che deve essere premuto il pulsante

#include <SoftwareSerial.h> // includo la libreria per la comunicazione seriale
SoftwareSerial mySerial(10, 11); // imposto i pin per la comunicazione seriale
// Collegare i pin: RX=>11 TX=>10

void setup() {
  for (int aa = 0; aa < rele_totali; aa++) {
    pinMode(rele [aa], OUTPUT );
    digitalWrite ( rele[aa], HIGH );
    statoLed[aa] = HIGH ;
  }
  for (int aa = 0; aa < pulsanti_totali; aa ++ ) {
    pinMode(pulsanti[aa], INPUT_PULLUP); // Mette i pin in input e abilita il PullUp
  }
  Serial.begin(9600); // setto la comunicazione seriale
  mySerial.begin(9600); // setto la comunicazione bluetooth
  Serial.println("dexter");  //scrivo sul monitor seriale
  delay(1000);
}

void loop() {
  for (int aa = 0; aa < pulsanti_totali; aa++ ) {
    stato_pulsante = 0;
    if (!digitalRead (pulsanti[aa])) {
      prev = millis() ;
      stato_pulsante = 1;
      while ((millis() - prev ) <= durata_ritardo ) {
        if (digitalRead(pulsanti[aa]))  {
          stato_pulsante = 0;
          break;
        }
      }
    }
    if (stato_pulsante == 1) {
      if ( !statoLed[aa]  ) {
        statoLed[aa] = HIGH;
      }
      else {
        statoLed[aa] = LOW;
      }
      digitalWrite( rele[aa], statoLed[aa] );
      // delay(250);
    }
  } // fine ciclo di FOR

  //***********************  Bluetooth
  while (mySerial.available())
  {
    char dato = mySerial.read(); // "dato" è il valore che viene ricevuto dalla seriale
    switch (dato)
    {
      case 'a': // Se ricevo la lettera A,
        {
          digitalWrite(23, HIGH); // attivo il relè collegato al pin12
          mySerial.println("Relè 1 ON");
          break;
        }
      case 'A': // Se ricevo la lettera a
        {
          digitalWrite(23, LOW); // Spengo il relè
          mySerial.println("Relè 1 OFF");
          break;
        }
      // E così anche di seguito...
      case 'b':
        {
          digitalWrite(24, HIGH);
          mySerial.println("Relè 2 ON");
          break;
        }
      case 'B':
        {
          digitalWrite(24, LOW);
          mySerial.println("Relè 2 OFF");
          break;
        }


      case 'c':
        {
          digitalWrite(25, HIGH);
          mySerial.println("Relè 3 ON");
          break;
        }
      case 'C':
        {
          digitalWrite(25, LOW);
          mySerial.println("Relè 3 OFF");
          break;
        }
      case 'd':
        {
          digitalWrite(26, HIGH);
          mySerial.println("Relè 4 ON");
          break;
        }
      case 'D':
        {
          digitalWrite(26, LOW);
          mySerial.println("Relè 4 OFF");
          break;
        }
      case 'e':
        {
          digitalWrite(27, HIGH);
          mySerial.println("Relè 5 ON");
          break;
        }
      case 'E':
        {
          digitalWrite(27, LOW);
          mySerial.println("Relè 5 OFF");
          break;
        }
      case 'f':
        {
          digitalWrite(28, HIGH);
          mySerial.println("Relè 6 ON");
          break;
        }
      case 'F':
        {
          digitalWrite(28, LOW);
          mySerial.println("Relè 6 OFF");
          break;
        }
      case 'g':
        {
          digitalWrite(29, HIGH);
          mySerial.println("Relè 7 ON");
          break;
        }
      case 'G':
        {
          digitalWrite(29, LOW);
          mySerial.println("Relè 7 OFF");
          break;
        }
      case 'h':
        {
          digitalWrite(22, HIGH);
          digitalWrite(23, HIGH);
          digitalWrite(24, HIGH);
          digitalWrite(25, HIGH);
          digitalWrite(26, HIGH);
          digitalWrite(27, HIGH);
          digitalWrite(28, HIGH);
          digitalWrite(29, HIGH);
          digitalWrite(30, HIGH);
          digitalWrite(31, HIGH);
          digitalWrite(32, HIGH);
          digitalWrite(33, HIGH );
          digitalWrite(34, HIGH );
          digitalWrite(35, HIGH );
          digitalWrite(36, HIGH );
          digitalWrite(37, HIGH );
          mySerial.println("Relè 8 ON");
          break;
        }
      case 'H':
        {
          digitalWrite(22, LOW);
          digitalWrite(23, LOW);
          digitalWrite(24, LOW);
          digitalWrite(25, LOW);
          digitalWrite(26, LOW);
          digitalWrite(27, LOW);
          digitalWrite(28, LOW);
          digitalWrite(29, LOW);
          digitalWrite(30, LOW);
          digitalWrite(31, LOW);
          digitalWrite(32, LOW);
          digitalWrite(33, LOW );
          digitalWrite(34, LOW );
          digitalWrite(35, LOW );
          digitalWrite(36, LOW );
          digitalWrite(37, LOW );
          mySerial.println("Relè 8 OFF");
          break;
        }
    }
  }
} // fine Loop

grazie ci proverò

stavo pensando di sostituire tutti i fili di comando con dei cavi schermati e come da consiglio mettere condensatori e snubber.

a presto appena posso vi aggiornerò

PS non vi nego che mi sta passando per la testa di cercare qualcuno che si offre a venire a darmi una mano.

ciao

ciao Brunello ho provato con il tuo sketch,ma succede che ciclicamente si accendono e si spengono i relè.

è possibile che ci sia qualcosa di errato domanda? io ho provato a leggerlo e capirlo ma non riesco a decifrare la logica e a trovare se ci fosse l'errore.

riesci a dagli un occhiata quando puoi

grazie ancora