Funkcia raz za hodinu

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

martinius96

Funkcia raz za hodinu

Príspevok od používateľa 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!

lacosebosik
Nový člen
Nový člen
Príspevky: 78
Dátum registrácie: 13 Aug 2017, 10:21
Bydlisko: Revúca

Re: Funkcia raz za hodinu

Príspevok od používateľa lacosebosik » 24 Aug 2017, 17:08

Pre opakujúce vykonávanie príkazov stará väčšinou daemon cron.
Viac si to pozri tu
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2563
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Funkcia raz za hodinu

Príspevok od používateľa 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ť.
0

alidedko
Ultimate člen
Ultimate člen
Príspevky: 3963
Dátum registrácie: 04 Feb 2013, 22:04
Bydlisko: U alibabky v Poprade
Vek: 32

Re: Funkcia raz za hodinu

Príspevok od používateľa 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 ...
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Funkcia raz za hodinu

Príspevok od používateľa 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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 752
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: Funkcia raz za hodinu

Príspevok od používateľa 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."
0
S.K.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Funkcia raz za hodinu

Príspevok od používateľa 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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12406
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Funkcia raz za hodinu

Príspevok od používateľa boraicho » 24 Aug 2017, 20:37

a ako vyzera ta funkcia milis?
to je špeci kod pre C? alebo pre arduiono?
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Funkcia raz za hodinu

Príspevok od používateľa 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 ... -function/
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

mr.mio
Ultimate člen
Ultimate člen
Príspevky: 5036
Dátum registrácie: 01 Okt 2009, 00:00
Bydlisko: Podunajska pahorkatina
Vek: 36

Re: Funkcia raz za hodinu

Príspevok od používateľa 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() {}
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Funkcia raz za hodinu

Príspevok od používateľa 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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

alidedko
Ultimate člen
Ultimate člen
Príspevky: 3963
Dátum registrácie: 04 Feb 2013, 22:04
Bydlisko: U alibabky v Poprade
Vek: 32

Re: Funkcia raz za hodinu

Príspevok od používateľa 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.
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 752
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: Funkcia raz za hodinu

Príspevok od používateľa 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.
0
S.K.

pocitujlasku
Ultimate člen
Ultimate člen
Príspevky: 6203
Dátum registrácie: 20 Júl 2007, 00:00
Vek: 41

Re: Funkcia raz za hodinu

Príspevok od používateľa 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.
0
Jedním z největších projevů nedůvěry v Boha je hromosvod na kostele.

Používateľov profilový obrázok
zen
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 22 Nov 2013, 14:33
Bydlisko: Cadca

Re: Funkcia raz za hodinu

Príspevok od používateľa 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();
}
0
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)

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 752
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: Funkcia raz za hodinu

Príspevok od používateľa 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.....
0
S.K.

mr.mio
Ultimate člen
Ultimate člen
Príspevky: 5036
Dátum registrácie: 01 Okt 2009, 00:00
Bydlisko: Podunajska pahorkatina
Vek: 36

Re: Funkcia raz za hodinu

Príspevok od používateľa 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ť.
0

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: Funkcia raz za hodinu

Príspevok od používateľa 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.
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Funkcia raz za hodinu

Príspevok od používateľa 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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
zen
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 22 Nov 2013, 14:33
Bydlisko: Cadca

Re: Funkcia raz za hodinu

Príspevok od používateľa 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;
}
0
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)

Napísať odpoveď