Partilhar: WhatsApp
aulify
UC UC02842 · T. Desenv. Software, T. Sist. Comp. Redes

Ficha 01 · Arduino básico

LEDs, botões, sensores analógicos
Versão · Aluno
Tempo · 45 minutos
Aluno(a)
Turma
Data

Exercício 1 · Blink personalizado

Modifica o Blink para piscar a 5Hz (5 vezes por segundo).

Resposta:
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(100);
  digitalWrite(LED_BUILTIN, LOW);
  delay(100);
}

5Hz = 5 ciclos/seg → 200ms por ciclo → 100ms ON + 100ms OFF.

Exercício 2 · Semáforo

Liga 3 LEDs (vermelho pino 8, amarelo pino 9, verde pino 10, cada um com resistência 220Ω). Simula semáforo: verde 3s, amarelo 1s, vermelho 3s, amarelo 1s, repete.

Resposta:
const int VERMELHO = 8;
const int AMARELO  = 9;
const int VERDE    = 10;

void setup() {
  pinMode(VERMELHO, OUTPUT);
  pinMode(AMARELO, OUTPUT);
  pinMode(VERDE, OUTPUT);
}

void apagarTudo() {
  digitalWrite(VERMELHO, LOW);
  digitalWrite(AMARELO, LOW);
  digitalWrite(VERDE, LOW);
}

void loop() {
  // Verde
  apagarTudo();
  digitalWrite(VERDE, HIGH);
  delay(3000);

  // Amarelo
  apagarTudo();
  digitalWrite(AMARELO, HIGH);
  delay(1000);

  // Vermelho
  apagarTudo();
  digitalWrite(VERMELHO, HIGH);
  delay(3000);

  // Amarelo
  apagarTudo();
  digitalWrite(AMARELO, HIGH);
  delay(1000);
}

Hardware: cada LED com resistência 220Ω entre pino e ânodo do LED; cátodo a GND.

Exercício 3 · Botão controla LED

Botão entre pino 2 e GND (com INPUT_PULLUP). LED no pino 8. - LED acende enquanto botão estiver premido.

Resposta:
const int BOTAO = 2;
const int LED = 8;

void setup() {
  pinMode(BOTAO, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
}

void loop() {
  int s = digitalRead(BOTAO);
  // INPUT_PULLUP: LOW quando premido
  if (s == LOW) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
}

Exercício 4 · Toggle com debounce

Modifica o exercício 3 para que cada click alterna o estado do LED (não enquanto premido). Implementa debounce.

Resposta:
const int BOTAO = 2;
const int LED = 8;

bool ledOn = false;
int ultimoEstado = HIGH;
unsigned long ultimoChange = 0;
const unsigned long DEBOUNCE = 50;

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

void loop() {
  int s = digitalRead(BOTAO);

  if (s != ultimoEstado && millis() - ultimoChange > DEBOUNCE) {
    ultimoChange = millis();
    ultimoEstado = s;

    // Detectou transição HIGH→LOW (premiu)
    if (s == LOW) {
      ledOn = !ledOn;
      digitalWrite(LED, ledOn ? HIGH : LOW);
      Serial.println(ledOn ? "ON" : "OFF");
    }
  }
}

Exercício 5 · Potenciómetro + LED PWM

Potenciómetro em A0, LED PWM no pino 9. Controla brilho do LED com a posição do potenciómetro.

Resposta:
const int POT = A0;
const int LED = 9;

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

void loop() {
  int raw = analogRead(POT);          // 0-1023
  int brilho = map(raw, 0, 1023, 0, 255);
  analogWrite(LED, brilho);

  Serial.print("Pot: ");
  Serial.print(raw);
  Serial.print(" → brilho: ");
  Serial.println(brilho);
  delay(50);
}

Hardware potenciómetro: 3 pinos. - Pino esquerdo → 5V. - Pino do meio (wiper) → A0. - Pino direito → GND.

Exercício 6 · LDR + threshold

LDR em A0 (com 10kΩ pull-down a GND). LED no pino 8. Quando ficar escuro (raw < 300), LED acende automaticamente.

Resposta:
const int LDR = A0;
const int LED = 8;
const int LIMITE = 300;

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

void loop() {
  int luz = analogRead(LDR);

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

  if (luz < LIMITE) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
  delay(200);
}

Hardware:

5V ── LDR ── A0
              
             10
              
             GND

Tapa a LDR com a mão para testar. Luz a menos = LDR mais resistente = leitura mais baixa.

Exercício 7 · TMP36 + Serial Monitor

Sensor de temperatura TMP36 em A0. Imprime no Serial Monitor a temperatura em °C e °F, uma leitura por segundo.

Resposta:
const int TMP = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int raw = analogRead(TMP);
  float volts = raw * (5.0 / 1023.0);
  float tempC = (volts - 0.5) * 100.0;   // TMP36
  float tempF = tempC * 9.0 / 5.0 + 32.0;

  Serial.print(tempC, 2);
  Serial.print(" °C  /  ");
  Serial.print(tempF, 2);
  Serial.println(" °F");

  delay(1000);
}

Verifica a temperatura ambiente. Sopra no sensor para ver subir, ou aproxima gelo para descer.

Exercício 8 · Termómetro com LEDs (bar graph)

Combina TMP36 (A0) com 5 LEDs (pinos 5-9). Acende mais LEDs consoante a temperatura: - < 18°C: 1 LED. - 18-22°C: 2 LEDs. - 22-26°C: 3 LEDs. - 26-30°C: 4 LEDs. - > 30°C: 5 LEDs.

Resposta:
const int TMP = A0;
const int LEDS[] = {5, 6, 7, 8, 9};
const int NUM_LEDS = 5;

void setup() {
  for (int i = 0; i < NUM_LEDS; i++) {
    pinMode(LEDS[i], OUTPUT);
  }
  Serial.begin(9600);
}

void acenderN(int n) {
  for (int i = 0; i < NUM_LEDS; i++) {
    digitalWrite(LEDS[i], i < n ? HIGH : LOW);
  }
}

void loop() {
  int raw = analogRead(TMP);
  float v = raw * (5.0 / 1023.0);
  float t = (v - 0.5) * 100.0;

  int nivel;
  if (t < 18)      nivel = 1;
  else if (t < 22) nivel = 2;
  else if (t < 26) nivel = 3;
  else if (t < 30) nivel = 4;
  else             nivel = 5;

  acenderN(nivel);

  Serial.print(t, 1);
  Serial.print(" °C → ");
  Serial.print(nivel);
  Serial.println(" LEDs");

  delay(500);
}

Versão mais elegante usando map() + constrain:

int nivel = constrain(map(t * 10, 140, 320, 1, 5), 1, 5);