Tartalom:
- Hat helység led világításának vezérlése fényerőszabályzással
- Fényerő fel és leúsztatás
- Kikapcsolási késleltetés, minden helyiség világításának kikapcsolása bárhonnan a világítás kapcsolókról
- Paraméterek beállítása működés közben a világításkapcsolókról
- Hagyományos világítás vezérlése is
- ATmega328P vezérlő
Lakásunkban már szinte minden világitás ledes. Ezeket a led világításokat magam szerelgettem boltban kapható led szalagokból és led modulokból. Boltban kapható 12V kapcsoló üzemű tápegységeket használtam, esetenként 24V-os printer tápegységet. Dögös áramokról van szó, itt 10A-ek röpködnek. Kezdetben relével kapcsoltam be a világítást, egy primitív áramkörrel. Szerettem volna, ha egy kicsit komfortosabb a működés, pl. bárhonnan le tudom kapcsolni az összes szobában a világítást, de azt is nagyon szerettem volna, ha éjszaka felkapcsolva a villanyt, nem vakít el a hirtelen nagy fény, hanem lassan kúszik fel a fényerő. Ezért kezdtem bele ennek az áramkörnek a megépítésébe.
Az a fotó a megvalósított kapcsolást mutatja. Középen a vezérlő az ATmega328 chip-el, alul a hűtőbordán a MOSFET tranzisztorok, amikkel a 12 vagy 24V feszültséget kapcsolgatom a pwm jellel a fényerő szabályozáshoz. Nem kelett volna ekkora hűtőborda, de csak ekkora volt a fiókban. A MOSFET tranzisztorok működéséről az elektronikai alapokról szóló leírásomban olvashatsz! Alig van valami alkatrész benne!
Nagy előnye még ennek a kapcsolásnak, hogy egy szobában több kapcsolót is el lehet helyezni, párhuzamosan köthetők, és bármelyikről fel és le kapcsolható a villany. Ez a kényelem ma még nem teljesen egyértelmű. A szokásos villanyszerelők által bekötött alternatív kapcsolás nem pont ugyanez. Kaphatók készen villamos hálózatba szabvány módon beköthető elektronikus kapcsoló áramkörök, darabja 9-10.000Ft. Nekem az egész került ennyibe (led világítás nélkül).
Álltalános leírás a működésről
Az alapvető cél, hogy egy fényerőszabályozható (pwm) LED világításból és hagyományos 230V-os, relével vagy más módon kapcsolt világításból álló lakásvilágítást intelligens módon lehessen vezérelni. Összesen nyolc csatornás világításvezérlést valósít meg a program, ahol egy csatorna egy fali kapcsoló – lámpa párost jelent.
Lakás világítás vezérlésem tulajdonságai, ha az alkalmazott mikrovezérlő ATmega168 vagy ATmega328:
- Maximum 6 db fényerőszabályozott kimenet és még 2 db digitális (relével stb. kapcsolható) kimenet.
- Minden fényerőszabályozott kimenet átállítható digitális vagy fényerőszabályozott működésre. Ha a programot beégetitek, alapértelmezetten fényerőszabályzás nélküliek a kimenetek.
- A nem fényerőszabályozott (digitális) kimenetek a fali kapcsolóval ki és bekapcsolhatók egy lenyomással (klikkeléssel), vagyis minden fali kapcsoló “csengő kapcsoló” kell, hogy legyen. Sajnos a hagyományos kétállású kapcsolókat (fel/lekapcsolókat) le kell cserélni! A mi lakásunkban szinte minden helységnek két bejárata van (a lakás körbejárható), így minden bejárathoz került egy fali kapcsoló. A kapcsolók párhuzamosan vannak kötve, így bármelyikről kapcsolható a világítás. Egyik ajtón bejövök és felkapcsolom, a másikon kimegyek és lekapcsolom.
- A fényerőszabályozott kimeneteket a hozzájuk tartozó kapcsolókkal a következő módon lehet vezérelni:
- Egy klikkel ki és be lehet kapcsolni. Bekapcsoláskor a fényerő nem ugrik azonnal maximumra, beállítható ütemben úszik fel egy beállított fényerőre. Kikapcsoláskor a világítás villan egy rövidet, ezzel jelzi, hogy megkezdődött a fényerőcsökkentés, ami egy 20%-os minimum fényerő eléréséig tart. Ekkor beindul a segédfény funkció, ami beállítható ideig tartja ezt a fényerőt, hogy ne kelljen vaksötétben kimenni a helységből. A beállított idő után a segédfény kikapcsol.
- A lámpa bekapcsolható a fali kapcsoló folyamatos nyomva tartásával is. A kapcsoló lenyomását követően az ismétlési idő elteltével (alapértelmezetten 500msec), minimum fényerővel kezd világítani a lámpa és folyamatosan emelkedik a fényerő a maximum felé. A maximum elérésekor a lámpa villan egyet. A kapcsolót bármely fényerőnél elengedjük, az aktuális fényerőt a rendszer megjegyezi, és következő felkapcsoláskor erre a fényerő értékre áll be a lámpa fényereje.
- Ha a lámpa világit, a fali kapcsoló folyamatos nyomva tartásával a fényerő növelhető a maximumig. Ha a fényerő a maximumot elérte, a lámpa villan (elalszik egy pillanatra). Újabb ismételt nyomva tartással a fényerő minimumig csökken. Ha a fényerő éppen megfelelő, elengedjük a nyomógombot és az így beállított fényerőt a rendszer tárolja (ez a fényerő érték a tápfesz kimaradáskor elveszik, újra be kell állítani). Ha a lámpát lekapcsoljuk, és újra bekapcsoljuk a tárolt fényerővel fog világítani. Természetesen a fényerő felúszik a beállított fényerőre, és leúszik a minimum fényerőig, amelyen a segédfény funkcióra beállított ideig még világít.
- Bármely fali kapcsoló dupla lenyomásával (dupla klikk), az összes lámpát lekacsolja a rendszer. Ez a funkció a fényerőszabályozott és nem fényerőszabályozott lámpákra is működik, a fényerőszabályozott részeken fényerő leúsztatás és segédfény funkció is működik. Mivel egy vezérlővel csak maximum 8 világítás vezérelhető, vannak bővítő ki és bemenetek ehhez a funkcióhoz. A bővítő kimeneten a tripla klikk egy rövid 10msec-es impulzust generál, ami egy másik hasonló vezérlő bővítő bemenetére köthető. A bemeneten megjelenő impulzus hatása azonos a tripla klikkel, vagyis az összes lámpa lekapcsol. Ez a bemenet esetleg egy központi lámpa lekapcsolásra is felhasználható, pl. a riasztó élesítése lekapcsolja a lámpákat. Segédfény funkció természetesen ekkor is működik!
- Bármely fali kapcsoló négyszeri lenyomása (4 klikk) bekapcsolja a „nyaralás” üzemmódot. Ez jelenleg még fejlesztés alatt áll. Lényege, hogy a vezérlő figyeli a világítási szokásokat, és ezen megtanult értékek alapján véletlenszerűen, de élet szerűen kapcsolgatja a villanyokat az esetleges rablók megtévesztésére. Természetesen más funkció is kialakítható, de én ezt terveztem a rendszerbe. A funkció megvalósítása óra funkció és külső memória beépítést is megköveteli, ezért is várat magára a fejlesztés.
- Bármely fali kapcsoló ötszöri lenyomása (5 klikk) az adott kapcsolóhoz tartozó lámpa működési paramétereinek a beállítására szolgáló setup folyamat elindulását eredményezi. Setup folyamat leírását lásd később.
Ezeket a funkciókat egy jelentősen leegyszerűsített egy „CSATORNÁS” programban is közzétettem. Ha valakinek nincs szüksége hat fényerőszabályozott csatornára, akkor ezt a programot fel tudja használni. Lényegesen egyszerűbb program, alaposan felkommenteztem! A forráskódok menüben több más program között ez is megtalálható.
Az egyes lámpák (csatornák) beállítható paraméterei
Összesen nyolc csatornát lehet vezérelni, ezek hivatkozása 0-7 közötti index értékkel történik. A programban egy be[] nevű tömb változóban lehet megadni a fizikai mikrovezérlő lábakat, melyeket bemenetnek definiálunk. A mellékelt programban mind a 6 analóg bemenet digitális bemenetnek lett definiálva. A ki[] nevű tömb változóban kell megadni a kimeneti lábakat. Ezzel szinkronban kell megadni a pwm_hdvr_mask[] tömb változóban, hogy melyek a pwm kimenetek, hiszen a program csak ezek fényerő szabályozását kezelheti, a többi kimenetet csak fel-le kapcsolgatja. Ezen változók jelenlegi beállításai:
be[]={14,15,16,17,18,19,0,1};
ki[]={3,5,6,9,10,11,2,4};
pwm_hdvr_mask[]={1,1,1,1,1,1,0,0}; //a 2,4 láb nem lehet pwm, ezért 0
Az egyes csatornák többféle tulajdonságát a felhasználó működés közben is megváltoztathatja. Ezt azért építettem be, mert a lakásvilágításomat folyamatosan fejlesztem (cserélem a hagyományos lámpákat fényerőszabályozható led világításra, illetve ha egy LED lámpa elromlik, gyorsan tudom helyettesíteni hagyományos lámpával), és nem akartam minden egyes változtatásnál programot módosítani és a mikrovezérlő beégetésével bajlódni.
A paraméterek:
- Csatorna típusa: pwm be és kikapcsolás (ki_pwm nevű tömb) 1-nincs pwm bekapcsolva, 2-pwm be van kapcsolva a csatornán. Ha van pwm, akkor működik a fényerő fel/leúsztatás, és beállítható az alapértelmezett fényerő, amire a lámpa beáll a felkapcsolást követően. Ekkor van segédfény funkció is.
- Klikkek közötti maximális várakozási idő: (klikk_wait_time nevű tömb) A beállított érték * 100msec ideig várakozik a program a következő klikkelésre ahhoz, hogy többszörös klikkelésnek érzékelje azokat (alapértelmezett 5 vagyis 500msec). Vagyis ha 500msec-en belül klikkelünk még egyet, akkor kétszeres, háromszoros stb. klikknek érzékeli a program. Ha 500msec-en belül nem érkezik klikk, akkor befejezi a klikkek számolását és az addigi klikkelések számához tartozó parancsot hajtja végre. Felkapcsolja a lámpát, beállítja a maximális fényerőt stb. Túl kicsire nem érdemes állítani, mert egy fali kapcsolóval nem lehet túl gyorsan klikkelni és esetleg csak fel és le fogjuk tudni kapcsolni a lámpát. Azonban túl lassúra sem érdemes állítani, mert ha felkapcsoljuk a lámpát és gyorsan szeretnénk mégis lekapcsolni, akkor meg kell várnunk ezt az időt, különben többszörös klikknek érzékeli a program és valami mást fog csinálni. Fontos tudni, hogy a klikkeléseket akkor is számolja a program, ha nincs az adott csatornán beállítva pwm mód. A lámpák lekapcsolása, nyaralásmód bekapcsolása és a setup mód ezeken a csatornákon is kiadható. A dupla klikkeknek azonban nem lesz hatása, mert nem fognak fényerőt növelni, vagy csökkenteni.
- Fel/le úsztatási idő: (fade_time nevű tömb). A beállított érték * 0,5sec (alapértelmezett 6, vagyis 3 sec) alatt úsztatja fel vagy le a fényerőt a maximumról minimumra. Csak ha van pwm beállítva, akkor értelmezett és felhasznált érték)
- Segédfény ideje: (assistance_time nevű tömb). A (beállított érték-1) * 3sec ideig minimális fényerőn fog világítani a lámpa a kikapcsolást követően. Ha értéke 1, akkor nincs segédfény bekapcsolva. Ha értéke 2 akkor 3sec stb. Csak ha van pwm, akkor értelmezett és felhasznált érték)
A setup folyamata
Elismerem, hogy ez a folyamat marhabonyolultnak látszik. Gyakorlatilag csak „papírból” lehet végigcsinálni. Szerencsére nem kell hozzányúlni gyakran. Öt év alatt talán háromszor állítgattuk feleségemmel, főleg a segédfénnyel kísérletezgettünk. Korrigálom magam, nem papírból csináltam a beállítást, a weblapomat használtam tablettel! Én már csak ilyen korszerű vagyok.
- Klikkeljünk a fali kapcsolóval ötször (a fali kapcsolót nyomjuk le gyorsan egymás után ötször). Bármely csatorna setup módja alatt a rendszerbe kötött többi kapcsoló nem működik, a többi lámpa megőrzi aktuális állapotát.
- A kapcsolóhoz tartozó lámpát a program két rövid és egy hosszabb (ti-ti-tá) időre felkapcsolja (villogtatja a lámpát).
- Ekkor klikkelések (fali kapcsoló gyors egymásutáni kapcsolgatásával) kell megmondanunk, hogy melyik paramétert akarjuk állítani. Két klikkelés között nem telhet el több mint 500msec. A következő paramétereket tudjuk beállítani:
1 klikk: pwm szabályozás ki vagy be kapcsolása
2 klikk: klikkelések közötti maximális ismétlési idő.
3 klikk: fel és leúsztatási idő beállítása
4 klikk: segédfény világítási ideje a lámpa leikapcsolás után
Az első klikkelésig maximum 5 másodperc áll rendelkezésre. Ha addig nem történik klikk, akkor a kapcsolóhoz tartozó lámpa rövid villantásával jelzi a program, hogy kilépett a setup módból.
- Miután befejeztük a klikkeléseket (az utolsó klikk után eltelt 500msec) a lámpa felvillan annyiszor, ahány klikkelést végeztünk. Ezzel ellenőrizhető, hogy melyik paramétert fogjuk beállítani. Ha netán nem a megfelelő paramétert sikerült „leklikkelni” akkor ezen a ponton várjunk 5 másodpercet, és a program vissza fog térni a 2. pontban leírt állapotba (levillogtatja a ti-ti-tá setup mód nyitó üzenetet), és kezdhetjük elölről a paraméter megadást.
- Most következik a paraméter értékének beállítása. A klikkelések megkezdésére 4 másodperc áll rendelkezésre. Itt is 500msec telhet el maximum két gombnyomás között. A következő értékek állíthatóak be az egyes paraméterek esetén:
1-es paraméter, pwm ki és bekapcsolás:
1 klikk pwm mód kikapcsolva
2 klikk pwm mód bekapcsolva
2-es paraméter, max. ismétlési idő: (1-10 klikk)
1 klikk 100msec,
2 klikk 200msec stb.
3-as paraméter, fel és leúsztatási idő: (1-10 klikk)
1 klikk 500msec,
2 klikk 1sec stb.
4-es paraméter, segédfény funkció: (1-15 klikk)
1 klikk segédfény kikapcsolva
2 klikk 3 sec
3 klikk 6 sec stb.
5-ös paraméter, segédfény funkció: (1-9 klikk)
1-1%,
2-3%,
3-5%,
4-10%,
5-15%,
6-20%,
7-30%,
8-40%,
9-50%
A paraméter érték beállítás megkezdéséhez, azaz az első gombnyomás megkezdéséhez 4 másodperc áll rendelkezésre. Ha nem teszünk semmit, akkor 4 másodperc után a program a paraméter értékét nem változtatja meg, és visszalép a 2. pontban leírt állapotba. (felvillantja a lámpát két rövid és egy hosszú villanással (ti-ti-tá), és várja a paraméter kiválasztását).
- Amint leklikkeltük a paraméter értékét, az utolsó klikk után 1 másodperccel a program levillogtatja a fogadott klikkek számát. Ezzel ellenőrizhetjük a beállított értéket, ami tárolásra is került. Ezt követően visszatér a program a 2. pontban leírt állapotba. (felvillantja a lámpát két rövid és egy hosszú villanással (ti-ti-tá), és várja a paraméter kiválasztását).
- Kiválaszthatjuk a következő paramétert, és annak értékét, vagy nem nyúlunk a kapcsolóhoz, és 5 másodperc múlva a lámpa rövid felvillanása jelzi, hogy kiléptünk a setup módból.
Gyári alapértelmezett értékek beállítása
Ehhez tegyünk a mikrovezérlő 7-es lábára egy kapcsolót, illetve valamilyen más módon kössük GND-re. Áramtalanítsuk a mikrovezérlőt és helyezzük áram alá úgy, hogy közben a 7-es láb földre van kötve. Pár másodperc után a láb GND-re kötését megszüntethetjük, mintavétel a láb állapotáról csak induláskor történik. Ha a program induláskor a 7-es lábon logikai 0-át talál, akkor az EEPROM-ba beírja az alapértelmezett értékeket. Következő induláskor már ezeket az értékeket fogja kiolvasni, illetve a setuppal ezeken az értékeken változtathatunk.
Forráskód:
#include <EEPROM.h> //segéd változók byte sw_prell[]={0,0,0,0,0,0,0,0}; //kapcsoló prell figyeléshez long sw_time[]={0,0,0,0,0,0,0,0}; //kapcsoló lenyomás prell figyeléshez eltelt idő az első kontaktus óta long sw_on_time[]={0,0,0,0,0,0,0,0}; //a lenyomvatartás kezdő időpontja (millis()) byte sw_valt[]={0,0,0,0,0,0,0,0}; //segéd változó, amig nincs ujabb klikk, addig blokkolja az állapot változást byte sw_prev_stat[]={0,0,0,0,0,0,0,0}; //kapcsoló előző ciklusbani állapotát tárolja. Kapcsoló lenyomás és elengedés //érzékeléséhez kell byte lamp_prev_stat[]={0,0,0,0,0,0,0,0}; //lampa előző ciklusbani éllapotát tárolja lámpa felkapcsolás és lakapcsolás //érzékeléshez kell long sw_nosens_time[]={0,0,0,0,0,0,0,0}; //a következő klikk megérkezéséig számolja az időt (ha több mint egy megadott érték, //akkor nem jött további kapcsolás és ezt véglegesítjük) byte sw_nosens[]={0,0,0,0,0,0,0,0}; //ha bebillentjük 1-be akkor figyeli, hogy jön-e új klikk byte sw_nosens_prev_stat[]={0,0,0,0,0,0,0,0}; //sw_nosens előző ciklusbeni állapota byte fenyero_tmp[]={0,0,0,0,0,0,0,0}; //a fényerő felés leusztatááskor az éppen aktuális fényerő értéke long fenyero_nov_time2[]={0,0,0,0,0,0,0,0}; //fenyero novelés során segédváltozó időméréshez byte lamp_on_prev_stat[]={0,0,0,0,0,0,0,0}; //lámpa előző állapota bekapcsolt állapota esetén 1, kikapcsolva 0 long fenyero_nov_time[]={0,0,0,0,0,0,0,0}; //a fenyero novelesnel az idozítés segédváltozója byte nyomvatart_prev_stat[]={0,0,0,0,0,0,0,0};//nyomvatartás végének észrevételéhez segédváltozó long sw_tart_time[]={0,0,0,0,0,0,0,0}; //két kapcsoló lenyomás közötti időmérés segéd változója. Első lenyomáskor //ez elengedéskor indul az időmérés, az ezt követő lenyomásokkor a felfutó éltől //indul a mérés byte villan[]={1,1,1,1,1,1,1,1}; //ha elérte a fényerő maximumot a fényerő növelés, akkor villan a lámpa, //ezt engedélyezi, alapértelmezette 1 mert alapértelmezett változási irány a növelés byte jelzes=0; //négy klik esetén a háromszor felvillantjuk a lámpát, ennek a segédváltozója byte negyklik=0; //segédváltozó a négy klikk estén a lámpa villogtatáshoz, és összes //lámpa lekapcsolásához. long negyklik_time=0; //segédválzozó négy klikk esetén időméréshez byte villanas_szaml=0; //segédváltozó négy klikk estén a lámpák villogtatásához byte zeroadress=16; //ettől a címtől kezdve tároljuk az adatokat az eeprom-ban // chip lábkiosztásának beállításai byte exp_input=8; //bővítő bemenet lábszáma byte exp_output=12; //bővítő kimenet lábszáma byte factory_default=7; //gyári beállítás bemenet lábszáma byte be[]={14,15,16,17,18,19,0,1}; //bemneti lábak definiálása byte ki[]={3,5,6,9,10,11,2,4}; //kimeneti lábak definiálása byte pwm_hdvr_mask[]={1,1,1,1,1,1,0,0}; //a pwm vezérelhető kimeneteket maszkolja. 0-aláb nem pwm képes, 1-a láb pwm képes. //Hiába állítja be pwm-nek a felhasználó azt abemenetet ami csak digitális kimenet, //mivel ez felülbírálja a beállított setup paramétert. A KI[] változóval szinkronban //kell feltölteni. Azoknál a lábaknál, melyek nem pwm vezérelhetők 0-at kell megadni. // Működési paraméterek változói EEPROM-ból töltődnek fel bekapcsoláskor byte ki_pwm[]={0,0,0,0,0,0,0,0}; //kimeneti lábak pwm kimenetek legyenek-e (1-igen,0-nem) byte klikk_wait_time[]={5,5,5,5,5,5,5,5}; //két lenyomás közötti maximális várakozási idő ahhoz, hogy számolja a lenyomások számát byte fade_time[]={6,6,6,6,6,6,6,6}; //fény fel és leúsztatásának tempóját határozza meg (érték * 0,5sec) a nulláról //maximumig (vagy fordítva) teljes ideje. byte assistance_time[]={2,2,2,2,2,2,2,2}; //segédfény időtartama (érték * 3sec) eddig még világit a lámpa lekapcsolás után //minimumfényerővel // byte minimumfenyero=20; //erre a fényerő értékre csökken kikapcsoláskor a lámpa byte min_fenyero[]={1,1,1,1,1,1,1,1}; //csatornánként az alapminimális fényerő értéke. Az eeprom-ban nem ezek az értékek kerülnek tárolásra byte fenyero[]={5,5,5,5,5,5,5,5}; //lámpa fényereje 5..255-ig. Felkapcsoláskor az ebben tárolt fényerőre //kapcsolja be a lámpát. Nyomvatartáskor ennek az értékét változtatja a program //Kapcsolók lámpál és egyéb futás közbeni változók byte lamp_on[]={0,0,0,0,0,0,0,0}; //lámpa bekapcsolt állapota esetén 1, kikapcsolva 0 byte sw_on[]={0,0,0,0,0,0,0,0}; //kapcsoló nyomvatartás alatt értéke 1 byte sw_klik[]={0,0,0,0,0,0,0,0}; //a kapcsoló klikkelések számát számolja folyamat közben byte sw_klik_mem[]={0,0,0,0,0,0,0,0}; //ha letelt a két klik közötti idő, akkor ebbe tárolóik le a klikkelések száma byte nyomvatart[]={0,0,0,0,0,0,0,0}; //jelzi, hogy nyomvatarjuk a nyomógombot, amig nyomjuk éstéke 1 byte valtozas_fel_le[]={1,1,1,1,1,1,1,1}; //a fenyero változás iránya nyomvatartáskor 1-fel 0-le void setup() { for (byte i=0;i<8;i++) {pinMode(be[i],INPUT);digitalWrite(be[i],HIGH);pinMode(ki[i],OUTPUT);} //be és kimenetek definiálása pinMode(factory_default,INPUT);digitalWrite(factory_default,HIGH); //gyári beállítás bemenet. Ha bekapcsoláskor 0, akkor betöltődi a gyári alapbeállítás pinMode(exp_input,INPUT);digitalWrite(exp_input,HIGH); //bővítő bemenet. Ha 0 jön, akkor minden lámpát kikapcsol (ugyanaz, mintha 3 klik-t nyomunk a kapcsolón) pinMode(exp_output,OUTPUT);digitalWrite(exp_output,HIGH); //bővítő kimenet. Ha bármellyik nyomógombot háromszor lenyomjuk (tripla klikk), akkor 100msec 0-at ad a kimenetre if (digitalRead(factory_default)==LOW) //alapértrelmezett értékekkel töltjük fel az eeprom-ot (gyári alapbeállítás) { for (byte i=0;i<8;i++) { EEPROM.write(zeroadress+(i*5),1);EEPROM.write(zeroadress+(i*5)+1,5);EEPROM.write(zeroadress+(i*5)+2,6);EEPROM.write(zeroadress+(i*5)+3,2);EEPROM.write(zeroadress+(i*5)+4,3);ki_pwm[i]=EEPROM.read(zeroadress+(i*5))-1; klikk_wait_time[i]=EEPROM.read(zeroadress+(i*5)+1);fade_time[i]=EEPROM.read(zeroadress+(i*5)+2);assistance_time[i]=EEPROM.read(zeroadress+(i*5)+3)-1; if (EEPROM.read(zeroadress+(i*5)+4)==1) {min_fenyero[i]=1;} if (EEPROM.read(zeroadress+(i*5)+4)==2) {min_fenyero[i]=3;} if (EEPROM.read(zeroadress+(i*5)+4)==3) {min_fenyero[i]=5;} if (EEPROM.read(zeroadress+(i*5)+4)==4) {min_fenyero[i]=10;} if (EEPROM.read(zeroadress+(i*5)+4)==5) {min_fenyero[i]=15;} if (EEPROM.read(zeroadress+(i*5)+4)==6) {min_fenyero[i]=20;} if (EEPROM.read(zeroadress+(i*5)+4)==7) {min_fenyero[i]=30;} if (EEPROM.read(zeroadress+(i*5)+4)==8) {min_fenyero[i]=40;} if (EEPROM.read(zeroadress+(i*5)+4)==9) {min_fenyero[i]=50;} } //alapértelmezett adatokkal történő feltöltés //pwm be és kikapcsolás (ki_pwm nevű tömb) 1-nem 2-igen (alapértelmezett 1, nincs pwm vagyis nincs fényerő fel-le // üsztatás, csak ki-be kapcsolgatás) //klikkek kozotti idő (klikk_wait_time nevű tömb) /100msec (alapértelmezett 5 vagyis 500msec-en belül kell // lenyomni a gombot, hogy egy gombnyomás sorozatnak érzékelje és számolja a gombnyomások számát. // Ennyi idő után érzékeli folyamatos nyomvatartásnak a gombnyomást és változtatja a fényerőt //fel-le usztatási idő (fade_time nevű tömb) /kb. 0,5sec (alapértelmezett 6, vagyis 3 sec alatt úsztatja fel vagy le // a fényerőt a maximumról minimumra. Csak ha van pwm beállítva, akkor értelmezett és felhasznált érték) //segédfény ideje (assistance_time nevű tömb) /3sec Ha értéke 1, akkor nincs segédfény bekapcsolva, 2-nél 3sec, // 3-nál 6-se stb. (alapértelmezett 2, vagyis 3sec-ig minimum fényerőn világit a lámpa, és csak ezt // követően kapcsol ki. Csak ha van pwm, akkor értelmezett és felhasznált érték) //minimális fényerő 1-1%, 2-3%, 3-5%, 4-10%, 5-15%, 6-20%, 7-30%, 8-40%, 9-50% } //then ág vége else //bekepcsoláskor a paraméter változók feltöltése az eeprom-ból { Serial.begin(9600); //csak fejlesztéshez a paraméterek kiíratása Serial.println("Lampa pwm klikk usztat seged"); Serial.println("----- --- ----- ------ -----"); for (byte i=0;i<8;i++) { ki_pwm[i]=EEPROM.read(zeroadress+(i*5))-1;klikk_wait_time[i]=EEPROM.read(zeroadress+(i*5)+1);fade_time[i]=EEPROM.read(zeroadress+(i*5)+2);assistance_time[i]=EEPROM.read(zeroadress+(i*5)+3)-1; Serial.print(" "); //csak fejlesztéshez a paraméterek kiíratása Serial.print(i); Serial.print(" "); Serial.print(ki_pwm[i]); Serial.print(" "); Serial.print(klikk_wait_time[i]); Serial.print(" "); Serial.print(fade_time[i]); Serial.print(" "); Serial.println(assistance_time[i]); } } //else vége } //void setup vége void loop() { klikk_detect(); // ez a fuggvény nem vesz el időt, nincs benne delay utasítás. akár további funkciók is beilleszthetőek, de arra vigyázni kell, //hogy a további prgramrészekben se legyenek hosszú várakozások, mert a lámpa vezérlés esetleg nem fog működni //ha a program lemarad egy-egy kapcsoló lenyomásról. } //void loop vége void klikk_detect() { //egy lenyomás hatására bekapcsol a lámpa. A bekapcsolás a nyomógomb elengedésekor következik be. //A nyomógomb elengedésekor elindul egy időzítás, ami minden lenyomáskor ujraindul 500msec (beállítható)időre, //ez alatt további nyomógomb lenyomások történhetnek, de ezek a lámpát nem kapcsolják fel vagy le (nosens változó). //Miután letelt a (nosens) időszak, a sw_klik_mem változóban megkapjuk a klikkelések számát. Ha csak egy gombnyomás //volt és ezzel fel vagy lekapcsolódott a lámpa, akkor is megkapjuk a számot (1). Ha az első gombnyomás hosszabb ideig //tart mint 500msec, akkor az foilyamatos nyomvatartásnak minősül (nyomvatart=1) Ha felkapcsolt lámpánál nyomjuk //folyamatosan a lámpát, akkor az elengedéskor a lámpa nem alszik el, és az sw_klik_mem tartalma 0 marad, a fényerő //növekszik vagy csökken (valtozas_fel_le). Ha lekapcsolt lámpánál nyomjuk folyamatosan a nyomógombot, akkor 500msec //után a lámpa felkapcsol, a nyomvatartás ideéig emelkedik a fényerő és a nyomógom elengedésekor az sw_klik_mem //változó 0 marad. for (byte i=0;i<8;i++) //végig nézzük az összes nyomógombot { if (sw_on[i]==0 and digitalRead(be[i])==LOW and sw_prell[i]==0) {sw_prell[i]=1;sw_time[i]=millis();} //első lenyomás érzékelése if (sw_on[i]==0 and digitalRead(be[i])==LOW and sw_prell[i]==1 and millis()>sw_time[i]+50) {sw_on[i]=1;sw_prell[i]=0;sw_on_time[i]=millis();} // már 50msecv óta nyomva van, most már biztos, hogy lenyomták és nem prellezik if (sw_on[i]==1 and digitalRead(be[i])==HIGH and sw_prell[i]==0) {sw_prell[i]=1;sw_time[i]=millis();} //első elengedés érzékelése if (sw_on[i]==1 and digitalRead(be[i])==HIGH and sw_prell[i]==1 and millis()>sw_time[i]+50) {sw_valt[i]=0;sw_on[i]=0;sw_prell[i]=0;} // már 50msecv óta elengedte, most már biztos, hogy elengedte a kapcsolót és nincs prell if (sw_on[i]==1 and sw_prev_stat[i]==0) {sw_tart_time[i]=millis();} //kapcsoló felfutó élénél indítjuk az időmérést a nyomvatartás figyeléshez if (sw_on[i]==1 and sw_prev_stat[i]==1 and millis()>sw_tart_time[i]+(klikk_wait_time[i]*100)) //kapcsoló nyomvatartás ha várakozási idő (500msec) letelt { nyomvatart[i]=1;sw_klik_mem[i]=0; if (lamp_on[i]==0) {lamp_on[i]=1;fenyero[i]=min_fenyero[i];valtozas_fel_le[i]=1;villan[i]=1;fenyero_nov_time2[i]=millis();} //a lámpa nincs felkapcsolva, ezért felkapcsoljuk } if (sw_on[i]==0 and sw_prev_stat[i]==1 and nyomvatart[i]==1) {nyomvatart[i]=0;sw_klik[i]=0;sw_klik_mem[i]=0;sw_nosens[i]=1;sw_nosens_time[i]=millis();} //ha kapcsolót elengedtuk nyomvatartás után, akkor mindent lenullázunk, lámpa felkapcsolva marad, //a következő kapcsoló érzékelésik még 400msec-et várni kell if (sw_on[i]==0 and sw_prev_stat[i]==1 and sw_klik[i]==0 and sw_nosens[i]!=1) //sw_on felfutó éle, lápát kel fel vagy le kapcsolni { sw_klik[i]++;sw_nosens_time[i]=millis();sw_nosens[i]=1; //lehet, hogy több klik lessz, azért növelni kell a klikk számlálót //nosens időt elkezdjük mérni, és nosens is 1, ezzel jelezzük, hogy //nosens ideig további lenyomások jöttek, nem kell fel le kapcsolni if (lamp_on[i]==0) {lamp_on[i]=1;fenyero_nov_time2[i]=millis();} //lampa felkapcsol else {lamp_on[i]=0;}} //lampa lekapcsol //sw_on lefutó éle első kattintáskor, lámpa fel vagy lekapcsol if (sw_on[i]==1 and sw_prev_stat[i]==0 and sw_klik[i]>0) {sw_klik[i]++;sw_nosens_time[i]=millis();} //sw_on felfutó második és további felfutó élei, lehet számlálni egyet, és ujraindítjuk a nyomógomb figyelési időzitőt if (sw_nosens[i]==1 and millis()>sw_nosens_time[i]+(klikk_wait_time[i]*100)) {sw_nosens[i]=0;} //500msec (illetve beállított érték) után ujra figyeli a nyomógombot if (sw_nosens[i]==0 and sw_nosens_prev_stat[i]==1) {sw_klik_mem[i]=sw_klik[i];sw_klik[i]=0;jelzes=1;} //miután letelt a várakozási idő (500msec), a nosens lefutó élekor tároljuk a klikkek számát sw_klik_mem-ben sw_prev_stat[i]=sw_on[i]; //nyomógom elengedés felismeréséhez lamp_prev_stat[i]=lamp_on[i]; //amikor a lampa felkapcsol, akkor szamolunk egyet sw_nosens_prev_stat[i]=sw_nosens[i]; //amig nosens 1 addig számoljuk a klikkeket, illetve a kapcsoló lenyomások nem kapcsolják a lámpát if (ki_pwm[i]==1 and pwm_hdvr_mask[i]==1) //csak pwm kimeneteknél és pwm-re beállított kimeneteknél kell fényerő szabályozással foglalkozni { if (fenyero[i]<min_fenyero[i]+1) {fenyero[i]=min_fenyero[i]+2;} //fényerő minimumra értünk. Azért állunk meg előtte egy értékkel, mert így kikapcsoláskor lesz segédfény if (fenyero[i]>254) {fenyero[i]=254;} //fenyero maximumhoz értünk if (lamp_on[i]==1 and millis()>fenyero_nov_time2[i]+(fade_time[i]*2)) //ha felkapcsoltuk a lámpát akkor a fenyero változóig növeljuk a fényerőt { if (fenyero_tmp[i]<fenyero[i]) {fenyero_tmp[i]=fenyero_tmp[i]+1;fenyero_nov_time2[i]=millis();analogWrite(ki[i],fenyero_tmp[i]);} //még nem értük el a szükséges fényerőt if (fenyero_tmp[i]>fenyero[i]) {fenyero_tmp[i]=fenyero_tmp[i]-1;fenyero_nov_time2[i]=millis();analogWrite(ki[i],fenyero_tmp[i]);} // csökkenteni is kell a fényerőt, ha folyamatosan nyomja a gombot (követéshez csökkentés is kell) } if (lamp_on[i]==0 and millis()>fenyero_nov_time2[i]+(fade_time[i]*2)) //lekapcsoltuk a lámpát, csökkenteni kell a fénmyerőt 0-ig { if (fenyero_tmp[i]==min_fenyero[i] and millis()>fenyero_nov_time2[i]+assistance_time[i]*3000+5) {analogWrite(ki[i],0);fenyero_tmp[i]=0;} // minimumfényerőnél megállunk a csökkentéssel és várunk, amig segédfény idő le nem telik if (fenyero_tmp[i]>min_fenyero[i]) {fenyero_tmp[i]=fenyero_tmp[i]-1;fenyero_nov_time2[i]=millis();analogWrite(ki[i],fenyero_tmp[i]);} //fenyerő csökkentés a minimum fényerőig } if (lamp_on[i]==0 and lamp_on_prev_stat[i]==1) {analogWrite(ki[i],0);fenyero_nov_time2[i]=millis()+90;} //lampa lekapcsoláskor csökkemnteni fogjuk a fenyerőtz if (valtozas_fel_le[i]==1 and nyomvatart[i]==1 and millis()>fenyero_nov_time[i]+15) {fenyero[i]=fenyero[i]+1;fenyero_nov_time[i]=millis();} //nyomvatartjuk a gombot és növeljuk a fényerőt maximumig if (fenyero[i]==255 and nyomvatart[i]==1 and villan[i]==1) {analogWrite(ki[i],125);fenyero_nov_time2[i]=millis();villan[i]=0;} //nyomvatartjuk a kapcsolót és elértük a maximumot megvillantjuk a lámpát rövid fényerő csökkentéssel if (fenyero[i]==255 and nyomvatart[i]==1 and millis()>fenyero_nov_time2[i]+200) {analogWrite(ki[i],255);} //200msec múlva visszakapcsolojuk a fényt maximumra (nyomvatartja a kapcsolót és elértük a maximumot, villanás van) if (valtozas_fel_le[i]==0 and nyomvatart[i]==1 and millis()>fenyero_nov_time[i]+15) {fenyero[i]=fenyero[i]-1;fenyero_nov_time[i]=millis();} // nyomvatartjuk a gombot és csökkentjük a fényerőt if (nyomvatart[i]==0 and nyomvatart_prev_stat[i]==1) //nyomvatartás után elengedtük a nyomógombot { if (valtozas_fel_le[i]==1) {valtozas_fel_le[i]=0;} //ha eddig "fel" irány volt, akkor most "le" jön else {valtozas_fel_le[i]=1;villan[i]=1;} //ha eddig "le" irány volt, akkor most "fel" jön. Engedélyezzük a villanást is //ha elérte a mximumot a fényerő } nyomvatart_prev_stat[i]=nyomvatart[i]; //előző ciklus állapotának tárolása a változás megállapításához // if (sw_klik_mem[i]==2) // { // lamp_on[i]=1; // if (valtozas_fel_le[i]==1) // {fenyero[i]=254;valtozas_fel_le[i]=0;} //dupla klikkre növelnunk kell a fényerőt maximumra // else // {fenyero[i]=min_fenyero[i]+1;valtozas_fel_le[i]=1;villan[i]=1;};sw_klik_mem[i]=0;sw_klik[i]=0; // //dupla klikkre csökkentenünk kell a fényerőt minimumra // } } else { if (negyklik==0) {if (lamp_on[i]==1) {digitalWrite(ki[i],HIGH);} else {digitalWrite(ki[i],LOW);}} } if (digitalRead(exp_input)==LOW) {sw_klik_mem[i]=2;} if (sw_klik_mem[i]==2) //két klikk érkezett, minden lámpát lekapcsolunk { for (byte z=0;z<8;z++) { lamp_on[z]=0;sw_klik_mem[z]=0; //lámpák lekapcsolása } ;digitalWrite(exp_output,LOW);delay(10);digitalWrite(exp_output,HIGH); //bővítő kimenet írása } //if vége // három klik hatására minden lámpát lekapcsolunk if (sw_klik_mem[i]==4) //négy klikk történt { negyklik=1;negyklik_time=millis();sw_klik_mem[i]=0;villanas_szaml=0; for(byte y=0;y<8;y++) { digitalWrite(ki[y],LOW);lamp_on[y]=0;fenyero_tmp[y]=0; //négy klik hatására villogtatunk, és ezzel jelezzuk, hogy bekapcsoljuk az otthonlét szimulátort. Ez még nincs megírva //ide kellene írni az ekkor meghívott fügvényt. } //for vége } //if vége if (sw_klik_mem[i]==3) {sw_klik_mem[i]=0;digitalWrite(ki[i],LOW);lamp_on[i]=0;fenyero_tmp[i]=0;param_select(i);} //3 klikkel belépünk a setup módba. Előtte a lámpát lekapcsoljuk. lamp_on[i]=0 lekapcsolja a lámpát // fenyero_tmp[i]=0 ahhoz kell, nehogy a következő programciklus visszakapcsolja és fokozatosan //csökkentse 0-ra, miutan kikapcsoluk a lámpát (csak pwm-nél van jelentősége) lamp_on_prev_stat[i]=lamp_on[i]; } if (negyklik==1 and millis()>negyklik_time+500) { for(byte k=0;k<5;k++){ if (villanas_szaml==0) {if (ki_pwm[k]==0) {digitalWrite(ki[k],HIGH);} else {analogWrite(ki[k],255);}} if (villanas_szaml==1) {if (ki_pwm[k]==0) {digitalWrite(ki[k],LOW);} else {analogWrite(ki[k],0);}} if (villanas_szaml==2) {if (ki_pwm[k]==0) {digitalWrite(ki[k],HIGH);} else {analogWrite(ki[k],255);}} if (villanas_szaml==3) {if (ki_pwm[k]==0) {digitalWrite(ki[k],LOW);} else {analogWrite(ki[k],0);}} } villanas_szaml++; if (villanas_szaml==4) {negyklik=0;villanas_szaml=0;} negyklik_time=millis(); } } void param_select(byte select_lamp) { //ha lenyomta ötször a nyomógombot, akkor minden más nyomógob figyelése felfüggesztve //megvillogtatjuk a lámpát (a nyomógombhoz tatozót) .-.. (morze L)jelzéssel és várjuk, hogy nyomkkodja a nyomógombot //minden egyes alkalommal, maikor paraméter kiválasztásra várunk, ez a morse kód lesz levillogtatva a lámpán. // ha nem nyomja le a nyomógombot, akkor 10 sec mulva kilépünk a setupból, ezt egy lámpa villanás jelzi //két nyomógomb lenyomás között maximum 500msec telhet el. Ha ennél sűrűbba nyomkodja, akkor számoljuk. //ha 500msec-nél többet várt, és legalább egyszer lenyomta, akkor belépünk a paraméter megadásba //Hogy melyik paramétert fogjuk megadni, azt a nyomógomb lenyomások száma adja meg. Négy paraméter van, tehát max. négy //nyomógomb lenyomást várunk. Ha többet nyomott le, akkor nem lesz beállítva paraméter. //ha visszatértünk paraméter beállításból, akkor ujra indul a 10 sec, és ezen belül ujra lehet paramétert kiválasztani megadni. byte setup_indulas_jelzes=1; byte param_number=0; // a kiválasztott paraméter száma long select_time; //kiválasztásra szolgáló időt méri while ( millis() < select_time+4000) { if (setup_indulas_jelzes==1) { digitalWrite(ki[select_lamp],LOW);delay(200);digitalWrite(ki[select_lamp],HIGH);delay(200);digitalWrite(ki[select_lamp],LOW); delay(200);digitalWrite(ki[select_lamp],HIGH);delay(200);digitalWrite(ki[select_lamp],LOW); delay(200);digitalWrite(ki[select_lamp],HIGH);delay(800);digitalWrite(ki[select_lamp],LOW); // ..- jelzés arra, hogy várja a paraméter sorszámának megadását setup_indulas_jelzes=0; select_time=millis(); } //If vége if (sw_on[select_lamp]==0 and digitalRead(be[select_lamp])==LOW and sw_prell[select_lamp]==0) {sw_prell[select_lamp]=1;sw_time[select_lamp]=millis();} //első lenyomás érzékelése if (sw_on[select_lamp]==0 and digitalRead(be[select_lamp])==LOW and sw_prell[select_lamp]==1 and millis()>sw_time[select_lamp]+50) {sw_on[select_lamp]=1;sw_prell[select_lamp]=0;} //már 50msecv óta nyomva van, most már biztos, hogy lenyomták és nem prellezik if (sw_on[select_lamp]==1 and digitalRead(be[select_lamp])==HIGH and sw_prell[select_lamp]==0) {sw_prell[select_lamp]=1;sw_time[select_lamp]=millis();} //első elengedés érzékelése if (sw_on[select_lamp]==1 and digitalRead(be[select_lamp])==HIGH and sw_prell[select_lamp]==1 and millis()>sw_time[select_lamp]+50) {sw_on[select_lamp]=0;sw_prell[select_lamp]=0;} // már 50msecv óta elengedte, most már biztos, hogy elengedte a kapcsolót és nincs prell if (sw_on[select_lamp]==1 and sw_prev_stat[select_lamp]==0) {param_number++;sw_tart_time[select_lamp]=millis();} //kapcsoló felfutó élénél indítjuk az időmérést a következő lenyomás figyeléshez if (param_number>0 and millis()>sw_tart_time[select_lamp]+500) {param_setup(param_number,select_lamp);param_number=0;setup_indulas_jelzes=1;select_time=millis();} // ha 500msec-ig nem nyom újabb nyomóggombot, akkor belépünk a paraméter setupba a lenyomások számával // paraméter beállítás után ujraindítjuk a setup időt, lehet ujabb paramétert beállítani digitalWrite(ki[select_lamp],LOW); //biztosan ne égjen a lámpa sw_prev_stat[select_lamp]=sw_on[select_lamp]; //nyomógom elengedés felismeréséhez } digitalWrite(ki[select_lamp],LOW);delay(200);digitalWrite(ki[select_lamp],HIGH);delay(200);digitalWrite(ki[select_lamp],LOW); //egy rövid (200msec) villanás jelzi, hogy kilépünk a setup-ból } void param_setup(byte param_number, byte select_lamp) { //Amikor belépünk ebbe a függvénybe, a nyomógomb lenyomások száma jelzi, hogy melyik paramétert fogjuk beállítani. //Elősször levillogtatjuk a paraméter számát, majd várjuk, hogy nmyomógomb lenyomások számával megadja a //beállítandó paraméter értékét. 4sec van arra, hogy elkezdje nyomkodni a gombot, ha nem teszi, kilépünk //a paraméter kiválasztásból, amit egy villanás jelez. Ha legalább egyszer lenyomta a gombot, de ha 500msec-ig //nem nyomja le ujra, akkor befelyeződött a paraméter érték megadása, meghívódik a param_setup függvény byte param_value=0; long param_ido; for (byte u=0;u<param_number;u++) { digitalWrite(ki[select_lamp],LOW);delay(400);digitalWrite(ki[select_lamp],HIGH);delay(400); //annyit villantunk hosszan (400msec), ahányszor lenyomta a nyomógombot } digitalWrite(ki[select_lamp],LOW);delay(500); // lekapcsoljuk a lámpát //kezdődik a nyomógomb figyelés param_ido=millis(); while ( millis() < param_ido+4000) { if (sw_on[select_lamp]==0 and digitalRead(be[select_lamp])==LOW and sw_prell[select_lamp]==0) {sw_prell[select_lamp]=1;sw_time[select_lamp]=millis();} //első lenyomás érzékelése if (sw_on[select_lamp]==0 and digitalRead(be[select_lamp])==LOW and sw_prell[select_lamp]==1 and millis()>sw_time[select_lamp]+50) {sw_on[select_lamp]=1;sw_prell[select_lamp]=0;} // már 50msecv óta nyomva van, most már biztos, hogy lenyomták és nem prellezik if (sw_on[select_lamp]==1 and digitalRead(be[select_lamp])==HIGH and sw_prell[select_lamp]==0) {sw_prell[select_lamp]=1;sw_time[select_lamp]=millis();} //első elengedés érzékelése if (sw_on[select_lamp]==1 and digitalRead(be[select_lamp])==HIGH and sw_prell[select_lamp]==1 and millis()>sw_time[select_lamp]+50) {sw_on[select_lamp]=0;sw_prell[select_lamp]=0;} // már 50msecv óta elengedte, most már biztos, hogy elengedte a kapcsolót és nincs prell if (sw_on[select_lamp]==1 and sw_prev_stat[select_lamp]==0) {param_value++;sw_tart_time[select_lamp]=millis();} //kapcsoló felfutó élénél indítjuk az időmérést a következő lenyomás figyeléshez if (param_value>0 and millis()>sw_tart_time[select_lamp]+500) {param_store(select_lamp,param_number,param_value); param_value=0;param_ido=millis()-4000;} // ha 500msec-ig nem nyom újabb nyomóggombot, akkor belépünk a paraméter setupba a lenyomások számával digitalWrite(ki[select_lamp],LOW); //biztosan ne égjen a lámpa sw_prev_stat[select_lamp]=sw_on[select_lamp]; //nyomógom elengedés felismeréséhez } //while ciklus vége } void param_store(byte select_lamp,byte param_number,byte param_value) { //Ennek a függvénynek a feladata a beállított paraméter érték tárolása az EEPROM-ban, és a vezérlést végző tömb //változókban. Elősször levillogtatja a program a paraméter értéket, aztán tárol. for (byte u=0;u<param_value;u++) {digitalWrite(ki[select_lamp],LOW);delay(400);digitalWrite(ki[select_lamp],HIGH);delay(400);} // annyit villantunk hosszan (400msec), ahányszor lenyomta a nyomógombot digitalWrite(ki[select_lamp],LOW);delay(500); // lekapcsoljuk a lámpát // kezdődik a paraméter érték tárolás és memória változó felülírás az új értékkel EEPROM.write(zeroadress+(select_lamp*5)+param_number-1,param_value); for (byte i=0;i<8;i++) { ki_pwm[i]=EEPROM.read(zeroadress+(i*5))-1;klikk_wait_time[i]=EEPROM.read(zeroadress+(i*5)+1);fade_time[i]=EEPROM.read(zeroadress+(i*5)+2); assistance_time[i]=EEPROM.read(zeroadress+(i*5)+3)-1; if (EEPROM.read(zeroadress+(i*5)+4)==1) {min_fenyero[i]=1;} if (EEPROM.read(zeroadress+(i*5)+4)==2) {min_fenyero[i]=3;} if (EEPROM.read(zeroadress+(i*5)+4)==3) {min_fenyero[i]=5;} if (EEPROM.read(zeroadress+(i*5)+4)==4) {min_fenyero[i]=10;} if (EEPROM.read(zeroadress+(i*5)+4)==5) {min_fenyero[i]=15;} if (EEPROM.read(zeroadress+(i*5)+4)==6) {min_fenyero[i]=20;} if (EEPROM.read(zeroadress+(i*5)+4)==7) {min_fenyero[i]=30;} if (EEPROM.read(zeroadress+(i*5)+4)==8) {min_fenyero[i]=40;} if (EEPROM.read(zeroadress+(i*5)+4)==9) {min_fenyero[i]=50;} } delay(1000); }
Utólag emlékezetből lerajzoltam a megépített vezérlő kapcsolási rajzát. Fontos különbség a rajz és a valóság között, hogy eredetiben ATMeaga328P chip-et építettem az áramkörre, amihez ugyebár még egy kvarcz kristály és két kondenzátor is kell. Nomeg eredetiben egy 5V-os tápegységet is építettem az áramkörre egy kicsi trafóval és 5V-os táp IC-vel. Praktikusabbnak látszik mamár egy Arduino nano egy telefon USB töltővel!!
Áramköri rajz (csak egy csatorna szerepel rajta a 6-ból):
Néhány instrukció és magyarázat a képen látható megoldásokhoz:
- Elméletileg 8 csatornát lehet kialakítani. A rajzon csak egy csatorna látható, a többi teljesen azonos, csak a nyomógombok más bemenetre lennének kötve, illetve a kimenetek is más mosfet-et hajtanak meg. Nyilván kimenetnek a PWM kimeneteket érdemes választani, amikből összesen 6 db van. Két csatorna ezért „digitális” kell hogy legyen. Vagyis csak ki és bekapcsol.
- Azokban a szobákban, ahol nem kellett fényerőszabályozás (pl. 230V-os teljesítmény ledeket szereltem), egy relével kapcsolom a 230V-ot. A reléket ugyanúgy a mosfet kapcsolja, mint a rajzon látható power led-et. A relé 24, 12 vagy akár 5V-os is lehet, mert a mosfet bármilyen feszültséget tud kapcsolni, amit rákötünk. Nálam mindhárom eset előfordul (led szalad 12V, 10V-os teljesítmény ledek sorba kapcsolva soros ellenállással 24V-on, 5V-os relé a 230V kapcsolására). Ha valaki relét kapcsol a mosfet-el, az ne feledje el a relé tekercsivel párhuzamosan a védődiódát, különben kezdheti előről ez egészet. A relé igen nagy feszültséget indukál kikapcsoláskor, és a nano-nak annyi! Ha relét teszünk a kimenetre, akkor úgy kell programozni a vezérlőt (fenti setup leírás szerint), hogy ne legyen fényerőszabályozás az adott csatornán.
- FONTOS! A rajzon a power led-el sorba van egy ellenállás. Ez esetleg akkor kell, ha valaki ugyanazt a megoldást választja mint én, azaz több led-et kapcsol sorba, és az áramot egy soros ellenállással állítja be. A rajzon szereplő ellenállás érték hibás. Utólag vettem észre. Nyilván nem 100ohm kell, hanem konkrétan ki kell számolni, vagy kísérletezni. Nálam a kb. 10V-os 10W-os power ledekhez kb. 1ohm 5W ellenállás kellett.
- Tesztelés és szerviz célokból az áramkörre is építettem nyomógombokat minden csatornához. Ugyanezen célból került a kimenetre egy-egy led. Így teszteléskor nem kellett az áramkört bekötni a helyére. Jól jött ez a megoldás akkor is, amikor buta módon bekötöttem közvetlenül a bemenetre a fali kapcsolókat (csengő kapcsoló, csak klikk-elünk vele) a hozzájuk vezető 10-20 m-es vezetékekkel. Annyi zajt szedtek össze, hogy tűzijátékot játszott az áramkör. Persze ha kikötöttem a vezetéket, minden jól működött a beépített nyomógombokról. Sokat segített ez a megoldás a hiba megoldásában.
- Az előző pontban szereplő zajszűrés céljából került a nyomógombbal párhuzamosan egy 1 mikroF kondi (vagy elkó is jó polaritás helyesen bekötve), és egy 1Kohm körüli felhúzó ellenállás. A zajok nem tudnak akkora energiát szolgáltatni, hogy lényegesen megváltozzon a kondi feszültsége. Így utólag még esetleg egy 4.7V-os zener diódát is oda tennék párhuzamosan a kondival, mert nagyon hosszú vezetéknél akár 5V feletti feszültség is kialakulhat.
- A rajzon szereplő alapbeállítás gomb nem feltétlenül kell, meg lehet oldani a problémát programból is. Már akinek elérhető helyen van az áramkör, és hozzáfér egy laptoppal.
- A cikk eléjén szerepel egy fotó a kész világítás vezérlésről. Látható, hogy a mosfet-ek hatalmas hűtőbordára kerültek. A legnagyobb áram amit kapcsolok velük 24V 3A, ez meg sem kottyan nekik. Még csak nem is langyosodnak. Ekkora áramnál semmi szükség ekkora hűtésre. Ezt alaposan eltúloztam! Elég egy 5x5cm-es alumínium lemez, vagy akár a semmi is elég! Ki kell persze próbálni.