Skocz do zawartości

Informacja z czujnika do maila


Pomocna odpowiedź

Napisano
#define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT
#define ETH_PHY_POWER 12

#include <Ethernet.h>
#include <ESP32Ping.h>
#include <WiFi.h>
#include "time.h"
#include <EEPROM.h>
#include "ESP32_MailClient.h"
#include <INA219_WE.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDRESS 0x44
INA219_WE ina219 = INA219_WE(I2C_ADDRESS);
int lcdColumns = 16;
int lcdRows = 4;
LiquidCrystal_I2C lcd(0x3E, lcdColumns, lcdRows);

const int Analog_channel_pin= 39;
int ADC_VALUE = 0;
double voltage_value = 0;
const int output32 = 32;
const int output33 = 33;

// REPLACE WITH YOUR NETWORK CREDENTIALS
const char* ssid = "__________";
const char* password = "_________";

// To send Email using Gmail use port 465 (SSL) and SMTP Server smtp.gmail.com
// YOU MUST ENABLE less secure app option https://myaccount.google.com/lesssecureapps?pli=1
#define emailSenderAccount    "____________"    
#define emailSenderPassword   "____________"
#define emailRecipient        "____________"
#define smtpServer            "____________"
#define smtpServerPort        465
#define emailSubject          "Olimex"


static bool eth_connected = false;

// The Email Sending data object contains config and data to send
SMTPData smtpData;

// Callback function to get the Email sending status
void sendCallback(SendStatus info);

void WiFiEvent(WiFiEvent_t event){  
  switch (event) {
    case SYSTEM_EVENT_ETH_START:
      Serial.println("ETH Started");
      //set eth hostname here
      ETH.setHostname("esp32-ethernet");
      break;
    case SYSTEM_EVENT_ETH_CONNECTED:
      Serial.println("ETH Connected");
      break;
    case SYSTEM_EVENT_ETH_GOT_IP:
      Serial.print("ETH MAC: ");
      Serial.print(ETH.macAddress());
      Serial.print(", IPv4: ");
      Serial.print(ETH.localIP());
      Serial.print(", DNS1: ");
      Serial.print(ETH.dnsIP());

      if (ETH.fullDuplex()) {
        Serial.print(", FULL_DUPLEX");
      }
      Serial.print(", ");
      Serial.print(ETH.linkSpeed());
      Serial.println("Mbps");
      eth_connected = true;
      break;
    case SYSTEM_EVENT_ETH_DISCONNECTED:
      Serial.println("ETH Disconnected");
      eth_connected = false;
      break;
    case SYSTEM_EVENT_ETH_STOP:
      Serial.println("ETH Stopped");
      eth_connected = false;
      break;
    default:
      break;
  }
}

void setup(){
   Serial.begin(115200);
   Wire.begin();
   lcd.init();
   lcd.backlight();
  // Initialize the output variables as outputs
  pinMode(output32, OUTPUT);
  pinMode(output33, OUTPUT);
//Set outputs to LOW
  digitalWrite(output32, LOW);
  digitalWrite(output33, LOW);
    ADC_VALUE = analogRead(Analog_channel_pin);
voltage_value = (ADC_VALUE * 15.76 ) / (4095);
  Serial.println(voltage_value);
  //Serial.begin(115200);
  Serial.println();
  
  Serial.print("Connecting");
  
  
  //uncomment for WiFi connection
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(200);
  }
  
/*
  //uncomment for ETH connection
  WiFi.onEvent(WiFiEvent);
  ETH.begin();
  while (eth_connected == false) {
    Serial.print(".");
    delay(200);
  }
 */ 
  Serial.println();
  Serial.println("WiFi o ETH connected.");
  Serial.println();
  Serial.println("Preparing to send email");
  Serial.println();
  


  //Start sending Email, can be set callback function to track the status
 // if (ADC_VALUE <= 3095){
 //  if (!MailClient.sendMail(smtpData))
  //}
 //   Serial.println("Error sending Email, " + MailClient.smtpErrorReason());
  }
  //Clear all data from Email object to free memory
//  smtpData.empty();
//}

void loop() {
  float busVoltage_V = 0.0;
  busVoltage_V = ina219.getBusVoltage_V();
    // Set the SMTP Server Email host, port, account and password
  smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword);

  // For library version 1.2.0 and later which STARTTLS protocol was supported,the STARTTLS will be 
  // enabled automatically when port 587 was used, or enable it manually using setSTARTTLS function.
  //smtpData.setSTARTTLS(true);

  // Set the sender name and Email
  smtpData.setSender("ESP32", emailSenderAccount);

  // Set Email priority or importance High, Normal, Low or 1 to 5 (1 is highest)
  smtpData.setPriority("High");

  // Set the subject
  smtpData.setSubject(emailSubject);

  // Set the message with HTML format
  smtpData.setMessage("<div style=\"color:#2f4468;\"><h1>Awaria </h1><p>- wysłano z obiektu nr: </p></div>", true);
  
  
 // Set the email message in text format (raw)
  //smtpData.setMessage("Hello World! - Sent from ESP32 board", false);
 
  // Add recipients, you can add more than one recipient
  smtpData.addRecipient(emailRecipient);
  //smtpData.addRecipient("[email protected]");

  smtpData.setSendCallback(sendCallback);
  
    //Start sending Email, can be set callback function to track the status
 if (busVoltage_V < 09.50){
   if (!MailClient.sendMail(smtpData))
   Serial.println("Error sending Email, " + MailClient.smtpErrorReason());
  exit(0);
 
   digitalWrite(output32, HIGH);
    lcd.setCursor(9,3);
    lcd.print("         ");
    lcd.setCursor(9,3);
  lcd.print("Batt Full");
  }else{
  digitalWrite(output32, LOW);
    lcd.setCursor(9,3);
  lcd.print("         ");
  lcd.setCursor(9,3);
  lcd.print("Charging");
  }
  if(busVoltage_V <= 10.00){
  digitalWrite(output33, HIGH);
  lcd.setCursor(0,3);
  lcd.print("       ");
  lcd.setCursor(0,3);
  lcd.print("Batt LOW");
  //delay(2000);
  //lcd.clear();
  }else{
  digitalWrite(output33, LOW);
  lcd.setCursor(0,3);
  lcd.print("        ");
  lcd.setCursor(0,3);
  lcd.print("Batt OK");
  
  //Clear all data from Email object to free memory
  smtpData.empty();
  
}
}

// Callback function to get the Email sending status
void sendCallback(SendStatus msg) {
  // Print the current status
  Serial.println(msg.info());

  // Do something when complete
  if (msg.success()) {
    Serial.println("wysłane");
    
    lcd.setCursor(3,0);
    lcd.print("email send");
    delay(200);
    lcd.setCursor(3,0);
    lcd.print("           ");
    delay(200);
    lcd.setCursor(3,0);
    lcd.print("next probe soon");
    lcd.setCursor(2,1);
    lcd.print("check AC generator");
  delay(2000);
  lcd.setCursor(3,0);
    lcd.print("                 ");
    delay(200);
    lcd.setCursor(3,0);  
    lcd.print("next probe");
  }
}

staram się dodać string coś w postaci :  String smtpData.setMessage = String (busVoltage_V)+ String ("V"); ale nie zostaje wyświetlony w treści maila

 smtpData.setMessage("<div style=\"color:#2f4468;\"><h1>Awaria </h1><p>- wysłano z obiektu nr: </p></div>", true);

 String smtpData.setMessage = string(voltage_value)+ String ("V");

inaczej jeśli znasz sposób jak zatrzymać kod w void loop po wykonaniu zależności by nie wysyłał w nieskończoność maila z awarią bądź by wykonał reboot softu będę wdzięczny za wskazówki

Najprościej dołożyć flagę - pseudokod:

if(mail_send == false && awaria == true)
{
// tu wysyłasz maila
mail_send = true // tu pamiętasz że mail był już wysłany   
}

 

(edytowany)
18 minut temu, Gal_kris napisał:

smtpData.setMessage("<div style=\"color:#2f4468;\"><h1>Awaria </h1><p>- wysłano z obiektu nr: </p></div>", true);

 String smtpData.setMessage = string(voltage_value)+ String ("V");

Pytanie kontrolne: czy Ty w ogóle rozumiesz o co tam chodzi czy losowo wrzucasz mądre słowa typu "String"? Przecież setMessage() to funkcja, podaj jej po prostu raz a dobrze stringa i będzie działać.

Co w stylu:

smtpData.setMessage(String("Awaria!\n") + String(voltage_value) + String("V"));
9 minut temu, Gal_kris napisał:

jeśli znasz sposób jak zatrzymać kod w void loop po wykonaniu zależności by nie wysyłał w nieskończoność maila z awarią

To już przed chwilą się dowiedziałeś, a

9 minut temu, Gal_kris napisał:

by wykonał reboot softu

ESP.restart();

Ale chyba nie o to Ci chodziło.

Edytowano przez ethanak

zgadza się nie do końca rozumiem, nadal się uczę a że mam mega dysleksję uczę się wolno i po swojemu bo wiem jak zmusić głowę do pamiętania.

zawracam komuś głowę tylko gdy siedzę już już nad czymś od 2 tygodni i nic nie potrafię wskórać .

 

no matching function for call to 'SMTPData::setMessage(StringSumHelper&)'

30 minut temu, Gal_kris napisał:

no matching function for call to 'SMTPData::setMessage(StringSumHelper&)'

Pisałem, że "coś w stylu" 🙂

smtpData.setMessage(String("Awaria!\n") + String(voltage_value) + String("V"), false);

Nie wiem czy zadziała.

Dnia 12.04.2022 o 11:59, _LM_ napisał:

if(mail_send == false && awaria == true) { // tu wysyłasz maila mail_send = true // tu pamiętasz że mail był już wysłany }

nie za bardzo to rozumiem bo mail_send <--- muszę podstawić z mojego programu, awaria <----- to bool ?

Proszę napisz tak bym to zrozumiał .

I mam jeszcze jedno pytanie by wyczuć programowo że napięcie wzrasta i maleje ?

 

 

Mówiąc prościej, musisz zapamiętać czy kiedy nastąpiła awaria to mail już został wysłany, ponieważ twoim problemem było że po wystąpieniu awarii mail był wysyłany za każdym obiegiem pętli. Najprościej zrobić dwie zmienne mogą być typu bool i w nich przechowywać te parametry. 

12 minut temu, Gal_kris napisał:

mam jeszcze jedno pytanie by wyczuć programowo że napięcie wzrasta i maleje ?

Zapamiętać ostatnią próbkę (napięcia) i kiedy nadejdzie nowy pomiar porównać z tą zapamiętaną. 

if (mail_send == false && awaria == true){

  smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword);
  smtpData.setSender("ESP32", emailSenderAccount);
  smtpData.setPriority("High");
  smtpData.setSubject(emailSubject);
  smtpData.setMessage(String(" Akumulatory wpełni naładowane \n") + String(busVoltage_V) + String("V"), false);
  smtpData.addRecipient(emailRecipient);
  smtpData.setSendCallback(sendCallback);
  if (busVoltage_V > 14.50){
   if (!MailClient.sendMail(smtpData))
   Serial.println("Error sending Email, " + MailClient.smtpErrorReason());
   //exit(0); 
 }
  mail_send = true; // tu pamiętasz że mail był już wysłany   
} 

po zastosowaniu tego nie reaguje na zmianę napięcia w globalu mam  static bool awaria = false; i byte mail_send;

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...