Vous ne devez pas appeler de fonctions à partir de fichiers d'en-tête. Les fichiers d'en-tête servent à définir les macros de pré-processeur (#define) et les références aux variables / fonctions dans d'autres fichiers.
Vous devez créer plusieurs fichiers C et les lier ensemble au moment de la compilation. Le fichier d'en-tête est utilisé pour indiquer à chaque fichier C les fonctions et les variables des autres fichiers C.
Pour utiliser plusieurs fichiers dans l'IDE Arduino, vous avez besoin d'au moins 1 fichier d'en-tête pour décrire les fonctions qui se trouvent dans les autres fichiers que vous souhaitez partager entre eux. En outre, toutes les variables globales que vous souhaitez utiliser dans tous les fichiers.
Ces définitions doivent être qualifiées avec l'attribut "externe".
Ensuite, vous devez ajouter un ou plusieurs fichiers "pde" qui contiennent le code réel et les définitions des variables pour les fonctions.
Par exemple, j'ai un fichier "mouse.h":
extern void mouse_read(char *,char *, char *);
extern void mouse_init();
et un fichier "mouse.pde":
#include <ps2.h>
PS2 mouse(6,5);
void mouse_read(char *stat,char *x, char *y)
{
mouse.write(0xeb); // give me data!
mouse.read(); // ignore ack
*stat = mouse.read();
*x = mouse.read();
*y = mouse.read();
}
void mouse_init()
{
mouse.write(0xff); // reset
mouse.read(); // ack byte
mouse.read(); // blank */
mouse.read(); // blank */
mouse.write(0xf0); // remote mode
mouse.read(); // ack
delayMicroseconds(100);
}
Ensuite, dans mon fichier principal, j'ai:
#include "mouse.h"
et je peux appeler les fonctions qui sont dans "mouse.pde" comme si elles étaient dans le fichier local.
Comme alternative à la très bonne réponse de @ Majenko, vous pouvez créer une classe C ++ pour encapsuler vos fonctions et la placer dans le dossier des bibliothèques comme décrit dans http://www.arduino.cc/en/Hacking/LibraryTutorial .
Vous devrez peut-être
#include <Serial.h>
dans le fichier d'implémentation de votre classe pour pouvoir appeler les méthodes Serial. Je ferais attention à ne pas le faire car il y a évidemment des effets secondaires à appeler des fonctions série (lire en particulier). Je préfère définir une méthode dans ma classe qui prend un char * et transmet des octets de l'interface série à partir de mon programme principal, plutôt que de la faire interagir directement avec l'interface série.la source
J'ai trouvé un moyen de
Serial
déclarer la classe / l'objet dans les fichiers / onglets d'en-tête:Cela ne me semble pas très propre, mais cela ne semble pas avoir encore d'inconvénients.
la source