Svetelektro.com

Svetelektro.com

Meno:
Heslo:
SVETELEKTRO • Funkcia raz za hodinu

Funkcia raz za hodinu

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Funkcia raz za hodinu

Odoslaťod martinius96 » 24 Aug 2017, 16:58

Ahojte, mám kód, ktorý obsahuje delaye a je dosť dlhý. Potrebujem ale spúšťať raz za hodinu jednu funkciu, ktorá bude robiť špecifický HTTP request. Loop sa opakuje každých cca 6s a tiež robí http requesty, ktoré sú pravidelné. Vedel by mi niekto poradiť ako docieliť spustenie tej funkcie raz za hodinu? Existuje niečo ako paralelne vykonavanie, alebo niečo na ten štýl? Ďakujem!
martinius96

Re: Funkcia raz za hodinu

Odoslaťod lacosebosik » 24 Aug 2017, 17:08

Pre opakujúce vykonávanie príkazov stará väčšinou daemon cron.
Viac si to pozri tu
lacosebosik
Okoloidúci
Okoloidúci
Príspevky: 18
Založený: 13.08.2017
Bydlisko: Revúca
Karma: 1

Re: Funkcia raz za hodinu

Odoslaťod maskrtnik01 » 24 Aug 2017, 17:33

Otázka je v sekcii pre Arduino.

Tu budú potrebné prerušenia, a časovače Atmegy (pre Uno je to Atmega328). https://playground.arduino.cc/Code/Timer1
Problém je že časovač 1 môže byť používaný rôznymi inými knižnicami, a keď prepíšete jeho konfiguráciu, tieto knižnice prestanú fungovať.
maskrtnik01
Obrázok používateľa
Pokročilý člen
Pokročilý člen
Príspevky: 573
Vek: 21.07
Založený: 20.07.2010
Bydlisko: okolie KE
Karma: 2

Re: Funkcia raz za hodinu

Odoslaťod alidedko » 24 Aug 2017, 17:58

Paralelne vykonavanie?

Ved to je princip normalneho fungovania vsetkych jednocipov. Je blud a totalne amaterske, mat len jednu slucku v programe a zdrziavat ju nejakym delayom.

Vacsinou sa veci riesia casovacmi. Zaklad casovac dajme tomu na 1ms a v obsluhe prerusenia inkrementovat. Na zaklade toho si odvodit premenne pre napr. 10ms, 100ms a 1s. A s nimi dalej pracovat.

Ale ci to vie arduino kniznica a ako sa to robi, to uz neviem ...
Trhala si chrasty, tretieho dvanásty ...
alidedko
Ultimate člen
Ultimate člen
Príspevky: 3250
Vek: 25.87
Založený: 04.02.2013
Bydlisko: U alibabky v Poprade
Karma: 22

Re: Funkcia raz za hodinu

Odoslaťod peterple » 24 Aug 2017, 18:32

martinius96 napísal:Vedel by mi niekto poradiť ako docieliť spustenie tej funkcie raz za hodinu? Existuje niečo ako paralelne vykonavanie, alebo niečo na ten štýl? Ďakujem!


V prvom rade, koľko má to Arduíno jadier? Keď na to chceš ísť paralelným vykonávaním. Neškodilo by držať sa možností architektúry na ktorej úloha beží. Ak má niečo jedno CPU paralelizmus je jaksi vylúčený. To ale treba poznať rozdiel medzi paralelizmom a multitaskingom.

Funkcia raz za hodinu sa spustí za pomoci rozumného kódu, napríklad s funkciou milis. Keby si si urobil to odstraňovanie zákmitov (ale sám), nie pomocou nejakej cudzej funkcii. A pochopil by si ako to pracuje tak by si možno prišiel na to, že je úplne jedno či sa čaká 10ms na ukludnenie kontaktu tlačítka, alebo 60*60*1000ms než uplynie hodina.

Ale pre teba mám tiež radu. Nájdi si nejaký projekt kde sú urobené hodiny a spúštaj si tú tvoju funkciu keď sa tam prepne hodina.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1544
Vek: 51.05
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: Funkcia raz za hodinu

Odoslaťod stefanSK » 24 Aug 2017, 19:27

Pri použití funkcie milis(). treba ešte pamätať na to, že táto hodnota sa asi po 50-tich dňoch resetne.

"Returns the number of milliseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days."
S.K.
stefanSK
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 490
Vek: 62.05
Založený: 24.06.2010
Bydlisko: Trnava
Karma: 9

Re: Funkcia raz za hodinu

Odoslaťod peterple » 24 Aug 2017, 20:10

nerozumiem varovaniu. Veď hodina je snáď o hodne menej ako 50 dní. To že to počítadlo pretečie a pôjde zase od nuly ničomu neublíži, aj keby to bolo raz za deň. Počíta sa s rozdielom a nie s absolútnou hodnotou.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1544
Vek: 51.05
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: Funkcia raz za hodinu

Odoslaťod boraicho » 24 Aug 2017, 20:37

a ako vyzera ta funkcia milis?
to je špeci kod pre C? alebo pre arduiono?
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
boraicho
Obrázok používateľa
Ultimate člen
Ultimate člen
Príspevky: 11531
Vek: 29
Založený: 03.02.2007
Bydlisko: Prešov
Karma: 40

Re: Funkcia raz za hodinu

Odoslaťod peterple » 24 Aug 2017, 21:06

Špécia pre arduíno. Využíva to jeden z časovačov. Ale samozrejme ak tomu rozumieš vieš si podľa toho napísať vlastnú na hocijaký procesor čo má hw časovač.

Tuto to je dopodrobna rozpitvané.
https://ucexperiment.wordpress.com/2012/03/16/examination-of-the-arduino-millis-function/
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1544
Vek: 51.05
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: Funkcia raz za hodinu

Odoslaťod mr.mio » 24 Aug 2017, 22:29

martinius96 napísal:Ahojte, mám kód, ktorý obsahuje delaye a je dosť dlhý. Potrebujem ale spúšťať raz za hodinu jednu funkciu, ktorá bude robiť špecifický HTTP request. Loop sa opakuje každých cca 6s a tiež robí http requesty, ktoré sú pravidelné. Vedel by mi niekto poradiť ako docieliť spustenie tej funkcie raz za hodinu? Existuje niečo ako paralelne vykonavanie, alebo niečo na ten štýl? Ďakujem!


Tento kód bude rátať sekundy,keď naráta 3600s vykoná tvoju funkciu nezávisle od loop funkcie.
Neviem akú máš dosku a MCU,ani na akej frekvencií ti MCU tiká,ale na vačšine arduino (ATmega 328/32u4/2560) dosiek by to malo pracovať. Niektoré funkcie ako delay či millis môžu prestať pracovať korektne.Nie som si istý či využívajú časovač 0 alebo 1. Vyskúšaj a daj vedieť.

Kód: Vybrať všetko

int cycle = 0;
void setup() {
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 3036;
  TCCR1B |= (1 << CS12);
  TIMSK1 |= (1 << TOIE1);
}

ISR (TIMER1_OVF_vect) {
  TCNT1 = 3036;
  cycle++;
  if (cycle == 3600) {
    //"sem daj svoju funkciu ktorú potrebuješ vykonať raz za hodinu"
    cycle = 0;
  }
}

void loop() {}
mr.mio
Obrázok používateľa
Ultimate člen
Ultimate člen
Príspevky: 4997
Vek: 29.93
Založený: 01.10.2009
Bydlisko: Podunajska pahorkatina
Karma: 3

Re: Funkcia raz za hodinu

Odoslaťod peterple » 24 Aug 2017, 22:49

Dobrá rada stojí groš, ale za túto by som veľa nedal:
mr.mio napísal:ISR (TIMER1_OVF_vect) {
TCNT1 = 3036;
cycle++;
if (cycle == 3600) {
//"sem daj svoju funkciu ktorú potrebuješ vykonať raz za hodinu"
Len to nie.
cycle = 0;
}
}

V tomto mieste sú zakázané prerušenia.

Páni majstri zapamätajte si že z prerušenia sa nevykonávajú žiadne časovo náročné funkcie. A keby náhodou záviseli na nejakom prerušení tak je to dead lock jak vyšitý.

Inak prečo je toto spoľahlivejšie ako milis()? Oboje je založené na časovači. Oboje zblbne len vtedy ak si to zblbne programátor keď nevie čo robí. Napríklad tým že volá divočiny rovno z prerušenia.
No a delay nemá žiadny dôvod nefungovať. Ten bude fungovať vždy. Jediný dôvod kedy sa môže zdať že zlyhal je zase nejaká prasačina s prerušením.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1544
Vek: 51.05
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: Funkcia raz za hodinu

Odoslaťod alidedko » 24 Aug 2017, 23:26

Mal som to "na jazyku", ale zas by som bol za rypaveho.

Do ISR urcite funkcia nepatri, hlavne nie copy paste, tam je potrebne si maximalne tak nastavit premennu (v tomto pripade cycle), ktoru si v hlavnej slucke skontrolujes a ak je nastavena, zavolat funkciu a znulovat.

Aj mna ucili, ze v obsluhe prerusenia sa robi minimum vlastnych instrukcii.
Trhala si chrasty, tretieho dvanásty ...
alidedko
Ultimate člen
Ultimate člen
Príspevky: 3250
Vek: 25.87
Založený: 04.02.2013
Bydlisko: U alibabky v Poprade
Karma: 22

Re: Funkcia raz za hodinu

Odoslaťod stefanSK » 25 Aug 2017, 07:05

pre peterple:

podľa zadania, chce spúšťať funkciu každú hodinu, tak predpokladám, že to pôjde nonstop.
Moje varovanie bolo myslené tak, že v prípade výpočtu hodiny tak, že urobí rozdiel aktualneho počtu milisekúnd od posledne zapamätamému, v jednom cykle (po pretečení počítadla ms) dostane záporný počet ms.
S.K.
stefanSK
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 490
Vek: 62.05
Založený: 24.06.2010
Bydlisko: Trnava
Karma: 9

Re: Funkcia raz za hodinu

Odoslaťod pocitujlasku » 25 Aug 2017, 07:35

ja som to riesil najprimitivnejsie, ako to ide. Mam premennu, kde si ukladam datum a cas + hodina. Jednoducho porovnavam ci je >=ako aktualny, ak ano, tak si do premennej ulozim datum a cas + hodina (tzn. kedy sa ma opat vykonat), vykonam request a vybavene. Moze tam nastat +- posun, preto bud to nastavim pred vykonanim requestu, alebo natvrdo davam minuty a sekundy na 0 (ak to chcem presne).
Pri prvom spusteni ju nastavim na 0 - teda sa vykona hned. Problem tam moze nastat, ked sa synchronizuje datum a cas, ale to sa da osetrit.
Intel, Nvidia, Ubuntu, Firefox, Asus, Nissan, Jelinek 52%, Metal
---------------------------------------------------------------------------------------------
Jedním z největších projevů nedůvěry v Boha je hromosvod na kostele.
pocitujlasku
Ultimate člen
Ultimate člen
Príspevky: 4011
Vek: 34.77
Založený: 20.07.2007
Bydlisko: Poprad
Karma: 15

Re: Funkcia raz za hodinu

Odoslaťod zen » 25 Aug 2017, 13:47

Nemam zapojene Arduino, dlho som ho neprogramoval, tak len zakladná idea:
Kód: Vybrať všetko
void once_per_hour() {
  if (millis()<3600*1000) return;
  print ("once_per_hour executed")
  // v Arduine je funkcia, co da millis na 0
  reset_millis();
}

void loop() {
   task_1();
   task_2();
   once_per_hour();
   task_3();
}
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)
zen
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 298
Založený: 22.11.2013
Bydlisko: Cadca
Karma: 4

Re: Funkcia raz za hodinu

Odoslaťod stefanSK » 25 Aug 2017, 14:09

nedoporučuje sa používať reset_millis0.

Arduino: How do you reset millis() ?
by James Lewis

The quick answer to “How do you reset millis()” is: You Don’t! And here’s why: if you did, it would potentially break most libraries and functions that rely on it. Generally the reason people want to reset it, is that they are concerned about rollover. Instead of focusing on resetting millis(), here is how to use it correctly.....
S.K.
stefanSK
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 490
Vek: 62.05
Založený: 24.06.2010
Bydlisko: Trnava
Karma: 9

Re: Funkcia raz za hodinu

Odoslaťod mr.mio » 25 Aug 2017, 15:07

peterple napísal:Páni majstri zapamätajte si že z prerušenia sa nevykonávajú žiadne časovo náročné funkcie. A keby náhodou záviseli na nejakom prerušení tak je to dead lock jak vyšitý.


Ale veď to je už na ňom čo si tam dá. Môže tam napísať celú funkciu a zistí že to nefunguje,alebo prepísať jeden boolean na true a v loop použiť jednoduchú podmienku if v ktorej vyžiada http a boolean prepíše na false. Podmienka bude splnená raz za hodinu.
A čo sa stane ak aj vykoná funkciu ktorej exekúcia je kratšia ako interval prerušení? A aj to iba raz za 3600 prerušení.
Nechcem sa hádať,nie som programátor,skôr hobbysta. Rád sa nechám poučiť.
mr.mio
Obrázok používateľa
Ultimate člen
Ultimate člen
Príspevky: 4997
Vek: 29.93
Založený: 01.10.2009
Bydlisko: Podunajska pahorkatina
Karma: 3

Re: Funkcia raz za hodinu

Odoslaťod lucky62 » 25 Aug 2017, 16:21

Všetko bolo dávno vymyslené - millis() funguje perfektne:
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Netreba prerušenia ani delay()...
Ak by niekoho niekomu vŕtalo v hlave, že pri pretečení millis() môže dôjsť k chybe, tak nemôže... (ak bude zachovaný spôsob porovnania časových intervalov).

Finta je vtom, že sa neporovnáva priamo čas millis() ale rozdiel časov millis() - previousMillis a pretože operandy sú unsigned long, aritmetika sa s tým sama vysporiada a vypočítaný interval bude vždy OK.

Nejaké zložitejšie vysvetlenie nájdete na tomto linku.
....môj bazar....

...Nikdy sa nehádaj z blbcom...
lucky62
Obrázok používateľa
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1026
Založený: 14.02.2012
Bydlisko: Liptovský Mikuláš, SK
Karma: 7

Re: Funkcia raz za hodinu

Odoslaťod peterple » 25 Aug 2017, 18:47

Hurá. Konečne jeden čo vie ako funguje binárna sústava.

StefanSK: žiadne záporné číslo tam nebude.

mr.mio:
Stať sa môže všeličo:
1. nič, iba sa stratí pár prerušení, takže napr milis pôjde pár ms (alebo aj sekund) pozadu. Ak to nie sú hodiny tak sú škody minimálne.
2. zmrzne to - to vtedy ak tá volaná funkcia jednoznačne bude čakať na niečo čo sa stane len po obsluhe iného prerušenia. Toto sa volá dead lock . Pretože sú zakázané obsluhy prerušení tak sa to obslúžiť nemôže a funkcia bude čakať večne.
3. zmrzne to len niekedy. Zvyčajne dosť nepravidelne a málo často. To je napr vtedy ak za normálnych podmienok sa na prerušenie nečaká. Ale za nenormálnych to nastať môže a vtedy to padne. Trebárs u toho http môže byť takýto scenár. Normálne sa tá http požiadavka nabufruje a teda obsluha funkcie http požiadavky skončí. Potom sa to vráti z prerušenia a tá bufrovaná požiadavka sa začne obluhovať a dorazí odpoveď a je všetko v poriadku. Môže sa ale stať z nejakého dôvodu (pomalá linka ...) že ten bufer nebude prázdny a tak sa tam tá nová požiadavka nezmestí. V takom prípade to volanie prechádza do blokujúceho režimu a čaká až sa ten bufer vyprázdni. Za normálnych okolností by sa tak stalo lebo by boli povolené prerušenia a nejako by sa to odvysielalo. Lenže teraz je prerušenie zakázané, nepošleš ani byte, nie to paket. Takže ti to zamrzlo. A udeje sa ti to raz za týždeň.
Tak potom začneš rozprávať že tá alebo oná funkcia občas nefunguje. Lebo si to nevieš nijako vysvetliť prečo to nastáva.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1544
Vek: 51.05
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: Funkcia raz za hodinu

Odoslaťod zen » 26 Aug 2017, 13:17

stefanSK napísal:nedoporučuje sa používať reset_millis0.

Celkom suhlasim, jednalo sa mi o to, dat najjadnochsie riesenie, ktore si upravi.

Ta ukazka z arduino.cc za moc nestoji:
- vsetko v main(), casto sa to tazko upravuje, ak to chces adaptovat na funkciu
- zbytocne vela operacii a variables:
Kód: Vybrať všetko
if (millis()>Next) {
     Next+=interval;
}
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)
zen
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 298
Založený: 22.11.2013
Bydlisko: Cadca
Karma: 4

Ďalšia

Naspäť na Arduino

Kto je prítomný

Užívatelia prezerajúci si toto fórum: Žiadny registrovaný používateľ a 1 hosť.

Forums ©
Autor stránky je Ondrej Závodský(zawin), o graficky design sa stará Ľuboš Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
Čas potrebný k spracovaniu stránky 0.67 sekúnd