Ficha 01 · Arduino básico
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
│
10kΩ
│
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);