Buongiorno, il problema che pongo è probabilmente banale ma con le mie attuali conoscenze non sono ancora in grado di risolverlo.
In pratica con un pulsante accendo un led e quando questo è acceso dovrebbe inviare ad un pc una semplice stringa di testo.
Il tutto funziona solo che la stringa di testo viene inviata continuamente (fintanto il led è acceso) mentre io desidero che vengo inviata una sola volta.
Ad un ulteriore pressione del pulsante, il led cambia di stato e dovrebbe inviare una diversa stringa di testo, anche in questo caso una sola volta.
int buttonState = 0;
int val=0;
int old_val=0;
int led=0;
void setup() {
Serial.begin(115200);
pinMode(BUTTON, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
val = digitalRead(BUTTON);
if ((val==HIGH) && (old_val==LOW)) {
buttonState=1-buttonState;
delay(10);
}
old_val=val;
if (buttonState==1) {
digitalWrite(LED, HIGH);
Serial.println("led on");
delay(1000);
}
else {
digitalWrite(LED, LOW);
Serial.println("led off");
delay(500);
}
}
Ho guardato alcuni vecchi topic:
che mi sembravano simili alla mia esigenza, ma purtroppo nonostante diversi tentativi non sono riuscito ad ottenere il risultato desiderato.
leggi attentamente il mio post simulazione pressione tasto e risolverai. Ci sono molti modi. Io ci sono riuscito, non senza qualche difficioltà, con i flag...ovvero delle variabili secondo i consigli di Etemanki e Gugliemo
Un modo molto semplice per fare una cosa UNA sola volta è ... condizionarla ad una "flag", esempio ...
boolean miaFlag = true;
...
...
...
void loop() {
...
if (miaFlag) { // quello che è in questo IF viene eseguito solo se miaFlag è true
...
...
miaFlag = false; // da questo momento NON viene più eseguito se non si mette di nuovo miaFlag a true
}
}
vince59:
..perchè con lui sei stato buono e con me no...costringendomi a studiare anche in barca?
Veramente ho scritto a lui esattamete le stesse cose che ho scritto a te, anzi, anche meno ... rileggiti i miei post ... sia io che Etem ti abbiamo fatto fin troppi esempi ... quindi non ti lamentare
Intanto grazie per le rapidissime risposte.
Ho aspettato solo ora a scrivere perchè prima ho voluto fare una serie di prove.
Ho letto il lungo topic indicatomi da vince59 e provato a seguire le indicazioni di Guglielmo.
Ho modificato lo sketch nel seguente modo:
int buttonState = 0;
int val=0;
int old_val=0;
boolean flag = true;
void setup() {
Serial.begin(115200);
pinMode(BUTTON, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
val = digitalRead(BUTTON);
if ((val==HIGH) && (old_val==LOW)) {
buttonState=1-buttonState;
delay(10);
}
old_val=val;
if (buttonState==1) {
digitalWrite(LED, HIGH);
if (flag) {
Serial.println("led on");
delay(500);
flag = false;
}
else {
digitalWrite(LED, LOW);
Serial.println("led off");
delay(500);
}
}
Sul serial monitor è apparso subito la stringa "led off" e dopo aver premuto il bottone è uscita la stringa "led on" esattamente solo una volta come desideravo.
Però dopo una ventina di secondi sul serial monitor ho letto quanto segue:
Desideravo semplicemente chiedere se l'errore può essere dovuto al codice scritto in maniera errata o se invece, come penso, sia legato alla parte hardware (ho connesso ad arduino una esp8266).
In quest'ultimo caso andrò a fare ricerche diverse.
Mille grazie