Weather radio station with Arduino UNO/MEGA Ethernet problem with EMailSender

Home Forums Your projects Weather radio station with Arduino UNO/MEGA Ethernet problem with EMailSender

Viewing 9 reply threads
  • Author
    Posts
    • #9559
      tpapas
      Participant

        Renzo, good morning and a good week to you my friend.
        You ‘re asking me what kind of problem do I have, it doesn’t work anymore!
        On the UNO the code I will share with you works fine, it’s a webserver Weather Station that produces an HTML page with all the different measures, on a static IP.

        Now on the Mega, no page loads, no output whatsoever, nothing!

        Try it yourself (if you can/want/have the time) and let me know.

        Here’s 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"
        
        #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
        
        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, 45);
        EthernetServer server(8081); // create a server listing on 192.168.1.45 port 80
        
        void setup() {
        
        // setup anemometer values
        	lastDirValue = 0;
        	rotations = 0;
        
        // setup timer values
        	timerCount = 0;
        
        	{
        		sensors.begin(); // Start up the library
        		Serial.begin(9600);
        // 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);
        
        // start the Ethernet connection and server
        	Ethernet.begin(mac, ip);
        	server.begin();
        
        	if (!bme.begin()) {
        // Serial.println("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
        }
        
        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);
        	}
        
        // 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);
        					if ((calDirection) < 23) {
        						client.print(" North");
        					}
        					if ((calDirection > 22) && (calDirection < 68)) {
        						client.print(" NorthEast");
        					}
        					if ((calDirection > 67) && (calDirection < 113)) {
        						client.print(" East");
        					}
        					if ((calDirection > 112) && (calDirection < 158)) {
        						client.print(" SouthEast");
        					}
        					if ((calDirection > 157) && (calDirection < 203)) {
        						client.print(" South");
        					}
        					if ((calDirection > 202) && (calDirection < 247)) {
        						client.print(" SouthWest");
        					}
        					if ((calDirection > 246) && (calDirection < 292)) {
        						client.print(" West");
        					}
        					if ((calDirection > 291) && (calDirection < 337)) {
        						client.print(" NorthWest");
        					}
        					if ((calDirection > 336) && (calDirection <= 360)) {
        						client.print(" North");
        					}
        					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;
        }
        
        
        
      • #9567
        tpapas
        Participant

          Thank you Renzo, sorry for the off topic!

          I tried again and again, and its so strange, as soon as I compile the sketch on the UNO it works right away, on the MEGA it just doesn’t… And I can’t really tell where it stops (if it stops) if it loads in the EEPROM or if it wants to run and it stops somewhere etc… I m in total darkness, I can’t debug.

          Anyway, if you need the cactus library, you can get it from here: http://cactus.io/projects/weather/arduino-weather-station-bme280-sensor

           

          • #9568
            Renzo Mischianti
            Keymaster

              Hi tpapas,
              try to add pin 10 HIGH (as documentation)

              
                  pinMode(53, OUTPUT);
                  pinMode(4, OUTPUT);
                  digitalWrite(4, HIGH);
                  pinMode(10, OUTPUT);
                  digitalWrite(10, HIGH);
              

               

              and add this code to check If there are some problem

              
                // Check for Ethernet hardware present
                if (Ethernet.hardwareStatus() == EthernetNoHardware) {
                  Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
                  while (true) {
                    delay(1); // do nothing, no point running without Ethernet hardware
                  }
                }
              
                if (Ethernet.linkStatus() == LinkOFF) {
                  Serial.println("Ethernet cable is not connected.");
                }
              

              I don’t have a w5100 shield, but this is a must have :P.

              And check if shield is fitted good, sometime the problems is more simple than expected.

              Bye Renzo

          • #9570
            tpapas
            Participant

              I will check, but remember it ran fine with your email routine! So I’m assuming that the shield is working properly.

            • #9571
              tpapas
              Participant

                Renzo…
                I fixed it!!!!!!!!!!

                Hahaha, I’m excited for this! After lots of research, here’s the solution (FYI):
                <h2 id=”wiring-bme280-module-to-arduino-uno”>Wiring BME280 Module to Arduino UNO</h2>
                Let’s hook the BME280 module up to the Arduino.

                Connections are fairly simple. Start by connecting VIN pin to the 5V output on the Arduino and connect GND to ground.

                Now we are remaining with the pins that are used for I2C communication. Note that each Arduino Board has different I2C pins which should be connected accordingly. On the Arduino boards with the R3 layout, the SDA (data line) and SCL (clock line) are on the pin headers close to the AREF pin. They are also known as A5 (SCL) and A4 (SDA).

                If you have a Mega, the pins are different! You’ll want to use digital 21 (SCL) and 20 (SDA). Refer below table for quick understanding.

                SCL SDA
                Arduino Uno A5 A4
                Arduino Nano A5 A4
                Arduino Mega 21 20
                Leonardo/Micro 3 2

                 

                Do you see it?! I was connecting the bme280 on A5 and A4 and it wanted it on 21 and 20!

                So now that this is over and all is ok, I need a favor from you 🙂 since I don’t know how to do it…

                You have the code, so in the code we get a mac address and we assign a static IP to the Ethernet shield.
                I need you to modify your email sending code, to work with the static IP, place it within the weather station code and then make it (with an IF statement) to send an email IF sensors.getTempCByIndex(0) > 30 degrees.

                Am I asking too much?!

                </div>

                • #9572
                  Renzo Mischianti
                  Keymaster

                    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

                • #9596
                  tpapas
                  Participant

                    Renzo… You are amazing!!!

                    Thank you so much for the effort.
                    I need some further help please.
                    The server now as you have it, works by DHCP and since I need to publish it on the web it does need to be on a specific static IP so I can open the port on the router etc, so the server must be on 192.168.1.45

                    Now when I ran it, the server started on 192.168.1.235.

                    I don’t understand what these do (since I set them correctly but it didn’t use them):

                    // 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, 45);
                    IPAddress myDns(192, 168, 1, 5);
                    IPAddress gateway(192, 168, 1, 5);
                    IPAddress subnet(255, 255, 255, 0);

                    Also, I raised the (sensors.getTempCByIndex(0) > 30 and it didn’t send an email, and since there is no monitor debug output or anything, I don’t know if it did anything, but I didn’t get an email! (I did change all the credentials and API keys to mine).

                    And one last thing, when we figure all this out and it works fine, I need it to send the same email to 3 recipients.

                    Thank you

                  • #9598
                    tpapas
                    Participant

                      From a little further debugging that I did, on the matter of not sending an email if temperature goes above 30 degrees.

                      // Check if value > 30 and check if you already send this email
                      if (sensors.getTempCByIndex(0) > 30 && emailSended == false){
                      emailSended = true;

                       // if sendEmail() is here then email is sent ok

                      // check if you had already send an email in the last 5 minutes
                      if ((timeElapsed+EMAIL_SEND_DEBOUNCE)<millis()){
                      timeElapsed = millis();
                      Serial.print(F(“Trying to Send EMAIL NOW”));
                      sendEmail();
                      }
                      }else{
                      // The value return ok and so if you are going over 30 again new notification was sended
                      emailSended = false;
                      }

                      So something is not working either with timeElapsed or emailSended.

                      By the way how do I raise the timeElapsed from 5 minutes to 15 minutes?

                    • #9601
                      Renzo Mischianti
                      Keymaster

                        Hi tpapas,

                        first, check the code I commend the static IP Ethernet initialization, so to restore It you must uncomment

                        
                        // start the Ethernet connection and server
                        //	  Ethernet.begin(mac, ip, myDns, gateway, subnet);
                        

                        and comment the dhcp initialization

                        
                        	  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);
                        	    }
                        
                        	  }
                        
                        

                        to change the debounce you must change this define

                        
                        #define EMAIL_SEND_DEBOUNCE 5*60*1000
                        

                        Try to change the variable like so (to activate immediately the email send)

                        
                        unsigned long timeElapsed = millis()-EMAIL_SEND_DEBOUNCE;
                        

                        and fix this

                        
                        
                        
                        // 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 if (sensors.getTempCByIndex(0) < 30  && emailSended == true){
                        		// The value return ok and so if you are going over 30 again new notification was sended
                        		emailSended = false;
                        	}
                         

                        Give me a feedback, bye Renzo

                      • #9609
                        tpapas
                        Participant

                          Renzo… Amazing! It does it now, it works like a charm…

                          I thought that the line // Ethernet.begin(mac, ip, myDns, gateway, subnet); was a comment and didn’t realize that it was commented out code! (Stupid me)…

                          Everything is perfect now, so all it needs now in order for me to close it is to email to 3 (or more recipients)

                          And I will let you be after that 🙂

                        • #9612
                          tpapas
                          Participant

                            const char* arrayOfEmail[] = {“email1@gmail.com”, “email2@gmail.com”, “email3@gmail.com”};
                            EMailSender::Response resp = emailSend.send(arrayOfEmail, 3, message);

                            That did Renzo, I guess I could do that myself!!!

                            Thank you so much for helping me in this project, I couldn’t have done it without your support!

                            🙂

                            • #23501
                              Mohamed
                              Participant

                                You have my best regards
                                Own a data transmission project using Arduino
                                Please send me a copy of the successful coding
                                And also how to connect the components
                                I am a beginner
                                (Excuse me I don’t speak English, I use google translate)

                            • #9628
                              Renzo Mischianti
                              Keymaster

                                Hi tpapas,

                                glad to have been helpful.

                                If you need more help write a topic.

                                Bye Renzo

                            Viewing 9 reply threads
                            • You must be logged in to reply to this topic.
                            Exit mobile version