Estrutura do Sketch
estrutura.ino
// 1. INCLUSÃO DE BIBLIOTECAS (no topo)
#include <Servo.h>
// 2. CONSTANTES E VARIÁVEIS GLOBAIS
const int LED_PIN = 13; // Constante - não muda
int contador = 0; // Variável global
// 3. OBJETOS
Servo meuServo;
// 4. SETUP — corre uma vez
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
meuServo.attach(9);
}
// 5. LOOP — corre em ciclo infinito
void loop() {
// Lógica principal aqui
}
// 6. FUNÇÕES AUXILIARES
void piscaLed(int vezes) {
for (int i = 0; i < vezes; i++) {
digitalWrite(LED_PIN, HIGH);
delay(200);
digitalWrite(LED_PIN, LOW);
delay(200);
}
}
Variáveis e Tipos de Dados
📦 Tipos principais
| Tipo | Tamanho | Intervalo | Exemplo |
|---|---|---|---|
| int | 2 bytes | -32768 a 32767 | int x = 10; |
| long | 4 bytes | -2M a 2M | long t = millis(); |
| float | 4 bytes | ±3.4×10³⁸ | float v = 3.14; |
| boolean | 1 byte | true / false | boolean on = true; |
| char | 1 byte | -128 a 127 | char c = 'A'; |
| String | variável | texto | String s = "Olá"; |
| byte | 1 byte | 0 a 255 | byte b = 255; |
variaveis.ino
const int PINO_LED = 9; // Constante (boa prática: MAIUSCULAS)
int brilho = 0; // Valor atual do brilho
int incremento = 5; // Passo de variação
void setup() {
pinMode(PINO_LED, OUTPUT);
}
void loop() {
analogWrite(PINO_LED, brilho); // Aplica o brilho
brilho += incremento; // Incrementa
if (brilho <= 0 || brilho >= 255) {
incremento = -incremento; // Inverte direção
}
delay(10);
}
Entradas e Saídas Digitais
📤 Saída Digital
Controla se um pino está a 5V (HIGH) ou 0V (LOW).
pinMode(13, OUTPUT);
digitalWrite(13, HIGH); // Liga
digitalWrite(13, LOW); // Desliga
📥 Entrada Digital
Lê se um pino está a HIGH (5V) ou LOW (0V).
pinMode(2, INPUT_PULLUP);
int estado = digitalRead(2);
// HIGH = solto, LOW = premido
💡
INPUT_PULLUP ativa uma resistência interna de pull-up (~20kΩ). O pino lê HIGH quando solto e LOW quando ligado ao GND. Evita a necessidade de resistências externas com botões.
Entradas Analógicas
leitura_analogica.ino
// analogRead() devolve um valor de 0 a 1023
// correspondente a tensão de 0 a 5V
void setup() {
Serial.begin(9600);
// Pinos analógicos não precisam de pinMode!
}
void loop() {
int leitura = analogRead(A0); // 0 a 1023
// Converter para tensão em Volt
float tensao = leitura * (5.0 / 1023.0);
Serial.print("Leitura: ");
Serial.print(leitura);
Serial.print(" Tensão: ");
Serial.print(tensao);
Serial.println(" V");
delay(500);
}
PWM — Modulação por Largura de Pulso
O Arduino não tem saída analógica verdadeira. O PWM simula tensões intermédias ligando e desligando muito rapidamente o pino. Funciona nos pinos marcados com ~ (3, 5, 6, 9, 10, 11).
pwm.ino
// analogWrite() aceita valores de 0 a 255
// 0 = sempre LOW (0% duty cycle)
// 127 = 50% do tempo HIGH
// 255 = sempre HIGH (100% duty cycle)
void setup() {
pinMode(9, OUTPUT);
}
void loop() {
// Fade in
for (int i = 0; i <= 255; i++) {
analogWrite(9, i);
delay(5);
}
// Fade out
for (int i = 255; i >= 0; i--) {
analogWrite(9, i);
delay(5);
}
}
Condições (if / else)
condicoes.ino
int leitura = analogRead(A0); // 0 a 1023
// if / else if / else
if (leitura > 800) {
digitalWrite(13, HIGH); // Muito luz
} else if (leitura > 400) {
// Luz moderada — não faz nada
} else {
digitalWrite(13, LOW); // Pouca luz
}
// Operadores de comparação:
// == igual a
// != diferente de
// > maior que
// < menor que
// >= maior ou igual
// <= menor ou igual
// Operadores lógicos:
// && E (AND)
// || OU (OR)
// ! NÃO (NOT)
if (leitura > 500 && leitura < 900) {
// Intervalo: entre 500 e 900
}
Ciclos (for / while)
ciclos.ino
// FOR — repetição com contador conhecido
for (int i = 0; i < 5; i++) {
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(100);
}
// Pisca 5 vezes e para
// WHILE — repete enquanto condição verdadeira
int botao = digitalRead(2);
while (botao == LOW) {
// Mantém LED aceso enquanto botão pressionado
digitalWrite(13, HIGH);
botao = digitalRead(2); // Relê o botão
}
digitalWrite(13, LOW);
// DO...WHILE — executa pelo menos uma vez
int contador = 0;
do {
contador++;
delay(100);
} while (contador < 10);
Funções Personalizadas
funcoes.ino
// Função sem retorno (void)
void piscarLed(int pino, int vezes, int intervalo) {
for (int i = 0; i < vezes; i++) {
digitalWrite(pino, HIGH);
delay(intervalo);
digitalWrite(pino, LOW);
delay(intervalo);
}
}
// Função com retorno
float celsiusParaFahrenheit(float c) {
return c * 9.0 / 5.0 + 32.0;
}
// Função que lê temperatura do LM35
float lerTemperatura(int pino) {
int leitura = analogRead(pino);
float tensao = leitura * (5.0 / 1023.0);
return tensao * 100.0; // LM35: 10mV por °C
}
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop() {
piscarLed(13, 3, 200); // Pisca 3x, 200ms entre
float temp = lerTemperatura(A0);
float tempF = celsiusParaFahrenheit(temp);
Serial.print(temp);
Serial.print("°C = ");
Serial.print(tempF);
Serial.println("°F");
delay(2000);
}
Monitor Série
O Monitor Série (Ctrl+Shift+M no IDE) permite ver mensagens do Arduino no ecrã do computador — essencial para depuração.
serie.ino
void setup() {
Serial.begin(9600); // Velocidade: 9600 baud
Serial.println("Iniciado!");
}
void loop() {
int val = analogRead(A0);
Serial.print("Valor: "); // Imprime sem nova linha
Serial.println(val); // Imprime COM nova linha
// Receber dados do computador
if (Serial.available() > 0) {
String cmd = Serial.readStringUntil('\n');
Serial.print("Recebido: ");
Serial.println(cmd);
}
delay(500);
}
// Certifica-te que o baud rate no Monitor Série
// é o mesmo que no Serial.begin()!
Bibliotecas
📚 Bibliotecas usadas neste kit
| Biblioteca | Para quê | Instalação |
|---|---|---|
| Servo.h | Controlo do servo SG90 | Incluída no IDE |
| LiquidCrystal.h | Display LCD 16x2 | Incluída no IDE |
| Stepper.h | Motor de passo | Incluída no IDE |
| IRremote.h | Recetor infravermelhos | Gestor de Bibliotecas |
| SoftwareSerial.h | Bluetooth HC-05/06 | Incluída no IDE |
📦
Para instalar bibliotecas externas: Sketch → Incluir Biblioteca → Gerir Bibliotecas. Pesquisa pelo nome e clica em Instalar.
Funções Utilitárias Essenciais
funcoes_uteis.ino
// map() — remapeia um valor de um intervalo para outro
int potVal = analogRead(A0); // 0 a 1023
int brilho = map(potVal, 0, 1023, 0, 255); // 0 a 255
analogWrite(9, brilho);
// constrain() — limita valor a um intervalo
int val = constrain(analogRead(A0), 200, 800);
// millis() — tempo desde o arranque (em ms), sem bloquear
unsigned long agora = millis();
if (agora - ultimoTempo >= 1000) {
ultimoTempo = agora;
// Corre a cada segundo sem usar delay()!
}
// abs() — valor absoluto
int diferenca = abs(valorA - valorB);
// min() e max()
int menor = min(val1, val2);
int maior = max(val1, val2);
// random() — número aleatório
int r = random(0, 256); // 0 a 255
randomSeed(analogRead(A5)); // Semente aleatória