inviare tramite pulsante un testo una sola volta

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.

Ringrazio in anticipo per le risposte.

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
  }
}

Guglielmo

…perchè con lui sei stato buono e con me no…costringendomi a studiare anche in barca? :frowning:

vince59:
..perchè con lui sei stato buono e con me no...costringendomi a studiare anche in barca? :frowning:

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 :smiling_imp: ... quindi non ti lamentare :grin:

Guglielmo

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:

........................................
Exception (29):
epc1=0x4000e1c3 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000018 depc=0x00000000

ctx: sys 
sp: 3ffffc80 end: 3fffffb0 offset: 01a0

>>>stack>>>
3ffffe20:  40102325 3ffede98 3ffee5b0 402310d0  
............................................................

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

neon-led:
... o se invece, come penso, sia legato alla parte hardware (ho connesso ad arduino una esp8266).

SI, non è il tuo programma.

L'ESP: come lo hai connesso, come lo alimenti e che piedini usi. Metti lo schema.

Guglielmo