IDEが物事を整理する方法
まず、IDEが「スケッチ」を整理する方法です。
- メイン
.inoファイルは、それが入っているフォルダーと同じ名前のものです。したがって、foobar.inoin foobarフォルダーの場合、メインファイルはfoobar.inoです。
.inoそのフォルダー内の他のファイルは、メインファイルの末尾にアルファベット順に連結されます(メインファイルの場所に関係なく、アルファベット順に)。
- この連結されたファイルは
.cppファイル(例:)になりますfoobar.cpp-一時的なコンパイルフォルダーに配置されます。
- プリプロセッサは、そのファイルで見つかった関数の関数プロトタイプを「役立つように」生成します。
- メインファイルの
#include <libraryname>ディレクティブがスキャンされます。これにより、IDEがトリガーされ、関連するすべてのファイルが各(言及された)ライブラリから一時フォルダーにコピーされ、コンパイルの指示が生成されます。
- 任意の
.c、.cppまたは.asmスケッチフォルダ内のファイルは(つまり、それらは別々のファイルとして通常の方法でコンパイルされている)別のコンパイル単位としてビルドプロセスに追加されます
- すべての
.hファイルは一時コンパイルフォルダーにもコピーされるため、.cまたは.cppファイルから参照できます。
- コンパイラは、ビルドプロセスに標準ファイル(など
main.cpp)を追加します
- ビルドプロセスは、上記のすべてのファイルをオブジェクトファイルにコンパイルします。
- コンパイル段階が成功した場合、それらはAVR標準ライブラリと一緒にリンクされます(例えば、あなたに与える
strcpyなど)
このすべての副作用は、メインスケッチ(.inoファイル)がすべての意図と目的に対してC ++であると見なせることです。ただし、関数プロトタイプの生成では、注意しないと不明瞭なエラーメッセージが表示される可能性があります。
プリプロセッサの癖を回避する
これらの特異性を回避する最も簡単な方法は、メインスケッチを空白のままにすることです(他の.inoファイルは使用しません)。次に、別のタブ(.cppファイル)を作成し、次のようにそこにアイテムを配置します。
#include <Arduino.h>
// put your sketch here ...
void setup ()
{
} // end of setup
void loop ()
{
} // end of loop
を含める必要があることに注意してくださいArduino.h。IDEはメインスケッチに対してそれを自動的に行いますが、他のコンパイルユニットについては、それを行う必要があります。そうしないと、String、ハードウェアレジスタなどのことを認識できません。
セットアップ/メインパラダイムの回避
セットアップ/ループの概念で実行する必要はありません。たとえば、.cppファイルは次のようになります。
#include <Arduino.h>
int main ()
{
init (); // initialize timers
Serial.begin (115200);
Serial.println ("Hello, world");
Serial.flush (); // let serial printing finish
} // end of main
強制的にライブラリを含める
「空のスケッチ」の概念で実行する場合、プロジェクトの別の場所、たとえばメイン.inoファイルで使用されるライブラリを含める必要があります。
#include <Wire.h>
#include <SPI.h>
#include <EEPROM.h>
これは、IDEがライブラリの使用状況についてメインファイルのみをスキャンするためです。効果的には、メインファイルを、使用中の外部ライブラリを指定する「プロジェクト」ファイルと見なすことができます。
命名の問題
同じ単一の.inoファイルでC ++スタイルのクラスを宣言します(聞いたことはありますが、動作することはありません-それは可能ですか?)。
はい、これは問題なくコンパイルします:
class foo {
public:
};
foo bar;
void setup () { }
void loop () { }
ただし、通常の慣行に従うことをお勧めします。宣言を.hファイルに、定義(実装)を.cpp(または.c)ファイルに入れます。
なぜ「おそらく」?
私の例が示すように、すべてを1つのファイルにまとめることができます。大規模なプロジェクトの場合は、組織化することをお勧めします。最終的には、中規模から大規模のプロジェクトの段階に到達します。そこでは、物事を「ブラックボックス」に分割します。可能な限り)。
このクラスをプロジェクト内の他の複数のファイルで使用する場合、個別のファイル.hと.cppファイルが使用されます。
.hファイルには、宣言したクラスを-それはどのような機能、それが持っている、そしてそれらがどのように呼ばれて、それが何を知っている他のファイルのための十分な詳細を提供するものであること。
この.cppファイルは、クラスを定義(実装)します。つまり、実際にクラスに機能を実行させる関数と静的クラスメンバーを提供します。一度だけ実装したいので、これは別のファイルにあります。
.hファイルには、他のファイルに含まれますものです。.cppファイルは、クラスの機能を実装するためにIDEによって一度にコンパイルされます。
図書館
このパラダイムに従えば、クラス全体(.hおよび.cppファイル)を非常に簡単にライブラリーに移動できます。その後、複数のプロジェクト間で共有できます。必要とされるすべてのフォルダ(例を。作ることですmyLibrary)と置く.hと.cpp(例えば。そこにファイルをmyLibrary.hしてmyLibrary.cpp)、その後、あなたの内側にこのフォルダを置くlibrariesあなたのスケッチが保存されているフォルダ(スケッチブックフォルダ)内のフォルダ。
IDEを再起動すると、IDEはこのライブラリを認識します。これは実に簡単なことで、このライブラリを複数のプロジェクトで共有できるようになりました。私はこれをたくさんします。
ここでもう少し詳しく。