teraz ked mam 1000 merani tak potrebujem tu najvacsiu hodnotu ktora sa bude vypisovat kazdu 1s. To by som robil nejak takto.
{
max=napatie[0];
for(j=0;j<1000;j++)
{
if(napatie[j]>max)
{
max=napatie[j];
}
}
}
teraz ked mam 1000 merani tak potrebujem tu najvacsiu hodnotu ktora sa bude vypisovat kazdu 1s. To by som robil nejak takto.
{
max=napatie[0];
for(j=0;j<1000;j++)
{
if(napatie[j]>max)
{
max=napatie[j];
}
}
}
Ty chceš uchovávat všech 1000 hodnot jen abys mohl nakonec najít tu nejvyšší? Není to zbytečné? Nehledě na to, že by ses nevešel do ram procesoru.
Přeci ti stačí jen ta nejvyšší z minulých měření a po každém měření jen porovnat uloženou nejvyšší s aktuálně změřenou.
Aha to ma ani nenapadlo, ze by sa mi to tam ani nezmestilo. Mám porovnávať dve hodnoty ktoré sú aktuálne namerané?
Na začátku si dáš do “max” nulu. Po prvním měření porovnáš max s naměřenou hodnotou, ta bude větší a uložíš ji do max. Při druhém měření zase porovnáš naměřenou hodnotou s max a když bude větší, přepíšeš max tou novou. A tak stále dokola. Do jiné proměnné bokem si počítej kolikáté je to měření. Až dojdeš do konce, tak prostě vypíšeš max a je to.
Navíc přepočet hodnoty z převodníku (na mV/mA) stačí také dělat až na konci, není nutný při každém měření.
môže to byť nejak takto?
[code]
{
MAXU=0;
MAXI=0;
meranie++;
if (napatie>=MAXU)
MAXU=napatie;
if (prud >=MAXI)
MAXI=prud;
if (meranie=>1000)
{
meranie=0;
}[/code]
Nějak tak. Sice jsou tam značně zmatený ty odsazení a nesedí závorky, ale zhruba ano. Jen na konci když nuluješ měření, měl bys také vynulovat ta maxima (potom, co si je uložíš někam bokem a později vypíšeš).
Už to tam mam zatial bez chyb. Teraz mam vypísať odber vo watt minutach kazdú minútu. Za nulovanie som maxu a maxi som dal
if (meranie>=60000)
{
P=(U*I)/60
}
Už tam začínáš mít dost výpočtů a výpisy na lcd budou taky pomalý. Chtělo by to přepsat na přerušení, ale nebudem to zatim řešit, dokud to nebude požadováno.
Práce ve wattminutách po dobu 1 minuty je prostě jen průměrnej výkon během té minuty. Stačí tedy sečíst všechny okamžitý výkony a vydělit počtem vzorků. To ovšem tvůj výpočet nesplňuje 
Pokud má být ten odběr včetně minulých minut, provedeš to obdobně jako s tím maximem. Budeš mít proměnnou, do který každou minutu přičteš průměrnej výkon.
Prerábať by som to už nechcel a ani by som to asi nestihol. Potrebujem to už na buduci tyžden v piatok. Neviem ako si mám zapamätať tých 60 hodnôt a spočítať ich. Výpis má byť len pre jednu minutu
Tězch hodnot bude 60000
A rozhodně by si je procesor nezapamatoval (nemá dost paměti). Prostě jen každou ms vždy když měříš U a I, tak je vynásobíš, vydělíš 1000 (jinak by to bylo v uW) a přičteš do proměnné. Na konci (po 1 minutě) to vydělíš 60000 a vyřízeno. Jen ta proměnná musí bejt “unsigned long int”, protože se tam nasčítá docela velký číslo.
[code]{
napatie = adc_read(0); // hodnota kanalu 0
prud = adc_read(1); // hodnota kanalu 1
P=(napatie*prud)/1000
meranie++;
if (napatie>=MAXU)
MAXU=napatie;
if (prud >=MAXI)
MAXI=prud;
if (meranie=>1000)
{
meranie=0;
MAXU=U;
MAXI=I;
//zdrojovy kod na vypis U I
MAXU=0;
MAXI=0;
vykon+=P
{
if (meranie>=60000)
}
vykon=vykon/60000
// vypis odber vo warrminutach
}
}[/code]
Tenhle kód má k tomu, co potřebuješ, ještě hodně daleko 
Díky požadavku na výpočet energie musíš přepočítávat U a I (hodnotu z převodníku převést na mV a mA) v každém kroku. To tam nemáš.
Proměnná “meranie” nikdy nedosáhne hodnoty přes 1000. tudíž se ti poslední výpočet neprovede. Založ si pro ten účel další proměnnou a počítej si v ní vteřiny(tam, kde nuluješ meranie přičteš vteřinu). Když dojdeš na 60, proveď výpočet energie.
Prepočet hodnoty prud z prevodnika na hodnotu I si mam vypočitať podla delica?
[code] {
napatie = adc_read(0); // hodnota kanalu 0
prud = adc_read(1); // hodnota kanalu 1
U=((napatie*5)/1024)*8;
I=
P=(napatie*prud)/1000;
meranie++;
if (napatie>=MAXU)
MAXU=napatie;
if (prud >=MAXI)
MAXI=prud;
if (meranie>=1000)
{
meranie=0;
cas=1000;
MAXU=U;
MAXI=I;
//zdrojovy kod na vypis U I
MAXU=0;
MAXI=0;
vykon+=P;
if (cas>=60000)
vykon=vykon/60000;
// vypis odber vo warrminutach
}
}[/code]
Trocha optimalizace:
((napatie5)/1024)8 = (napatie5)/128 = (napatie5) >> 7
Co se týká proudu, tak nevím, jaké máš zapojení. Pokud máě na snímání proudu odpor, tak když umíš spočítat napětí z hodnoty z převodníku, tak proud je U/R.
Ohledně proměnné čas - máš obdobný problém jako předtím. Tím, že do ní pokaždé zapíšeš 1000 (místo přičtení) přeci nikdy nedosáhneš hodnoty 60000 aby mohl provést poslední výpočet
.
Zapojenie mám také ako si mi nakreslil na strane 2. Snímací odpor je 1ohm. Rozsah 0,5A. Napätie na prevodníku bude 0-0,5V.
I=(prud*5)/1024
a ten cas+=1000
Matematicky správně, akorát na displeji se ti toho moc neukáže.
Vypočítané napětí a proud jsou zde totiž v základních jednotkách, ale jen celočíselně (pokud jsi to nepředělal na float). Tedy dokud např. proud nepřekročí 1A (a to se asi nestane), budeš vidět jen nuly.
Když hodnotu z převodníku před výpočtem vynásobíš 1000, budeš mít hodnoty v mV a mA a už by se ti mohlo něco zobrazit.
Za meranim na prevodníku som doplnil
napatie*=1000;
prud*=1000;
Môžeš sa pozrieť či to mám dobre.
Cv_2.rar (22.8 KB)
Zas ten RAR…
![]()
Pro začátek než se podívám na střeva: stále chybí ochrany hlavičkových souborů proti vícenásobnému vložení. => opraveno
Odstraněn přebytečný soubor “tlacitko.c”.
Nevim jesli ten svůj kód poznáš
Každopádně bude tam hodně úprav a dost komentářů. Tak si to pak promaž případně přelož do slovenčiny aby tě s tím nevyhodili
.
edit: Tak jsem to trochu počochtal. Zkus jesli to bude něco dělat (a vyřeš si tam lcd).
Cv_2.zip (22.8 KB)
Zajtra pôjdem testovať čo to bude robiť, ale nejak sa mi nezdá ten napäťový delič hlavne jeho hodnoty