Prof Creative Commons License 2023.04.18 0 0 4133

Üdv,

 

Próbálom ezt a rémálmot megfejteni. Eddig nagy vonalakban odáig jutottam el, hogy több lehetséges állapot alapján (amelyet a jelek szerint idő vezérel) csökkenti vagy növeli a ledek fényességét.

Magát a fényességet a korábban idézett borzalmas képlet állítja be, konkrétan ez:

 

fading = exp(-pow(x-X_DIFF, 2)) * (255 - SLOPE*X_DIFF) + SLOPE*x;

 

Az x egy működési változól, erre késpőbb visszatérek.

Az X_DIFF egy konstans, fix 3 az értéke.

A SLOPE szintén konstans, pontosan 10 az értéke.

Az exp az e-alapú exponenciálist számolja, vagyis e értéke a paraméterben megadott hatványon).

A pow a hatványozás függvénye, ahol az első paraméter az alap, a második paraméter a hatvány, itt tehát a 2. hatvány működik.

 

Először helyettesítsük be a cuccokat:

 

fading = e^(-(x-3)^2) * (255 - 10 * 3) + 30x.

 

Átrendezve:

 

fading = 30x + 225 * e^(-(x-3)^2).

 

fadig értelmezési tartománya 0-tól (teljes fényerő bekapcsolva) 255-ig (kikapcsolva) terjed. Az Excel itt a barátunk (bár a CASIO 991 még inkább az lenne), és segít megoldani, hogy a fading értelmezési tartományára x értékének közelítőleg 0 és pontosan 8,5 között kell lennie, a 8,5-et is beleértve. De... Ha a teljes tartományt nézzük, akkor van egy galiba, nevezetesen 2,5 körül a fading értéke átlépi a bűvös 255-öt, majd kicsúcsosodik x = 3,1 körül, majd visszamegy x = 4,8 körül egy újabb minimumra, ahonnan nagyjából lineárisan emelkedik végig. Lásd az ábrát.
Tehát x értéke 0 és közelítőleg 2,5 között lehet. Nekünk az lenne a célunk, hogy a minimumot (ahol viszonylag lineáris, de kis meredekséggel) feljebb hozzuk, ne 0 legyen, hanem valahol 1--1,5 között.

 

x értékét a kódban több ponton direktben állítják. Van x = 0; x = X_DIFF; (vagyis feloldva x = 3;), továbbá x += X_DIFF / dawnDuration, illetve x -= X_DIFF / dawnDuration. Ez utóbbi kis magyarázatra szorul.
x = 0 a teljes fényerő. x = X_DIFF, vagyis x = 3 elméletileg 315-öt ad eredményül. Őszintén szólva fogalmam sincs, hogy az Arduino IDE ezt hogyan fordítja le a 0 és 255 között értelmezhető char típusú változó értékére (valószínűleg vág, de ezt tesztelni kellene), de tételezzük fel, hogy ez így normális működést eredményez.
A következő rész az x módosítása (vagyis a fokozatos világostás a -=-vel és a sötétítés a +=-vel, ami az aktuális x értékéből vesz el vagy az értékéhez ad hozzá 3 / dawnDuration-t, ami a kód alapján egy másodpercben kifejezett érték, de a kód maga konkrét értékadást nem tartalmaz (ez egyébként egy baromi nagy kódolási hiba). Az értéke egyébként meglehetősen széles tartományon belül mozoghat, 86400-at, vagyis teljes 24 órát is láttam, de arra nem sikerült rájönnöm, hogy ennek így mi értelme van.

 

Sebaj.

 

Magát a fényerőállítást a light_fading() függvény csinálja, ami a mian_screen fülön van alul. Ennek is a legvége az érdekes a fenti képlettel és az analogWrite függvényhívással, ami konkrétan a kimenetet vezérli.

Namost. Az a fő kérdés, hogy miként lehet a maximális fényerőt valamennyire csökkenteni? a helyes válasz az, hogy fading értékének minimalizálásával. Ezt a teljes fenti körforgás megértésével (illetve a most hiányzó értékű dawnDuration változó értékének számszerűsítésével) lehetne többé-kevésbé modellezni, majd javaslatot tenni arra, hogy ebben az eszelősen nagy katyvaszban hol, mit és hogyan kellene megváltoztatni (nagyjából kísérleti úton) ahhoz, hogy sikerrel járjunk.
Vagy.

Van egy kotvány megoldás, ami egy sornyi kód, brute-force, minden léltező konvencióval szembe megy és a már most is gyalázatos kódon rettenetesen sokat ront tovább. De -- elvben -- megoldja a problémát.


if (fading < 20) fading = 20;

 

vagy nagyon elborultan:

fading = (fading < 20) ? 20 : fading;

A 20 értékét változtatva a kódban lehet a maximális fényerőt változtatni, de bele lehet írnia  kódba, hasonlóan a többi változóhoz, hogy eepromból olvassa, illetve akár állíthatóvá tenni, hogy oda visszaírva a következő restartnál is már a jó érték legyen benne.

Hardveresen egyébként a feszültség csökkentésével lehetne megoldani, de erre a feltételezhetően több wattnyi teljesítmény miatt annyira nincs egyszerű és olcsó módszer.

 

 

Üdv,

Előzmény: beti00 (4125)