Ficha 01 · Arduino e I/O
- Compreender µC
- Estruturar sketch
- Programar I/O
- Ler ADC e usar PWM
Parte I · Conceitos
Exercício 1 · µC vs µP (10 pts)
Indica 3 diferenças entre um microcontrolador e um microprocessador.
- O µC integra CPU + RAM + Flash + I/O num só chip; o µP é só CPU (precisa de tudo externo).
- µC para tarefas dedicadas (controlo); µP para uso geral (PC).
- µC de baixo consumo/custo; µP de alto desempenho/consumo. (Também: µC tem GPIO/ADC/PWM integrados; µP não.)
Exercício 2 · Plataforma (10 pts)
Indica a plataforma mais adequada:
a) Projeto IoT que envia dados por Wi-Fi para a nuvem. ___
b) Aprender o básico, ecossistema enorme de tutoriais. ___
c) Programar em MicroPython, hardware moderno. ___
a) ESP32 (Wi-Fi + Bluetooth integrados). b) Arduino UNO. c) Raspberry Pi Pico (RP2040).
Parte II · Estrutura
Exercício 3 · setup/loop (10 pts)
a) O que corre em setup() e o que corre em loop()? (5 pts)
b) Como se vê o valor de uma variável durante a execução (não há ecrã)? (5 pts)
a) setup() corre uma vez ao ligar/reset (inicializações: pinModes, Serial). loop() repete indefinidamente (lógica principal).
b) Pelo Serial: Serial.begin(9600) no setup e Serial.println(variavel) no loop; ver no Serial Monitor do IDE. É a principal forma de depurar num µC.
Exercício 4 · Blink (15 pts)
Escreve o sketch completo que pisca um LED no pino 9 a cada 0,5 s.
const int LED = 9;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}
Parte III · Entradas
Exercício 5 · Botão (15 pts)
a) Para que serve INPUT_PULLUP? (5 pts)
b) Escreve um sketch que acende o LED (pino 9) enquanto um botão (pino 2, ligado a GND) está premido. (10 pts)
a) Ativa uma resistência pull-up interna que mantém a entrada em HIGH em repouso, evitando que "flutue" (leituras aleatórias por ruído). O botão liga o pino a GND → leitura LOW quando premido.
b)
const int LED = 9;
const int BTN = 2;
void setup() {
pinMode(LED, OUTPUT);
pinMode(BTN, INPUT_PULLUP);
}
void loop() {
if (digitalRead(BTN) == LOW) { // premido (ligou a GND)
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}
Exercício 6 · Debounce (10 pts)
Porque é necessário "debounce" num botão? Como se faz por software (ideia)?
Um botão mecânico, ao ser premido, "salta" elétricamente durante alguns milissegundos (bounce) — sem tratamento, o µC conta vários toques onde houve um.
Software: ao detetar a mudança, esperar ~20 ms e reconfirmar o estado antes de o aceitar; ou usar millis() para só aceitar nova mudança após um intervalo. (Também se pode fazer por hardware com um RC.)
Parte IV · Analógico/PWM
Exercício 7 · ADC e PWM (15 pts)
a) analogRead(A0) devolve que gama de valores e a que correspondem? (5 pts)
b) Escreve um sketch que lê um potenciómetro em A0 e usa esse valor para regular o brilho de um LED no pino 6 (PWM). (10 pts)
a) Devolve 0 a 1023 (ADC de 10 bits), proporcional à tensão na entrada (0 V → 0, Vref/5 V → 1023).
b)
const int POT = A0;
const int LED = 6; // pino com PWM
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
int leitura = analogRead(POT); // 0..1023
int brilho = map(leitura, 0, 1023, 0, 255);
analogWrite(LED, brilho); // PWM 0..255
}
map() converte a gama do ADC (0–1023) para a do PWM (0–255).