input

ciao a tutti
ho un problema
sto cercando un modo per poter usare un bottone che funzioni una volta sola non che funzioni fino a che non smetto di pigiarlo
ho provato il codice di esempio che da arduino ma non funziona

// this constant won't change:
const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT_PULLUP);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button
      // wend from off to on:
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    } else {
      // if the current state is LOW then the button
      // wend from on to off:
      Serial.println("off");
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state,
  //for next time through the loop
  lastButtonState = buttonState;


  // turns on the LED every four button pushes by
  // checking the modulo of the button push counter.
  // the modulo function gives you the remainder of
  // the division of two numbers:
  if (buttonPushCounter % 4 == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

}

questo è i mio codice per capire meglio

int last=0;
int sensorVal;
void setup() {
   
  Serial.begin(9600);
   
  pinMode(53, INPUT_PULLUP);
  
}

void loop() {
  
   sensorVal = digitalRead(53); 
  if ((sensorVal == HIGH) && (last ==0)) {
   
   Serial.println("prova " + String(last)); 
   last=1;
  }
     last=0; 
}

io uso la funzione INPUT_PULLUP

ciao...diciamo che ci sei quasi...io al posto di una int per last userei boolean
imposterei last a false
verificherei che sensorVal sia HIGH e che last sia false
scriverei "prova " + String(last)
imposterei last come true
aggiungerei un altro if dove verifico se sensorVal è LOW ed all'interno di questo if assegnerei a last il valore false.

come hai fatto tu nel tuo if verifiche se val vale 0 all'interno porti last a 1 ma poi alla fine del loop riporti val a 0...che rende nuovamente vero l'if di verifica

EDIT: scusa mi sono dimenticato che tu hai impostato sensorVal come PULL_UP...quindi se premuto è LOW se non premuto è HIGH...quindi invertiti

non funziona lo ripete almeno tre volte
io voglio una volta sola

bool last=false;
int sensorVal;
void setup() {
  //start serial connection
  Serial.begin(9600);
  //configure pin2 as an input and enable the internal pull-up resistor
  pinMode(53, INPUT_PULLUP);
  
}

void loop() {
  //read the pushbutton value into a variable
   sensorVal = digitalRead(53);
  //print out the value of the pushbutton

 
  if ((sensorVal == LOW) && (last ==false)) {
  
   Serial.println("prova " + String(last)); 
    last=true;
  }
   if (sensorVal == HIGH) {  last=false;} 
}

ciao...scusa la domanda...il pulsante collega il pin 53 a GND giusto!?

se si hai problemi di bouncing...io ho provato questo e funziona (che è come il tuo):

boolean last = false;
int sensorVal;
void setup() {

  Serial.begin(9600);

  pinMode(53, INPUT_PULLUP);

}

void loop() {

  sensorVal = digitalRead(53);
  if ((sensorVal == LOW) && (last == false)) {

    Serial.println("prova " + String(last));
    last = true;
  }
  if (sensorVal == HIGH) {
    last = false;
  }
}

si lo schema elettrico è quello
ma mi fa uguale

screenshot

prova.jpg

arduino l'ho attaccato via usb al computer
il pin 53 è collegato con gnd
grazie

il problema non è software (sketch) ma è hardware...o guardi in questo LINK o cerchi in internet "debounce hardware"...oppure usi un debounce software...che, sostanzialmente, vuol dire modificare un po' lo sketch inserendo verifiche del tempo trascorso tra uno cambio stato del pulsante ed un altro...

ma ci vuole una resistenza anche se è settato come pull up?
nel disegno non serve
ho provato con un arduino nuovo e mi fa uguale

dipende dalla "qualità" del pulsante che utilizzi...diciamo che quando setti un pin come INPUT PULL_UP più che altro fissi una condizione di tensione HIGH...che, diversamente dal solo INPUT, evita che disturbi elettrici ambientali influiscano sulla lettura del valore.

per quanto riguarda i pulsanti..per esempio ... ho letto che, alcuni, tutti, utilizzano un lubrificante per lo scorrimento del contatto e che questo può fare da conduttore...creando appunto effetti di bouncing...

ho provato con due fili rigidi isolati fa uguale
cose meglio input o inputpullup?

di solito io "uso" INPUT PULL_UP appunto per evitare la cattura di disturbi.

ho provato con due fili rigidi isolati

cioè facendoli toccare tra loro nella parte sguainata!?

..e l'arco voltaico dove lo metti!?...causa appunto di bouncing...

ho provato con questo pulsante
schermato dalla plastica

con il pulsante funziona un po meglio
qualcosa per migliorare il segnale?

...ha un LED?

se sì non so cosa può comportare...anche se penso che i 4 piedini (2 del contatto e 2 del LED) siano indipendenti...o li hai collegati?

EDIT: o un debounce hardware o uno software...per quello software...prova:

boolean last = false;
int sensorVal;
unsigned long myTime;

void setup() {

  Serial.begin(9600);

  pinMode(53, INPUT_PULLUP);

}

void loop() {

  sensorVal = digitalRead(53);
  if ((sensorVal == LOW) && last == false && millis() - myTime >= 5) {
    myTime = millis();
    Serial.println("prova " + String(last));
    last = true;
  }
  if (sensorVal == HIGH) {
    last = false;
  }
}

non ho provato ad accenderli però ho visto che sono dipendenti come contatti che come plastica
poi quando li monto ci metto il termorestringente

mi sono ricordato che c'è una libreria per il debounce QUI

che dovrebbe fare?
come funziona?

non l'ho mai usata...ma da una lettura veloce filtra il cambio stato di un pin per un tot di tempo..più o meno quello che ho voluto fare con l'ultimo sketch che ti ho inviato...

ORSO2001:
per quanto riguarda i pulsanti..per esempio ... ho letto che, alcuni, tutti, utilizzano un lubrificante per lo scorrimento del contatto e che questo può fare da conduttore...creando appunto effetti di bouncing...

No, non é il lubrificante la causa del boncing.

Il bouncing deriva dal contatto meccanico del pulsante/interruttore. Quando chiude il contatto la parte mobile va a contatto con la parte fissa. La parte mobile non si posiziona subito sulla parte fissa ma saltella qualche volta. Dal lato elettrico hai 3-4 impulsi prima che il segnale é stabile.

Il modo piú semplice per evitare un riconoscimento di piú aperture/chiusure di un unico azionamento del pulsante/interruttore é mettere dopo la lettura del pulsante un delay di 5-10 mS. Spesso questo ritardo non da problemi nello sketch ma evia la letture multipla di un azionamento.

Oltre al delay() ci sono altri modi per fare il debouncing sia al lato software che al lato hardware e anche al lato costruzione del pulsante/interruttore.

Ciao Uwe