Creating Cron job for arduino web server

hi all,

I’m building a home automation system and have many sensors attached to it. I’m using a arduino mega with a ethernet shield to connect the system to the internet. The arduino is setup as a web server and it display the data in the inbuild html page. Now i have decided to store the sensor data in an online hosted mysql database.

My problem is, if i setup a cron job on my online server, will i be able to grab the sensor data from the arduino inbuild html page and save it in the mysql database. this data will be used to draw a graph. i will setup the cron job to send a request to the arduino every 5 minutes. How would i implement this.

This is the sketch I’m using. Has only one sensor for simplicity.

#include <DHT.h>

#define DHTPIN 2     // what pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT dht(DHTPIN, DHTTYPE);

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x00, 0x23, 0x36 }; //MAC address found on the back of your ethernet shield.
IPAddress ip(192,168,254,177); // IP address dependent upon your network addresses.

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
// Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  dht.begin();

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
 
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");
  }
 
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new 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
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
   client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
        
          // output the value of the DHT-11
         client.println("<H2>");
            client.print("Humidity: ");
            client.println("</H2>");
            client.println("<p />");
            client.println("<H1>");
            client.print(h);
            client.print(" %\t");
            client.println("</H1>");
            client.println("<p />"); 
            client.println("<H2>");
            client.print("Temperature: ");
            client.println("</H2>");
            client.println("<H1>");
            client.print(t*1.8+32);
            client.println(" °");
            client.println("F");
            client.println("</H1>");
           
                
         
          client.println("</html>");
          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();
    Serial.println("client disonnected");
  }
}

Since I’m new to the arduino world, please be patient with me and any help provided would be highly appreciated.

Thank You.

How would i implement this.

On the Arduino? Nothing needs to change. The Arduino will not know that the client is a cron job vs. someone using a browser and mouse, and clicking the refresh button every 5 minutes.

Hi PaulS,

How about grabbing the sensor data (values) from the arduino inbuild html page and save it in the mysql database ?

Many examples show how to get the data with a php script when the arduino is setup as a client. In this case i want to setup the arduino as a web server and read the sensor values from the response. How can i achieve this.

Thank You.

How can i achieve this.

That REALLY depends on what application the cron job is running, that is going to get the web page from the Arduino-as-server, and extract the data from it.

what application the cron job is running

Do you mean like, php or java script.

that is going to get the web page from the Arduino-as-server, and extract the data from it.

Well that is what i don't know. I have no idea how to get the sensor values. Can i use php to read the values ?

I know how to get the sensor values and save it into mysql with php if the arduino is a client.

Could you please show me a effective way to get this sensor values from the arduino server and save into my online mysql database. If possible please provide an example code so that i can understand.

Thank You.

Can i use php to read the values ?

Read them from what? If you can make PHP make a GET request (I presume that that can be done), then you can read the values from the response from the server.

Could you please show me a effective way to get this sensor values from the arduino server and save into my online mysql database. If possible please provide an example code so that i can understand.

The simplest is to include a meta tag in the page that the server returns that will cause the client to make another request a pre-defined period of time later.