/*Akvárium vezérlő 1.0
Szükséges könyvtárak importálása*/
#include <DS1307RTC.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
/*Konstansok deklarálása*/
#define rtc 0x68 // DS1307 óramodul előre meghatározott címe
#define I2C_ADDR 0x20 // PCF8574T LCD előre meghatározott címe
//PCF8574 pin kioszása az LCD érintkezőire
// Különbözik az előző LCD kiosztásoktól
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
#define LED_OFF 1
#define LED_ON 0
#define Repeat 30 //Hőmérséklet meddig maradjon más mielőtt vált
#define Change 300 //Kijelzés váltás idő beállítás
/*Globális változók deklarálása*/
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
byte ss,mm,hh,d,DD,MM,YY,mode;
const char *months[] = {
" Jan.", " Feb.", " Mar.", " Apr.", " May.", " Jun.",
" Jul.", " Aug.", " Sep.", " Oct.", " Nov.", " Dec."
};
int ThermistorPinLED = A0; //Termistor analog0 pin-re kötve LED hőmérőnek
int ThermistorPinWater = A1; //Termistor analog1 pin-re kötve vízhőmérőnek
//Digitális pin-ek elnevezése ahová a reléket kötjük
byte CO2 = 8; //CO2 mágnesszelep (relé 1)
byte AIR = 9; //Levegőztető (relé 2)
byte LIG = 10; //Világítás (relé 3)
byte FAN = 11; //LED-ek hűtőventilátora (relé 4)
byte CO2_ON_hh = 9; //CO2 bekapcsolás óra
byte CO2_ON_mm = 00; //CO2 bekapcsolás perc
byte CO2_OFF_hh = 19; //CO2 kikapcsolás óra
byte CO2_OFF_mm = 30; //CO2 kikapcsolás perc
boolean CO2_ON = false;
byte AIR_ON_hh = 00; //Levegő bekapcsolás óra
byte AIR_ON_mm = 00; //Levegő bekapcsolás perc
byte AIR_OFF_hh = 5; //Levegő kikapcsolás óra
byte AIR_OFF_mm = 00; //Levegő kikapcsolás perc
boolean AIR_ON = false;
byte LIG_ON_hh = 10; //Lámpa bekapcsolás óra
byte LIG_ON_mm = 00; //Lámpa bekapcsolás perc
byte LIG_OFF_hh = 20; //Lámpa kikapcsolás óra
byte LIG_OFF_mm = 00; //Lámpa kikapcsolás perc
boolean LIG_ON = false;
byte FAN_ON = 45; //LED ventilátor bekapcsolás hőfok
boolean FAN_runs = false;
byte Old_Temp_LED = 0;
byte Old_Temp_Water = 0;
byte counter = 0; //Hőmérséklet break stop számlálója
int Display_Loop = 0; //Kijelzés váltás számlálója
void setup() /* SETUP: 1x fut le a program elején*/
{
pinMode(CO2, OUTPUT); //pin-ek beállítása kimenetnek
pinMode(AIR, OUTPUT);
pinMode(LIG, OUTPUT);
pinMode(FAN, OUTPUT);
digitalWrite(CO2, HIGH); //relék így vannak alapállapotban
digitalWrite(AIR, HIGH);
digitalWrite(LIG, HIGH);
digitalWrite(FAN, HIGH);
Wire.begin();
lcd.begin (16,2); // LCD beállítása
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(LED_ON); // Háttérvilágítás bekapcsolása
byte CO2[8] = {0,0,0,12,18,4,8,30}; //Kis 2-es karakter
byte Deg[8] = {1,12,18,16,16,18,12,0}; //° karakter
lcd.createChar(2,CO2); //Tárolás LCD karaktertáblába (0..7)
lcd.createChar(1,Deg);
lcd.clear(); //LCD törlés
lcd.home();
Serial.begin(9600);
//set_time(); //Óra beállításkor kell csak
}// END Setup
void loop() /* LOOP: ismétlődik futás alatt */
{
lcd.backlight(); //Ha nem világítana most fog
byte PrintLEDTemp = get_LED_temp(); //LED termisztor kiolvasása rutin hívása és PrintLEDTemp-be tárolás
byte PrintWaterTemp = get_Water_temp();//Víz termisztor kiolvasása rutin hívása és PrintWaterTemp-be tárolás
if (Display_Loop == 0) {lcd.clear();}
if (Display_Loop <= Change)
{
Output_Status();
Display_Loop ++;
}
if (Display_Loop == Change+1) {lcd.clear();}
if (Display_Loop > Change)
{
DATE();
Display_Loop ++;
}
if (Display_Loop == Change*3)
{
Display_Loop = 0;
}
if (counter == Repeat && PrintWaterTemp != Old_Temp_Water)
{
Old_Temp_Water = PrintWaterTemp;
}
if (counter == Repeat && PrintLEDTemp == Old_Temp_LED)
{
counter = 0;
}
if (counter == Repeat && PrintLEDTemp != Old_Temp_LED)
{
Old_Temp_LED = PrintLEDTemp;
counter = 0;
}
if (PrintLEDTemp >= FAN_ON) //LED hőmérséklet ellenőrzés, ha kell venti bekapcs
{
digitalWrite(FAN, LOW);
FAN_runs = true;
}
if (FAN_runs && Old_Temp_LED == FAN_ON-10)
{
digitalWrite(FAN, HIGH);
FAN_runs = false;
}
get_time();
//CO2 idő ellenőrzés
if ((hh*60+mm) >= (CO2_ON_hh*60+CO2_ON_mm) && (hh*60+mm) < (CO2_OFF_hh*60+CO2_OFF_mm)) //az ellenőrzéshez az órát át kell alakítani perccé és összeadni a perccel
{
digitalWrite(CO2, LOW);
CO2_ON = true;
}
else
{
digitalWrite(CO2, HIGH);
CO2_ON = false;
}
//Levegő idő ellenőrzés
if ((hh*60+mm) >= (AIR_ON_hh*60+AIR_ON_mm) && (hh*60+mm) < (AIR_OFF_hh*60+AIR_OFF_mm))
{
digitalWrite(AIR, LOW);
AIR_ON = true;
}
else
{
digitalWrite(AIR, HIGH);
AIR_ON = false;
}
//Világítás idő ellenőrzés
if ((hh*60+mm) >= (LIG_ON_hh*60+LIG_ON_mm) && (hh*60+mm) < (LIG_OFF_hh*60+LIG_OFF_mm))
{
digitalWrite(LIG, LOW);
LIG_ON = true;
}
else
{
digitalWrite(LIG, HIGH);
LIG_ON = false;
}
} // END Loop
void get_time() //Idő kiolvasási rutin
{
Wire.beginTransmission(rtc); // start communication over i2c with DS1307
Wire.write(0x00); // Write the value of the register to point to
Wire.endTransmission(); // End communication over i2c with DS1307
Wire.requestFrom(rtc,7); // This will request 7 bytes of data
//starting from the '0' the register
ss=bcd_to_dec(Wire.read());
mm=bcd_to_dec(Wire.read());
hh=bcd_to_dec(Wire.read());
d=bcd_to_dec(Wire.read());
DD=bcd_to_dec(Wire.read());
MM=bcd_to_dec(Wire.read());
YY=bcd_to_dec(Wire.read());
Wire.endTransmission();
}
void set_time() //Idő beállítási rutin
{
Wire.beginTransmission(rtc);
Wire.write(0x00);
Wire.write(dec_to_bcd(50)); // seconds
Wire.write(dec_to_bcd(30)); // minutes
Wire.write(dec_to_bcd(20)); // hours
Wire.write(dec_to_bcd(6)); // day of the week, startin monday
Wire.write(dec_to_bcd(11)); // date
Wire.write(dec_to_bcd(05)); // month
Wire.write(dec_to_bcd(13)); // year
Wire.endTransmission();
}
void Output_Status()
{
lcd.setCursor(0,0);
lcd.print("CO");
lcd.write(byte(2));
lcd.print(":");
if (CO2_ON) {lcd.print("ON ");}
else {lcd.print("OFF");}
lcd.setCursor(9,0);
lcd.print("LIG:");
if (LIG_ON) {lcd.print("ON ");}
else {lcd.print("OFF");}
lcd.setCursor(0,1);
lcd.print("AIR:");
if (AIR_ON) {lcd.print("ON ");}
else {lcd.print("OFF");}
lcd.setCursor(9,1);
lcd.print("FAN:");
if (FAN_runs) {lcd.print("ON ");}
else {lcd.print("OFF");}
}
void DATE()
{
get_time(); //Óra kiolvasása
lcd.setCursor(8,0); //Idő kiíratása
if (hh < 10) {lcd.print("0");}
lcd.print(hh);
lcd.print(":");
if (mm < 10) {lcd.print("0");}
lcd.print(mm);
lcd.print(":");
if (ss < 10) {lcd.print("0");}
lcd.print(ss);
lcd.setCursor(9,1); //Dátum kiíratása
lcd.print(months[MM-1]);
if (DD < 10) {lcd.print("0");}
lcd.print(DD);
lcd.setCursor(0,0);
lcd.print("LED:"); //LED hőmérséklet kiíratás
lcd.setCursor(0,1);
lcd.print("Viz:"); //LED hőmérséklet kiíratás
if (counter != Repeat) //Szám brékelés elkerülésére csak akkor váltson a kijelzőn az érték, ha a counter által meghat. ciklusig más volt a kijelzett és a kiolvasott érték
{
lcd.setCursor(4,0);
if (Old_Temp_LED < 10) {lcd.print("0");}
lcd.print(Old_Temp_LED);
lcd.write(byte(1));
lcd.setCursor(4,1);
if (Old_Temp_Water < 10) {lcd.print("0");}
lcd.print(Old_Temp_Water);
lcd.write(byte(1));
counter ++;
}
}
int dec_to_bcd(int dec)
{ return dec/10*16 + (dec%10);}
int bcd_to_dec(int bcd)
{ return bcd/16*10 + (bcd%16);}
byte get_LED_temp() //LED hőmérséklet kiolvasási rutin
{
int CurrentTemp = analogRead(ThermistorPinLED); //Termisztor érték kiolvasás LED hőfok
byte Temp = (CurrentTemp-310)/8.5; //Átváltás C°-ra
if (CurrentTemp <= 310) {Temp = 0;}
return Temp;
}
byte get_Water_temp() //Víz hőmérséklet kiolvasási rutin
{
int CurrentTemp = analogRead(ThermistorPinWater); //Termisztor érték kiolvasás Víz hőfok
byte Temp = (CurrentTemp-310)/8.5; //Átváltás C°-ra
if (CurrentTemp <= 310) {Temp = 0;}
return Temp;
}