1 Naposledy upravil: milan.simunek (2012-04-12 21:46:35)

Téma: [vyřešeno] goniometrické fce

Je v SDS-C možné používat goniometrické fce?
Myšlenka je napsat program pro výpočet východu a západu Slunce s následnou vazbou na ovládání topení, vlhkosti a osvětlení terária (+ monitoring měřených hodnot a spotřeby). Jen nevím, zda lze gon.fce používat, případně jaká jsou pravidla. Problematika výpočtu dobře zpracována např. zde (koho to zaujme, zbytkem se prokliká).

Věřím, že by to bylo lze zřejmě i obejít (nepočítat dle polohy Slunce, jen dle známých údajů o východu i západu Slunce korigovat vůči aktuálnímu datu), ale chtěl jsem se něco naučit. Můžete někdo nakopnout poučeného laika správným směrem?

2

Re: [vyřešeno] goniometrické fce

Uvažuji k čemu to použít ....
Pro meteo jsem cucal data z webu ale taky jenom údaje východ/západ ... anebo si můžu udělat výpočet i na svém web serveru ....
Já budu řídit osvětlení u papoušků taky podle venkovního světla ale na to používám solární článek ze staré kalkulačky. Ten mám připojený na AD a hezky měří světlo smile

SDS micro DIN - firmware 8.7.2014, SDS micro DIN - firmware Beta xx.x.2014
SDS nováček :-) Správce sítě, programátor, kutil .... :-)

3

Re: [vyřešeno] goniometrické fce

Ahoj, mohu mít dotaz k tomu solárnímu článku? Máš tam připojenou nějakou zátěž, nebo měříš přímo napětí na článku? Poznáš podle napětí slunce, polojasno, zataženo? Já někde viděl takovou převodní tabulku (statistiky) podle které se to dalo s nějakou přesností určit, ale nemohu to najít.

4

Re: [vyřešeno] goniometrické fce

Měřím to přímo, dává to max cca 1.7 V. Možná by šlo vykoumat pozorováním kdy kolik dává V ale já to mám čistě jako soumrak. spínač, pod 0.9 se pro mě stmívá a zapínám světla. Mám tam prodlevu aby to nespínalo hned.

SDS micro DIN - firmware 8.7.2014, SDS micro DIN - firmware Beta xx.x.2014
SDS nováček :-) Správce sítě, programátor, kutil .... :-)

5

Re: [vyřešeno] goniometrické fce

Já se to chtěl hlavně naučit napsat a odladit. O tom sol.článku jako soumrakovém čidle jsem také uvažoval jako o možném řešení, právě v návaznosti na Váš (TiborTeam) příspěvek v jiném vlákně zde na fóru. Svítání a soumrak samozřejmě stačí.
Každopádně díky, pokud ty fce SDS-C nepodporuje (což stále nevím), budu pokračovat cestou nejmenšího odporu.

6

Re: [vyřešeno] goniometrické fce

Funkce sin() a cos() a další trigonometrické funkce nejsou v jazyce SDS-C definovány, ale to neznamená že je nelze použít - napište si je sám. Aktuálně je to velmi jednoduché vzhledem ke skutečným požadavkům vaší aplikace.

Stačí vyhledet "sin approximation" a návodů je celá řada.

Mi se líbí tento: http://www.coranac.com/2009/07/sines/ - proto sem do příspěvku přepíšu jednu z uvedených funkcí.
Protože používá datový typ "s32" (signed 32 bit) což je to samé co interně používá SDS-C.

No a kosinus je ve výsledku to samé co sinus, ale s fázovým posunem (tj. výsledky pro kosinus dostaneme i z funkce sinus, stačí jen poskytnou funkci sinus vstupní parametr s přičtenou konstantou). Takže stačí implementovat jen aproximaci funkce sin() a je to, zbytek (vše) je středoškolská matematika.

var sin_input;
var sin_output;

isin_S4
{
    // copyright by http://www.coranac.com/2009/07/sines/
    var x;
    var c, x2, y;
    var qN, qA, B, C;

    x = sin_input;

    qN= 13; qA= 12; B=19900; C=3516;

    c= x<<(30-qN);              // Semi-circle info into carry.
    x -= 1<<qN;                 // sine -> cosine calc

    x= x<<(31-qN);              // Mask with PI
    x= x>>(31-qN);              // Note: SIGNED shift! (to qN)
    x= x*x>>(2*qN-14);          // x=x^2 To Q14

    y= B - (x*C>>14);           // B - x^2*C
    y= (1<<qA)-(x*y>>16);       // A - x^2*(B-x^2*C)

    if (c >= 0)
   {
        sin_output = y;
   } else
   {
        sin_output = 0 - y;
   }

}


main
{

   sin_input = 1;
   isin_S4();
   echo(' vysledek = ', sin_output);

x: goto x;
   
}

Správný rozsah vstupních hodnot a správnou interpretaci výstupní hodnot si už zjistěte sami, viz odkaz.
Základem je hodnota PI a to je 0x4000 (16384 decimálně). Zdejší funkce isin_S4() samozřejmě pracuje s radiány, ne se stupni.
Pak platí následující příklad: sin_input = -224385 -> -13.6954*pi = -43.0253 rad -> 0x1000*sin(-43.0253) = 3348 kde sin_output = 3353 což je velm blízko. Takže to i funguje, zdá se.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

7

Re: [vyřešeno] goniometrické fce

Děkuji, zkusím se s tím poprat.