Gestione relè da Nextion display

Buongiorno a tutti.
Ho un paio di quesiti da sottoporre.Intanto illustro i componenti che sto utilizzando:
Display Nextion 7’ base
Arduino mega
Scheda 16 relè.
In sostanza sul display ci sono 16 pulsanti che attivano i rispettivi relè per un tempo predefinito. L’utente però deve poter cliccare solo un massimo di 3 pulsanti. Qui sorge il problema, come posso dare questo limite da codice arduino? In più vorrei che questi relè si attivino solo dopo la pressione di un ulteriore pulsante di conferma(sempre da display Nextion).Esempio, clicco pulsante 1, 2 e 3, ma solo quando confermo con il tasto 4 partono i relè con le tempistiche assegnate.
Grazie.

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Ok scusami...presentazione fatta

Mancano alcune specifiche:

  • È necessario un sistema di reset nel caso che l'utente sbagli tasto. Altro pulsante o a tempo?
  • È comunque necessario che la sequenza avvenga in un certo tempo, pena annullamento, o può indefinitamente restare in una condizione intermedia?
  • Durante il tempo di azionamento di un relé, può essere usata la tastiera per un altro input o occorre attendere la fine del tempo di attivazione?

Ciao,
P.

Si servirebbe in reset anche se l’utente sbaglia tasto.
Non è necessario che l’azione avvenga in un determinato tempo l’importante che dopo 3 relè azionati, l’utente non possa selezionarne altri in quella pagina.
I relè dovrebbero partire solo quando si clicca il tasto 4 ovvero quello di conferma

Nessuno riesce ad aiutarmi?

allego il codice

#define ledpin 47 
#define ledpin1 45
#define ledpin2 43

NexButton fragola = NexButton (2, 5, "fragola");
NexButton cocco = NexButton (2, 6, "cocco");
NexButton vaniglia = NexButton (2, 7, "vaniglia");

NexNumber n0 = NexNumber (3,1,"n0");
NexNumber n1 = NexNumber (3,2,"n1");
NexNumber n2 = NexNumber (3,3,"n2");
NexNumber n3 = NexNumber (3,4,"n3");
NexNumber n4 = NexNumber (3,5,"n4");
NexNumber n5 = NexNumber (3,6,"n5");
NexNumber n6 = NexNumber (3,7,"n6");
NexNumber n7 = NexNumber (3,8,"n7");
NexNumber n8 = NexNumber (3,9,"n8");
NexNumber n9 = NexNumber (3,10,"n9");
NexNumber n10 = NexNumber (4,1,"n10");
NexNumber n11 = NexNumber (4,2,"n11");
NexNumber n12 = NexNumber (4,3,"n12");
NexNumber n13 = NexNumber (4,4,"n13");
NexNumber n14 = NexNumber (4,5,"n14");
NexNumber n15 = NexNumber (4,6,"n15");
NexNumber n16 = NexNumber (4,7,"n16");
NexNumber n17 = NexNumber (4,8,"n17");
NexNumber n18 = NexNumber (4,9,"n18");
NexNumber n19 = NexNumber (4,10,"n19");

NexTouch *nex_listen_list[] =
{
  &fragola,
  &cocco,
  &vaniglia,
  
  &n0,
  &n1,
  &n2,
  &n3,
  &n4,
  &n5,
  &n6,
  &n7,
  &n8,
  &n9,
  &n10,
  &n11,
  &n12,
  &n13,
  &n14,
  &n15,
  &n16,
  &n17,
  &n18,
  &n19,
  NULL
};
//

 

void fragola1ml(void *ptr)
{

  
  digitalWrite(ledpin,LOW);
    delay(500);
     digitalWrite(ledpin, HIGH);
    char cmdToSend[8] = "tsw 5,0";
nexSerial.print(cmdToSend);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
nexSerial.write(0xFF);

}

void bloccafragola(void *ptr)
{
   char cmdToSend[8] = "tsw 5,0";
nexSerial.print(cmdToSend);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
}
void fragola2ml(void *ptr)
{
  
digitalWrite(ledpin,LOW);
    delay(900);
     digitalWrite(ledpin, HIGH);
    char cmdToSend[8] = "tsw 5,0";
nexSerial.print(cmdToSend);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
nexSerial.write(0xFF);

}

void cocco1ml(void *ptr)
{
digitalWrite(ledpin1,LOW);
    delay(900);
     digitalWrite(ledpin1, HIGH);
    char cmdToSend[8] = "tsw 6,0";
nexSerial.print(cmdToSend);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
nexSerial.write(0xFF);

}



void setup(void)
{
  dbSerial.begin(250000);
  nexSerial.begin(115200);
  nexInit();
  
  n0.attachPush(fragola1ml,&n0); // attiva routine accendiled al rilascio del pulsante bon
  n1.attachPush(fragola2ml, &n1);
  n10.attachPush(cocco1ml, &n10);
  fragola.attachPush(bloccafragola, &fragola);
  pinMode(ledpin, OUTPUT);
  digitalWrite(ledpin , HIGH);
   pinMode(ledpin1, OUTPUT);
  digitalWrite(ledpin1 , HIGH);
  pinMode(ledpin2, OUTPUT);
  digitalWrite(ledpin2 , HIGH);
}

void loop(void)
{
  
    nexLoop(nex_listen_list);
 
  
}

Lappio:
Nessuno riesce ad aiutarmi?

... ti rammento che, in conformità al REGOLAMENTO, punto 13, terzo capoverso, NON è permesso fare "up" prima che siano passate almeno 48 ore dall'ultimo post.

Guglielmo

Il tuo codice NON COMPILA e da i seguenti errori:

Arduino:1.8.8 (Linux)

sketch_aug04a:8:1: error: 'NexButton' does not name a type
 NexButton fragola = NexButton (2, 5, "fragola");
 ^
sketch_aug04a:9:1: error: 'NexButton' does not name a type
 NexButton cocco = NexButton (2, 6, "cocco");
 ^
sketch_aug04a:10:1: error: 'NexButton' does not name a type
 NexButton vaniglia = NexButton (2, 7, "vaniglia");
 ^
sketch_aug04a:12:1: error: 'NexNumber' does not name a type
 NexNumber n0 = NexNumber (3,1,"n0");
 ^
sketch_aug04a:13:1: error: 'NexNumber' does not name a type
 NexNumber n1 = NexNumber (3,2,"n1");
 ^
sketch_aug04a:14:1: error: 'NexNumber' does not name a type
 NexNumber n2 = NexNumber (3,3,"n2");
 ^
sketch_aug04a:15:1: error: 'NexNumber' does not name a type
 NexNumber n3 = NexNumber (3,4,"n3");
 ^
sketch_aug04a:16:1: error: 'NexNumber' does not name a type
 NexNumber n4 = NexNumber (3,5,"n4");
 ^
sketch_aug04a:17:1: error: 'NexNumber' does not name a type
 NexNumber n5 = NexNumber (3,6,"n5");
 ^
sketch_aug04a:18:1: error: 'NexNumber' does not name a type
 NexNumber n6 = NexNumber (3,7,"n6");
 ^
sketch_aug04a:19:1: error: 'NexNumber' does not name a type
 NexNumber n7 = NexNumber (3,8,"n7");
 ^
sketch_aug04a:20:1: error: 'NexNumber' does not name a type
 NexNumber n8 = NexNumber (3,9,"n8");
 ^
sketch_aug04a:21:1: error: 'NexNumber' does not name a type
 NexNumber n9 = NexNumber (3,10,"n9");
 ^
sketch_aug04a:22:1: error: 'NexNumber' does not name a type
 NexNumber n10 = NexNumber (4,1,"n10");
 ^
sketch_aug04a:23:1: error: 'NexNumber' does not name a type
 NexNumber n11 = NexNumber (4,2,"n11");
 ^
sketch_aug04a:24:1: error: 'NexNumber' does not name a type
 NexNumber n12 = NexNumber (4,3,"n12");
 ^
sketch_aug04a:25:1: error: 'NexNumber' does not name a type
 NexNumber n13 = NexNumber (4,4,"n13");
 ^
sketch_aug04a:26:1: error: 'NexNumber' does not name a type
 NexNumber n14 = NexNumber (4,5,"n14");
 ^
sketch_aug04a:27:1: error: 'NexNumber' does not name a type
 NexNumber n15 = NexNumber (4,6,"n15");
 ^
sketch_aug04a:28:1: error: 'NexNumber' does not name a type
 NexNumber n16 = NexNumber (4,7,"n16");
 ^
sketch_aug04a:29:1: error: 'NexNumber' does not name a type
 NexNumber n17 = NexNumber (4,8,"n17");
 ^
sketch_aug04a:30:1: error: 'NexNumber' does not name a type
 NexNumber n18 = NexNumber (4,9,"n18");
 ^
sketch_aug04a:31:1: error: 'NexNumber' does not name a type
 NexNumber n19 = NexNumber (4,10,"n19");
 ^
sketch_aug04a:33:1: error: 'NexTouch' does not name a type
 NexTouch *nex_listen_list[] =
 ^
/home/Arduino/sketch_aug04a/sketch_aug04a.ino: In function 'void fragola1ml(void*)':
sketch_aug04a:73:1: error: 'nexSerial' was not declared in this scope
 nexSerial.print(cmdToSend);
 ^
/home/Arduino/sketch_aug04a/sketch_aug04a.ino: In function 'void bloccafragola(void*)':
sketch_aug04a:83:1: error: 'nexSerial' was not declared in this scope
 nexSerial.print(cmdToSend);
 ^
/home/Arduino/sketch_aug04a/sketch_aug04a.ino: In function 'void fragola2ml(void*)':
sketch_aug04a:95:1: error: 'nexSerial' was not declared in this scope
 nexSerial.print(cmdToSend);
 ^
/home/Arduino/sketch_aug04a/sketch_aug04a.ino: In function 'void cocco1ml(void*)':
sketch_aug04a:108:1: error: 'nexSerial' was not declared in this scope
 nexSerial.print(cmdToSend);
 ^
/home/Arduino/sketch_aug04a/sketch_aug04a.ino: In function 'void setup()':
sketch_aug04a:119:3: error: 'dbSerial' was not declared in this scope
   dbSerial.begin(250000);
   ^
sketch_aug04a:120:3: error: 'nexSerial' was not declared in this scope
   nexSerial.begin(115200);
   ^
sketch_aug04a:121:11: error: 'nexInit' was not declared in this scope
   nexInit();
           ^
sketch_aug04a:123:3: error: 'n0' was not declared in this scope
   n0.attachPush(fragola1ml,&n0); // attiva routine accendiled al rilascio del pulsante bon
   ^
sketch_aug04a:124:3: error: 'n1' was not declared in this scope
   n1.attachPush(fragola2ml, &n1);
   ^
sketch_aug04a:125:3: error: 'n10' was not declared in this scope
   n10.attachPush(cocco1ml, &n10);
   ^
sketch_aug04a:126:3: error: 'fragola' was not declared in this scope
   fragola.attachPush(bloccafragola, &fragola);
   ^
/home/Arduino/sketch_aug04a/sketch_aug04a.ino: In function 'void loop()':
sketch_aug04a:138:13: error: 'nex_listen_list' was not declared in this scope
     nexLoop(nex_listen_list);
             ^
sketch_aug04a:138:28: error: 'nexLoop' was not declared in this scope
     nexLoop(nex_listen_list);
                            ^
exit status 1
'NexButton' does not name a type

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Non prendo in considerazione un codice con errori.

Ciao,
P.

Scusami da errore perchè non ho inserito le librerie

#include <doxygen.h>
#include <NexButton.h>
#include <NexCheckbox.h>
#include <NexConfig.h>
#include <NexCrop.h>
#include <NexDualStateButton.h>
#include <NexGauge.h>
#include <NexGpio.h>
#include <NexHardware.h>
#include <NexHotspot.h>
#include <NexNumber.h>
#include <NexObject.h>
#include <NexPage.h>
#include <NexPicture.h>
#include <NexProgressBar.h>
#include <NexRadio.h>
#include <NexRtc.h>
#include <NexScrolltext.h>
#include <NexSlider.h>
#include <NexText.h>
#include <NexTimer.h>
#include <Nextion.h>
#include <NexTouch.h>
#include <NexUpload.h>
#include <NexVariable.h>
#include <NexWaveform.h>
#include <SoftwareSerial.h>
#define nexSerial Serial
#ifdef DEBUG_SERIAL_ENABLE
#define dbSerialPrint(a) dbSerial.print(a)
#define dbSerialPrintln(a) dbSerial.println(a)
#define dbSerialBegin(a) dbSerial.begin(a)
#else
#define dbSerialPrint(a) do{}while(0)
#define dbSerialPrintln(a) do{}while(0)
#define dbSerialBegin(a) do{}while(0)
#endif
#define DEBUG_SERIAL_ENABLE
#define nexSerial Serial2


#define ledpin 47 
#define ledpin1 45
#define ledpin2 43

NexButton fragola = NexButton (2, 5, "fragola");
NexButton cocco = NexButton (2, 6, "cocco");
NexButton vaniglia = NexButton (2, 7, "vaniglia");

NexNumber n0 = NexNumber (3,1,"n0");
NexNumber n1 = NexNumber (3,2,"n1");
NexNumber n2 = NexNumber (3,3,"n2");
NexNumber n3 = NexNumber (3,4,"n3");
NexNumber n4 = NexNumber (3,5,"n4");
NexNumber n5 = NexNumber (3,6,"n5");
NexNumber n6 = NexNumber (3,7,"n6");
NexNumber n7 = NexNumber (3,8,"n7");
NexNumber n8 = NexNumber (3,9,"n8");
NexNumber n9 = NexNumber (3,10,"n9");
NexNumber n10 = NexNumber (4,1,"n10");
NexNumber n11 = NexNumber (4,2,"n11");
NexNumber n12 = NexNumber (4,3,"n12");
NexNumber n13 = NexNumber (4,4,"n13");
NexNumber n14 = NexNumber (4,5,"n14");
NexNumber n15 = NexNumber (4,6,"n15");
NexNumber n16 = NexNumber (4,7,"n16");
NexNumber n17 = NexNumber (4,8,"n17");
NexNumber n18 = NexNumber (4,9,"n18");
NexNumber n19 = NexNumber (4,10,"n19");

NexTouch *nex_listen_list[] =
{
  &fragola,
  &cocco,
  &vaniglia,
  
  &n0,
  &n1,
  &n2,
  &n3,
  &n4,
  &n5,
  &n6,
  &n7,
  &n8,
  &n9,
  &n10,
  &n11,
  &n12,
  &n13,
  &n14,
  &n15,
  &n16,
  &n17,
  &n18,
  &n19,
  NULL
};
//

 

void fragola1ml(void *ptr)
{

  
  digitalWrite(ledpin,LOW);
    delay(500);
     digitalWrite(ledpin, HIGH);
    char cmdToSend[8] = "tsw 5,0";
nexSerial.print(cmdToSend);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
nexSerial.write(0xFF);

}

void bloccafragola(void *ptr)
{
   char cmdToSend[8] = "tsw 5,0";
nexSerial.print(cmdToSend);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
}
void fragola2ml(void *ptr)
{
  
digitalWrite(ledpin,LOW);
    delay(900);
     digitalWrite(ledpin, HIGH);
    char cmdToSend[8] = "tsw 5,0";
nexSerial.print(cmdToSend);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
nexSerial.write(0xFF);

}

void cocco1ml(void *ptr)
{
digitalWrite(ledpin1,LOW);
    delay(900);
     digitalWrite(ledpin1, HIGH);
    char cmdToSend[8] = "tsw 6,0";
nexSerial.print(cmdToSend);
nexSerial.write(0xFF);
nexSerial.write(0xFF);
nexSerial.write(0xFF);

}



void setup(void)
{
  dbSerial.begin(250000);
  nexSerial.begin(115200);
  nexInit();
  
  n0.attachPush(fragola1ml,&n0); 
  n1.attachPush(fragola2ml, &n1);
  n10.attachPush(cocco1ml, &n10);
  fragola.attachPush(bloccafragola, &fragola);
  pinMode(ledpin, OUTPUT);
  digitalWrite(ledpin , HIGH);
   pinMode(ledpin1, OUTPUT);
  digitalWrite(ledpin1 , HIGH);
  pinMode(ledpin2, OUTPUT);
  digitalWrite(ledpin2 , HIGH);
}

void loop(void)
{
  
    nexLoop(nex_listen_list);
 
  
}

Cosi non da errore...dimenticanza mia perdonami

Non posso controllare la compilazione perché non posso importare tutte le librerie

Se ti può aiutare, lo schema logico del programma potrebbe essere questo:

SETUP
 Visualizza tasti su schermo
 Inizializza relè
 Azzera numero relè selezionati
 Azzera matrice relè premuti

LOOP
 SE è premuto il tasto reset
   azzera il numero dei relè selezionati
   resetta i relè selezionati
   azzera la matrice dei relè selezionati

 SE è premuto il tasto azionamento
   aziona i relè selezionati per un tempo prefissato
   azzera il numero dei relè selezionati
   resetta i relè selezionati
   azzera la matrice dei relè selezionati

 SE è selezionato un relè && il numero dei relè è minore di tre
     incrementa il numero dei relè selezionati
     memorizza il numero del relè selezionato nella matrice

Ciao,
P.

Ti ringrazio sei molto gentile.
Solo che ci sono un pò di concetti nel logico che mi hai scritto che non conosco purtroppo.

Ho fatto una cosa del genere per registrare il valore dopo la pressione del tasto ma non funziona...ne va solo uno

uint32_t statoButton;
uint32_t statoButton1;
void term(void *ptr)//clicco il tasto termina
{
  cocco.getValue(&statoButton);  //registro il valore dopo la pressione del tasto cocco

 
  if(statoButton >0){  //se è maggiore di 0
  digitalWrite(ledpin,LOW);
    delay(1000);
     digitalWrite(ledpin, HIGH);
  }

  fragola.getValue(&statoButton1); //registro il valore dopo la pressione del tasto fragola

  if (statoButton1 >0){
    digitalWrite(ledpin1,LOW);
    delay(4000);
     digitalWrite(ledpin1, HIGH);
  }
  }

sono in grande difficoltà perchè non so proprio come risolvere.

Purtroppo non conosco la programmazione del display Nextion e il tuo codice è un po' parco di commenti. :slight_smile:

Inoltre sono abituato a trattare i pulsanti con l'istruzione "digitalRead" e i relè con l'istruzione "digitalWrite", mentre nel tuo caso mi sembra che il pulsante premuto sia individuato ad es. dall'istruzione "cocco.getValue(&statoButton)". Ne deduco che la programmazione di un display Nextion è lontana dalla mia esperienza e non posso andare oltre lo schema logico che ti ho proposto. Mi spiace.

Ciao,
P.

Grazie mille comunque...Cercherò di ragionare sul logico che mi hai scritto.

Posso aiutarti ad impostare il programma.
Per quello che ho capito hai già definito i 16 relè e hai già disegnato i 16 pulsanti (+1 per il reset, +1 per l'esecuzione).
Devi definire un contatore di pulsanti premuti e un array che memorizza i relè corrispondenti. Per una migliore comprensione ti conviene definire i pulsanti e i relè con degli alias del tipo:

 #define P0 <tua definizione (fragola)?>
 #define P1 <tua definizione (cocco)?>
 .  .  .
 #define P15 <?  ?  ?>
 #define R0 <tua definizione (n0)?>
 #define R1 <tua definizione (n1)?>
 .  .  .
 #define R15 <?  ?  ?>
 #define reset <?  ?  ?>
 #define exec <?  ?  ?>

Prima della sezione "void setup()" definisci:

 byte contPuls;
 byte arrRel[3];

Nella sezione "void setup()" azzerali, anche se non sarebbe necessario perché, essendo definiti come globali, il compilatore li ha già azzerati.

 contPuls = 0;
 for (int i=0; i<3; i++) {
   arrRel[i] = 0;
 }

Mi sembra che hai già inizializzato i relè. Se così non fosse, fallo.

Nella sezione "void loop()" ci sono due "if" relativi ai pulsanti reset ed exec e 16 "if" relativi ai pulsanti relè. Sono strutture condizionali che dovresti conoscere, altrimenti studiatele.

 if (<PULSANTE PREMUTO == reset) { //se è stato premuto il reset
   contPuls = 0;                   //azzera contatore pulsanti
   for (int i=0; i<3) {
     <DISABILITA RELÈ IN POSIZIONE arrRel[i]>
     arrRel[i] = 0;                //azzera array relè
   }
 }
 if (<PULSANTE PREMUTO == exec && contPuls > 0) {
   //se è stato premuto il tasto exec E il contatore pulsanti è > 0
   for (int i=0; i<contPuls; i++) { //aziona i relè selezionati
     <ATTIVA IL RELÈ IN POSIZIONE arrRel[i]>
   }
   <ATTENDI IL TEMPO PREFISSATO>
   for (int i=0; i<contPuls; i++) { //aziona i relè selezionati
     <DISATTIVA IL RELÈ IN POSIZIONE arrRel[i]>
     arrRel[i] = 0;       //azzera i relè selezionati
   }
   contPuls = 0;          //azzera contatore pulsanti
 }
 if (<PULSANTE PREMUTO == P0 && contPuls < 3>) {
   arrRel[contPuls] = <P0>
   contPuls = contPuls+1;
 }
 if (<PULSANTE PREMUTO == P1 && contPuls < 3>) {
   arrRel[contPuls] = <P1>
   contPuls = contPuls+1;
 }
 .  .  .
 if (<PULSANTE PREMUTO == P15 && contPuls < 3>) {
   arrRel[contPuls] = <P15>
   contPuls = contPuls+1;
 }

È una struttura buttata giù alla svelta. Vedi se ti riesce comprensibile e tenta di completarla con i comandi che tu sai e io no.

Ciao,
P.

Grazie stasera provo a mettere giù qualcosa e ti aggiorno

... ma è la macchina del gelato di Ikea?... :smiley:

si più o meno...

Ho provato a creare il codice ma purtroppo non si attiva nulla.

#include <NexDualStateButton.h>

#include <Nextion.h>
#include <NexTouch.h>

#include <SoftwareSerial.h>
#define nexSerial Serial
#ifdef DEBUG_SERIAL_ENABLE
#define dbSerialPrint(a) dbSerial.print(a)
#define dbSerialPrintln(a) dbSerial.println(a)
#define dbSerialBegin(a) dbSerial.begin(a)
#else
#define dbSerialPrint(a) do{}while(0)
#define dbSerialPrintln(a) do{}while(0)
#define dbSerialBegin(a) do{}while(0)
#endif
#define DEBUG_SERIAL_ENABLE
#define nexSerial Serial2

#define rele 47 //definisco i pin rele
#define rele1 45
#define rele2 43
#define rele3 41

byte contPuls;
byte arrRel[3];

uint32_t bottone;
uint32_t bottone1;
uint32_t bottone2;
uint32_t bottone3;
uint32_t bottone4;
uint32_t bottone5;
NexDSButton fragola = NexDSButton (0, 1, "fragola"); //associo i pulsanti touch di nextion
NexDSButton cocco = NexDSButton (0, 2, "cocco");
NexDSButton vaniglia = NexDSButton (0, 5, "vaniglia");
NexDSButton menta = NexDSButton (0, 6, "menta");
NexDSButton termina = NexDSButton (0, 3, "termina");
NexDSButton resetta = NexDSButton (0,4,"resetta");

NexTouch *nex_listen_list[] = { &fragola, &cocco, &vaniglia, &termina, &resetta, &menta};  //rendo sensibili al tocco
NexDSButton arr[6]= {fragola,cocco,vaniglia,termina,resetta,menta};  //creo un array dei tasti

void setup() {

  dbSerial.begin(250000);
  nexSerial.begin(115200);
  nexInit();
  
contPuls = 0;
 for (int i=0; i<3; i++) {
   arrRel[i] = 0;

   pinMode(rele, OUTPUT);
  digitalWrite(rele , HIGH);
   pinMode(rele1, OUTPUT);
  digitalWrite(rele1 , HIGH);
  pinMode(rele2, OUTPUT);
  digitalWrite(rele2 , HIGH);
  pinMode(rele3, OUTPUT);
  digitalWrite(rele3 , HIGH);
 }
}

void loop() {

  arr[4].getValue(&bottone); //clicco tasto resetta
   if(bottone == 1) {
     contPuls = 0;
                                        //azzera contatore pulsanti
   for (int i=0; i<3;) {
     
     arrRel[i] = 0;                //azzera array relè
   }
 }
   arr[3].getValue(&bottone1);  //clicco tasto termina
if (bottone1 == 1 && contPuls > 0) {
                                                          //se è stato premuto il tasto exec E il contatore pulsanti è > 0
   for (int i=0; i<contPuls; i++) {                //aziona i relè selezionati
    // <ATTIVA IL RELÈ IN POSIZIONE arrRel[i]>
    digitalWrite(arrRel[i],LOW);
    delay(1000);
     digitalWrite(arrRel[i], HIGH);
    


    
   }
  // <ATTENDI IL TEMPO PREFISSATO>
   for (int i=0; i<contPuls; i++) { //aziona i relè selezionati

    // <DISATTIVA IL RELÈ IN POSIZIONE arrRel[i]>
   
     arrRel[i] = 0;       //azzera i relè selezionati
   }
   contPuls = 0;          //azzera contatore pulsanti

arr[0].getValue(&bottone2);  //clicco tasto fragola
if (bottone2 == 1 && contPuls < 3) {
   arrRel[contPuls] = bottone2;
   contPuls = contPuls+1;
 }

arr[1].getValue(&bottone3);  //clicco tasto cocco
if (bottone3 == 1 && contPuls < 3) {
   arrRel[contPuls] = bottone3;
   contPuls = contPuls+1;
 }

arr[2].getValue(&bottone4);     //clicco tasto vaniglia
if (bottone4 == 1 && contPuls < 3) {
   arrRel[contPuls] = bottone4;
   contPuls = contPuls+1;
 }
arr[5].getValue(&bottone5);     //clicco tasto menta
if (bottone4 == 1 && contPuls < 3) {
   arrRel[contPuls] = bottone5;
   contPuls = contPuls+1;
 }

   
 }

Alcune osservazioni:

  • Hai parlato di 16 relè. Ne conto 4

  • In tutto lo sketch hai chiamao i pulsanti "cocco", "vaniglia" etc. Poi definisci "rele", "rele1", etc. Ho immaginato che le corrispondenze fossero: rele=fragola, rele1=cocco, etc.

  • Non posso controllare se l'acquisizione dello stato del bottone sia giusta, presumo che lo sia. Per esempio, l'acquisizione avviene con l'istruzione:

 arr[4].getValue(&bottone);

e lo stato può essere 1 se il bottone è stato premuto, o diverso da 1 (presumo 0) se non lo è stato. Può andar bene, ma spiegami perché hai definito i bottoni come variabili a 32 bit quando ne basterebbero 8.

  • Per come hai implementato la pressione del tasto "termina" i relè selezionati vengono azionati in successione per 1 secondo. Va bene così o devono essere azionati contemporaneamente?

Ti allego lo sketch che ho corretto. Prova a compilarlo ed eventualmente mandami gli errori rilevati.

Ciao,
P.

sketch_aug04a.ino (3.99 KB)

void loop() 
{
	 arr[4].getValue(&bottone); //clicco tasto resetta
	 if(bottone == 1) 
	 {
		 contPuls = 0; //azzera contatore pulsanti
		 for (int i=0; i<3;) 
		 {
			 arrRel[i] = 0; //azzera array relè
		 }
	 }

	 arr[3].getValue(&bottone1);  //clicco tasto termina
	 if (bottone1 == 1 
		&& contPuls > 0) 
	 {
		 //se è stato premuto il tasto exec E il contatore pulsanti è > 0
		 for (int i=0; i<contPuls; i++) 
		 {
			 //aziona i relè selezionati
			 // <ATTIVA IL RELÈ IN POSIZIONE arrRel[i]>
			 digitalWrite(arrRel[i],LOW);
			 delay(1000);
			 digitalWrite(arrRel[i], HIGH);
		 }
	 }

	 // <ATTENDI IL TEMPO PREFISSATO>
	 for (int i=0; i<contPuls; i++) 
	 { 
		 //aziona i relè selezionati
		 // <DISATTIVA IL RELÈ IN POSIZIONE arrRel[i]>

		 arrRel[i] = 0;       //azzera i relè selezionati
	 }

	 contPuls = 0;          //azzera contatore pulsanti

	 arr[0].getValue(&bottone2);  //clicco tasto fragola
	 if (bottone2 == 1 
		 && contPuls < 3) 
	 {
	   arrRel[contPuls] = bottone2;
	   contPuls = contPuls+1;
	 }

	 arr[1].getValue(&bottone3);  //clicco tasto cocco
	 if (bottone3 == 1 
	 && contPuls < 3) 
	 {
	   arrRel[contPuls] = bottone3;
	   contPuls = contPuls+1;
	 }

	 arr[2].getValue(&bottone4);     //clicco tasto vaniglia
	 if (bottone4 == 1 
	 && contPuls < 3) 
	 {
	   arrRel[contPuls] = bottone4;
	   contPuls = contPuls+1;
	 }

	 arr[5].getValue(&bottone5);     //clicco tasto menta
	 if (bottone4 == 1 
	 && contPuls < 3) 
	 {
	   arrRel[contPuls] = bottone5;
	   contPuls = contPuls+1;
	 }
 }

Non conosco la libreria e nemmeno l'HW, però vorrei chiederti una cosa:

I pulsanti mantengono lo stato "pressed" una volta premuti o lo perdono subito?

Te lo chiedo perchè nel loop che hai postato, ad un certo punto setti la variabile contPuls = 0, quindi se i pulsanti mantengono lo stato la variabile viene resettata e poi reincrementata, ma se non lo mantengono la variabile viene si incrementata in un ciclo, ma viene subito resettata nel successivo e quando premi "termina", varrà sempre 0.

Un'altra cosa: quelli a cui piace la menta resteranno sempre delusi: :slight_smile:

 arr[5].getValue(&bottone5);     //clicco tasto menta
 if (bottone4 == 1 
 && contPuls < 3) 
 {
   arrRel[contPuls] = bottone5;
   contPuls = contPuls+1;
 }

Ciao