Arduinoで1回実行するためのコード


12

質問: Arduinoの起動ごとに1回だけ実行する場合、どこにコードを配置しますか?

背景:私は、Arduinoを使用して、電源の再投入ごとに1回実行する必要があるタスクを実行する傾向があります。(たとえば、ロボットは、電源を入れるたびに1回だけ前進する必要があります。それ以上は、テーブルから落ちる可能性があります。)

標準のArduino IDEの「テンプレート」はと関数で構成されloop()ていsetup()ます。setupコードは、電源サイクルごとに一度実行され、そしてloopそれが終わるたびに再起動されます。

「1回のタスク」をコーディングする2つのアプローチがあります。

方法1:「1回ループ」

void setup() {
  //do setup stuff
}

void loop() {
  //do task

  while(1) ; //Repeat forever, preventing function from re-starting
}

方法2:「セットアップのみ」

void setup() {
  //do setup stuff

  //do task
}

void loop() {
  //do nothing
}

より詳細な質問形式: これらの方法の1つは、ハードウェア/ソフトウェアの意味から「より良い」ものですか?(たとえば、setup機能に非常に長い時間しか実行できないような「特別な」何かがありますか?)
また、ハードウェア/ソフトウェアの観点から同じ場合、「ベストプラクティス」またはコードを記述する標準的な方法はありますかArduinoコミュニティのこれらの状況のた​​めに?


このexitコマンドの使用方法については、arduino.stackexchange.com
questions /

回答:


13

私はあなたの質問にちょっと混乱しています。起動ごとに1回セットアップ機能を配置する場所を尋ね、セットアップ機能について説明します。それがセットアップ機能の目的です。

そのため、1回限りのセットアップ機能はセットアップ機能に入ります。

FWIW、あなたがファイルに見れば呼び出すsetuploop機能を:

#include <Arduino.h>

int main(void)
{
    init();

#if defined(USBCON)
    USBDevice.attach();
#endif

    setup();
    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }
    return 0;
}

すべての意図と目的について、2つのオプションは完全に同一です。いずれにしても、空のbusy-waitループが発生します。率直に言って、2つの異なるオプションがおそらくとにかく同じマシンコードを出力することを期待しているので、全体は問題ではありません。

注:
if (serialEventRun) serialEventRun();シリアルデータの受信時に呼び出される関数をアタッチできる機能のように見えますvoid serialEvent(){}が、コードで関数を定義しない場合、完全にコンパイルされ、生成されたマシンコードには存在しません。


最高の投票ではない(まだ)回答を受け入れるのは奇妙に感じます。しかし、main()関数の定義を見ることは私の質問にとって本当に役に立ちました。(そして、あなたはのsetup代わりにを使用してグループとのコンセンサスを示しますloop)。ご協力ありがとうございました。
アプノートン14

1
@anorton-疑問がある場合は、カバーの下を見てください。私はarduinoプラットフォームがプロトタイピングに便利だと思っていますが、それは大部分が単なる定型コードです。何をしているのかを理解することは、何かを設計する方法を決定する際に非常に役立ちます。
コナーウルフ

6

私は通常、方法2を使用しますが、これを実行することになります。

void setup() {
  //do setup stuff

  //do task
  init(); //Do start-up initialization steps
}

void init() {
  // do tasks on startup
}

void loop() {
  //do looping code
}

上記の設定により、コードをさらに整理できます。


これまでのベストアンサー+1、ありがとうございます!
カイル

5

方法2を強くお勧めします。入力、出力などを処理するコードを追加する予定がある場合は、方法2を使用すると簡単です。入力するだけでloop()、方法1でリワーク/リファクタリングが必要になります。


3

セットアップ機能に時間制限はありません。後で必要なものでループを埋めることができるので、方法2を好みます。


1

間違いなく方法2を使用してください。それがセットアップ機能の目的です。読みやすくなっています。内のloop()すべてのものは、ループで実行されることを意味します。


0

他のほとんどの答えとして、方法2に進みます。

しかし、私は、Arduinoライブラリによるloop()、Atmelが「多くの」電流を無料で消費する空への呼び出しを回避しようとします。

編集:

ただし、いくつかのコメントが指摘しているように、delay()in loop()を使用しても電力消費量は変化しません。

したがって、setup()実行後に消費電力を削減したい場合は、Atmelスリープモードで遊ぶ必要があります。あなたはを見てとることができ、この記事ショーはあなたのArduinoのスケッチからスリープモードに対処する方法ということ。Atmelをスリープ状態にするだけではありませんが、スリープモードでプレイしたい場合は適切な(そして簡単な)読み物です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.