A pulsante chiuso esegui una sola volta un'azione

Mi stò disperando a far eseguire all'Arduino quanto segue:

-Ho scritto uno sketch il quale chiaramente deriva dai miei precedenti post il quale prevede Arduino1 con Ethernet shield a bordo
-All'Arduino sono collegati diversi sensori di temperatura più su 3 pin digitali controllo lo stato di alcune apparecchiature...
-Arduino 1 provvede a intervalli di 3 minuti a mandare lo stato dei pin dichiarati ( sono 4 pin analogici e 3 digitali ) al sito Google spreadsheet o meglio Google drive e il tutto ad oggi funziona a meraviglia...

Ora volevo aggiungere che quando mi si accende la caldaia(opportunamente collegata su un digitalPin) in quel preciso momento mi segnalasse la variazione di stato del Pin senza aspettare la routine dei tre minuti e che lo facesse inviando UNA SOLA VOLTA un testo del tipo "acceso" per poi rimandare una segnalazione allo spegnimento della caldaia stessa con altro testo "spento" ma putroppo il mio ARDUINO1 all'Accensione della caldaia mi manda in CONTINUAZIONE il testo "acceso" in quanto il ciclo loop si ripete all'infinito e pertanto ho problemi a fermarlo per inviare una sola stringa...

ESEMPIO :

....if (digitalPin = HIGH) ...
client.Print "acceso" etc..etc

else ...etc..etc come faccio nel codice a scrivere che mi deve mandare una sola volta la stringa "acceso" anche se il pin rimane a livello HIGH per diversi minuti ???
e di conseguenza la stessa al contrario quando il pin torna a riposo a livello LOW ???

Grazie e spero nel vostro aiuto e di essermi fatto capire...

Usa 1 variabile di stato in cui memorizzi lo stato della lettura del pin. All'avvio dello sketch, salvi la lettura dello stato del pin.
Ogni volta che cambia lo stato (passi da HIGH a LOW o viceversa), spedisci la lettura e salvi lo stato. In questo modo, al successivo controllo, se vedi che lo stato è uguale al precedente non spedisci nulla.

pietro78:
Mi stò disperando a far eseguire all'Arduino quanto segue:

-Ho scritto uno sketch il quale chiaramente deriva dai miei precedenti post il quale prevede Arduino1 con Ethernet shield a bordo
-All'Arduino sono collegati diversi sensori di temperatura più su 3 pin digitali controllo lo stato di alcune apparecchiature...
-Arduino 1 provvede a intervalli di 3 minuti a mandare lo stato dei pin dichiarati ( sono 4 pin analogici e 3 digitali ) al sito Google spreadsheet o meglio Google drive e il tutto ad oggi funziona a meraviglia...

Ora volevo aggiungere che quando mi si accende la caldaia(opportunamente collegata su un digitalPin) in quel preciso momento mi segnalasse la variazione di stato del Pin senza aspettare la routine dei tre minuti e che lo facesse inviando UNA SOLA VOLTA un testo del tipo "acceso" per poi rimandare una segnalazione allo spegnimento della caldaia stessa con altro testo "spento" ma putroppo il mio ARDUINO1 all'Accensione della caldaia mi manda in CONTINUAZIONE il testo "acceso" in quanto il ciclo loop si ripete all'infinito e pertanto ho problemi a fermarlo per inviare una sola stringa...

ESEMPIO :

....if (digitalPin = HIGH) ...
client.Print "acceso" etc..etc

else ...etc..etc come faccio nel codice a scrivere che mi deve mandare una sola volta la stringa "acceso" anche se il pin rimane a livello HIGH per diversi minuti ???
e di conseguenza la stessa al contrario quando il pin torna a riposo a livello LOW ???

Grazie e spero nel vostro aiuto e di essermi fatto capire...

devi dare qualche informazione in piu

se e spenta dà sempre il messaggio spenta (stesso fastidio)
ogni quanto ti andrebbe bene che il messaggio si ripete es (60 secondi)

Per gingardu...ora cerco di essere molto più chiaro :

Ho scritto per il mio arduino un semplice sketch il quale ripeto si connette tramite ethernet shield al sito google spreadsheet e con un form compilato a dovere riesco a mandare dei dati su label di un foglio tipo formato excel ...

Pertanto ad esempio :

Invio a tempo ( ogni 3 minuti ) Colonna 1 = Temperatura esterna = "25 C Invio a tempo ( ogni 3 minuti ) Colonna 2 = Temperatura interna caldaia = "30 C" etc etc
Invio a seguito di evento Colonna 5 = Stato Caldaia = "acceso"

A questo punto è chiaro che se la caldaia si accende il sistema mi deve mandare una sola volta la stringa dati "accesa" in modo tale che io posso sapere in quale data e ora è accaduto l'evento....

Quando la caldaia si spegne dovrà succedere la stessa cosa ovvero al fronte di discesa dello stato pin collegato allo caldaia l'Arduino mi manda sempre una sola volta la stringa dati "spenta"...

Sembra tutto facile ma almeno per me al momento sembra insormontabile...spero adesso di essermi spiegato meglio e mi scuso se prima di adesso il post non era chiaro a tutti...Aspetto le vostre brillanti soluzioni...grazie...

spero di aver compreso;

ti faccio un esempio se l'invio dati puo essere simile a un Serial print che per caldaia accesa o spenta hai un pin (11) che va HIGH(accesa) o LOW (spenta) (ovvio che poi tu modifichi in pin 11 con il corretto, e la scritta del serial print con quella che hai gia)

byte mela;

void setup () {
if ( digitalRead (11)==HIGH) mela=1;
if ( digitalRead (11)==LOW) mela=0;
}

void loop()

{
if ( digitalRead (11)==HIGH && mela==1) mela=0, Serial.println(" la caldaia è accesa");

if ( digitalRead (11)== LOW && mela==0) mela=1, Serial.println(" la caldaia è spenta");
}

come vedi in questo caso puo essere stampato solo se 2 condizioni assieme sono vere
(attenzione a non confondere un = o 2 ==)

quando mela è uguale a 1 e il pi 11 è HIGH viene stampato la caldaia è accesa e allo stesso tempo viene portato mela a zero ,
al prossimo ciclo non puo piu stampare (" la caldaia è accesa"); perche mela è uguale a zero,

l'unico modo per portare mela a 1 e che si spegne la caldaia (pin 11 va LOW) a questo punto visto che mela era zero, e il pin 11 LOW viene stampato la caldaia è spenta; e mela viene portato a 1

il ciclo si ripete e stampa solo una volta qualdo il pin 11 passa da alto a basso o viceversa

ps se poi non ho afferrato prova a chiarire meglio

Non per ripetermi....

leo72:
Usa 1 variabile di stato in cui memorizzi lo stato della lettura del pin. All'avvio dello sketch, salvi la lettura dello stato del pin.
Ogni volta che cambia lo stato (passi da HIGH a LOW o viceversa), spedisci la lettura e salvi lo stato. In questo modo, al successivo controllo, se vedi che lo stato è uguale al precedente non spedisci nulla.

avendo solo due stati da monitorare potresti fare anche una cosa del tipo:

if (statoprecedente=!statocorrente){

Serial.print(statocorrente);
statoprecedente=statocorrente;
}

questa stampa solo una volta e solo quando lo stato cambia da acceso o spento