Vous êtes sur la page 1sur 7

//senzor de temperatura ds18s20

#include <LiquidCrystal.h>
#include <avr/EEPROM.h>
#include <OneWire.h>

//definire variabile
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //setare LCD 2x16
OneWire ds(10); //setare pin senzor temperatura
int sondaph = 5; //setare pin sonda PH
int buton = 4; //setare pin buton de control
int supapa = 13; //setare pin comanda electrovalva
int releu1 = 12; //setare pin releu incalzitor
float pmax, pmin, ph, prag, temp, tmax, tmin, pragt;
boolean EV,R1 = false;
//pun sonda in PH7 si reglez la primul etaj 0V din calib si 2.1V la al 2-lea eta
j din offset
//pun sonda in PH4 si reglez 1.2V la al doilea etaj din slope
//functiile de scriere/citire a unui float in EEPROM
float readFloat(int address)
{
float out;
eeprom_read_block((void *) &out, (unsigned char *) address ,4 );
return out;
}
void writeFloat(float value, int address)
{
eeprom_write_block((void *) &value, (unsigned char *) address ,4);
}

//meniu configurare
void meniu()
{
int cursor=0;
boolean gata=false;
lcd.clear();
lcd.print("config menu");
delay (2000);
while (gata == false)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("PH");
lcd.setCursor(11,0);
lcd.print("Temp");
lcd.setCursor(0,1);
lcd.print("Cal");
if (analogRead(buton) > 330 & analogRead(buton) < 350)//jos
{
if ( cursor == 2 )
{
cursor = 0;
}
else cursor = cursor + 1;
}
else if (analogRead(buton) > 490 & analogRead(buton) < 520) //sus
{
if (cursor == 0)
{
cursor = 2;
}
else cursor = cursor - 1;
}
switch (cursor)
{
case 0: //ph
lcd.setCursor(3,0);
lcd.print("<");
break;
case 1: //cal
lcd.setCursor(3,1);
lcd.print("<");
break;
case 2: //Temp
lcd.setCursor(15,0);
lcd.print("<");
break;
}
if (analogRead(buton) == 1023)
{
lcd.clear();
lcd.print("Set");
delay(1000);
lcd.clear();
if (cursor == 0)
{
while (analogRead(buton) != 1023)
{
lcd.print("PH");
lcd.setCursor(0,1);
if (analogRead(buton) > 330 & analogRead(buton) < 350) //jos
{
if (prag == 3)
{
prag = 7.99;
}
else prag = prag - 0.01;
}
if (analogRead(buton) > 490 & analogRead(buton) < 520) //sus
{
if (prag == 7.99)
{
prag = 3;
}
else prag = prag + 0.01;
}
lcd.print(prag);
delay(100);
lcd.clear();
}
}
else if (cursor == 1)
{
while (analogRead(buton) != 1023)
{
lcd.print("Calibration");
delay(300);
//aici o sa fie procedura de calibrare care deocamdata nu merge
:)
lcd.clear();
}
}
else if (cursor == 2)
{
while (analogRead(buton) != 1023)
{
lcd.print("Temp");
lcd.setCursor(0,1);
if (analogRead(buton) > 330 & analogRead(buton) < 350)//jos
{
if (pragt == 20)
{
pragt = 33;
}
else pragt = pragt - 0.05;
}
if (analogRead(buton) > 490 & analogRead(buton) < 520) //sus
{
if (pragt == 33)
{
pragt = 20;
}
else pragt = pragt + 0.05;
}
lcd.print(pragt);
delay(100);
lcd.clear();
}
}
gata = true;
}
delay(300);

}
writeFloat(prag,0);
writeFloat(pragt,4);
delay(300);
lcd.clear();
lcd.print("saved ...");
pmax=prag+0.04; //setare tolerante => vezi si in setup
pmin=prag-0.04;
tmax=pragt+0.4;
tmin=pragt-0.4;
delay(2000);
lcd.clear();
}

// citire ph
float readph()
{
float p4, p7;
p4=238; //valori determinate manual la calibrare, reprezinta ce a citit
DAC-ul pt ph4 si ph7
p7=428;
return ((3*analogRead(sondaph)+4*p7-7*p4)/(p7-p4));
}

// citire temperatura de la senzor


float readtemp()
{
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int HighByte, LowByte, TReading;
ds.search(addr);
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power
on
present = ds.reset();
ds.select(addr);
ds.write(0xBE);

for ( i = 0; i < 9; i++)


{
data[i] = ds.read();
}
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
return TReading*0.0625;
}

//functia de afisare ph
void phcomp(int stare)
{
ph=readph();
lcd.setCursor(0,0);
lcd.print("PH ");
lcd.print(ph);
lcd.setCursor(9,0);
lcd.print(prag);
lcd.setCursor(15,0);
switch (stare)
{
case 1:
lcd.write(255);
case 0:
lcd.write(219);
case 2:
if (EV == true) lcd.write(255);
else lcd.write(219);
}
}

//functia de afisare temperatura


void tcomp(int stare)
{
temp=readtemp();
lcd.setCursor(0,1);
lcd.write(223);
lcd.print("C ");
lcd.print(temp);
lcd.setCursor(9,1);
lcd.print(pragt);
lcd.setCursor(15,1);
switch (stare)
{
case 1:
lcd.write(255);
case 0:
lcd.write(219);
case 2:
if (R1 == true) lcd.write(255);
else lcd.write(219);
}
}

//initializarea la boot cu citirea pragului din EEPROM si mesaj de intampinare


void setup()
{
// Serial.begin(9600);
ph=readph(); //citesc ph
temp=readtemp(); //citesc temperatura
prag=readFloat(0); //citeste pragurile-ul din EEPROM
pragt=readFloat(4);
// writeFloat(25,4); //necesar doar la prima programare ca sa p
ice pragt in pragul de la if
pmax=prag+0.04; //setare tolerante => vezi si in functia d
e meniu
pmin=prag-0.04;
tmax=pragt+0.4;
tmin=pragt-0.4;
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
digitalWrite(supapa, LOW);
digitalWrite(releu1, LOW);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(4,0);
lcd.print("AquaCOMP");
lcd.setCursor(0,1);
lcd.print("(c)Ovidiu - 2010");
delay(2000);
lcd.clear();
}

//bucla principala
void loop()
{
// Serial.println(analogRead(sondaph));
//verificare ph
if (ph > pmax && EV == false)
{
digitalWrite(supapa, HIGH);
EV = true;
phcomp(1);
}
else if (ph < pmin && EV == true)
{
digitalWrite(supapa, LOW);
EV = false;
phcomp(0);
}
else
{
phcomp(2);
}

//verificare temperatura
if (temp < tmin && R1 == false)
{
digitalWrite(releu1, HIGH);
R1 = true;
tcomp(1);
}
else if (temp > tmax && R1 == true)
{
digitalWrite(releu1, LOW);
R1 = false;
tcomp(0);
}
else
{
tcomp(2);
}

//intrare in meniu
if (analogRead(buton) == 1023)
{
meniu();
}
else
{
delay(300);
}
}

Vous aimerez peut-être aussi