Go Down

Topic: MQTT pubblish (Read 122 times) previous topic - next topic

Cencio

salve  a tutti

devo pubblicare lo stato di un rele' che aziona una sirena, ma la funzione che ho fatto mi inonda di messaggi il server (lo vedo da MQTTlens) a me invece serve un solo messaggio per ON e uno solo per OFF. Ho provato anche con le flag ma senza riuscire.
Qualche suggerimento?
grazie a tutti, vi allego il codice.

questo e' all'inizio dello sketch
Code: [Select]
const char* switchTopic_sirena =  "openhab/in/sirena/state";
const int relay_allarme     = 0;
bool relaystate_sirena = LOW;
 


questa la funzione
Code: [Select]
void read_sirena(){
   
 digitalRead(relay_sirena);
  if  (relaystate_sirena == HIGH) {
   
    client.publish(switchTopic_sirena, "ON", true);   
  }
  else if (relaystate_sirena == LOW) {
    client.publish(switchTopic_sirena, "OFF", true);     
  }
}



gpb01

#1
Mar 21, 2019, 03:51 pm Last Edit: Mar 21, 2019, 03:51 pm by gpb01
Così ovviementre trasmette in continuazione ...
... tu devi salvare lo stato "precedente" del relè e confrontarlo con lo stato "attuale"; se sono uguali NON devi afre nulla, se sono diversi devi solo capire se è passato da HIGH a LOW o viceversa ed inviare il giusto messaggio.

Guglielmo
Search is Your friend ... or I am Your enemy !

fabpolli

Senza il codice completo si può solo ipotizare che tu richiami read_sirena nel loop, in tal caso è normale che ti incii un messaggio ad ogni ciclo di loop.
Devi usare una variabile che ti vontenga il vecchio stato di relay_sirena e inviare il messaggio solo se il valore appena letto è differente dal vecchio valore.
Peraltro, sempre supponendo, se il pin identificato da relay_sirena sei tu a pilotarlo in funzione della logica di funzionamento è perfettamente innutile andare a leggere lo stato del pin quando in altre zone probabilmente avrai fatto una
Code: [Select]

digitalWrite(relay_sirena, HIGH);

memorizzati lo stato in cui hai impostato la sirena e confrontalo con il vecchio valore (memorizzato in una variabile come indicato in precedenza) non solo ottieni un ottimizzazione della velocità d'esecuzione ma rendi il codice compatibile con tutte le schede, la digitalRead fatta su un pin settato come output è fattibile solo su alcune MCU.

Edit = Sovrapposto a gpb01

Cencio

Scusate il ritardo nella risposta, ma ho sempre poco tempo da dedicare ai miei hobbies.
Grazie per l'aiuto, adesso funziona, ho dovuto inserire anche una flag per avere la singola pubblicazione

saluti
Davide

Go Up