Temperature overflow to send email does not work

I would like to receive an email when the temperature is exceeded. Unfortunately, this does not work, I do not get an email though temperature is higher than indicated. How can I fix this? Thank you

and another question, how can you show only one decimal place and not 3
So instead of 31.390 only 31.3?

PS: Display, Thingspeak, Blynk everything works. Just not Email. Use a local server.
Thingspeak data is older

#include <Wire.h>               // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <SPI.h>                // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <BlynkSimpleEsp8266.h> // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#define BLYNK_PRINT Serial      // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <Adafruit_BME280.h>    // librarie https://github.com/adafruit/Adafruit_BME280_Library
#include <ESP8266WiFi.h>        // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <ThingSpeak.h>         // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <Adafruit_Sensor.h>    // librarie Adafruit_Unified_Sensor  über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <LiquidCrystal_I2C.h>  // Library https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library 
#include <OneWire.h>            // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <DallasTemperature.h>  // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#define ONE_WIRE_BUS D6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

unsigned long myChannelNumber =  XXXXX;
const char * myWriteAPIKey = "XXXXXXXXXX";
const char* ssid = "XXXXXXXXXX";
const char* password = "XXXXXXXXXX";
char auth[] = "XXXXXXXXXXXXXXXXXXX";
const char* server = "api.thingspeak.com";
WiFiClient client;
LiquidCrystal_I2C lcd(0x27,20,4);  // Stellen Sie die LCD-I2C-Adresse ein, in diesem Fall 0x3F - Wenn Sie sie nicht kennen, verwenden Sie das I2C-Scanskript. Vergessen Sie nicht, die E / A-Pins nach Wire.begin (x, y) festzulegen.
float h, t, p, pin, dp;
Adafruit_BME280 bme; // I2C
BlynkTimer timer;

float temp = 0;
float Nachricht = 0;
float EMail = 0;

  

void setup() {
  Wire.begin(4, 5);
  sensors.begin();                          // Schalte Sensor (in diesen fall DS18B20) ein
  
  Serial.begin(115200);
  lcd.begin();
  WiFi.begin(ssid, password);
  ThingSpeak.begin(client);

  Serial.println();
  Serial.println();
  Serial.print("Verbunden mit ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi verbunden");

  if (!bme.begin()) {
    Serial.println("Es konnte kein gültiger BME280-Sensor gefunden werden, Verdrahtung prüfen!");
    while (1);
  }
  
//***Blynk starten
  //Blynk.begin(auth, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
  Blynk.begin(auth, ssid, password, IPAddress(192,168,0,19), 8080);
  Blynk.notify("Device started");
   // Richten Sie eine Funktion ein, die jede Minute aufgerufen werden soll
  timer.setInterval(1000L, sendTemps);

     lcd.setCursor(1,0);
     lcd.print("Wetterstation V1.0");
     lcd.setCursor(0,1);
     lcd.print("Temp. Luftf. Luftd.");
     lcd.setCursor(6,2);
     lcd.print("Waschhaus");
     lcd.setCursor(1,3);
     lcd.print("Lese Sensoren aus");
    
     lcd.backlight();
     delay(5000);
     
     lcd.noBacklight();
     delay(1000);

     lcd.backlight();     // finish with backlight on
     
}
void sendTemps()
{
    sensors.requestTemperatures();
    temp = sensors.getTempCByIndex(0);
    Serial.println(String("Temperatur=")+bme.readTemperature()+ String(" C"));
    Blynk.virtualWrite(V4, temp);
    Blynk.virtualWrite(V5, bme.readTemperature());
    Blynk.virtualWrite(V6, bme.readHumidity());
    Blynk.virtualWrite(V7, (bme.readPressure()/100));
}

void loop(){
    Blynk.run();
    timer.run();
    
  t = bme.readTemperature();
  p = bme.readPressure()/100.0F;
  h = bme.readHumidity();
  dp = t-19,4*(100,0-h);
  pin = 0.225*p;
        
  float Luftdruck = p;
 // float temp;
  
  
//  Serial.print("Heizk.Temperatur =    ");       // zwischen den " " kann ein beliebiger Name verwendet werden
//  Serial.print(sensors.getTempCByIndex(0),1);   // auslesen der Sensordaten. Wenn °C hinter der Temperatur stehen soll, dann muss "print" verwendet werden
  Serial.println ("  °C");
  Serial.print("Temperatur       =   ");
  Serial.print(t);
  Serial.println ("  °C");
  Serial.print("Luftfeuchtigkeit =   ");
  Serial.print(h);
  Serial.println ("   %");
     
  Serial.print("Luftdruck        =   ");
  Serial.print(p,1);
  Serial.println (" hPA");
  Serial.print("Höhe             =   ");
  Serial.print(pin);
  Serial.println ("  m");
  Serial.print("Taupunkt         =   ");
  Serial.print(dp);
  Serial.println ("  °C");
  
  Serial.println("sende Daten an Thingspeak");
  ThingSpeak.setField(1, t);
  ThingSpeak.setField(2, p);
  ThingSpeak.setField(3, h);
  ThingSpeak.setField(4, dp);
  ThingSpeak.setField(5, temp);
  ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  delay(20000);


     lcd.clear();                              // Display löschen
     delay (500);
     lcd.setCursor(5, 0);                       // Anfang auf Stelle 5, Zeile 1 setzen
     lcd.print("Waschhaus");                  // Wassertemp. auf LCD ausgeben
   //  lcd.setCursor(12, 0);                      // Anfang auf Stelle 12, Zeile 1 setzen
   //  lcd.print(sensors.getTempCByIndex(0),1);   // Wert aus "DS18B20" Wassertemperatur (sensors.getTempCByIndex(0),1 
   //  lcd.setCursor(17, 0);                      // Anfang auf Stelle 17, Zeile 1 setzen
   //  lcd.print("\337C");                        // °C (mit"\337" wird das Gradzeichen dargestellt)auf LCD ausgeben 

     lcd.setCursor(0, 1);                       // Anfang auf Stelle 0, Zeile 2 setzen
     lcd.print("Temperatur");                   // Temperatur  auf LCD ausgeben
     lcd.setCursor(12, 1);                      // Anfang auf Stelle 12, Zeile 2 setzen
     lcd.print(t,1);                            // Wert aus "t" ausgeben (Temperatur), 1 ist eine Stelle hinter dem Komma
     lcd.setCursor(17, 1);                      // Anfang auf Stelle 17, Zeile 2 setzen
     lcd.print("\337C");                        // °C (mit"\337" wird das Gradzeichen dargestellt)auf LCD ausgeben
    
     lcd.setCursor(0, 2);                       // Anfang auf Stelle 0, Zeile 3 setzen
     lcd.print("Luftfeuchte");                  // Luftfeuchte auf LCD ausgeben
     lcd.setCursor(12, 2);                      // Anfang auf Stelle 12, Zeile 3 setzen
     lcd.print(h,1);                            // Wert aus "h" ausgeben (Luftfeuchtigkeit), 1 ist eine Stelle hinter dem Komma
     lcd.setCursor(18, 2);                      // Anfang auf Stelle 18, Zeile 3 setzen
     lcd.print("%");                            // % auf LCD ausgeben

     lcd.setCursor(0, 3);                       // Anfang auf Stelle 0, Zeile 4 setzen
     lcd.print("Luftdruck");                    // Luftdruck auf LCD ausgeben
     lcd.setCursor(10, 3);                      // Anfang auf Stelle 10, Zeile 4 setzen
     if (p < 1000) lcd.print(" ");              // ein Leerzeichen ausgeben wenn Luftdruck unter 1000 ist
     lcd.print(p,1);                            // Wert aus "p" ausgeben (Luftdruck)(p,1 ist eine Stelle hinter den Komma
     lcd.setCursor(17, 3);                      // Anfang auf Stelle 17, Zeile 4 setzen
     lcd.print("hPa");                          // hPa auf LCD ausgeben

     if ( (bme.readTemperature() > 29 ) && (millis() > Nachricht+3000 ) )
 {
  Nachricht = millis();
  Blynk.notify(String("Warnung ")+bme.readTemperature() + String("C"));
 }
 
 
 if ( (bme.readTemperature() > 29 ) && (millis() > EMail+3000 ) )
 {
  EMail = millis();
  Blynk.email("XXXXXXX@gmail.com","Blynk",String("Warnung Temperatur gestiegen ")+bme.readTemperature() + String("°C"));
 }
     
}

XXXXXXXX are correct data
how can you attach pictures?

Wow, you should win a prize for that void loop!
Read this:

And research what the limit is on the frequency of emails with Blynk.

Of course, you may also have an issue with email on either your local server setup or your ISP, but a simple sketch would test that.

Pete.

1 Like

ok, email is not working. Notification goes though.

But to my other question. How can I show only one decimal place in Blynk?

So not 31,390, but only 31.0?
Please a sample code, thank you

@Pete
but I got her email

Well, if you wanted 31.390 to display to two decimal places (31.3 or 31.4 depending on how it works) then the easiest way is to change the pin label on the widget, like this:
/pin.#/°C

If you want it to read 31.0 when the actual temperature is 31.39 then turn it into an integer in your code.

Pete.

Thank you, that worked

short feedback. With this sketch now the email notification works.

Email Widget and Eventor Widget added in the Blynkapp. Then enter email address and create new event.

Many thanks

#include <Wire.h>               // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <SPI.h>                // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <BlynkSimpleEsp8266.h> // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#define BLYNK_PRINT Serial      // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <ESP8266WiFi.h>        // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <ThingSpeak.h>         // über > Sketch > Bibliothek einbinden > Bibliotheken verwalten  einbinden
#include <LiquidCrystal_I2C.h>  // Library https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library 
#include <Bme280BoschWrapper.h>  // Library https://github.com/janw-cz/JWA_BME280
Bme280BoschWrapper bme280(true);
#define BLYNK_MAX_SENDBYTES 1000
unsigned long myChannelNumber = XXXXXXXXXX;
const char * myWriteAPIKey = "XXXXXXXXXXXX";
const char* ssid = "XXXXXXXXXXXX";
const char* password = "XXXXXXXXXXXX";
char auth[] = "XXXXXXXXXXXX";
const char* server = "api.thingspeak.com";
WiFiClient client;
LiquidCrystal_I2C lcd(0x27,20,4);  // Stellen Sie die LCD-I2C-Adresse ein, in diesem Fall 0x3F - Wenn Sie sie nicht kennen, verwenden Sie das I2C-Scanskript. Vergessen Sie nicht, die E / A-Pins nach Wire.begin (x, y) festzulegen.
float h, t, p, pin, dp;
BlynkTimer timer;

void setup() 
{
  Wire.begin();
  Serial.begin(115200);
  Blynk.begin(auth, ssid, password, IPAddress(192,168,0,19), 8080);

  while(!bme280.beginI2C(0x76))

  {
    Serial.println("Es konnte kein gültiger BME280-Sensor gefunden werden, Verdrahtung prüfen!");
  }
  
  lcd.begin();
  WiFi.begin(ssid, password);
  ThingSpeak.begin(client);

  Serial.println();
  Serial.println();
  Serial.print("Verbunden mit ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi verbunden");
  
     lcd.setCursor(1,0);
     lcd.print("Wetterstation V1.0");
     lcd.setCursor(0,1);
     lcd.print("Temp. Luftf. Luftd.");
     lcd.setCursor(6,2);
     lcd.print("Waschhaus");
     lcd.setCursor(1,3);
     lcd.print("Lese Sensoren aus");
    
     lcd.backlight();
     delay(5000);
     
     lcd.noBacklight();
     delay(1000);

     lcd.backlight();     // finish with backlight on
    
}

void loop()
{
   Blynk.run();
   disptemp();
   delay(500);
}

void disptemp(){
  
  bool ok = bme280.measure();

   Blynk.virtualWrite(V5, (bme280.getTemperature()/ 100.0));
   Blynk.virtualWrite(V6, (bme280.getHumidity() / 1024.0));
   Blynk.virtualWrite(V7, (bme280.getPressure()/ 100));
    
  t = bme280.getTemperature() / 100.0;
  p = bme280.getPressure()/ 100.0F;
  h = bme280.getHumidity() / 1024.0;
  dp = t-19,4*(100,0-h);
  pin = 0.225*p;
        
  float Luftdruck = p;
 // float temp;
  
  
//  Serial.print("Heizk.Temperatur =    ");       // zwischen den " " kann ein beliebiger Name verwendet werden
//  Serial.print(sensors.getTempCByIndex(0),1);   // auslesen der Sensordaten. Wenn °C hinter der Temperatur stehen soll, dann muss "print" verwendet werden
  Serial.println ("  °C");
  Serial.print("Temperatur       =   ");
  Serial.print(t);
  Serial.println ("  °C");
  Serial.print("Luftfeuchtigkeit =   ");
  Serial.print(h);
  Serial.println ("   %");
     
  Serial.print("Luftdruck        =   ");
  Serial.print(p,1);
  Serial.println (" hPA");
  Serial.print("Höhe             =   ");
  Serial.print(pin);
  Serial.println ("  m");
  Serial.print("Taupunkt         =   ");
  Serial.print(dp);
  Serial.println ("  °C");
  
  Serial.println("sende Daten an Thingspeak");
  ThingSpeak.setField(1, t);
  ThingSpeak.setField(2, p);
  ThingSpeak.setField(3, h);
  ThingSpeak.setField(4, dp);
//  ThingSpeak.setField(5, temp);
  ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  delay(20000);


     lcd.clear();                              // Display löschen
     delay (500);
     lcd.setCursor(5, 0);                       // Anfang auf Stelle 5, Zeile 1 setzen
     lcd.print("Waschhaus");                  // Wassertemp. auf LCD ausgeben
   //  lcd.setCursor(12, 0);                      // Anfang auf Stelle 12, Zeile 1 setzen
   //  lcd.print(sensors.getTempCByIndex(0),1);   // Wert aus "DS18B20" Wassertemperatur (sensors.getTempCByIndex(0),1 
   //  lcd.setCursor(17, 0);                      // Anfang auf Stelle 17, Zeile 1 setzen
   //  lcd.print("\337C");                        // °C (mit"\337" wird das Gradzeichen dargestellt)auf LCD ausgeben 

     lcd.setCursor(0, 1);                       // Anfang auf Stelle 0, Zeile 2 setzen
     lcd.print("Temperatur");                   // Temperatur  auf LCD ausgeben
     lcd.setCursor(12, 1);                      // Anfang auf Stelle 12, Zeile 2 setzen
     lcd.print(t,1);                            // Wert aus "t" ausgeben (Temperatur), 1 ist eine Stelle hinter dem Komma
     lcd.setCursor(17, 1);                      // Anfang auf Stelle 17, Zeile 2 setzen
     lcd.print("\337C");                        // °C (mit"\337" wird das Gradzeichen dargestellt)auf LCD ausgeben
    
     lcd.setCursor(0, 2);                       // Anfang auf Stelle 0, Zeile 3 setzen
     lcd.print("Luftfeuchte");                  // Luftfeuchte auf LCD ausgeben
     lcd.setCursor(12, 2);                      // Anfang auf Stelle 12, Zeile 3 setzen
     lcd.print(h,1);                            // Wert aus "h" ausgeben (Luftfeuchtigkeit), 1 ist eine Stelle hinter dem Komma
     lcd.setCursor(18, 2);                      // Anfang auf Stelle 18, Zeile 3 setzen
     lcd.print("%");                            // % auf LCD ausgeben

     lcd.setCursor(0, 3);                       // Anfang auf Stelle 0, Zeile 4 setzen
     lcd.print("Luftdruck");                    // Luftdruck auf LCD ausgeben
     lcd.setCursor(10, 3);                      // Anfang auf Stelle 10, Zeile 4 setzen
     if (p < 1000) lcd.print(" ");              // ein Leerzeichen ausgeben wenn Luftdruck unter 1000 ist
     lcd.print(p,1);                            // Wert aus "p" ausgeben (Luftdruck)(p,1 ist eine Stelle hinter den Komma
     lcd.setCursor(17, 3);                      // Anfang auf Stelle 17, Zeile 4 setzen
     lcd.print("hPa");                          // hPa auf LCD ausgeben
     
    
}

Why do you use the enormous delay of 20 seconds? Put an one time timer ( timeout ) for better…

1 Like

@magnum1795 if you re-read the “keep your void loop clean” document you’ll see that you need to use a timer, not do what you’ve done and simply move the code into a function and call that every time the void loop executes.
There should be no delay() commands in your code.

Pete.