Bagaimana IDE mengatur berbagai hal
Hal pertama, ini adalah bagaimana IDE mengatur "sketsa" Anda:
- File utama
.ino
adalah salah satu nama yang sama dengan folder di dalamnya. Jadi, untuk foobar.ino
di foobar
folder - file utama adalah foobar.ino.
.ino
File - file lain di folder itu digabungkan bersama-sama, dalam urutan abjad, di akhir file utama (terlepas dari di mana file utama berada, berdasarkan abjad).
- File gabungan ini menjadi
.cpp
file (mis. foobar.cpp
) - ditempatkan di folder kompilasi sementara.
- Preprosesor "membantu" menghasilkan prototipe fungsi untuk fungsi yang ditemukan dalam file itu.
- File utama dipindai untuk
#include <libraryname>
arahan. Ini memicu IDE untuk juga menyalin semua file yang relevan dari masing-masing (disebutkan) perpustakaan ke folder sementara, dan menghasilkan instruksi untuk mengkompilasi mereka.
- Apa pun
.c
, .cpp
atau .asm
file dalam folder sketsa ditambahkan ke proses build sebagai unit kompilasi terpisah (yaitu, mereka dikompilasi dengan cara biasa sebagai file terpisah)
- Setiap
.h
file juga disalin ke dalam folder kompilasi sementara, sehingga mereka dapat disebut dengan c atau Cpp file Anda.
- Kompiler menambahkan ke file standar proses build (seperti
main.cpp
)
- Proses build kemudian mengkompilasi semua file di atas menjadi file objek.
- Jika fase kompilasi berhasil mereka dihubungkan bersama dengan pustaka standar AVR (mis. Memberi Anda
strcpy
dll.)
Efek samping dari semua ini adalah Anda dapat menganggap sketsa utama (file .ino) sebagai C ++ untuk semua maksud dan tujuan. Namun, pembuatan prototipe fungsi dapat menyebabkan pesan kesalahan yang tidak jelas jika Anda tidak berhati-hati.
Menghindari kebiasaan pra-prosesor
Cara paling sederhana untuk menghindari keanehan ini adalah membiarkan sketsa utama Anda kosong (dan tidak menggunakan .ino
file lain ). Kemudian buat tab lain ( .cpp
file) dan masukkan barang-barang Anda ke dalamnya seperti ini:
#include <Arduino.h>
// put your sketch here ...
void setup ()
{
} // end of setup
void loop ()
{
} // end of loop
Perhatikan bahwa Anda perlu memasukkan Arduino.h
. IDE melakukan itu secara otomatis untuk sketsa utama, tetapi untuk unit kompilasi lain, Anda harus melakukannya. Kalau tidak, ia tidak akan tahu tentang hal-hal seperti String, register perangkat keras, dll.
Menghindari pengaturan / paradigma utama
Anda tidak harus menjalankan dengan konsep setup / loop. Misalnya, file .cpp Anda dapat:
#include <Arduino.h>
int main ()
{
init (); // initialize timers
Serial.begin (115200);
Serial.println ("Hello, world");
Serial.flush (); // let serial printing finish
} // end of main
Paksakan inklusi perpustakaan
Jika Anda menjalankan dengan konsep "sketsa kosong" Anda masih perlu menyertakan perpustakaan yang digunakan di tempat lain dalam proyek, misalnya dalam .ino
file utama Anda :
#include <Wire.h>
#include <SPI.h>
#include <EEPROM.h>
Ini karena IDE hanya memindai file utama untuk penggunaan perpustakaan. Secara efektif Anda dapat mempertimbangkan file utama sebagai file "proyek" yang menominasikan perpustakaan eksternal mana yang digunakan.
Masalah penamaan
Jangan beri nama sketsa utama Anda "main.cpp" - IDE menyertakan main.cpp sendiri sehingga Anda akan memiliki duplikat jika melakukannya.
Jangan beri nama file .cpp Anda dengan nama yang sama dengan file .ino utama Anda. Karena file .ino secara efektif menjadi file .cpp ini juga akan memberi Anda nama bentrokan.
Mendeklarasikan kelas gaya C ++ dalam file .ino yang sama, tunggal (pernah dengar, tetapi tidak pernah terlihat berfungsi - apakah itu mungkin?);
Ya, ini mengkompilasi OK:
class foo {
public:
};
foo bar;
void setup () { }
void loop () { }
Namun Anda mungkin lebih baik mengikuti praktik normal: Masukkan deklarasi Anda dalam .h
file dan definisi Anda (implementasi) dalam file .cpp
(atau .c
).
Kenapa "mungkin"?
Seperti contoh saya menunjukkan Anda dapat meletakkan semuanya dalam satu file. Untuk proyek yang lebih besar lebih baik lebih terorganisir. Akhirnya Anda sampai ke tahap dalam proyek ukuran sedang hingga besar di mana Anda ingin memisahkan hal-hal menjadi "kotak hitam" - yaitu, kelas yang melakukan satu hal, melakukannya dengan baik, diuji, dan mandiri ( sejauh mungkin).
Jika kelas ini kemudian digunakan dalam banyak file lain di proyek Anda ini adalah di mana file terpisah .h
dan .cpp
ikut bermain.
The .h
File menyatakan kelas - yaitu, ia menyediakan cukup detail untuk file lain tahu apa yang dilakukannya, apa fungsi itu, dan bagaimana mereka disebut.
The .cpp
File mendefinisikan (mengimplementasikan) kelas - yaitu, itu benar-benar menyediakan fungsi, dan anggota kelas statis, yang membuat kelas melakukan hal tersebut. Karena Anda hanya ingin mengimplementasikannya sekali, ini ada dalam file terpisah.
The .h
file apa yang akan dimasukkan ke dalam file lainnya. The .cpp
file dikompilasi sekali oleh IDE untuk melaksanakan fungsi kelas.
Perpustakaan
Jika Anda mengikuti paradigma ini, maka Anda siap untuk memindahkan seluruh kelas ( .h
dan .cpp
file) ke perpustakaan dengan sangat mudah. Kemudian dapat dibagi antara beberapa proyek. Semua yang dibutuhkan adalah untuk membuat folder (misalnya. myLibrary
) Dan menempatkan .h
dan .cpp
file ke dalamnya (misalnya. myLibrary.h
Dan myLibrary.cpp
) dan kemudian menempatkan folder ini di dalam Anda libraries
folder dalam folder di mana sketsa Anda disimpan (folder sketsa).
Mulai ulang IDE dan sekarang tahu tentang perpustakaan ini. Ini sangat sederhana, dan sekarang Anda dapat berbagi perpustakaan ini melalui beberapa proyek. Saya sering melakukan ini.
Lebih detail di sini .