C File
#include <Wire.h>
#include <SensorLibrary.h>
SensorLibrary foginator;
#define SLAVE_ADDRESS 0x04
int number = 0;
int state = 0;
int dataRead = 0;
void setup() {
//pinMode(13, OUTPUT);
Serial.begin(9600); // start serial for output
// initialize i2c as slave
Wire.begin(SLAVE_ADDRESS);
// define callbacks for i2c communication
Wire.onReceive(receiveData);
Wire.onRequest(sendData);
//Serial.println(“Ready!”);
}
void loop() {
delay(100);
}
// callback for received data
void receiveData(int byteCount){
while(Wire.available()) {
dataRead = Wire.read();
if (dataRead == 10) {
number = foginator.getWpTempData1();
Serial.print(number);
}
else if (dataRead == 11) {
number = foginator.getWpTempData2();
Serial.print(number);
}
else if (dataRead == 12) {
number = foginator.getCO2Data();
Serial.print(number);
}
else if (dataRead == 13) {
number = 22;
Serial.print(number);
}
else if (dataRead == 14) {
number = foginator.getPHData();
Serial.print(number);
}
else if (dataRead == 15) {
number = foginator.getLuxData();
Serial.print(number);
}
else if (dataRead == 16) {
number = foginator.getHumidityData();
Serial.print(number);
}
}
}
// callback for sending data
void sendData(){
Wire.write(number);
//Wire.endTransmission();
}
CPP File
#include “Arduino.h”
#include “SensorLibrary.h”
#include “OneWire.h”
#include “DallasTemperature.h”
#include “SparkFunTSL2561.h”
#include “Wire.h”
#include “DHT.h”
SensorLibrary::SensorLibrary()
{
pinMode(A0,INPUT); // CO2 Sensor
}
// CO2 Sensor
int SensorLibrary::getCO2Data()
{
float CO2Curve[3] = {2.602,0.324,(0.020/(2.602-3))};
int percentage;
float volts;
volts = MGRead(A7);
percentage = MGGetPercentage(volts,CO2Curve);
return percentage;
}
float SensorLibrary::MGRead(int mg_pin)
{
int i;
float v=0;
for (i=0;i<5;i++) {
v += analogRead(mg_pin);
delay(50);
}
v = (v/5)*5/1024 ;
return v;
}
int SensorLibrary::MGGetPercentage(float volts, float *pcurve)
{
if ((volts/8.5)>=0.324) {
return -1;
} else {
return pow(10, ((volts/8.5)-pcurve[1])/pcurve[2]+pcurve[0]);
}
}
// * * * * * * * * * * * * * * * * * *
// Waterproof Temperature Sensor
float SensorLibrary::getWpTempData1()
{
OneWire oneWire(A5);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
sensors.requestTemperatures(); // Send the command to get temperatures
delay(50);
return sensors.getTempFByIndex(0);
}
float SensorLibrary::getWpTempData2()
{
OneWire oneWire(A6);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
sensors.requestTemperatures(); // Send the command to get temperatures
delay(50);
return sensors.getTempFByIndex(0);
}
// * * * * * * * * * * * * * * * * * *
// Lux Light Sensor
double SensorLibrary::getLuxData()
{
SFE_TSL2561 light;
unsigned char time = 2;
unsigned int data0, data1;
unsigned int ms = 1000;
boolean gain = 0;
light.begin();
light.setTiming(gain,time,ms);
light.setPowerUp();
//****
if (light.getData(data0,data1))
{
double lux; // Resulting lux value
boolean good; // True if neither sensor is saturated
// Perform lux calculation:
good = light.getLux(0,1000,data0,data1,lux);
return lux;
}
}
// * * * * * * * * * * * * * * * * * *
// Humidity Sensor
float SensorLibrary::getHumidityData()
{
DHT dht(A10, DHT22);
dht.begin();
float h = dht.readHumidity();
return h;
}
// pH Sensor
float SensorLibrary::getPHData()
{
float pHdata; //Store the average value of the sensor feedback
float pHValue,voltage;
pHdata=analogRead(A9);
voltage = pHdata*5.0/1024;
pHValue = 3.5*voltage+0.00;
return pHValue;
}
double SensorLibrary::avgArray(int* arr, int number)
{
int i;
int max,min;
double avg;
long amount=0;
if(number<=0){
Serial.println(“Error number for the array to avraging!/n”);
return 0;
}
if(number<5){ //less than 5, calculated directly statistics
for(i=0;i<number;i++){
amount+=arr[i];
}
avg = amount/number;
return avg;
}else{
if(arr[0]<arr[1]){
min = arr[0];max=arr[1];
}
else{
min=arr[1];max=arr[0];
}
for(i=2;i<number;i++){
if(arr[i]<min){
amount+=min; //arr<min
min=arr[i];
}else {
if(arr[i]>max){
amount+=max; //arr>max
max=arr[i];
}else{
amount+=arr[i]; //min<=arr<=max
}
}//if
}//for
avg = (double)amount/(number-2);
}//if
return avg;
}
// * * * * * * * * * * * * * * * * * *
Header File
#ifndef SensorLibrary_h
#define SensorLibrary_h
#include “Arduino.h”
class SensorLibrary
{
public:
SensorLibrary();
//CO2 Sensor functions
int getCO2Data();
float MGRead(int mg_pin);
int MGGetPercentage(float volts, float *pcurve);
float getWpTempData1();
float getWpTempData2();
double getLuxData();
float getHumidityData();
float getPHData();
double avgArray(int* arr, int number);
//
};
#endif