Partilhar: WhatsApp
aulify
UC UC00670 · T. Sist. Comp. Redes

Ficha 01 · Arduino e I/O

Arquitetura, setup/loop, digital, analógico, PWM
Versão · Aluno
Tempo · 60 minutos
Cotação · 100 pontos
Aluno(a)
Turma
Data
Objectivos da ficha

Parte I · Conceitos

Exercício 1 · µC vs µP (10 pts)

Indica 3 diferenças entre um microcontrolador e um microprocessador.

  1. O µC integra CPU + RAM + Flash + I/O num só chip; o µP é só CPU (precisa de tudo externo).
  2. µC para tarefas dedicadas (controlo); µP para uso geral (PC).
  3. µ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).