Problema Sketch Bottone

Buongiorno!

Posto qui di seguito un mio codice che non fa quello che dovrebbe fare!
Non riesco a capire il perchè..
Quando premo il bottone dovrebbe aggiungere 1 alla variabile conta (messa per alternare la scelta dell'algoritmo) e fare la divisione.
Se il resto è 0 avvia il primo algoritmo e se è 1 avvia il secondo..
Praticamente ogni volta che premo il bottone deve cambiarmi algoritmo!
Però non lo fa e giuro che non riesco a capire il perchè!

Nel codice ho spiegato tutto. Richiedo l'aiuto degli esperti!

int Bottone = 2; // Input del Bottone  
int Faretto = 3; // Input del Bottone  
int LedArduino = 13;


// ----------------------------------------------------------------

void setup(){

Serial.begin(9600); // Apro porta seriale e setto Boud Rate a 9600 bps

pinMode(Faretto, OUTPUT); // Dichiaro Bottone come Input
pinMode(Bottone, INPUT); // Dichiaro Bottone come Input
pinMode(LedArduino, OUTPUT); // Per l'algoritmo 1

}

// ----------------------------------------------------------------

void loop(){

int ValBottone = digitalRead(Bottone);  // Leggo Valore del Bottone

int conta = 1;
int resto = 0;

if ( ValBottone == LOW ){
  
  conta = conta++;
  resto = conta % 2;
  
  Serial.println(" ### Bottone Premuto");
  
  // Faccio stampare conta per controllare.
  Serial.println(conta);
  
}

else { Serial.println(" ### Bottone Non Premuto"); }
  
  if ( resto == 0) {
 
      Serial.println("------- ALGORITMO NUMERO 1 -------");
     
      // Richiamo il primo metodo
      Algoritmo1();

    } 
  
  else {
    
      Serial.println("------- ALGORITMO NUMERO 2 -------");
    
      // Richiamo secondo metodo
      Algoritmo2();

  }

delay(100);

} 
  
  
  
// ------------------ METODO NUMERO 1 ----------------------------------------------------------------------------------

void Algoritmo1(){
  
int ValoreLuce;

ValoreLuce = analogRead(0); // Entrata analogica Numero 0

Serial.println(ValoreLuce,DEC); 

  
// ----------- ACCENSIONE LED SE E' BUIO  ----------------

if(ValoreLuce<650){
  
  Serial.println("LED SPENTO");

  digitalWrite(Faretto, HIGH);  // Accendo il faretto.

 } 
  
else {

  Serial.println("LED ACCESO");
  
  digitalWrite(Faretto, LOW); // Spengo il faretto.

  }

delay(150);

// ----------- Codice stupido per capire che è l'algoritmo 1

  digitalWrite(LedArduino, HIGH);  
  delay(800);               
  digitalWrite(LedArduino, LOW);   
  delay(800); 

}




// ------------------ METODO NUMERO 2 ----------------------------------------------------------------------------------

void Algoritmo2(){
  
int ValoreLuce;

ValoreLuce = analogRead(0); // Entrata analogica Numero 0

Serial.println(ValoreLuce,DEC); 


// ----------- ACCENSIONE LED SE E' BUIO  ----------------

if(ValoreLuce<650){
  
  Serial.println("LED SPENTO");

  digitalWrite(Faretto, HIGH);  // Accendo il faretto.

 } 
  
  
else {

  Serial.println("LED ACCESO");
  
  digitalWrite(Faretto, LOW); // Spengo il faretto.

  }


delay(150);


// -----------

Serial.println("Codice stupido dell'algoritmo 2");

}

Samuele

Intanto fai un piccol debounce del pulsantino per evitare false letture: magari il codice legge 2 pressioni per volta.
Poi togli l'else dopo la lettura del bottone, è inutile: è scontato che se il pulsante non è premuto, venga eseguito il codice sottostante.

if (digitalRead(Bottone == LOW) {
  delay(30);
  if (digitalRead(Bottone == LOW) {
    ...... codice pulsante premuto
  }
}
....... codice pulsante non premuto....

:slight_smile:
Ciao Apache93,

li problema potrebbe essere legato al fatto che inizializzi di continuo le variabili all'interno del loop

void loop(){

int ValBottone = digitalRead(Bottone); // Leggo Valore del Bottone

int conta = 1;
int resto = 0;

if ( ValBottone == LOW ){

conta = conta++;
resto = conta % 2;

Prova ad inserire
int conta = 1;
int resto = 0;
fuori dal loop principale, ad esempio dove dichiari le altre variabili all'inizio nel setup.
E poi inizializzi "int conta = 1;", che all'istruzione "conta = conta++;" il valore si porterà a 2 :wink:

Vera l'osservazione di Giuseppe, non ci avevo fatto caso. Puoi usare anche la parola chiave "static" da far precedere alla dichiarazione della variabile, in questo modo il valore di inizializzazione varrà solo la prima volta, poi manterrà il valore via via elaborato durante l'esecuzione del codice

perfetto! oggi quando arrivo a casa provo! davvero gentili :wink: non ci avevo proprio pensato..
grazie mille

samuele

Al posto di

 conta = conta++;

puoi scrivere direttamente

conta++;

è la stessa cosa. :wink:

sisi già sistemato quello! :smiley:
mi sono accorto dopo!

Perfetto ragazzi! Davvero veloci!
:smiley:

Grazie mille!

Ok funziona tutto perfettamente! una cosa però..
lui cambia algoritmo solo se durante il ciclo il bottone è premuto.. nel senso: quando lui controlla se il bottone è premuto e vede che non lo è procede con altre cose.. se io premo il bottone in questo momento ovviamente non fa niente! perchè non sta controllando quello xD c'è un modo di ovviare a questo?
Alla fine mi va bene anche così basta tenere premuto il pulsante finchè vedo che cambia algoritmo xD ma per sapere..

Un programma è un semplice insieme di comandi che servono ad eseguire la logica di funzionamento che tu hai stabilito.
Se ti serve controllare lo stato del pulsante anche DURANTE l'esecuzione di un certo algoritmo, devi inserire in quell'algoritmo il controllo del pulsante.

Ok grazie mille! :slight_smile: ora vado avanti con il progetto! Grazie mille! :slight_smile:

blink without delay è il sentiero che devi imboccare

Me ha detto.