Professional Documents
Culture Documents
Thesis
Thesis
int in2 = 9;
#define SensorPin A0 //pH meter Analog output to Arduino Analog Input 0
#define Offset 0.00 //deviation compensate
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth 40 //times of collection
int pHArray[ArrayLenth]; //Store the average value of the sensor feedback
int pHArrayIndex=0;
#include <LiquidCrystal.h>
LiquidCrystal lcd (1,3,4,5,6,7); //rs, enable, d4, d5, d6, d7
#include <avr/pgmspace.h>
#include <EEPROM.h>
#include <OneWire.h>
#define ReceivedBufferLength 20
char receivedBuffer[ReceivedBufferLength+1]; // store the serial command
byte receivedBufferIndex = 0;
void setup(void)
{
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
digitalWrite(in1, HIGH);
digitalWrite(in2, HIGH);
lcd.noCursor();
lcd.begin(20,4);
pinMode(DoSensorPin,INPUT);
readDoCharacteristicValues(); //read Characteristic Values calibrated from
the EEPROM
}
void loop(void){
pH();
DO();
turb();
}
void pH()
{
static unsigned long samplingTime = millis();
static unsigned long printTime = millis();
static float pHValue,voltage;
if(millis()-samplingTime > samplingInterval)
{
pHArray[pHArrayIndex++]=analogRead(SensorPin);
if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
pHValue = 3.5*voltage+Offset;
samplingTime=millis();
}
if(millis() - printTime > printInterval) //Every 800 milliseconds, print a
numerical, convert the state of the LED indicator
{
lcd.setCursor(0,0);
lcd.print(" pH Value: ");
delay(100);
lcd.setCursor(13,0);
lcd.print(pHValue);
printTime=millis();
}
if(pHValue <= 6.5)
{
lcd.clear();
lcd.setCursor(5,2);
lcd.print("PROCESSING");
digitalWrite(in1, LOW);
delay(1000);
digitalWrite(in1,HIGH);
delay(1000);
lcd.clear();
}
}
double avergearray(int* arr, int number){
int i;
int max,min;
double avg;
long amount=0;
if(number<=0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ERROR PH");
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;
}
void DO(){
static unsigned long analogSampleTimepoint = millis();
if(millis()-analogSampleTimepoint > 30U) //every 30 milliseconds,read the
analog value from the ADC
{
analogSampleTimepoint = millis();
analogBuffer[analogBufferIndex] = analogRead(DoSensorPin); //read the
analog value and store into the buffer
analogBufferIndex++;
if(analogBufferIndex == SCOUNT)
analogBufferIndex = 0;
}
if(doValue <= 3)
{
lcd.clear();
lcd.setCursor(5,2);
lcd.print("PROCESSING");
digitalWrite(in2, LOW);
delay(1000);
digitalWrite(in2, HIGH);
delay(1000);
lcd.clear();
}
}
float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -10;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
ds.reset_search();
return TemperatureSum;
void readDoCharacteristicValues(void)
{
EEPROM_read(SaturationDoVoltageAddress, SaturationDoVoltage);
EEPROM_read(SaturationDoTemperatureAddress, SaturationDoTemperature);
if(EEPROM.read(SaturationDoVoltageAddress)==0xFF &&
EEPROM.read(SaturationDoVoltageAddress+1)==0xFF &&
EEPROM.read(SaturationDoVoltageAddress+2)==0xFF &&
EEPROM.read(SaturationDoVoltageAddress+3)==0xFF)
{
SaturationDoVoltage = averageVoltage; //default voltage:1127.6mv
EEPROM_write(SaturationDoVoltageAddress, SaturationDoVoltage);
}
if(EEPROM.read(SaturationDoTemperatureAddress)==0xFF &&
EEPROM.read(SaturationDoTemperatureAddress+1)==0xFF &&
EEPROM.read(SaturationDoTemperatureAddress+2)==0xFF &&
EEPROM.read(SaturationDoTemperatureAddress+3)==0xFF)
{
SaturationDoTemperature = temperature; //default temperature is 25^C
EEPROM_write(SaturationDoTemperatureAddress, SaturationDoTemperature);
}
}
void turb(){
int sensorValue = analogRead(A2);// read the input on analog pin 0:
float voltagelol = sensorValue * (5.0 / 1024.0) * 10; // Convert the analog
reading (which goes from 0 - 1023) to a voltage (0 - 5V): // 3.5V ang reading sa
NATURAL WATER
lcd.setCursor(0,3);
lcd.print(" Turbidity:");
lcd.setCursor(13,3);
lcd.print(voltagelol);
delay(100);
if(voltagelol <= 30)
{
lcd.clear();
lcd.setCursor(5,2);
lcd.print("PROCESSING");
digitalWrite(in1, LOW);
delay(1000);
digitalWrite(in1, HIGH);
delay(1000);
lcd.clear();
}
}