Küsimus:
Kood ühekordseks täitmiseks Arduinos
apnorton
2014-02-13 08:56:19 UTC
view on stackexchange narkive permalink

Küsimus: kuhu ma pean koodi panema, kui tahan, et see toimuks Arduino käivitamisel ainult üks kord?

Taust: kipun kasutama oma Arduino ülesannete täitmiseks, mida tuleks käivitada üks kord võimsustsükli jooksul. (Näiteks peaks minu robot sõitma edasi ainult üks kord iga kord, kui selle sisse lülitan - rohkem kui see võib laualt kukkuda.)

Standardne Arduino IDE "mall" koosneb funktsioonist loop () ja setup () . Kood setup käivitatakse üks kord voolutsükli jooksul ja loop käivitatakse uuesti iga kord, kui see lõpeb.

Näen koodile kahte lähenemist " 1-kordsed ülesanded: "

Meetod 1:" Loop üks kord "

  void setup () {// do setup stuff} void loop () {// do task (1); // Korrake igavesti, vältides funktsiooni taaskäivitamist}  

2. meetod: "Ainult seadistamine"

  void setup () {// tee seadistamise asju // tee ülesanne} void loop () {// ei tee midagi}  

Küsimuse üksikasjalikum vorm: kas üks neist meetoditest on riistvarast parem? / tarkvara mõttes? (nt kas funktsioonis setup on midagi "erilist", nagu see töötaks ainult nii palju aega?)
Ja kui need on riistvara / tarkvara seisukohast samad, kas on "parim tava" või tavaline viis koodi kirjutamiseks nendeks olukordadeks Arduino kogukonnas?

Käsu `exit 'mõningast kasutamist käsitletakse saidil http://arduino.stackexchange.com/questions/188/what-happens-when-i-call-exit-from-my-program
Kuus vastused:
#1
+13
Connor Wolf
2014-02-13 18:43:07 UTC
view on stackexchange narkive permalink

Mind segab teie küsimus. Küsite, kuhu soovite üks kord käivitamisel seadistamise funktsioonid panna, ja arutate seejärel häälestusfunktsiooni. Selleks on häälestusfunktsioon.

Sellisena läheb ühekordne seadistamise funktsioon seadistamisfunktsiooni.

FWIW, kui vaatate fail, mis kutsub setup ja loop funktsioone:

  #include <Arduino.h>int main (void) { init (); # kui määratletud (USBCON) USBDevice.attach (); # endif setup (); for (;;) {silmus (); if (serialEventRun) serialEventRun (); } return 0;}  

Kõigil eesmärkidel on need kaks võimalust täiesti identsed. Mõlemal juhul saate tühja hõivatud ootamise silmuse. Ausalt öeldes eeldaksin, et kaks erinevat võimalust väljastavad tõenäoliselt sama masinakoodi, nii et kogu asi pole probleem.

Märkus:
if (serialEventRun) serialEventRun ( ); näib olevat võimalus, mis võimaldab teil lisada funktsiooni, mida kutsutakse jadaandmete vastuvõtmisel, kuid kui te ei määratle oma funktsioonis funktsiooni void serialEvent () {} kood, kompileeritakse see täielikult ja seda pole toodetud masinakoodis.

Imelik on aktsepteerida vastust, mis pole (veel) enim hääletatud. Kuid funktsiooni `main ()` definitsiooni nägemine oli minu küsimusele tõesti kasulik. (Ja märkite grupiga üksmeelt, kasutades "loop" asemel "setup".) Tänan teid abi eest.
@anorton - kahtluse korral vaadake teki all. Arduino platvorm on minu arvates mugav prototüüpide loomiseks, kuid see on suuresti ainult katlakoodi kood. Selle tegemise mõistmine võib olla tohutult kasulik, kui otsustate, kuidas midagi üles ehitada.
#2
+6
Steven10172
2014-02-13 10:40:08 UTC
view on stackexchange narkive permalink

Lähen tavaliselt 2. meetodiga, kuid lõpetan sellega:

  void setup () {// do setup stuff // do task init (); // Tehke käivitamise lähtestamisetapid} void init () {// tehke käivitamisel toiminguid} void loop () {// do looping code}  

Ülaltoodud seadistustega võimaldab kood veelgi korrastatum.

siiani parim vastus +1, aitäh kutt, et sa mind päästsid!
#3
+5
Matthew G.
2014-02-13 09:41:08 UTC
view on stackexchange narkive permalink

Ma eelistaksin tungivalt meetodit 2. Kui plaanite kunagi sisendi, väljundi jms käitlemiseks koodi lisada, on see 2. meetodiga lihtne - täitke lihtsalt loop () , kuid vajab ümbertöötamist / refaktoreerimine meetodis 1.

#4
+3
TheDoctor
2014-02-13 10:01:09 UTC
view on stackexchange narkive permalink

Seadistusfunktsioonil pole ajalist piirangut. Ma eelistan meetodit 2, kuna tsükli saab hiljem täita kõigega, mida vajate.

#5
+1
sachleen
2014-02-13 10:23:37 UTC
view on stackexchange narkive permalink

Kindlasti minge teise meetodiga. Selleks on häälestusfunktsioon olemas. Ka seda on palju lihtsam lugeda. Kõik, mis asub loopis () , tähendab, et seda käitatakse tsüklis.

#6
  0
jfpoilpret
2014-02-13 12:24:45 UTC
view on stackexchange narkive permalink

Nagu enamik teisi vastuseid, valiksin meetodi 2.

Kuid prooviksin vältida Arduino teegi poolt tehtud kõnet tühjale silmusele () , mis paneb Atmeli tarbima "palju" voolu tühjana.

Muuda:

Nagu mõned kommentaarid siiski välja tõid, kasutage delay () > loop () ei muuda midagi energiatarbimiseks.

Seega, kui soovite energiatarbimist vähendada, kui teie setup () on käivitatud, peate Atmeli unerežiimidega mängimiseks. Arduino visandite abil saate vaadata seda artiklit, mis näitab unerežiimidega toimetulekut; see teeb midagi enamat kui lihtsalt Atmeli magama panemine, kuid see on hea (ja lihtne) lugemisviis, kui soovite unerežiimidega mängida.



See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...