Jasper’s Arduino indoor sensor logger

details

This is a very simple project using Arduino, Ethernet Shield & some sensors.

The Arduino micro-controller board measures indoor light intensity, temperature, humidity, air quality and has human movement detection. It sends the measured data to Xively.com that creates beautiful graphs. You can also control the brightness of a red and a green LED from the Xiveley website.

This indoor sensor logger helps me understand the indoor climate and air quality over time. In the future, it may help to control the indoor climate.

arduino-1

 

 

Code

/*
 Name:   Jasper's Arduino Logger
 Author: Jasper Sikken
 Date  : 31 jan 2014
 
 This system measures all kinds of sensors using an Arduino microcontroller board 
 and sends the measured data to the internet either through a ethernet shield or the electric imp.
 The original code comes from https://xively.com/dev/tutorials/arduino_wi-fi/ and 
 is adapted to use a Wiznet 5100 Ethernetshield in stead if a Wi-Fi shield. 
 It make uses of the Xively Arduino library. https://github.com/xively/xively_arduino/archive/master.zip
 The MQ-135 air quality sensor output is compensated for dependency on temperature and humidity.
 
 Circuit:
 * Arduino UNO or Nano
 * Wiznet Ethernet shield attached to pins 10, 11, 12, 13 (only on UNO)
 * Electric Imp is used as a Wifi gateway
 * Temperature and humidity sensor (DHT11) on pin2
 * Infra red movement detector (HC-SR501)connected to pin3
 * red LED on pin5 (analog/PWM out)
 * softserial RX pin 6 to Electric Imp
 * softwerial TX pin 7 to Electric Imp
 * green LED on pin9 (analog/PWM out)
 * Light intensity sensor (LDR) on analog pin0 and 100k to GND
 * Air quality sensor (MQ-135) on analog pin1
 */

boolean useEthernet = 0; // Indicates if ethernet is used or not
int interval = 10000;    // delay between calls to xively in ms

#include <SPI.h>            // SPI library
#include <Ethernet.h>       // Ethernet library
#include <HttpClient.h>     // Http client library
#include <Xively.h>         // Xively Arduino Library
#include <dht11.h>          // Temperature and humidity sensor
#include <SoftwareSerial.h> // the serial interface to the imp

dht11 DHT11;

#define APIKEY "<API key>" // your API key
#define FEEDID <feed ID>   // your xively feed ID

char lightID[]     = "light";    // datastreams
char airqID[]      = "air";      // datastreams
char RedLEDID[]    = "RedLED";   // datastreams
char dht11tempID[] = "dht11temp";// datastreams
char dht11humID[]  = "dht11hum"; // datastreams
char pirID[]       = "PIR";      // datastreams
char GreenLEDID[]  = "GreenLED"; // datastreams
volatile boolean pir;    // variables used in an ISR must be volatile
float RoRs;              // to compensate the MQ-135 Air Quality sensor for Temp and RH

#define LDRPin      A0  // the pin connected to the LDR
#define airqPin     A1  // the pin connected to air quality sensor
#define GreenLEDPin 9   // the pin connected to the Green LED
#define RedLEDPin   5   // the pin connected to the Red LED
#define DHT11PIN    2   // the pin connected to the temperature and humidity sensor
// pirPin           3   // this is a interrupt pin and does not have to be declared
SoftwareSerial mySerial(6, 7); // RX, TX

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
EthernetClient client;
IPAddress server(216,52,233,121); // numeric IP for api.xively.com

XivelyClient xivelyclient(client);

XivelyDatastream datastreams[] = { // Define the strings for our datastream IDs
  XivelyDatastream(lightID    ,strlen(lightID)    ,DATASTREAM_FLOAT),  // light
  XivelyDatastream(airqID     ,strlen(airqID)     ,DATASTREAM_FLOAT),  // air quality
  XivelyDatastream(RedLEDID   ,strlen(RedLEDID)   ,DATASTREAM_FLOAT),  // red LED
  XivelyDatastream(dht11tempID,strlen(dht11tempID),DATASTREAM_FLOAT),  // temp
  XivelyDatastream(dht11humID ,strlen(dht11humID) ,DATASTREAM_FLOAT),  // humidity
  XivelyDatastream(pirID      ,strlen(pirID)      ,DATASTREAM_FLOAT),  // PIR
  XivelyDatastream(GreenLEDID ,strlen(GreenLEDID) ,DATASTREAM_FLOAT),};// green LED

// Finally, wrap the datastreams into a feed
XivelyFeed feed(FEEDID, datastreams, 7); /* number of datastreams */

void setup() {                
  Serial.begin(9600);         // initialize the serial port
  mySerial.begin(19200);      // initialize the software serial port
  Serial.println("Start");    // print to the serial port
  if(useEthernet==0){
    Serial.println("Ethernet is turned OFF");
  }
  else {
    Serial.println("Ethernet is turned ON");
  }
  Serial.print("DHT11 LIBRARY VERSION: ");
  Serial.println(DHT11LIB_VERSION);

  pinMode(LDRPin,     INPUT); // set the pin as input
  pinMode(airqPin,    INPUT); // set the pin as input
  pinMode(RedLEDPin,  OUTPUT);// set the pin as output
  pinMode(GreenLEDPin,OUTPUT);// set the pin as output

  delay(1000);                // give the ethernet module time to boot up:

  if(useEthernet==1){
    Serial.println("Obtaining DHCP IP address");          // print to the serial port
    if (Ethernet.begin(mac) == 1) {                       // start the Ethernet connection:
      Serial.print("IP address: ");                       // print your local IP address:
      Serial.println(Ethernet.localIP());
    } //end of ethernet begin
  }

  attachInterrupt(1, PirActive, RISING); // interrupt 0 is on pin 2, and interrupt 1 is on pin 3, triggered on rising edge
} //end of void setup()

// this function is executed when PIR activity is detected
void PirActive(){
  pir=1;
}                 // set a flag that movement was detected

void loop() {
  analogWrite(GreenLEDPin, 0);                   // turn off the Green LED
  analogWrite(RedLEDPin, 0);                     // turn off the Red LED

  int level, value;
  // Here we get all values in the feed from Xively
  if(useEthernet==1){
    Serial.println("Getting feed from Xively");    // print to the serial port
    int getReturn = xivelyclient.get(feed, APIKEY);// get all values in the feed from Xively
    if(getReturn > 0){Serial.println(feed[2]);}    // if getting the feed was successful print the value to serial
    if(getReturn > 0){Serial.println(feed[6]);}    // if getting the feed was successful print the value to serial
    else Serial.println("HTTP Error");             // else print to serial that it was unsuccesfull

    // Here we write the level to the Red LED
    level = feed[2].getFloat();     // convert float to integer
    if(level < 0  )level = 0;       // values below 0 are are capped to 0
    if(level > 255)level = 255;     // values above 255 are capped to 255
    analogWrite(RedLEDPin, level);  // here I actually write the value to the red LED

    // Here we write the level to the Green LED
    value = feed[6].getFloat(); // convert float to integer
    if(value < 0  )value = 0;       // values below 0 are are capped to 0
    if(value > 255)value = 255;     // values above 255 are capped to 255
    analogWrite(GreenLEDPin, value);// here I actually write the value to the red LED
  }

  int sensorValue = analogRead(LDRPin);     // read brightness from LDR
  datastreams[0].setFloat(sensorValue);     // set the LDR value in the feed
  Serial.print("LDR value      ");             // print the LDR value
  Serial.println(datastreams[0].getFloat());// print the LDR value

  datastreams[2].setFloat(level);           // set the Red LED value in the feed
  Serial.print("Red LED value  ");           // print the LED value
  Serial.println(datastreams[2].getFloat());// print the LED value

  int chk = DHT11.read(DHT11PIN);            // read the temperature and humidity
  switch (chk)
  {
  case DHTLIB_OK: 
    break;
  case DHTLIB_ERROR_CHECKSUM: 
    Serial.println("DHT11 Checksum error"); 
    break;
  case DHTLIB_ERROR_TIMEOUT: 
    Serial.println("DHT11 Time out error"); 
    break;
  default: 
    Serial.println("DHT11 Unknown error"); 
    break;
  }

  datastreams[3].setFloat(DHT11.temperature);// set the temperature value in the feed
  Serial.print("DHT11 Temp     ");           // print the temperature value
  Serial.println(datastreams[3].getFloat()); // print the temperature value
  datastreams[4].setFloat(DHT11.humidity);   // set the humidity value in the feed
  Serial.print("DHT11 Humidity ");           // print humidity value
  Serial.println(datastreams[4].getFloat()); // print humidity value

  int airqValue   = analogRead(airqPin);    // read air quality sensor
  if(DHT11.temperature >=20.0&&DHT11.temperature<=50.0){//adjust for dependency on temperature
    RoRs = -0.0034 * DHT11.temperature + 1.067; 
  }
  else if(DHT11.temperature>=-10.0&&DHT11.temperature<=5.0){//adjust for dependency on temperature
    RoRs = -0.0300 * DHT11.temperature + 1.4; 
  }
  else if (DHT11.temperature >= 5.0 && DHT11.temperature <= 20.0){//adjust for dependency on temperature
    RoRs = -0.0167 * DHT11.temperature + 1.333; 
  }
  else {
    RoRs = 1; 
  }
  RoRs= RoRs * (-0.001923 * DHT11.humidity + 1.0634); //adjust for dependency on humidity
  int adjAirQValue = airqValue * RoRs;

  datastreams[1].setFloat(adjAirQValue);    // set the AirQ value in the feed
  Serial.print("Adj AirQ value ");         // print the AirQ value
  Serial.println(datastreams[1].getFloat());// print the AirQ value

  datastreams[5].setFloat(pir);              // set the pir value in the feed
  Serial.print("PIR activity:  ");            // print PIR activity
  Serial.println(pir);                       // print 1 or 0

  datastreams[6].setFloat(value);            // set the Red LED value in the feed
  Serial.print("Green LED value ");          // print the LED value
  Serial.println(datastreams[6].getFloat()); // print the LED value

  // First print to software serial port
  Serial.println("Putting feed to Soft Serial Port");
  mySerial.print("|");
  mySerial.print("LDR,");
  mySerial.println(sensorValue);
  mySerial.print("Air,");
  mySerial.println(adjAirQValue);
  mySerial.print("Temp,");
  mySerial.println(DHT11.temperature);
  mySerial.print("Hum,");
  mySerial.println(DHT11.humidity);
  mySerial.print("PIR,");
  mySerial.print(pir);
  mySerial.println("~");
  Serial.println("End of putting feed to soft serial port");  // print to the serial port

  if(useEthernet==1){
    Serial.println("Putting feed to Xively");  // print to the serial port
    int ret = xivelyclient.put(feed, APIKEY);  // put the feed to xively
    Serial.print("Put to xivelyclient returned ");//return message
    Serial.println(ret);                       // if 200, all is fine!
  }
  Serial.println("");                        // print empy line
  pir=0;                                     // set back to 0 to able able to detect activity until 
  delay(interval);                           // delay before restarting the loop
}

 

For more detail about this project, visit below link.

http://jasper.sikken.nl/arduinosensor/index.html

This is a very simple project using Arduino, Ethernet Shield & some sensors.

The Arduino micro-controller board measures indoor light intensity, temperature, humidity, air quality and has human movement detection. It sends the measured data to Xively.com that creates beautiful graphs. You can also control the brightness of a red and a green LED from the Xiveley website.

This indoor sensor logger helps me understand the indoor climate and air quality over time. In the future, it may help to control the indoor climate.

arduino-1

 

 

Code

/*
 Name:   Jasper's Arduino Logger
 Author: Jasper Sikken
 Date  : 31 jan 2014
 
 This system measures all kinds of sensors using an Arduino microcontroller board 
 and sends the measured data to the internet either through a ethernet shield or the electric imp.
 The original code comes from https://xively.com/dev/tutorials/arduino_wi-fi/ and 
 is adapted to use a Wiznet 5100 Ethernetshield in stead if a Wi-Fi shield. 
 It make uses of the Xively Arduino library. https://github.com/xively/xively_arduino/archive/master.zip
 The MQ-135 air quality sensor output is compensated for dependency on temperature and humidity.
 
 Circuit:
 * Arduino UNO or Nano
 * Wiznet Ethernet shield attached to pins 10, 11, 12, 13 (only on UNO)
 * Electric Imp is used as a Wifi gateway
 * Temperature and humidity sensor (DHT11) on pin2
 * Infra red movement detector (HC-SR501)connected to pin3
 * red LED on pin5 (analog/PWM out)
 * softserial RX pin 6 to Electric Imp
 * softwerial TX pin 7 to Electric Imp
 * green LED on pin9 (analog/PWM out)
 * Light intensity sensor (LDR) on analog pin0 and 100k to GND
 * Air quality sensor (MQ-135) on analog pin1
 */

boolean useEthernet = 0; // Indicates if ethernet is used or not
int interval = 10000;    // delay between calls to xively in ms

#include <SPI.h>            // SPI library
#include <Ethernet.h>       // Ethernet library
#include <HttpClient.h>     // Http client library
#include <Xively.h>         // Xively Arduino Library
#include <dht11.h>          // Temperature and humidity sensor
#include <SoftwareSerial.h> // the serial interface to the imp

dht11 DHT11;

#define APIKEY "<API key>" // your API key
#define FEEDID <feed ID>   // your xively feed ID

char lightID[]     = "light";    // datastreams
char airqID[]      = "air";      // datastreams
char RedLEDID[]    = "RedLED";   // datastreams
char dht11tempID[] = "dht11temp";// datastreams
char dht11humID[]  = "dht11hum"; // datastreams
char pirID[]       = "PIR";      // datastreams
char GreenLEDID[]  = "GreenLED"; // datastreams
volatile boolean pir;    // variables used in an ISR must be volatile
float RoRs;              // to compensate the MQ-135 Air Quality sensor for Temp and RH

#define LDRPin      A0  // the pin connected to the LDR
#define airqPin     A1  // the pin connected to air quality sensor
#define GreenLEDPin 9   // the pin connected to the Green LED
#define RedLEDPin   5   // the pin connected to the Red LED
#define DHT11PIN    2   // the pin connected to the temperature and humidity sensor
// pirPin           3   // this is a interrupt pin and does not have to be declared
SoftwareSerial mySerial(6, 7); // RX, TX

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
EthernetClient client;
IPAddress server(216,52,233,121); // numeric IP for api.xively.com

XivelyClient xivelyclient(client);

XivelyDatastream datastreams[] = { // Define the strings for our datastream IDs
  XivelyDatastream(lightID    ,strlen(lightID)    ,DATASTREAM_FLOAT),  // light
  XivelyDatastream(airqID     ,strlen(airqID)     ,DATASTREAM_FLOAT),  // air quality
  XivelyDatastream(RedLEDID   ,strlen(RedLEDID)   ,DATASTREAM_FLOAT),  // red LED
  XivelyDatastream(dht11tempID,strlen(dht11tempID),DATASTREAM_FLOAT),  // temp
  XivelyDatastream(dht11humID ,strlen(dht11humID) ,DATASTREAM_FLOAT),  // humidity
  XivelyDatastream(pirID      ,strlen(pirID)      ,DATASTREAM_FLOAT),  // PIR
  XivelyDatastream(GreenLEDID ,strlen(GreenLEDID) ,DATASTREAM_FLOAT),};// green LED

// Finally, wrap the datastreams into a feed
XivelyFeed feed(FEEDID, datastreams, 7); /* number of datastreams */

void setup() {                
  Serial.begin(9600);         // initialize the serial port
  mySerial.begin(19200);      // initialize the software serial port
  Serial.println("Start");    // print to the serial port
  if(useEthernet==0){
    Serial.println("Ethernet is turned OFF");
  }
  else {
    Serial.println("Ethernet is turned ON");
  }
  Serial.print("DHT11 LIBRARY VERSION: ");
  Serial.println(DHT11LIB_VERSION);

  pinMode(LDRPin,     INPUT); // set the pin as input
  pinMode(airqPin,    INPUT); // set the pin as input
  pinMode(RedLEDPin,  OUTPUT);// set the pin as output
  pinMode(GreenLEDPin,OUTPUT);// set the pin as output

  delay(1000);                // give the ethernet module time to boot up:

  if(useEthernet==1){
    Serial.println("Obtaining DHCP IP address");          // print to the serial port
    if (Ethernet.begin(mac) == 1) {                       // start the Ethernet connection:
      Serial.print("IP address: ");                       // print your local IP address:
      Serial.println(Ethernet.localIP());
    } //end of ethernet begin
  }

  attachInterrupt(1, PirActive, RISING); // interrupt 0 is on pin 2, and interrupt 1 is on pin 3, triggered on rising edge
} //end of void setup()

// this function is executed when PIR activity is detected
void PirActive(){
  pir=1;
}                 // set a flag that movement was detected

void loop() {
  analogWrite(GreenLEDPin, 0);                   // turn off the Green LED
  analogWrite(RedLEDPin, 0);                     // turn off the Red LED

  int level, value;
  // Here we get all values in the feed from Xively
  if(useEthernet==1){
    Serial.println("Getting feed from Xively");    // print to the serial port
    int getReturn = xivelyclient.get(feed, APIKEY);// get all values in the feed from Xively
    if(getReturn > 0){Serial.println(feed[2]);}    // if getting the feed was successful print the value to serial
    if(getReturn > 0){Serial.println(feed[6]);}    // if getting the feed was successful print the value to serial
    else Serial.println("HTTP Error");             // else print to serial that it was unsuccesfull

    // Here we write the level to the Red LED
    level = feed[2].getFloat();     // convert float to integer
    if(level < 0  )level = 0;       // values below 0 are are capped to 0
    if(level > 255)level = 255;     // values above 255 are capped to 255
    analogWrite(RedLEDPin, level);  // here I actually write the value to the red LED

    // Here we write the level to the Green LED
    value = feed[6].getFloat(); // convert float to integer
    if(value < 0  )value = 0;       // values below 0 are are capped to 0
    if(value > 255)value = 255;     // values above 255 are capped to 255
    analogWrite(GreenLEDPin, value);// here I actually write the value to the red LED
  }

  int sensorValue = analogRead(LDRPin);     // read brightness from LDR
  datastreams[0].setFloat(sensorValue);     // set the LDR value in the feed
  Serial.print("LDR value      ");             // print the LDR value
  Serial.println(datastreams[0].getFloat());// print the LDR value

  datastreams[2].setFloat(level);           // set the Red LED value in the feed
  Serial.print("Red LED value  ");           // print the LED value
  Serial.println(datastreams[2].getFloat());// print the LED value

  int chk = DHT11.read(DHT11PIN);            // read the temperature and humidity
  switch (chk)
  {
  case DHTLIB_OK: 
    break;
  case DHTLIB_ERROR_CHECKSUM: 
    Serial.println("DHT11 Checksum error"); 
    break;
  case DHTLIB_ERROR_TIMEOUT: 
    Serial.println("DHT11 Time out error"); 
    break;
  default: 
    Serial.println("DHT11 Unknown error"); 
    break;
  }

  datastreams[3].setFloat(DHT11.temperature);// set the temperature value in the feed
  Serial.print("DHT11 Temp     ");           // print the temperature value
  Serial.println(datastreams[3].getFloat()); // print the temperature value
  datastreams[4].setFloat(DHT11.humidity);   // set the humidity value in the feed
  Serial.print("DHT11 Humidity ");           // print humidity value
  Serial.println(datastreams[4].getFloat()); // print humidity value

  int airqValue   = analogRead(airqPin);    // read air quality sensor
  if(DHT11.temperature >=20.0&&DHT11.temperature<=50.0){//adjust for dependency on temperature
    RoRs = -0.0034 * DHT11.temperature + 1.067; 
  }
  else if(DHT11.temperature>=-10.0&&DHT11.temperature<=5.0){//adjust for dependency on temperature
    RoRs = -0.0300 * DHT11.temperature + 1.4; 
  }
  else if (DHT11.temperature >= 5.0 && DHT11.temperature <= 20.0){//adjust for dependency on temperature
    RoRs = -0.0167 * DHT11.temperature + 1.333; 
  }
  else {
    RoRs = 1; 
  }
  RoRs= RoRs * (-0.001923 * DHT11.humidity + 1.0634); //adjust for dependency on humidity
  int adjAirQValue = airqValue * RoRs;

  datastreams[1].setFloat(adjAirQValue);    // set the AirQ value in the feed
  Serial.print("Adj AirQ value ");         // print the AirQ value
  Serial.println(datastreams[1].getFloat());// print the AirQ value

  datastreams[5].setFloat(pir);              // set the pir value in the feed
  Serial.print("PIR activity:  ");            // print PIR activity
  Serial.println(pir);                       // print 1 or 0

  datastreams[6].setFloat(value);            // set the Red LED value in the feed
  Serial.print("Green LED value ");          // print the LED value
  Serial.println(datastreams[6].getFloat()); // print the LED value

  // First print to software serial port
  Serial.println("Putting feed to Soft Serial Port");
  mySerial.print("|");
  mySerial.print("LDR,");
  mySerial.println(sensorValue);
  mySerial.print("Air,");
  mySerial.println(adjAirQValue);
  mySerial.print("Temp,");
  mySerial.println(DHT11.temperature);
  mySerial.print("Hum,");
  mySerial.println(DHT11.humidity);
  mySerial.print("PIR,");
  mySerial.print(pir);
  mySerial.println("~");
  Serial.println("End of putting feed to soft serial port");  // print to the serial port

  if(useEthernet==1){
    Serial.println("Putting feed to Xively");  // print to the serial port
    int ret = xivelyclient.put(feed, APIKEY);  // put the feed to xively
    Serial.print("Put to xivelyclient returned ");//return message
    Serial.println(ret);                       // if 200, all is fine!
  }
  Serial.println("");                        // print empy line
  pir=0;                                     // set back to 0 to able able to detect activity until 
  delay(interval);                           // delay before restarting the loop
}

 

For more detail about this project, visit below link.

http://jasper.sikken.nl/arduinosensor/index.html

COMMENTS

Please Login to comment
  Subscribe  
Notify of