Contatore con pressione pulsanti breve o lunga

Ciao a tutti, mi presento, sono mikseven.
Sono entrato da pochissimo in questo mondo, con conoscenze basiche di elettronica e nessuna conoscenza di programmazione.

Tuttavia, con l’aiuto del forum, di internet e dello studio sto facendo i miei piccoli passi.

Oggi scrivo per un quesito.
Ho una arduino uno.

Devo creare un contatore che alla pressione di un pulsante incrementi un valore di 0.01. Fino a qui nessun problema.

In realtà ho la necessità di avere un incremento di 0.01 ad ogni pressione del pulsante e un incremento sempre di 0.01 ma molto piu rapido nel caso tenga premuto a lungo il pulsante.

Ho preparato questo codice, ma non ne vengo fuori, poichè il tempo che differenzia la pressione breve o lunga del pulsante interferisce anche sulla velocità di incremento.

E’ la modalità giusta per la gestione della pressione breve o lunga?

Grazie

#include <LiquidCrystal.h>
 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);           // select the pins used on the LCD panel

long prev = 0;
int buttonState = 0;  // 0 = not pressed   --- 1 = long pressed --- 2 short pressed
float value = 0;
#define button 2 
int longpresstime = 500;	

void setup(){
   lcd.begin(16, 2);               
   pinMode(button, INPUT_PULLUP);
}

void loop(){
  lcd.setCursor(0,0);             
  lcd.print(value);
  buttonState = 0;
  if(digitalRead(button) == LOW){
    prev = millis();
    buttonState = 1;
    while((millis()-prev)<=longpresstime){
      if((digitalRead(button))){
        buttonState = 2;
        break;
      }
    }
  }
  
  if(!buttonState){
    //do nothing
  }else if(buttonState == 1){
	  value = value + 0.01;
    // TODO button is pressed long
  }else if(buttonState == 2){
	  value = value + + 0.01;
  }
  
}
.

Ho modificato un po’ il tuo sketch, aumentando l’incremento superati 0.5 secondi:

#define ButtonPin     2

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

float Value = 0.0;
float Incremento = 0.0;
unsigned long Timer = 0;

void setup() {
  lcd.begin(16, 2);
  pinMode(ButtonPin, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(ButtonPin) == LOW) {
    if (Timer == 0) Timer = millis();
    if (millis() - Timer < 500) Value += 0.01;
    else Value += 0.05;
  }
  else Timer == 0;
  
  lcd.setCursor(0, 0);
  lcd.print(Value, 2);
}

mikseven: Ciao a tutti, mi presento, sono mikseven.

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: - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

Eccomi. Presentato nella sezione corretta.

Intanto grazie per il codice.
Ho modifcato qualcosa

#define ButtonPin     2

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

float Value = 0.0;
float Incremento = 0.0;
unsigned long Timer = 0;

void setup() {
  lcd.begin(16, 2);
  pinMode(ButtonPin, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(ButtonPin) == LOW) {
    if (Timer == 0) Timer = millis();
    if (millis() - Timer < 750) Value += 0.01;
    else Value += 0.10;
    delay(200);
  }
  else Timer = 0;
  
  lcd.setCursor(0, 0);
  lcd.print(Value, 2);
}

Ho modificato questo

  DA else Timer == 0; A   else Timer = 0;

Ho aggiunto un delay come antirimbalzo.

Non ho capito a cosa serve la variabile incremento.
Ci siamo quasi ma ho ancora problemi sulla pressione lunga. Quando premo il pulsante ovviamente inizia ad aggiungere 0.01 fin quando non supera il tempo impostato. Dopodichè inizia ad aggiungere 0.10.

Quello che vorrei ottenere è che appena premo il pulsante aggiungere solo una volta 0.01 e se lascio premuto dopo un determinato tempo inizi ad aggiungere 0.10 o ancora meglio ad aggiungere 0.01 ma in modo piu veloce.

Un po come il volume della TV o di un autoradio