Comandare bottone tramite potenziometro

Ciao ragazzi, mi chiamo Ivan, sto cercando di realizzare un cambio elettronico per la moto tramite Arduino, e fin'ora sono riuscito a scrivere lo sketch. Ora volevo implementarlo aggiungendo il fatto che il programma iniziasse a partire dopo che il potenziometro (uso il potenziometro per il momento, poi utilizzerò i il contagiri della moto) raggiunge un determinato valore, e poi mi dia il consenso per far funzionare il bottone che fa partire il resto del circuito, mentre al disotto di quel valore anche se schiaccio il bottone non deve succedere nulla.
Spero di essere spiegato bene, e mi scuso se per caso ho creato un post doppio ma non sono riuscito a trovare nulla.
In attesa di vostre risposte.
Grazie mille.
Ivan :slight_smile:

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Mi sono già presentato.
Comunque ho provato a guardare i link che mi hai postato ma non sono riuscito a capire come scrivere il programma.
Vi può essere di aiuto se carico lo sketch che ho fatto fin'ora?

walluga:
Vi può essere di aiuto se carico lo sketch che ho fatto fin'ora?

Direi che è fondamentale che tu metti sia lo schema di cosa stai realizzando che il codice che sino ad ora hai scritto (... mi raccomando, come da regolamento, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).

Partendo da quello che hai già fatto potremo suggerirti come andare avanti :wink:

Guglielmo

int led = 9;
const int  bottone = 9;
int lettura;
int stato = 0;



void setup () {
  pinMode (led, OUTPUT);
  pinMode (bottone, INPUT);
}

void loop () {
  
  lettura = digitalRead (bottone); 
   
  if( lettura == HIGH)
  {
    if(stato == 0)
    {
       stato = 1;
       digitalWrite(led,HIGH);
       delay(20);
       digitalWrite (led, LOW);
       delay(500);
     }
  }
  else
  {
     stato = 0;
  }  
    
  delay (10);
  
  
}

Spero di aver fatto giusto.

Allora, prima di passare ad aggiungere la gestione del potenziometro ... hai pensato al problema del "debouncing" (cerca con Google) sul bottone ?

Perché un bottone "teorico" si comporta come credi tu, ma un bottone "reale" ha tutt'altro comportamento ... nel momento che lo premi, quello che accade realmente è, più o meno, questo:

... ovvero, ricevi una "raffica" di pressioni e rilasci molto ravvicinati tra loro ... con le conseguenze del caso.

Esistono tecniche "software" e tecniche "hardware" per ovviare al problema ... tu cosa intendi fare ?

Guglielmo

Io per quel problema ho messo un delay di 500 e così pensavo di ovviare a quel problema e facendo delle prove sulla breadboard mi sembrava di essere a posto.

... è la tecnica software ... ed è un po' più complessa di come l'hai fatta tu :wink:

Ti rammento comunque che la delay() è un istruzione "bloccante" (... ovvero, per il tempo della delay(), il programma si ferma) e ... ci sono casi in cui questo non è un problema, altri invece in cui NON la puoi usare.

Comunque, visto cosa cerchi di realizzare, mi sembra molto più pulita ed affidabile la soluzione hardware ...
... prova a guardare gli allegati, ci sono varie configurazioni (quella nel secondo schema è la più affidabile in assoluto).

Guglielmo

debouncing_hw.pdf (22.8 KB)

Debouncer SetReset.pdf (14.8 KB)

Ti ringrazio del contributo Guglielmo e dell'interessamento ma a me serve poter comandare il circuito dopo un certo valore dato dal potenziometro e non riesco a capire come le soluzioni che mi hai mandato riescano ad aiutarmi (forse per una mancanza mia).

Anche perché da quello che ho capito tu stai cercando di risolvere un problema hardware e avevo pensato per evitare attivazioni involontarie del circuito di utilizzare una cella di carico, come ho visto usare nei quick shift professionali, quindi ti chiedo e vi chiedo gentilmente di rispondere al mio quesito iniziale, ovvero come poter comandare il pulsante dopo che il mio potenziometro (dopo contagiri) abbia raggiunto un certo valore.

Grazie della collaborazione.
Ivan :slight_smile: :slight_smile:

... quello te lo stavo lasciando per dopo ... quando l'hardware del bottone era a posto :smiley:

Comunque, non mi sembra difficile ...
... colleghi il potenziometro con i capi al +Vcc ed al GND ed il centrale ad un ingresso analogico; leggi il valore analogico; se il valore è al di sopra/(sotto) di un valore prefissato effettui la lettura del bottone, altrimenti non lo leggi.

Insomma una analogRead() seguita da un if ...

Guglielmo

... dubbio, ma una volta che il potenziometro ha raggiunto un certo valore e abilita il bottone, se poi torna indietro e scende sotto il valore, il bottone deve continuare a funzionare o non deve funzionare più fino a quando non si risupera il certo valore ? ? ?

Guglielmo

Non ci avevo pensato! Quando il valore del potenziometro cala sotto la soglia prefissata il circuito per tornare a funzionare dovrà attendere fino a quando il valore analogico non ritorna al valore maggiore o uguale a quello prefissato.

walluga:
Quando il valore del potenziometro cala sotto la soglia prefissata il circuito per tornare a funzionare dovrà attendere fino a quando il valore analogico non ritorna al valore maggiore o uguale a quello prefissato.

... ok, quindi è facile ... come lo schemino che ti ho scritto :smiley:

Guglielmo

Scusami Guglielmo, ma i potresti scrivere te quella riga di comando che dicevi?
Credo di essere diventato stupido tutto in una volta!
Non riesco a capire come scriverla e dove.

Grazie mille per la tua pazienza!

Immagino che il test lo farai nel loop() quindi ...

....
....
valorePotenziometro = analogRead(pinPotenziometro);
if (valorePotenziometro > limitePotenziometro) {
  funzione_che_legge_il_bottone();
}
....
....

e nella funzione_che_legge_il_bottone() controlli se il bottone è premuto o meno. Come vedi il bottone lo controlli SOLO se il valore del potenziometro supera il valore limite da te deciso.

Spero di aver risposto alla tua domanda ... ::slight_smile:

Guglielmo

P.S.: Guarda nel reference la analogRead()

Ciao Guglielmo, sono ancora qui a romperti le scatole :sweat_smile:
ho provato a riscrivere il programma ma non mi funziona.
Questo è il programma:

int rele = 10;
const int  bottone = 2;
int lettura;
int stato = 0;



void setup () {
  pinMode (rele, OUTPUT);
  pinMode (bottone, INPUT);
  Serial.begin(9600);
}

void loop () {

  int  sensoValue= analogRead(A0);
    if (542 > 1023) {
   lettura = digitalRead (bottone);
}
    
  if( lettura == HIGH)
  {
    if(stato == 0)
    {
       stato = 1;
       digitalWrite(rele,HIGH);
       delay(20);
       digitalWrite (rele,LOW);
       delay(500);
     }
  }
  else
  {
     stato = 0;
  }  
    
  delay (10);
  
  
}

Emmm ...
... quando credi che questa condizione : "if (542 > 1023)" possa verificarsi ? :o :o :o Perché stai chiedendoti SE 542 è MAGGIORE di 1023 ... e dubito che questa cosa possa mai avverarsi :wink:

Magari, nel IF dovrai confrontare il valore che ti ritorna la analogRead(), ovvero sensoValue ... ::slight_smile:

Guglielmo

Ma con valore potenziometro cosa intendi?

gpb01:
... Perché stai chiedendoti SE 542 è MAGGIORE di 1023 ... e dubito che questa cosa possa mai avverarsi :wink:
...

Certo che e' maggiore ... 5+4+2=11, 1+0+2+3=6 ... :stuck_out_tongue: :smiley:

Scherzi a parte ... wallunga, per fare un confronto devi usare la variabile che contiene il valore che vuoi confrontare ... ad esempio, se leggi un potenziometro da un'ingresso analogico e metti il valore letto in ValPot, poi dovrai ovviamente fare if(ValPot > tuovalore) ... occhio anche che il DAC di Arduion, essendo a 10 bit, ti puo dare valori che vanno da 0 a 1023, quindi se non fai un mapping per cambiare le scale, il valore non potra' mai essere maggiore di 1023, al massimo uguale :wink: