Ficha 01 · Programação Arduino
- Conceitos de microcontrolador
- Código com sensor
- Debugging
Parte I · Verdadeiro ou Falso (30 pts)
Indica V ou F e justifica.
- A função
setup()corre repetidamente enquanto a placa está ligada. (5 pts) analogRead()no Arduino devolve um valor entre 0 e 1023. (5 pts)- O ESP32 trabalha a 5 V de tensão lógica, tal como o Arduino Uno. (5 pts)
INPUT_PULLUPpermite ler um botão sem resistência externa. (5 pts)- O protocolo MQTT usa um broker para distribuir mensagens por tópicos. (5 pts)
- Um LED pode ser ligado directamente a um pino sem resistência, sem qualquer risco. (5 pts)
- F —
setup()corre uma vez ao ligar/reiniciar. É aloop()que corre repetidamente. - V — O ADC do Arduino tem 10 bits, devolvendo 0-1023. (No ESP32 é 0-4095, 12 bits.)
- F — O ESP32 trabalha a 3.3 V. Ligar 5 V aos seus pinos pode danificá-lo.
- V —
INPUT_PULLUPactiva uma resistência interna, evitando estados flutuantes; o pino lê HIGH em repouso e LOW quando o botão liga a GND. - V — No MQTT, os dispositivos publicam/subscrevem tópicos e o broker encaminha as mensagens.
- 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:
-
Falta ponto e vírgula na declaração da constante:
const int LED = 13→const int LED = 13; -
pinMode errado: o LED é saída, não entrada:
pinMode(LED, INPUT);→pinMode(LED, OUTPUT); -
Falta de parênteses em
loop:void loop {→void loop() { -
Falta ponto e vírgula após o primeiro
delay:delay(1000)→delay(1000); -
Serial usado sem inicialização: falta
Serial.begin(9600);nosetup(). Sem ele,Serial.printlnnã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.)