problema su array

Progetti Arduino
Rispondi
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

problema su array

Messaggio da RoccoCostruzioni »

Salve a tutti ho un piccolo problema su come gestire degli array, in particolare sugli maxArray per gestire il fondo scala dell'array, ho due pulsanti e 5 led, all'accensione i led sono tutti spenti tranne quello centrale, quindi se 5 led vanno da 0 a 4 il led acceso è il 2, alla pressione del primo pulsante pulsI ho bisogno di accendere il led 3, alla ripressione deve accendersi il led 4 e bloccarsi in questa posizione anche se continuo a schiacciarlo, se voglio scendere devo schiacciare pulsD e quindi ad ogni pressione deve accendere un led con la stessa logica di prima e bloccarsi nella posizione in cui il led 0 è acceso, ovvio se voglio risalire schiaccio il pulsante pulsI e così via, chiaro è che ritornando all'accensione di arduino con il led 2 acceso nel primo caso sono salito verso il 3 e il 4 in egual modo adesso scendo verso l' 1 e lo 0 ripetendo tutto il ciclo, con il mio listato le salite e discese vengono effettuate ma arrivato agli estremi, in salita continua a contare quando io schiaccio, quindi, arrivato al led 4 e schiaccio il pulsante per esempio 3 volte, mi si spegne il led 4 e sembra che non fa più niente, invece per eseguire la sequenza a scendere schiaccio l'altro pulsante ma sembra che non succeda niente fino a quando dopo aver pigiato 3 volte il pulsante della discesa, si riaccende il led 4 e incominciano ad accendersi in sequenza ad ogni pigiata il led 3-2-1-0, nel momento il cui mi si è acceso il led 0 e rischiaccio il pulsante di discesa ecco che il sistema mi si impalla e rimane impallato al tal punto di dover agire sul reset.
Spero di aver esposto il mio problema in maniera chiara e chiedo a voi di risolvermi questo piccolo problema dando un'occhiata al mio listato che, lo dico subito, è frutto di molti copia e incolla, al momento ho poche nozioni in virtù dell'approccio non proprio longevo ad arduino.

Codice: Seleziona tutto

#define A 8 //LED +10% 
#define B 9 //LED +5%
#define C 10 //LED 230V
#define D 11 //LED -5%
#define E 12 //LED -10%
#define pulsI 13//PULSANTE INCREMENTO PERCENTUALE INGRESSO TRAFO
#define pulsD 14//PULSANTE DECREMENTO PERCENTUALE INGRESSO TRAFO

bool active = true;

int array1[] = {A, B, C, D, E};
int cont1;
int maxArray1, maxArray2;

void setup () {

  pinMode (A, OUTPUT);
  pinMode (B, OUTPUT);
  pinMode (C, OUTPUT);
  pinMode (D, OUTPUT);
  pinMode (E, OUTPUT);
  pinMode (pulsI, INPUT);
  pinMode (pulsD, INPUT);

  maxArray1 = 5;
  maxArray2 = 0;
  for (int i = 0; i < 5; i++) digitalWrite (array1[i], LOW);
  for (int i = 5; i < 0; i--) digitalWrite (array1[i], LOW);
  cont1 = 2;

  digitalWrite (array1[cont1], HIGH);

}

void loop () {

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

  if (digitalRead(pulsD) == HIGH) {
    delay(100); 
    digitalWrite(array1[cont1], LOW); //spengo led corrente
    cont1 = cont1 - 1; //incremento contatore led corrente
    if (cont1 == maxArray2) //se il contatore è al massimo
    {
     ;
    }
    digitalWrite(array1[cont1], HIGH); //accendi il nuovo led corrente
    while (digitalRead(pulsD) == HIGH); //attendi il rilascio di BUTTON1
    delay(100);
  }
  
}
Avatar utente
Pier Aisa
Amministratore
Messaggi: 2540
Iscritto il: ven 16 mar 2018, 9:43
Località: Bologna
Contatta:

Re: problema su array

Messaggio da Pier Aisa »

Direi di eliminare

for (int i = 5; i < 0; i--) digitalWrite (array1, LOW);

Questa istruzione accede fuori memoria

Poi cambierei in modo da bloccare cont1 al massimo e cont2 al minimo e gestire eventuali sforamenti
if (cont1 >= maxArray1) //se il contatore è al massimo
{
cont1 = maxArray1 ;
}

if (cont1 <= maxArray2) //se il contatore è al massimo
{
cont1 = maxArray2 ;
}
TheOrdinarySuperhero
Messaggi: 1032
Iscritto il: mar 2 ott 2018, 15:16

Re: problema su array

Messaggio da TheOrdinarySuperhero »

Otre a quello detto da Pier per limitare i valori tra 0 e 4 per accendere i led puoi usare il construtto switch case
https://www.arduino.cc/reference/en/lan ... witchcase/

switch (var) {
case 0:
// accendi led 0
break;
case1:
// accendi led 1
break;
................
default:
// accendi led 2
break;
}
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: problema su array

Messaggio da RoccoCostruzioni »

ok grazie a tutti!!!! la soluzione di Pier Aisa è stata la vincente e non avevo dubbi. grazieeee
Rispondi