C++

/**
* iFish – Smart Aquarium
* Version 0.5
* 23-Abr-2016
*/

//DHT11
#include <dht11.h>
//DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>

dht11 DHT11;

#define VERSION 0.5

const int DHT11Pin = 7;
const int waterLevelSwitch = 6;
const int DS18B20Pin = 5;
const int ldrPin = A5;
const int redLedPin = 4;
const int speakerPin = 3;
const int relayChannel1Pin = A0; // LED lamp
const int relayChannel2Pin = A1; // Heater
const int relayChannel3Pin = A2; // Water pump
const int relayChannel4Pin = A3; // Automatic feeder
const int phPin = A4;

int pH_measure = 0;
double pH_voltage = 0.0;

boolean lowLuminosity = false;
boolean forceLightOff = false;

String separator = “;”;

String inputString = “”; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete

OneWire oneWire(DS18B20Pin);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup() {
Serial.begin(9600);

pinMode(waterLevelSwitch, INPUT);
pinMode(redLedPin, OUTPUT);
pinMode(speakerPin, OUTPUT);
pinMode(relayChannel1Pin,OUTPUT); // LED lamp
pinMode(relayChannel2Pin,OUTPUT); // Heater
pinMode(relayChannel3Pin,OUTPUT); // Water pump
pinMode(relayChannel4Pin,OUTPUT); // Automatic Feeder

// Start up the library
sensors.begin();

// reserve 50 bytes for the inputString:
inputString.reserve(50);
}

void loop() {
/***********************************************************************************************
* Do some operations
***********************************************************************************************/
// in case of water leakage , fire alarm
if(digitalRead(waterLevelSwitch) == 1) {
digitalWrite(redLedPin, HIGH);
tone(speakerPin, 1500);
} else {
digitalWrite(redLedPin, LOW);
noTone(speakerPin);
}

// aquarium Lighting managemen
if(analogRead(ldrPin) < 50 and !forceLightOff) {
digitalWrite(relayChannel1Pin, HIGH);
lowLuminosity = true;
} else if (analogRead(ldrPin) > 200){
digitalWrite(relayChannel1Pin, LOW);
lowLuminosity = false;
forceLightOff = false;
}

/***********************************************************************************************
* Process Inputs
***********************************************************************************************/
// print the string when a newline arrives:
if (stringComplete) {
//Process the command
if(inputString == “HELLO;”){
Serial.println(“Hello from iFish”);
} else if (inputString == “GET_ALL_DATA;”) {
Serial.println(readFromAllSensors());
} else if (inputString == “GET_EXT_TEMP;”) {
Serial.println(readExternalTemperature());
} else if (inputString == “GET_EXT_HUMIDITY;”) {
Serial.println(readExternalHumidity());
} else if (inputString == “GET_WATER_LVL;”) {
Serial.println(readWaterLevel());
} else if (inputString == “GET_INT_TEMP;”) {
Serial.println(readInternalTemperature());
} else if (inputString == “GET_LUMINOSITY;”) {
Serial.println(readLuminosity());
} else if (inputString == “GET_PH;”) {
Serial.println(readPH());
} else if (inputString == “LED_ON;”) {
digitalWrite(redLedPin, HIGH);
} else if (inputString == “LED_OFF;”) {
digitalWrite(redLedPin, LOW);
} else if (inputString == “BUZZER_ON;”) {
tone(speakerPin, 1500, 500);
} else if (inputString == “BUZZER_OFF;”) {
noTone(speakerPin);
} else if (inputString == “RELAY1_ON;”) {
if(lowLuminosity) digitalWrite(relayChannel1Pin, HIGH);
} else if (inputString == “RELAY1_OFF;”) {
digitalWrite(relayChannel1Pin, LOW);
if(lowLuminosity) forceLightOff = true;
} else if (inputString == “RELAY2_ON;”) {
digitalWrite(relayChannel2Pin, HIGH);
} else if (inputString == “RELAY2_OFF;”) {
digitalWrite(relayChannel2Pin, LOW);
} else if (inputString == “RELAY3_ON;”) {
digitalWrite(relayChannel3Pin, HIGH);
} else if (inputString == “RELAY3_OFF;”) {
digitalWrite(relayChannel3Pin, LOW);
} else if (inputString == “RELAY4_ON;”) {
digitalWrite(relayChannel4Pin, HIGH);
} else if (inputString == “RELAY4_OFF;”) {
digitalWrite(relayChannel4Pin, LOW);
} else if (inputString == “CHECK_SYSTEM;”) {
checkSystem();
} else {
// command not recognised
error();
}
// clear the string:
inputString = “”;
stringComplete = false;
}
}

/*
SerialEvent occurs whenever a new data comes in the
hardware serial RX. This routine is run between each
time loop() runs, so using delay inside loop can delay
response. Multiple bytes of data may be available.
*/
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == ‘;’) {
stringComplete = true;
}
}
}

/**
* Check all system components
*/
void checkSystem(){
digitalWrite(redLedPin, HIGH);
delay(1000);
digitalWrite(redLedPin, LOW);
tone(speakerPin, 1500, 500);
delay(1000);
digitalWrite(redLedPin, HIGH);
delay(1000);
digitalWrite(redLedPin, LOW);
digitalWrite(relayChannel1Pin, HIGH);
delay(1000);
digitalWrite(relayChannel1Pin, LOW);
digitalWrite(redLedPin, HIGH);
delay(1000);
digitalWrite(redLedPin, LOW);
digitalWrite(relayChannel2Pin, HIGH);
delay(1000);
digitalWrite(relayChannel2Pin, LOW);
digitalWrite(redLedPin, HIGH);
delay(1000);
digitalWrite(redLedPin, LOW);
digitalWrite(relayChannel3Pin, HIGH);
delay(1000);
digitalWrite(relayChannel3Pin, LOW);
digitalWrite(redLedPin, HIGH);
delay(1000);
digitalWrite(redLedPin, LOW);
digitalWrite(relayChannel4Pin, HIGH);
delay(1000);
digitalWrite(relayChannel4Pin, LOW);
}

/**
* Blink Red LED and send a beep to alert user that something went wrong
*/
void error(){
digitalWrite(redLedPin, HIGH);
tone(speakerPin, 1500, 200);
delay(200);
tone(speakerPin, 1500, 200);
digitalWrite(redLedPin, LOW);
}

int readExternalTemperature(){
DHT11.read(DHT11Pin);
return DHT11.temperature;
}

int readExternalHumidity(){
DHT11.read(DHT11Pin);
return DHT11.humidity;
}

int readWaterLevel(){
return (digitalRead(waterLevelSwitch) == 0 ? 1 : 0);
}

int readInternalTemperature(){
// call sensors.requestTemperatures() to issue a global temperature
sensors.requestTemperatures(); // Send the command to get temperatures
return sensors.getTempCByIndex(0);
}

int readLuminosity(){
return analogRead(ldrPin);
}

float readPH(){
pH_measure = analogRead(phPin);
pH_voltage = 5 / 1024.0 * pH_measure; //classic digital to voltage conversion
return 7 + ((2.5 – pH_voltage) / 0.18);
}

/**
* Get the data from all servers
* Serial Output:
* ExternalTemperature;Humidity;WaterLevel;InternalTemperature;Light;pH
*/
String readFromAllSensors(){
return ” ” + String(readExternalTemperature()) + “;” + String(readExternalHumidity()) + “;” + String(readWaterLevel()) + “;” + String(readInternalTemperature()) + “;” + String(readLuminosity()) + “;” + String(readPH());
}