Partilhar: WhatsApp
aulify
UC UC02647 · T. Multimédia

Ficha 01 · Programação Arduino

Conceitos, código de luz automática e depuração de sketch
Versão · Aluno
Tempo · 90 minutos
Cotação · 100 pontos
Aluno(a)
Turma
Data
Objectivos da ficha

Parte I · Verdadeiro ou Falso (30 pts)

Indica V ou F e justifica.

  1. A função setup() corre repetidamente enquanto a placa está ligada. (5 pts)
  2. analogRead() no Arduino devolve um valor entre 0 e 1023. (5 pts)
  3. O ESP32 trabalha a 5 V de tensão lógica, tal como o Arduino Uno. (5 pts)
  4. INPUT_PULLUP permite ler um botão sem resistência externa. (5 pts)
  5. O protocolo MQTT usa um broker para distribuir mensagens por tópicos. (5 pts)
  6. Um LED pode ser ligado directamente a um pino sem resistência, sem qualquer risco. (5 pts)
  1. Fsetup() corre uma vez ao ligar/reiniciar. É a loop() que corre repetidamente.
  2. V — O ADC do Arduino tem 10 bits, devolvendo 0-1023. (No ESP32 é 0-4095, 12 bits.)
  3. F — O ESP32 trabalha a 3.3 V. Ligar 5 V aos seus pinos pode danificá-lo.
  4. VINPUT_PULLUP activa uma resistência interna, evitando estados flutuantes; o pino lê HIGH em repouso e LOW quando o botão liga a GND.
  5. V — No MQTT, os dispositivos publicam/subscrevem tópicos e o broker encaminha as mensagens.
  6. F — Sem resistência em série, a corrente pode exceder o limite e queimar o LED e/ou o pino. Usa-se sempre resistência (ex: 220-330 Ω).

Parte II · Escrever código (35 pts)

Escreve um sketch Arduino completo que acende um LED automaticamente conforme a luz ambiente, usando um LDR.

Requisitos: - LDR ligado ao pino analógico A0; LED ligado ao pino 9 (PWM). - Quando está escuro, o LED acende; quanto mais escuro, mais brilho. - Enviar o valor de luz pela Serial para depuração.

const int LDR = A0;   // sensor de luz
const int LED = 9;    // pino PWM

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int luz = analogRead(LDR);          // 0 (escuro) .. 1023 (claro)

  // mais escuro -> mais brilho: invertemos o intervalo
  int brilho = map(luz, 0, 1023, 255, 0);
  brilho = constrain(brilho, 0, 255); // garantir limites

  analogWrite(LED, brilho);

  Serial.print("Luz: ");
  Serial.print(luz);
  Serial.print("  Brilho: ");
  Serial.println(brilho);

  delay(100);
}

Pontos avaliados: - Uso correcto de analogRead em A0 e analogWrite em pino PWM. - map para reescalar com inversão (escuro → mais brilho). - constrain para segurança. - Serial.begin + impressão do valor (depuração). - Estrutura setup/loop correcta.

Variante com limiar (também aceite):

if (luz < 300) analogWrite(LED, 255); else analogWrite(LED, 0);

Parte III · Identificar erros no sketch (35 pts)

O sketch seguinte deveria piscar um LED no pino 13 (1 s ligado, 1 s desligado) e imprimir uma mensagem, mas tem 5 erros. Identifica-os e corrige.

const int LED = 13

void setup() {
  pinMode(LED, INPUT);
}

void loop {
  digitalWrite(LED, HIGH);
  delay(1000)
  digitalWrite(LED, LOW);
  delay(1000);
  Serial.println("Piscou!");
}

Erros encontrados e correcções:

  1. Falta ponto e vírgula na declaração da constante: const int LED = 13const int LED = 13;

  2. pinMode errado: o LED é saída, não entrada: pinMode(LED, INPUT);pinMode(LED, OUTPUT);

  3. Falta de parênteses em loop: void loop {void loop() {

  4. Falta ponto e vírgula após o primeiro delay: delay(1000)delay(1000);

  5. Serial usado sem inicialização: falta Serial.begin(9600); no setup(). Sem ele, Serial.println não funciona.

Sketch corrigido:

const int LED = 13;

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(LED, HIGH);
  delay(1000);
  digitalWrite(LED, LOW);
  delay(1000);
  Serial.println("Piscou!");
}

(7 pts por cada erro correctamente identificado e corrigido.)