Você não deve chamar funções de dentro dos arquivos de cabeçalho. Os arquivos de cabeçalho são para definir macros do pré-processador (#define) e referências a variáveis / funções em outros arquivos.
Você deve criar vários arquivos C e vinculá-los juntos em tempo de compilação. O arquivo de cabeçalho é usado para informar a cada arquivo C quais funções e variáveis os outros arquivos C possuem.
Para usar vários arquivos no Arduino IDE, você precisa de pelo menos 1 arquivo de cabeçalho para descrever as funções que estão nos outros arquivos que você deseja compartilhar entre eles. Além disso, quaisquer variáveis globais que você deseja usar em todos os arquivos.
Essas definições devem ser qualificadas com o atributo "externo".
Então você precisa adicionar um ou mais arquivos "pde" que contenham o código real e as definições de variáveis para as funções.
Por exemplo, eu tenho um arquivo "mouse.h":
extern void mouse_read(char *,char *, char *);
extern void mouse_init();
e um arquivo "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);
}
Então, no meu arquivo principal, tenho:
#include "mouse.h"
e posso chamar as funções que estão no "mouse.pde" como se estivessem no arquivo local.
Como alternativa à resposta muito boa do @ Majenko, você pode criar uma classe C ++ para encapsular suas funções e colocá-la na pasta de bibliotecas, conforme descrito em http://www.arduino.cc/en/Hacking/LibraryTutorial .
Talvez você precise
#include <Serial.h>
no arquivo de implementação da sua classe para poder chamar métodos Seriais. Eu tomaria cuidado ao fazer isso, pois obviamente existem efeitos colaterais ao chamar funções seriais (leia em particular). Prefiro definir um método na minha classe que use um caractere * e passe bytes da interface serial para ele no meu programa principal, em vez de interagir diretamente com a interface serial.fonte
Encontrei uma maneira de
Serial
declarar a classe / objeto nos arquivos / guias do cabeçalho:Isso não parece super limpo para mim, mas ainda não parece ter nenhuma desvantagem.
fonte