singola notifica pushetta

buongiorno a tutti
dovrei fa eseguire sendToPushetta (CHANNEL, "temperatura acquario alta!"); una volta sola, all'avverarsi della condizione indicata nella variabile temp, altrimenti mi manda una notifica ad ogni ciclo del loop, ho provato a rallentare la cosa con un delay, ma non mi piace. questo il codice:

float temp;
temp = DS18B20.getTempCByIndex(0);
if 
 (temp >=33.0)
{
  Serial.println(temp);
  sendToPushetta (CHANNEL, "temperatura acquario alta!");
  digitalWrite(13, HIGH);
  delay(5000); 
}
else
{
  digitalWrite(13, LOW);
}

suggerimenti?
grazie in anticipo per l'aiuto

> Cencio: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Grazie,

Guglielmo

Dopo che avrai fatto quanto chiesto ...

... devi usare una "flag" che metti a TRUE quando hai inviato il messaggio (in modo fa ricordartelo e le volte successive, interrogando la flag, sai che non devi più inviarlo) e che metti a FALSE quando vuoi che, al prossimo giro, se si ripete la condizione, il messaggio venga di nuovo inviato.

In pratica ti serve un qualche cosa per "ricordarti" che lo hai già inviato e che è inutile che, ad ogni giro del loop(), continui ad inviarlo.

Guglielmo

Forse più che una variabile vera/falsa,
magari una unsigned long che memorizza millis(), se 0 come se fosse false, se la assegni di sicuro >0 quindi come se fosse vera. Bisogna riportarla a 0 quando passati i 5 secondi in un if quando questa variabile diversa da 0.

Nid, non credo voglia un invio ogni 5 secondi ... da quanto ho capito lo ha fatto così solo per non essere bombardato da notifiche push (... e riceverne una ogni 5 sec.), ma credo che vorrebbe una sola notifica al momento del superamento della temperatura e ... magari, un altra al momento del rientro nella norma :wink:

Del resto dice:

Cencio:
... dovrei fa eseguire sendToPushetta (CHANNEL, "temperatura acquario alta!"); una volta sola, all'avverarsi della condizione indicata nella variabile temp

Guglielmo

Ok, quindi invia una volta sola e poi la rimetteresti a false quando la temperatura è tornata okay

credo che Guglielmo abbia centrato il problema.

Mi studio la cosa e poi vi aggiorno, casomai dovessi avere qualche altro dubbio nell'esecuzione approfitto di nuovo del vostro aiuto.

grazie

Davide

ricapitolando

sono riuscito nell’intento, adesso la notifica e’ una soltanto come volevo.

Una cosa pero’ non capisco, ed e’ tutto il pomeriggio che mi ci sbuccio la cervice, e cioè’, il tutto funziona solamente se ricarico la pagina web dove invia la temperatura, data e ora, in caso contrario se la sonda rileva che sale o scende la temperatura prefissata, non accade niente, non notifica ne accende il rele’, se pero’ ricarico la pagina aggiorna i dati e esegue le istruzioni (notifica + rele’). Forse sarà la stanchezza ma non riesco a vedere il problema, un aiuto?
grazie
Davide

#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <DS1302.h>

char APIKEY[] = "XXXXXXXXXXXXXXXXXX"; 
char CHANNEL[] = "temperatura acquario";                              
char serverName[] = "api.pushetta.com";
boolean lastConnected = false;
//int status = WL_IDLE_STATUS;
const char* ssid = "XXXXXXXXXXXXX";
const char* pass = "XXXXXXXXXXXXX";

boolean flag =true;

IPAddress ip(XXX,XXX,X,X); 
IPAddress gate(XXX, XXX,X,X); 
IPAddress subnet(255,255,255,0);
WiFiServer server(80);  

#define ONE_WIRE_BUS 5   // Data wire is plugged into pin D1 on the ESP8266 12-E - GPIO 5
OneWire oneWire(ONE_WIRE_BUS);   // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) 
DallasTemperature DS18B20(&oneWire);
char temperatureCString[6];

DS1302 rtc(2, 4, 12);
Time t;



void setup() {

Serial.begin(115200);
delay(10);


 
// Connecting to WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.config(ip,gate,subnet);
WiFi.begin(ssid, pass);  
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
 
// Starting the web server
server.begin();
Serial.println("Web server running... Waiting to connect.....");
delay(5000);
Serial.println(WiFi.localIP());

pinMode(14, OUTPUT); //rele pompa
pinMode(13, OUTPUT); //rele ventola
DS18B20.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement

rtc.halt(false);
rtc.writeProtect(false);
rtc.setDOW(SUNDAY);
rtc.setTime(16, 59, 40);
rtc.setDate(9, 7, 2017);
}

void getTemperature() {
  float tempC;

  do {
    DS18B20.requestTemperatures(); 
    tempC = DS18B20.getTempCByIndex(0);
    dtostrf(tempC, 2, 2, temperatureCString);    
    delay(100);
    
  } while (tempC == 85.0 || tempC == (-127.0));

  
  }
    

void loop() {

  float temp;
temp = DS18B20.getTempCByIndex(0);

  if ((temp > 30.0) && ( flag == true))
{
    sendToPushetta (CHANNEL, "temperatura acquario alta!");
    digitalWrite(13, HIGH);
    flag = false;                
}
  if ((temp < 30.0) && ( flag == false))
{
  digitalWrite(13, LOW);
  flag = true;
}
  
WiFiClient client = server.available();  
  
if (client) {
    Serial.println("New client");
    boolean blank_line = true;
    while (client.connected()) {
if (client.available()) {
        char c = client.read();
if (c == '\n' && blank_line) {
            getTemperature();
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();                   
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<head></head><body><h1>GESTIONE ACQUARIO</h1><h3>Temperatura in gradi: ");
            client.println(temperatureCString);            
            client.println("data: ");
            client.println(rtc.getDOWStr());
            client.println(" ");
            client.println(rtc.getDateStr());
            client.println(" ");
            client.println("ora: ");
            client.println(rtc.getTimeStr());              
            break;
        }
if (c == '\n') {
          // when starts reading a new line
          blank_line = true;
        }
else if (c != '\r') {
          // when finds a character on the current line
          blank_line = false;
        }
      }
    }  
    // closing the client connection
    delay(1);
    client.stop();
    Serial.println("Client disconnected.");
  }
  
t = rtc.getTime();

  if (t.hour >=13 && t.hour <= 15 || t.hour >=20 && t.hour <= 22)
     {
      digitalWrite(14, HIGH);     
      //delay(1000);
      //digitalWrite(14, LOW);
    }
else
    {
      digitalWrite(14, LOW);
    }

    

}

   
void sendToPushetta(char channel[], String text) {
  WiFiClient client;
  client.stop();

  if (client.connect(serverName, 80))
  {
    client.print("POST /api/pushes/");
    client.print(channel);
    client.println("/ HTTP/1.1");
    client.print("Host: ");
    client.println(serverName);
    client.print("Authorization: Token ");
    client.println(APIKEY);
    client.println("Content-Type: application/json");
    client.print("Content-Length: ");
    client.println(text.length() + 46);
    client.println();
    client.print("{ \"body\" : \"");
    client.print(text);
    client.println("\", \"message_type\" : \"text/plain\" }");
    client.println();
  }
}

Penso che sia il “while (client.connected()) {”
nella parte client, se sei connesso stai girando in quel ciclo e non viene più eseguito il resto

pero' da seriale mi dice "client disconnected"
quindi dovrei essere uscito dal ciclo, invece la sequenza e':

  • alzo la temperatura della sonda (non succede niente)
  • ricarico pagina web (new client)
  • stampa a video i dati (temperatura data ora)
  • client disconnected
  • poi si riconnette da solo infatti a seriale vedo: new client
  • esegue la notifica e attiva il rele
  • e da seriale: client disconnected

quando la temperatura scende, e quindi dovrebbe staccare il rele in automatico, non lo fa se non ricarico un altra volta la pagina

ho fatto anche un altra prova, ho eliminato tutta la parte client web, ma il problema rimane

risolto! :slight_smile:

mancava la richiesta della temperatura

DS18B20.requestTemperatures();

nel loop prima della struttura che abilita le istruzioni di notifica e accensione rele, quindi non aggiornava mai la variabile TEMP e si inchiodava li'

Mentre senza, la prendeva quando il client si connetteva, ecco perche' funzionava solo su richiesta del client

grazie a tutti per l'aiuto

Davide