Hirdetés

2020. december 1., kedd

Gyorskeresés

Útvonal

Cikkek » Akármi rovat

Arduino konyhapult világítás

Egy Arduino Nano, egy MOSFET meghajtó, led szalagok, alu profilok, kábelcsatornák, 20m vezeték és egy hét szabadidő.

[ ÚJ TESZT ]

loop() - állapotgép

Ez volna a kódja a korábban látható három üzemmódnak, ezek között váltogat a program az interakciók szerint.
switch (mode) {
case 1: //felkapcsolás
psu(true); //táp bekapcsolása
if (light_tl == 0) { //világítás felkapcsolása
light_tl = max_light;
//light_tr = max_light;
}
if (light_bl == 0) {
light_bl = max_b_light;
//light_br = max_b_light;
}
updateLed(); //PWM vezérlők frissítése
break;
case 0: //lekapcsolás
psu(false); //táp kikapcsolása
light_tl = 0;
//light_tr = 0;
light_bl = 0;
//light_br = 0;
updateLed();
break;
case 2: //éjszakai üzemmód
psu(true); //táp bekapcsolása
light_bl = night_light;
//light_br = night_light;
updateLed();
break;
}

Hirdetés

Ez a részlet pedig a fényerő fokozatos kivilágosodásáért és elsötétüléséért felel. Minden csatornának van egy saját változója a fényerőhöz, ahogy az feljebb már látható volt. Ezek használatával értékadáskor azonnal felvenné a szalag a beállított fényerőt, viszont nekem jobban tetszik, ha fokozatosan veszi fel a célértéket. Ehhez létrehoztam egy másodlagos változót minden csatornához, amivel úgymond követem a célt - az angol shadowing kifejezés után (tudom, nem a legkreatívabb változó nevek) - egy adott lépésközzel minden egyes loop() ciklusban. Így a shadow változók képviselik az aktuálisan megjelenített fényerőt, a light változók pedig a beállított fényerőt. Mivel az érintésérzékelés elég sok időt vesz igénybe és kicsit sokáig tartott az effektus, ezért kénytelen voltam meggyorsítani kicsit, amúgy elég lenne egy változó++ vagy változó-- is ciklusonként.

//set fading
if (shadow_tl < light_tl) shadow_tl += 5;
else if (shadow_tl > light_tl) shadow_tl -= 5;
//if (shadow_tr < light_tr) shadow_tr += 5;
//else if (shadow_tr > light_tr) shadow_tr -= 5;
if (shadow_bl < light_bl) shadow_bl += 5;
else if (shadow_bl > light_bl) shadow_bl -= 5;
//if (shadow_br < light_br) shadow_br += 5;
//else if (shadow_br > light_br) shadow_br -= 5;

Van még nekem továbbá egy függvényem a loop()-ban a Serial monitorból küldött parancsokhoz, de ezt csak a tesztelés erejéig használtam. Éles használatban nincs gépre dugva a mikrovezérlő*.
Ez meghívja a processSerialRead() függvényt, amit a következő oldalon tárgyalok.
while (Serial.available() > 0) processSerialRead((char)Serial.read());

*Ha használatban van az USB port a mikrovezérlőn, akkor ajánlott leválasztani a tápról, különben előfordulhatnak nem kívánt visszirányú áramok a számítógép USB portja felé!! Rosszabb esetben akár kárt is tehet a számítógépben.

A cikk még nem ért véget, kérlek, lapozz!

Előzmények

Hirdetés

Copyright © 2000-2020 PROHARDVER Informatikai Kft.