Pages: [1]   Go Down
Author Topic: Problema Sketch Bottone  (Read 514 times)
0 Members and 1 Guest are viewing this topic.
Belluno
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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!


Code:
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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21669
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

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


Torino (Italy)
Offline Offline
Sr. Member
****
Karma: 0
Posts: 264
Fare insegna a fare. To make teaches at to make.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley
Ciao Apache93,

li problema potrebbe essere legato al fatto che inizializzi di continuo le variabili all'interno del loop
Quote
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 smiley-wink
Logged

Un saluto a tutta la comunità.
Giuseppe G.

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21669
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Belluno
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

perfetto! oggi quando arrivo a casa provo! davvero gentili ;-) non ci avevo proprio pensato..
grazie mille

samuele
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 104
Posts: 6626
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Al posto di
Code:
conta = conta++;

puoi scrivere direttamente
Code:
conta++;

è la stessa cosa.  smiley-wink
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Belluno
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

sisi già sistemato quello! smiley-grin
mi sono accorto dopo!

Perfetto ragazzi! Davvero veloci!
smiley-grin

Grazie mille!
Logged

Belluno
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21669
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Belluno
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok grazie mille! smiley ora vado avanti con il progetto! Grazie mille! smiley
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

blink without delay è il sentiero che devi imboccare

Me ha detto.
Logged

Pages: [1]   Go Up
Jump to: