Pages: [1]   Go Down
Author Topic: A pulsante chiuso esegui una sola volta un'azione  (Read 694 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21654
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: October 15, 2012, 06:41:00 am by gingardu » Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21654
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non per ripetermi....
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.
Logged


Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

avendo solo due stati da monitorare potresti fare anche una cosa del tipo:
Code:
if (statoprecedente=!statocorrente){

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

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

Pages: [1]   Go Up
Jump to: