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);
}
}
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;}
}
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...
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...
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.