Implementare contatore

Salve a tutti avrei necessità di inserire un contatore in una porzione di listato. Se il contatore è pari esegue la prima parte, se è dispari la seconda.
Il listato che posterò non l’ho fatto io del tutto ma ho preso un po qua e la e adattato alle mie esigenze, solo che adesso non trovo niente in rete per fare quello che intendo io.
Detto questo ho un BUTTON3 che mi deve fare delle memorie su i due array che ho quindi con la prima pressione mi commuta sull’array1 out 4 e sull’array2 out 2, con un’altra pressione mi commuta sull’array1 out 3 e sull’array2 out 0 se premo dinuovo il ciclo si ripete, se non che mi rendo conto che non può funzionare così, da qui l’uso del contatore.
Come posso fare? Mi potreste dare una mano?
Grazie a chi mi aiuterà.

listato parziale dove inserire il contatore

if (digitalRead(BUTTON3) == HIGH) {
    delay(100); 
    digitalWrite(array1[cont1], LOW);
    digitalWrite(array2[cont2], LOW); 

     {
       cont1 = 4;
       cont2 = 2;
    }   
    
    digitalWrite(array1[cont1], HIGH); 
    digitalWrite(array2[cont2], HIGH);
    while (digitalRead(BUTTON3) == HIGH);
    delay(100);
  }
  
if (digitalRead(BUTTON3) == HIGH) {
    delay(100); 
    digitalWrite(array1[cont1], LOW);
    digitalWrite(array2[cont2], LOW);
       
     { 
       cont1 = 3;
       cont2 = 0;
    }
     
    digitalWrite(array1[cont1], HIGH);
    digitalWrite(array2[cont2], HIGH);
    while (digitalRead(BUTTON3) == HIGH); 
    delay(100);
  }

listato completo

#include <OneShotTimer.h>

#define ledPin4 28 //LED LETTURA SINGOLA SELEZIONATA TRAFO 1KVA
#define ledPin3 29 //LED LETTURA SINGOLA SELEZIONATA TRAFO LKB
#define ledPin2 25 //RELE SELEZIONE LETTURA SINGOLA O DUALE TRAFO 1KVA
#define ledPin1 23 //RELE SELEZIONE LETTURA SINGOLA O DUALE TRAFO LKB
#define LED12 27 //RELE SOFT START
#define LED11 12 //RELE SELEZIONE PRIMARIO TRAFO ISOLAMENTO P1
#define LED10 11 //RELE SELEZIONE PRIMARIO TRAFO ISOLAMENTO P2
#define LED9 10 //RELE SELEZIONE PRIMARIO TRAFO ISOLAMENTO P3
#define LED6 8 //RELE SELEZIONE SECONDARIO TRAFO ISOLAMENTO S1
#define LED5 7 //RELE SELEZIONE SECONDARIO TRAFO ISOLAMENTO S2
#define LED4 6 //RELE SELEZIONE SECONDARIO TRAFO ISOLAMENTO S3
#define LED3 5 //RELE SELEZIONE SECONDARIO TRAFO ISOLAMENTO S4
#define LED2 4 //RELE SELEZIONE SECONDARIO TRAFO ISOLAMENTO S5
#define LED1 3 //RELE SELEZIONE SECONDARIO TRAFO ISOLAMENTO S6
#define buttonPin2 24 //PULSANTE SELEZIONE LETTURA SINGOLA O DUALE TRAFO 1KVA
#define buttonPin1 22 //PULSANTE SELEZIONE LETTURA SINGOLA O DUALE TRAFO LKB
#define BUTTON3 13 //PULSANTE SELEZIONE MEMORIA USCITA VARIAC O 230V
#define BUTTON2 9 //PULSANTE SELEZIONE PRIMARIO TRAFO ISOLAMENTO
#define BUTTON1 2 //PULSANTE SELEZIONE SECONDARIO TRAFO ISOLAMENTO

OneShotTimer timer;
bool active = true;

int ledState3 = HIGH;
int ledState1 = LOW;
int buttonState1;
int lastButtonState1 = HIGH;

long lastDebounceTime1 = 0;
long debounceDelay1 = 50;

int ledState4 = HIGH;
int ledState2 = LOW;
int buttonState2;
int lastButtonState2 = HIGH;

long lastDebounceTime2 = 0;
long debounceDelay2 = 50;

int array1[] = {LED6, LED5, LED4, LED3, LED2, LED1};
int array2[] = {LED11, LED10, LED9};
int cont1, cont2;
int maxArray1, maxArray2;

void setup () {
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(LED12, OUTPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode (LED11, OUTPUT);
  pinMode (LED10, OUTPUT);
  pinMode (LED9, OUTPUT);
  pinMode (LED6, OUTPUT);
  pinMode (LED5, OUTPUT);
  pinMode (LED4, OUTPUT);
  pinMode (LED3, OUTPUT);
  pinMode (LED2, OUTPUT);
  pinMode (LED1, OUTPUT);
  pinMode (BUTTON3, INPUT);
  pinMode (BUTTON2, INPUT);
  pinMode (BUTTON1, INPUT);
  //definisco il quantitativo di led delle due serie
  maxArray1 = 6; //la prima serie è composta da 6 led
  maxArray2 = 3; //la seconda serie è composta da 3 led
  //spengo tutti i led delle due serie
  for (int i = 0; i < 6; i++) digitalWrite(array1[i], LOW);
  for (int i = 0; i < 3; i++) digitalWrite(array2[i], LOW);
  cont1 = 4; //inizializzo contatore array1
  cont2 = 2; //inizializzo contatore array2
  //accendo i primi led delle due serie
  digitalWrite(ledPin4, ledState4);
  digitalWrite(ledPin3, ledState3);
  digitalWrite(LED12, LOW);
  digitalWrite(BUTTON3, LOW);
  digitalWrite(ledPin1, ledState1);
  digitalWrite(ledPin2, ledState2);
  digitalWrite(array1[cont1], HIGH);
  digitalWrite(array2[cont2], HIGH);
  timer.OneShot(3000, action);
}
void loop () {

if (digitalRead(BUTTON3) == HIGH) {
    delay(100); 
    digitalWrite(array1[cont1], LOW);
    digitalWrite(array2[cont2], LOW); 
     
     {
       cont1 = 4;
       cont2 = 2;
    }   
    
    digitalWrite(array1[cont1], HIGH); 
    digitalWrite(array2[cont2], HIGH);
    while (digitalRead(BUTTON3) == HIGH);
    {
      ;
    }
    delay(100);
  } 
  
if (digitalRead(BUTTON3) == HIGH) {
    delay(100); 
    digitalWrite(array1[cont1], LOW);
    digitalWrite(array2[cont2], LOW);
    
     { 
       cont1 = 3;
       cont2 = 0;
    }
     
    digitalWrite(array1[cont1], HIGH);
    digitalWrite(array2[cont2], HIGH);
    while (digitalRead(BUTTON3) == HIGH); 
    {
      ;
    }
    delay(100);
    
  }    

timer.Update(); 

  int reading1 = digitalRead(buttonPin1);
  if (reading1 != lastButtonState1) {
    lastDebounceTime1 = millis();
  }
  if ((millis() - lastDebounceTime1) > debounceDelay1) {
    if (reading1 != buttonState1) {
      buttonState1 = reading1;
      if (buttonState1 == HIGH) {
        ledState1 = !ledState1;
        ledState3 = !ledState3;
      }
    }
  }
  digitalWrite(ledPin1, ledState1);
  digitalWrite(ledPin3, ledState3);
  lastButtonState1 = reading1;

  int reading2 = digitalRead(buttonPin2);
  if (reading2 != lastButtonState2) {
    lastDebounceTime2 = millis();
  }
  if ((millis() - lastDebounceTime2) > debounceDelay2) {
    if (reading2 != buttonState2) {
      buttonState2 = reading2;
      if (buttonState2 == HIGH) {
        ledState2 = !ledState2;
        ledState4 = !ledState4;
      }
    }
  }
  digitalWrite(ledPin2, ledState2);
  digitalWrite(ledPin4, ledState4);
  lastButtonState2 = reading2;

  if (digitalRead(BUTTON2) == HIGH) {
    delay(100); //attesa antibounce
    digitalWrite(array2[cont2], LOW); //spengo led corrente
    cont2 = cont2 + 1; //incremento contatore led corrente
    if (cont2 == maxArray2) //se il contatore è al massimo
      cont2 = 0; //azzeralo
    digitalWrite(array2[cont2], HIGH); //accendi il nuovo led corrente
    while (digitalRead(BUTTON2) == HIGH); //attendi il rilascio di BUTTON2
    delay(100); //attesa antibounce
  }

  if (digitalRead(BUTTON1) == HIGH) {
    delay(100); //attesa antibounce
    digitalWrite(array1[cont1], LOW); //spengo led corrente
    cont1 = cont1 + 1; //incremento contatore led corrente
    if (cont1 == maxArray1) //se il contatore è al massimo
      cont1 = 0; //azzeralo
    digitalWrite(array1[cont1], HIGH); //accendi il nuovo led corrente
    while (digitalRead(BUTTON1) == HIGH); //attendi il rilascio di BUTTON1
    delay(100);
  }

}
void action()
{
  digitalWrite(LED12, HIGH);
  }

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:

Allo stato attuale tutto il listato funziona alla perfezione tranne quella porzione che funziona alla prima pressione ma alla seconda non switcha, per farlo switchare e funziona il 90% delle volte, bisogna fare il doppio click, ovviamente questo per me è un mal funzionamento e vorrei eliminarlo tutto qui.

Prova cosi al primo if

if (digitalRead(BUTTON3) == HIGH && !cont2) {

e al secondo

if (digitalRead(BUTTON3) == HIGH && cont2) {

A cosa servono le due parentesi?

     {
       cont1 = 3;
       cont2 = 0;
    }

adesso provo il tuo consiglio, per quanto riguarda le parentesi non saprei mi è stato fornito così :smiley:

ho provato il consiglio e adesso va alla grande!!! ho tolto anche le parentesi e funziona benissimo!!!
GRAZIE MILLE PER L'AIUTO
se io adesso voglio spegnere l'array2 mantenendo BUTTON2 per 1 secondo (meglio regolabile) e per riaccendere l'array ripigiare lo stesso pulsante mantenendo il led che era acceso prima dello spegnimento come verrebbe la modifica?

poi come mai con cont2 funziona e con cont1 no? ho fatto questa prova giusto per provare!

p

RoccoStragapede:
poi come mai con cont2 funziona e con cont1 no? ho fatto questa prova giusto per provare!

perché cont2 ha come valore 0 o 2 (false o true) mentre cont1 ha come valore possibile 3 o 4 (true o true).
Mi rendo conto pero' che non è una soluzione molto leggibile.

per quanto riguarda le parentesi non saprei mi è stato fornito così

toglile, sono più brutte della la mia soluzione!! :smiley:

se io adesso voglio spegnere l'array2 mantenendo BUTTON2 per 1 secondo (meglio regolabile) e per riaccendere l'array ripigiare lo stesso pulsante mantenendo il led che era acceso prima dello spegnimento come verrebbe la modifica?

Se sapessi quello che vuoi fare... L'ho letto più volte ma è difficile capire. Dai, cerca di trovare tu la soluzione! Sei la persona più adatta.

e infatti le ho tolte anche perchè senza funziona uguale

se io adesso voglio spegnere l'array2 mantenendo BUTTON2 per 1 secondo (meglio regolabile) e per riaccendere l'array ripigiare lo stesso pulsante mantenendo il led che era acceso prima dello spegnimento come verrebbe la modifica?

il problema e che non so programmare io per mettere il contatore ci ho provato una settimana tu per mettere due cont2 nei due if sei stato 1 minuto

provo a spiegartelo meglio

ho BUTTON2 che pigio regolarmente per un istante per far ciclare i 3 led corrispondenti quindi ad ogni pressione spengo il led corrente e accendo il led successivo e così via, fino a che non arrivo all'ultimo led e ricomincia da capo

ecco il listato che fa questo:

if (digitalRead(BUTTON2) == HIGH) {
delay(100); //attesa antibounce
digitalWrite(array2[cont2], LOW); //spengo led corrente
cont2 = cont2 + 1; //incremento contatore led corrente
if (cont2 == maxArray2) //se il contatore è al massimo
cont2 = 0; //azzeralo
digitalWrite(array2[cont2], HIGH); //accendi il nuovo led corrente
while (digitalRead(BUTTON2) == HIGH); //attendi il rilascio di BUTTON2
delay(100); //attesa antibounce
}

ora a questo sempre con il BUTTON2 vorrei spegnere l'array2 mantenendo BUTTON2 per 1 secondo (meglio se regolabile) e per riaccendere l'array ripigiare lo stesso pulsante mantenendo il led che era acceso prima dello spegnimento

: ( :frowning: :frowning: iiii taaaaggggs!!!!

delay(100); //attesa antibounceè troppo: 10 dovrebbe essere sufficiente.
cont2 = cont2 + 1 meglio cont2++

Devi usare millis() + memorizzare cont2. Ho provato a fare una semplice ricerca sul web (per esempio: pulsante arduino millis) e ho trovato molte cose.

per i tags che credo tu intenda dire metti il codice nei tags, ecco, adesso che stò scrivendo qui sotto dove c'è scritto quick replay faccine tags ecc mi sono scomparsi tutti e non so dove riprendere la scrermata iniziale

provo a fare la ricerca anche io ma so gia che integrare il risultato della ricerca nel mio listato sarà difficile

vedo.

if (digitalRead(BUTTON2) == HIGH) {
    delay(100);
    BUTTON2 = millis();
  {
  else
  }
      if (millis() - BUTTON2 >= 100) {
        digitalWrite(array2[cont2], LOW); //spengo led corrente
        cont2 = cont2 + 1; //incremento contatore led corrente
        if (cont2 == maxArray2) //se il contatore è al massimo
          cont2 = 0; //azzeralo
        digitalWrite(array2[cont2], HIGH); //accendi il nuovo led corrente
        while (digitalRead(BUTTON2) == HIGH); //attendi il rilascio di BUTTON2
        delay(100); //attesa antibounce
      }
    
      if (millis() - BUTTON2 >= 1000) {
        digitalWrite(array2, LOW);
      }
  }

ho provato questo ma mi da errore

considerando che ho messo

unsigned long BUTTON2 = 0;

ovviamente devo poterlo riaccendere

ma come?

ho provato così:

unsigned long t_pulsante = 0;

e poi:

if (digitalRead(BUTTON2) == HIGH) {
    delay(100);
    t_pulsante = millis();
  }
  else
  {
      if (millis() - t_pulsante >= 100) {
        digitalWrite(array2[cont2], LOW); //spengo led corrente
        cont2 = cont2 + 1; //incremento contatore led corrente
        if (cont2 == maxArray2) //se il contatore è al massimo
          cont2 = 0; //azzeralo
        digitalWrite(array2[cont2], HIGH); //accendi il nuovo led corrente
        while (digitalRead(BUTTON2) == HIGH); //attendi il rilascio di BUTTON2
        delay(100); //attesa antibounce
      }
    
      if (millis() - t_pulsante >= 1000 && !cont2) {
        digitalWrite(array2[cont2], LOW);
      }
      if (millis() - t_pulsante >= 1000 && cont2) {
        digitalWrite(array2[cont2], HIGH);
      }
  }

ma niente addirittura lo scorrimento è diventato automatico che si ferma al pigiare del BUTTON2

HELP

if (digitalRead(BUTTON2) == HIGH) {
    t_pulsante = millis();
    while (digitalRead(BUTTON2) == HIGH):
  }

se millis() - t_pulsante < 1000 fai questo se no fai quest’altro.

ho provato così ma niente

 if (digitalRead(BUTTON2) == HIGH) {
    t_pulsante = millis();
  while (digitalRead(BUTTON2) == HIGH);
  }
  if (millis() - t_pulsante < 1000) {
        digitalWrite(array2[cont2], LOW); //spengo led corrente
        cont2 = cont2 + 1; //incremento contatore led corrente
        if (cont2 == maxArray2) //se il contatore è al massimo
          cont2 = 0; //azzeralo
        digitalWrite(array2[cont2], HIGH); //accendi il nuovo led corrente
        while (digitalRead(BUTTON2) == HIGH); //attendi il rilascio di BUTTON2
        delay(100); //attesa antibounce
      }
    else
      {
        digitalWrite(array2[cont2], LOW);
      }

ho provato così ma niente

Certo, che detto cosi' non è che mi aiuti molto! Prova ad essere più preciso.

RoccoStragapede:
ho provato così:

unsigned long t_pulsante = 0;

e poi:

if (digitalRead(BUTTON2) == HIGH) {

delay(100);
    t_pulsante = millis();
  }
  else
  {
      if (millis() - t_pulsante >= 100) {
        digitalWrite(array2[cont2], LOW); //spengo led corrente
        cont2 = cont2 + 1; //incremento contatore led corrente
        if (cont2 == maxArray2) //se il contatore è al massimo
          cont2 = 0; //azzeralo
        digitalWrite(array2[cont2], HIGH); //accendi il nuovo led corrente
        while (digitalRead(BUTTON2) == HIGH); //attendi il rilascio di BUTTON2
        delay(100); //attesa antibounce
      }
   
      if (millis() - t_pulsante >= 1000 && !cont2) {
        digitalWrite(array2[cont2], LOW);
      }
      if (millis() - t_pulsante >= 1000 && cont2) {
        digitalWrite(array2[cont2], HIGH);
      }
  }




ma niente addirittura lo scorrimento è diventato automatico che si ferma al pigiare del BUTTON2

HELP

a questo mio post tu hai risposto così:

savoriano:

if (digitalRead(BUTTON2) == HIGH) {

t_pulsante = millis();
    while (digitalRead(BUTTON2) == HIGH):
  }



se millis() - t_pulsante < 1000 fai questo se no fai quest'altro.

e l’ho modificato così:

if (digitalRead(BUTTON2) == HIGH) {
t_pulsante = millis();
while (digitalRead(BUTTON2) == HIGH);
}
if (millis() - t_pulsante < 1000) {
digitalWrite(array2[cont2], LOW); //spengo led corrente
cont2 = cont2 + 1; //incremento contatore led corrente
if (cont2 == maxArray2) //se il contatore è al massimo
cont2 = 0; //azzeralo
digitalWrite(array2[cont2], HIGH); //accendi il nuovo led corrente
while (digitalRead(BUTTON2) == HIGH); //attendi il rilascio di BUTTON2
delay(100); //attesa antibounce
}
else
{
digitalWrite(array2[cont2], LOW);
}

Volevo sapere come si comporta con questo codice, il quale mi sembra corretto. Sicuramente c'è qualche cosa che mi sfugge!
Con "ho provato cosi' ma niente" non riesco a capire che cosa c'è di sbagliato.

 if (digitalRead(BUTTON2) == HIGH) {
    t_pulsante = millis();
  while (digitalRead(BUTTON2) == HIGH);
  }
  if (millis() - t_pulsante < 1000) {
        digitalWrite(array2[cont2], LOW); //spengo led corrente
        cont2 = cont2 + 1; //incremento contatore led corrente
        if (cont2 == maxArray2) //se il contatore è al massimo
          cont2 = 0; //azzeralo
        digitalWrite(array2[cont2], HIGH); //accendi il nuovo led corrente
        while (digitalRead(BUTTON2) == HIGH); //attendi il rilascio di BUTTON2
        delay(100); //attesa antibounce
      }
    else
      {
        digitalWrite(array2[cont2], LOW);
      }

con questo codice l’array2 si spegne del tutto, se provo a pigiare si riaccende per un secondo e poi si spegne di nuovo, nel momento in cui si accende non rimane fisso un led ma i tre led scorrono in sequenza 0-1-2-0-1-2-0-1-2- ecc alla frequenza di 1/10 di secondo