Guia de Programação C para Arduino¶
Introdução¶
Este guia fornece uma introdução prática à programação em C para o Arduino, abordando conceitos fundamentais e boas práticas para desenvolvimento de projetos com microcontroladores.
O objetivo é ajudar você a entender a sintaxe básica do C e como aplicá-la em projetos de IoT e sistemas embarcados.
Estrutura Básica de um Programa em C para Arduino¶
Todo programa Arduino é composto de duas funções principais:
Função setup()
¶
A função setup()
é executada uma vez quando o programa começa. É usada para inicializar variáveis, pinos de entrada e saída, bibliotecas, etc.
void setup() {
// Inicializa o pino digital 13 como saída
pinMode(13, OUTPUT);
}
Função loop()
¶
A função loop()
contém o código que é executado repetidamente até que o Arduino seja desligado. É aqui que a lógica principal do programa reside.
void loop() {
digitalWrite(13, HIGH); // Liga o LED
delay(1000); // Espera por um segundo
digitalWrite(13, LOW); // Desliga o LED
delay(1000); // Espera por um segundo
}
Conceitos Fundamentais¶
Variáveis¶
Variáveis são usadas para armazenar dados que podem ser manipulados pelo programa. No Arduino, as variáveis comuns incluem:
int
: Números inteirosfloat
: Números de ponto flutuantechar
: Caracteres individuaisString
: Cadeias de caracteres
int ledPin = 13;
float temperatura = 23.5;
char inicial = 'A';
String texto = "Hello, World!";
Estruturas de Controle¶
Condicionais¶
if
,else if
,else
: Executa blocos de código com base em condições.
if (temperature > 25) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
Loops¶
for
: Executa um bloco de código um número específico de vezes.while
: Executa um bloco de código enquanto uma condição for verdadeira.do...while
: Executa um bloco de código pelo menos uma vez, e então repete enquanto a condição for verdadeira.
for (int i = 0; i < 10; i++) {
Serial.println(i);
}
while (digitalRead(buttonPin) == LOW) {
// Espera o botão ser pressionado
}
int j = 0;
do {
Serial.println(j);
j++;
} while (j < 5);
Funções¶
Funções são blocos de código que executam tarefas específicas. Elas ajudam a organizar e reutilizar o código.
void acenderLed(int pino) {
digitalWrite(pino, HIGH);
}
void apagarLed(int pino) {
digitalWrite(pino, LOW);
}
void loop() {
acenderLed(ledPin);
delay(1000);
apagarLed(ledPin);
delay(1000);
}
Arrays¶
Arrays são coleções de variáveis do mesmo tipo, armazenadas em locais de memória contíguos. Eles são úteis para armazenar listas de valores.
int numeros[5] = {10, 20, 30, 40, 50};
void setup() {
Serial.begin(9600);
for (int i = 0; i < 5; i++) {
Serial.println(numeros[i]);
}
}
Manipulação de Arrays¶
void inverterArray(int arr[], int tamanho) {
for (int i = 0; i < tamanho / 2; i++) {
int temp = arr[i];
arr[i] = arr[tamanho - 1 - i];
arr[tamanho - 1 - i] = temp;
}
}
void setup() {
int dados[5] = {1, 2, 3, 4, 5};
inverterArray(dados, 5);
for (int i = 0; i < 5; i++) {
Serial.println(dados[i]);
}
}
Ponteiros¶
Ponteiros são variáveis que armazenam endereços de memória. Eles são poderosos para manipulação de dados e memória.
int valor = 10;
int *ponteiro = &valor;
void setup() {
Serial.begin(9600);
Serial.println(*ponteiro); // Acessa o valor usando o ponteiro
*ponteiro = 20;
Serial.println(valor); // Valor alterado através do ponteiro
}
Ponteiros e Arrays¶
void imprimirArray(int *arr, int tamanho) {
for (int i = 0; i < tamanho; i++) {
Serial.println(*(arr + i));
}
}
void setup() {
int numeros[3] = {100, 200, 300};
imprimirArray(numeros, 3);
}
Structs¶
Structs são usadas para agrupar variáveis relacionadas sob um único nome. Elas são úteis para representar objetos complexos.
typedef struct {
int idade;
float altura;
char nome[50];
} Pessoa;
void setup() {
Serial.begin(9600);
Pessoa aluno = {20, 1.75, "João"};
Serial.print("Nome: ");
Serial.println(aluno.nome);
Serial.print("Idade: ");
Serial.println(aluno.idade);
Serial.print("Altura: ");
Serial.println(aluno.altura);
}
Manipulação de Structs¶
void imprimirPessoa(Pessoa p) {
Serial.print("Nome: ");
Serial.println(p.nome);
Serial.print("Idade: ");
Serial.println(p.idade);
Serial.print("Altura: ");
Serial.println(p.altura);
}
void setup() {
Pessoa professor = {35, 1.80, "Carlos"};
imprimirPessoa(professor);
}
enum¶
Um enum (abreviação de enumerador ou tipo enumerado) em C é um tipo de dado que permite atribuir nomes simbólicos a constantes inteiras. Esses nomes tornam o código mais legível e fácil de entender, especialmente quando se trabalha com conjuntos específicos de valores constantes.
//Declaração
enum estadosMotor { PARADO, FRENTE, TRAS };
// Definine estado inicial
estadosMotor estadoAtual = PARADO;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop() {
switch (estadoAtual) {
case PARADO:
digitalWrite(13, LOW);
Serial.println("Motor parado.");
break;
case FRENTE:
digitalWrite(13, HIGH);
Serial.println("Motor para frente.");
break;
case TRAS:
digitalWrite(13, HIGH);
Serial.println("Motor para trás.");
break;
}
delay(1000);
}
Boas Práticas¶
- Comente seu código: Use comentários para explicar o que o código faz, especialmente para lógica complexa.
- Use nomes descritivos: Escolha nomes de variáveis e funções que descrevam claramente seu propósito.
- Modularize o código: Divida o código em funções para melhorar a legibilidade e a reutilização.
- Teste frequentemente: Teste pequenas partes do código à medida que desenvolve para identificar problemas rapidamente.
Recursos Adicionais¶
- Documentação Oficial do Arduino
- Curso de C para Arduino (YouTube)
- Livro: "Programming Arduino: Getting Started with Sketches"
Este guia serve como um ponto de partida para a programação em C no Arduino.