• Most regisztráltál, de nem tudsz privát üzenetet küldeni?

    Kérjük olvasd el milyen korlátozások vonatkoznak rád, miután regisztrációd jóvá lett hagyva.
    Regisztrációs korlátozások

Építsünk akváriumvezérlőt Arduino-ból

Annyit lehet csinálni DS1307-el hogy ráraksz egy pár pf-s forgókondit és belövöd a frekit pontosan 32768Hz-re. Mondjuk ehhez kell egy szkóp.Sajnos a legtöbb óramodul amivel én találkoztam ilyen volt.
Szia, nem küzdök ezekkel tovább. Rendeltem egy ds3231-t, ezt "High precision clock modul" néven terjesztik. Remélem, azzal már nem lesz gond. 5-6$ az is csak, rögtön ezzel kellett
volna kezdeni.
 
Így megy ez manapság sajnos :) Én is 1307-et rendeltem egyébként, de ha ugyanezt produkálja ki kell majd találnom valamit. Alapvetően NTP-vel akarnék szinkronizálni, de a hálózati kapcsolat + mobilalkalmazás kombó jó ha belekerül idén egyáltalán :\

A DS18B20 mennyire vált be Neked? Nálam az első tesztpanelen folyamatosan fölé mér pár fokkal. Mondjuk az is igaz, hogy én nem tokozva rendeltem és egyelőre levegőt mér. Remélem ha elkészül a vízhatlan ház nameg nem olvasgatom folyamatosan akkor megoldódik majd a probléma.
 
A DS18B20 mennyire vált be Neked? Nálam az első tesztpanelen folyamatosan fölé mér pár fokkal. Mondjuk az is igaz, hogy én nem tokozva rendeltem és egyelőre levegőt mér. Remélem ha elkészül a vízhatlan ház nameg nem olvasgatom folyamatosan akkor megoldódik majd a probléma.
Egyelőre az egész cucc a dobozában az akva mellett a parkettán figyel és próbaüzemel. A ds1820 is csak le van rakva mellé, majd hétvégén belógatom a vízbe, mennyire mutat hasonlót az akvárium hőmérővel. Most ránézésre jó hőfokot produkál. (Azért a 100-ad fokokat felkerekítettem, csak 1 tizedes jegyre jelez ki :))
 
Bocs, hogy beleszólok, de raspberry pi-vel kilométerekkel kevesebbet szívtatok volna, kb ugyanezért az árért. még csak nem is kéne rá külön net, időszinkron, időzítés. első körben egy sima crontabos script megoldotta volna, GPIO vezérlésekkel. van benne RTC, amit NTP-vel szinkronizálhatsz, távolról rá tudsz menni napközben, hogy minden OK-e, küld e-mailt ha baj van és ha nagyon belemerülsz, akkor tudsz rá írni egyszerűen egy webes configuráló cuccot. (bocs az OFF-ért, tudom, hogy ez arduino-s projekt).
 
Bocs, hogy beleszólok, de raspberry pi-vel kilométerekkel kevesebbet szívtatok volna, kb ugyanezért az árért. még csak nem is kéne rá külön net, időszinkron, időzítés. első körben egy sima crontabos script megoldotta volna, GPIO vezérlésekkel. van benne RTC, amit NTP-vel szinkronizálhatsz, távolról rá tudsz menni napközben, hogy minden OK-e, küld e-mailt ha baj van és ha nagyon belemerülsz, akkor tudsz rá írni egyszerűen egy webes configuráló cuccot. (bocs az OFF-ért, tudom, hogy ez arduino-s projekt).
Bocs, nem akarok platform háborút, de azért a raspberry másra való. És nem, nem akarok net-t vezetni a vezérlőmbe, nem akarok NTP-t, nem akarom távolról nézegetni.
Egy működő mikrokontroller vezérelt vezérlést akarok, ezt meg is tudtam csinálni. Óra gond volt, meg fog oldódni.
 
Én sem látom értelmét internetes vezérlőnek és egyéb bonyolításoknak. Ha egyszer be van állítva a rendszer, akkor úgysem fogja senki távolról piszkálni. Majd jön egy ügyes hacker aztán jól elállogatja a vezérlődet ;) .
Az egész vezérlős dologba annak idején azért jártam utána, mert sokan szívnak az olcsó kapcsolóórákkal, spec engem az is zavart, hogy két különböző órát használva (CO2, világítás) a a kapcsolási idők mindig elcsúsztak. Mivel ezek a vezérlők, és a korábban épített Omron Zen-es rendszerem egy órát használ, így ez alapban ki van zárva
Akvárium elektromos vezérlő kicsit másképp | Page 2 | Magyar Akvakertész Fórum
Arról nem is beszélve, hogy alapban is pontatlan volt mindkét cucc, és nekem este 7-kor, mikor lekapcsolt a világítás, akkor kellett mennem fürdetni az ikreket :)
A másik dolog, hogy sokan szeretnénk automatizálni a tápozást is, ehhez meg kell olyan eszköz ami másodpercenkéni időzítést is tud, vagy ha az ember kreatív akkor még injekciós fecskendőből is csinálhat tápadagolót, mert a vezérlője már megvan hozzá.
Szóval alap dolgokon kívül én nem látom értelmét másnak, látjátok Amano bácsi még CO2 vezérlőt sem használ pedig biztos megengedheti magának, jó neki a drop checker, egyszer belövi az időzítést és a bubiszámot aztán csókolom.
 
Victor,
:) pont most írtam neked erről. Mi elektronikai fejlesztéseket végeztünk, panelokat gyártottunk és fejlesztőeszközöket terveztünk. Van a polcon egy rakat saját cucc, de amikor összeszedtem, hogy na akkor mi lenne az egész lényege, akkor rájöttem, hogy nem kell ez igazából. OK a közös óra fontos lehet, de erre viszonylag olcsóbb megoldások is léteznek, mint az Omron PLC-k. Végiggondolva nekem(!) a táp adagoláson kívül nem kell más. Arra pedig van kész és olcsó megoldás.
Csak azért szóltam bele, mert végigfutottam a threadet és láttam, hogy RTC-kel szívnak meg NTP-ket akarnak így gondoltam segítek, de nem jött be :) az internetes vezérlőnek amúgy lenne értelme, utána lehetne menni egy csomó dolognak (alertek (magas-alacsony PH, nincs flow, nincs ÁRAM (gsm modullal 4e forintért, szünetmentessel, vízszint, hogy a legalapvetőbbeket említsem), állapot megtekintések, NTP, időjárás alapján világítás vagy egyéb szimuláció (pl milyen idő van most (illetve tegnap az időeltolódás miatt) ott, ahol az élőlényeid élnek, borult, esik, napsütés, etc...)

aztán mégis elég a dózispumpa vezérlés, készen, meg időkapcsoló és drop checker :) - legalábbis nekem.
 
Egyedül az alertek miatt gondoltam én is a netre. Mondjuk az is igaz, hogy ha épp nyaral pl. az ember és jön az üzenet, hogy megállt a szűrő azzal még nem feltétlenül van kisegítve :D

Egyébként több embedded linuxot futtató termék fejlesztésében közreműködtünk már, így többféle kiépítésben válogathatnék saját gyártású panelekből, de ezt azért túlzásnak éreztem erre a feladatra. Nameg hiányzott is már, hogy ilyesmivel bajoljak :)
 
az internetes vezérlőnek amúgy lenne értelme, utána lehetne menni egy csomó dolognak (alertek (magas-alacsony PH, nincs flow, nincs ÁRAM (gsm modullal 4e forintért, szünetmentessel, vízszint, hogy a legalapvetőbbeket említsem), állapot megtekintések, NTP, időjárás alapján világítás vagy egyéb szimuláció (pl milyen idő van most (illetve tegnap az időeltolódás miatt) ott, ahol az élőlényeid élnek, borult, esik, napsütés, etc...)

aztán mégis elég a dózispumpa vezérlés, készen, meg időkapcsoló és drop checker :) - legalábbis nekem.
Hát igen, el lehet ezt bonyolítani, ahogy az ember csak akarja: ha rákeresel, eszméletlen sensor választék van mindenhez. Bármit meg lehetne oldani - pénz és kitartás kérdése.
De a lényeg úgyis az, hogy mi kell neked. És ha az megvan és ok. hátra lehet dőlni és nézegetni a halacsokat.
 
Szép, igényes munka!
PH szenzoron nem gondolkodtál?
A tápozásnál érdemes lehet szintén lecserélni a "delay-t" "millis-re" (bár tudom jelenleg nincs jelentősége, hacsak nem pont akkor akarsz etetni is :)))

Üdv.
Szia, köszönöm.
Igen, a delay nagy ellensége vagyok :) Lustaságból maradt abban a részben, de már ki van váltva.
PH sensor kemény dió. Nézegettem az atlas megoldását, és ugye ők kb. 100$ -ért árulják a saját shield-jüket. De a sok ph kalibrálós folyadékkal a macera
visszatart a dologtól. Marad a jól bevált dropchecker :D
 
Nos, több heti próbaüzem után múlt szombaton élesben is üzembe lett állítva a vezérlő.
Az eredeti programhoz képest több változás lett, kisebb finomítások.
A valódi üzemben nem voltam megelégedve a napkelte-naplemente megoldással, túl sokáig van a kevés fény állapotban.
Ezért 30-ról 25 percre lett csökkentve a napkelte-lemente ideje és kicsit átalakítva.
Remélem, tetszik majd az élővilágnak így is :)
Sajnos, a szekrényem elég kicsi, ezért a kábelek elrendezésével még lehet küzdeni:
4ZYTvBgWJ35rqbwAjQWCTj


7ixRYqAd6uqKviGyaUU2BH


A hűtő ventillátor vezérlés még hiányzik a programból, de elnézve az időjárást, hamarosan el kell készülnie :D
És akkor még a progi a jelenlegi állapotában (elérte az 1.0.0 verziószámot! (y) )
http://ubuntuone.com/4At0OPgVbbANnDeJjSPCbn
 
Victor elképzelései és leírása alapján nagyon megtetszett ez a vezérlő ötlet. Nekem semmi gondom nem volt az óramodullal. A világítást, CO-t, levegőztetőt és a LED világítás hűtő ventillátorát kapcsolgatom vele. Mivel mindent innen merítettem, ezért gondoltam megosztom a "kész" kódot, hátha valaki tud belőle hasznosítani valamit.


Kód beillesztése:
/*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;
}
 
Bedobtam egy kód nézet ablakba. A szerkesztőn a média - kép beszúrás gombok mellett találjátok. Így sanszosabb, hogy a rendszer nem csapja ki a kód egy részét ha olyan karakterek kerülnének bele. Kérlek használjátok ti is a jövőben kód beillesztésre. Köszi :)(y)
 
Bedobtam egy kód nézet ablakba. A szerkesztőn a média - kép beszúrás gombok mellett találjátok. Így sanszosabb, hogy a rendszer nem csapja ki a kód egy részét ha olyan karakterek kerülnének bele. Kérlek használjátok ti is a jövőben kód beillesztésre. Köszi :)(y)
Szia Viktor!
Köszi az infot, hasznos :)
 
Victor elképzelései és leírása alapján nagyon megtetszett ez a vezérlő ötlet. Nekem semmi gondom nem volt az óramodullal. A világítást, CO-t, levegőztetőt és a LED világítás hűtő ventillátorát kapcsolgatom vele. Mivel mindent innen merítettem, ezért gondoltam megosztom a "kész" kódot, hátha valaki tud belőle hasznosítani valamit.


Kód beillesztése:
/*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;
}


Szeretnék én is egy hasonló vezérlőt, beillesztenél egy pontos alkatrész listát? Amennyiben a fórumszabályzat engedi, akkor egy linket is, hogy honnan lehet megrendelni.
Köszönöm!
 
Szeretnék én is egy hasonló vezérlőt, beillesztenél egy pontos alkatrész listát? Amennyiben a fórumszabályzat engedi, akkor egy linket is, hogy honnan lehet megrendelni.
Köszönöm!
Szia!
A pontos alkatrészlista a bejegyzés elején megtalálható.
Arduino alapmodul
DS1307 óramodul
Relé modul (4 relés nekem)
LCD kijelző modul
2 db termisztor
 
Back
Oldal tetejére