Home › Forums › Your projects › Weather radio station with Arduino UNO/MEGA Ethernet problem with EMailSender › Reply To: Weather radio station with Arduino UNO/MEGA Ethernet problem with EMailSender
26 January 2021 at 15:52
#9572
Hi tpapas,
I add the EMailSender to the sketch, I attach the code.
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "TimerOne.h"
#include <math.h>
#include "cactus_io_BME280_I2C.h"
#include <EMailSender.h>
#define TX_Pin 8 // used to indicate web data tx
// Data wire is plugged into digital pin 9 on the Arduino
#define ONE_WIRE_BUS 9
#define WindSensor_Pin (2) // digital pin for wind speed sensor
#define WindVane_Pin (A2) // analog pin for wind direction sensor
#define VaneOffset 0 // define the offset for caclulating wind direction
#define WEB_SERVER_PORT 8081
#define EMAIL_SEND_DEBOUNCE 5*60*1000
volatile unsigned int timerCount; // used to count ticks for 2.5sec timer count
volatile unsigned long rotations; // cup rotation counter for wind speed calcs
volatile unsigned long contactBounceTime; // timer to avoid contact bounce in wind speed sensor
volatile float windSpeed;
int vaneValue; // raw analog value from wind vane
int vaneDirection; // translated 0 - 360 wind direction
int calDirection; // calibrated direction after offset applied
int lastDirValue; // last recorded direction value
int deviceCount = 0; // how many DS18B20 we keep on the OneWire
float OutminTemp; // keep track of minimum recorded Outside temp
float OutmaxTemp; // keep track of maximum recorded Outside temp
float InminTemp; // keep track of minimum recorded Inside temp
float InmaxTemp; // keep track of maximum recorded Inside temp
// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);
BME280_I2C bme; // I2C using address 0x77
// Here we setup the web server. We are using a static ip address and a mac address
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);
IPAddress myDns(192, 168, 1, 1);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
EthernetServer server(WEB_SERVER_PORT); // create a server listing on 192.168.1.45 port 80
EMailSender emailSend("apikey", "SG.FINTOFINTOFINTO.FINTOFINTO", "sender.mischianti@gmail.com", "smtp.sendgrid.net", 25 );
void isr_rotation();
void sendEmail();
void setup() {
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// setup anemometer values
lastDirValue = 0;
rotations = 0;
// setup timer values
timerCount = 0;
{
sensors.begin(); // Start up the library
// locate devices on the bus
// Serial.print("Locating devices...");
// Serial.print("Found ");
// deviceCount = sensors.getDeviceCount();
// Serial.print(deviceCount, DEC);
// Serial.println(" devices.");
// Serial.println("");
sensors.requestTemperatures();
InminTemp = sensors.getTempCByIndex(0);
InmaxTemp = sensors.getTempCByIndex(0);
OutminTemp = sensors.getTempCByIndex(1);
OutmaxTemp = sensors.getTempCByIndex(1);
}
// disable the SD card by switching pin 4 High
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
pinMode(53, OUTPUT);
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
Serial.println(F("Pin start!"));
// start the Ethernet connection and server
// Ethernet.begin(mac, ip, myDns, gateway, subnet);
if (Ethernet.begin(mac) == 0) {
Serial.println(F("Failed to configure Ethernet using DHCP"));
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println(F("Ethernet shield was not found. Sorry, can't run without hardware. :("));
} else if (Ethernet.linkStatus() == LinkOFF) {
Serial.println(F("Ethernet cable is not connected."));
}
// no point in carrying on, so do nothing forevermore:
while (true) {
delay(1);
}
}
Serial.println(F("Begin executed!"));
server.begin();
if (!bme.begin()) {
Serial.println(F("Could not find BME280 sensor, check wiring!"));
while (1);
}
pinMode(TX_Pin, OUTPUT);
//pinMode(RG11_Pin, INPUT);
pinMode(WindSensor_Pin, INPUT);
attachInterrupt(digitalPinToInterrupt(WindSensor_Pin), isr_rotation, FALLING);
// setup the timer for 0.5 second
Timer1.initialize(500000);
Timer1.attachInterrupt(isr_timer);
sei(); // Enable Interrupts
Serial.print(F("IP: "));
Serial.println(Ethernet.localIP());
Serial.print(F("Web Server: http://"));
Serial.print(Ethernet.localIP());
Serial.print(F(":"));
Serial.print(WEB_SERVER_PORT);
}
bool emailSended = false;
unsigned long timeElapsed = millis();
void loop() {
// Send command to all the sensors for temperature conversion
sensors.requestTemperatures();
bme.readSensor();
// update min and max temp values for Outside and Inside Temperatures
if (sensors.getTempCByIndex(1) < OutminTemp) {
OutminTemp = sensors.getTempCByIndex(1);
}
if (sensors.getTempCByIndex(1) > OutmaxTemp) {
OutmaxTemp = sensors.getTempCByIndex(1);
}
if (sensors.getTempCByIndex(0) < InminTemp) {
InminTemp = sensors.getTempCByIndex(0);
}
if (sensors.getTempCByIndex(0) > InmaxTemp) {
InmaxTemp = sensors.getTempCByIndex(0);
}
// Check if value > 30 and check if you already send this email
if (sensors.getTempCByIndex(0) > 30 && emailSended == false){
emailSended = true;
// check if you had already send an email in the last 5 minutes
if ((timeElapsed+EMAIL_SEND_DEBOUNCE)<millis()){
timeElapsed = millis();
sendEmail();
}
}else{
// The value return ok and so if you are going over 30 again new notification was sended
emailSended = false;
}
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
digitalWrite(TX_Pin, HIGH);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // connection closed completion of response
client.println("Refresh: 10"); // refresh the page automatically every 10 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.print("<HTML><HEAD><TITLE>RadioActive Weather Server</TITLE></HEAD>");
client.println("<font color='red'><h2>RadioActive Weather Server</font></h2>");
client.print("Agios Merkouris, Sifnos @ 36.987832, 24.719809<br><br>");
client.println("<html><body>");
digitalWrite(TX_Pin, HIGH); // Turn the TX LED on
client.print("<span style=\"font-size: 26px\";>Outside Temperature now ");
client.print(sensors.getTempCByIndex(1));
client.println("C<br>");
client.print("<br> Inside Temperature now ");
client.print(sensors.getTempCByIndex(0));
client.println("C<br>");
client.print("<br> Wind Speed now ");
client.print(windSpeed);
client.println(" mph<br>");
getWindDirection();
client.print("<br> Direction now ");
client.print(calDirection);
client.print(direction(calDirection));
client.println("<br>");
client.print("<br> Humidity now ");
client.print(bme.getHumidity());
client.println("%<br>");
client.print("<br> Pressure now ");
client.print(bme.getPressure_MB());
client.println("mb%<br>");
client.print("<br> Outside Min Temperature was ");
client.print(OutminTemp);
client.println("C<br>");
client.print("<br> Outside Max Temperature was ");
client.print(OutmaxTemp);
client.println("C<br>");
client.print("<br> Inside Min Temperature was ");
client.print(InminTemp);
client.println("C<br>");
client.print("<br> Inside Max Temperature was ");
client.print(InmaxTemp);
client.println("C");
client.println("</body></html>");
digitalWrite(TX_Pin, LOW); // Turn the TX LED off
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
} else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
// Interrupt handler routine for timer interrupt
void isr_timer() {
timerCount++;
if (timerCount == 5) {
// convert to mp/h using the formula V=P(2.25/T)
// V = P(2.25/2.5) = P * 0.9
windSpeed = rotations * 0.9;
rotations = 0;
timerCount = 0;
}
}
// Interrupt handler routine to increment the rotation count for wind speed
void isr_rotation() {
if ((millis() - contactBounceTime) > 15) { // debounce the switch contact
rotations++;
contactBounceTime = millis();
}
}
// Get Wind Direction
void getWindDirection() {
vaneValue = analogRead(WindVane_Pin);
vaneDirection = map(vaneValue, 0, 1023, 0, 360);
calDirection = vaneDirection + VaneOffset;
if (calDirection > 360)
calDirection = calDirection - 360;
if (calDirection > 360)
calDirection = calDirection - 360;
}
const char* direction(int calDirection){
if ((calDirection) < 23) {
return " North";
}
if ((calDirection > 22) && (calDirection < 68)) {
return " NorthEast";
}
if ((calDirection > 67) && (calDirection < 113)) {
return " East";
}
if ((calDirection > 112) && (calDirection < 158)) {
return " SouthEast";
}
if ((calDirection > 157) && (calDirection < 203)) {
return " South";
}
if ((calDirection > 202) && (calDirection < 247)) {
return " SouthWest";
}
if ((calDirection > 246) && (calDirection < 292)) {
return " West";
}
if ((calDirection > 291) && (calDirection < 337)) {
return " NorthWest";
}
if ((calDirection > 336) && (calDirection <= 360)) {
return " North";
}
return "No data!";
}
void sendEmail(){
EMailSender::EMailMessage message;
message.subject = "RadioActive Weather Server";
getWindDirection();
message.message = ("Ciao come stai<br>io bene."
"<span style=\"font-size: 26px\";>Outside Temperature now "
+String(sensors.getTempCByIndex(1))+
"C<br>" +
("<br> Inside Temperature now ")
+String(sensors.getTempCByIndex(0))+
"C<br>"
"<br> Wind Speed now "
+String(windSpeed)+
" mph<br>"
"<br> Direction now "
+direction(calDirection)+
"<br>"
"<br> Humidity now "
+String(bme.getHumidity())+
"%<br>"
"<br> Pressure now "
+String (bme.getPressure_MB())+
"mb%<br>"
"<br> Outside Min Temperature was "
+String(OutminTemp)+
"C<br>"
"<br> Outside Max Temperature was "
+String(OutmaxTemp)+
"C<br>"
"<br> Inside Min Temperature was "
+String(InminTemp)+
"C<br>"
"<br> Inside Max Temperature was "
+String(InmaxTemp)+
"C");
const char* emailToSend = "receiver.mischianti@gmail.com";
EMailSender::Response resp = emailSend.send(emailToSend, message);
Serial.println(F("Sending status: "));
Serial.println(resp.status);
Serial.println(resp.code);
Serial.println(resp.desc);
}
I get a w5100 shield and now can try to test It.
Bye Renzo