| Módulo | Conector Interface | Pino Arduino | Notas |
|---|---|---|---|
| 🔘 Botão de Pressão | BTN | D4 | Usar INPUT_PULLUP — lógica invertida: LOW = premido |
INPUT_PULLUP, o Arduino ativa internamente uma resistência de ~10 kΩ que mantém o pino em HIGH quando o botão está solto.
Quando o botão é premido, o pino vai a GND → lê LOW.
Esta lógica é invertida: LOW = premido, HIGH = solto.
Lê o estado do botão e imprime no Monitor Série. Usa o Serial Monitor (115200 baud) para observar a mudança de HIGH para LOW ao premir.
#define BOTAO 4
void setup() {
// INPUT_PULLUP: botão solto = HIGH, premido = LOW
pinMode(BOTAO, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Botao pronto. Prima para testar.");
}
void loop() {
int estado = digitalRead(BOTAO);
if (estado == LOW) {
Serial.println("PREMIDO");
} else {
Serial.println("Solto");
}
delay(200); // Evita inundar o Serial Monitor
}
Enquanto o botão está premido, o LED branco fica ligado. Ao soltar, apaga. Controlo direto — sem estado interno.
#define BOTAO 4
#define LED_BRANCO 5
void setup() {
pinMode(BOTAO, INPUT_PULLUP);
pinMode(LED_BRANCO, OUTPUT);
}
void loop() {
if (digitalRead(BOTAO) == LOW) { // Premido
digitalWrite(LED_BRANCO, HIGH); // Liga LED
} else { // Solto
digitalWrite(LED_BRANCO, LOW); // Apaga LED
}
}
digitalRead(BOTAO) == LOW é equivalente a
!digitalRead(BOTAO) — as duas formas funcionam. A primeira é mais legível para iniciantes.
Um clique liga o LED; outro clique apaga. Este padrão usa uma variável de estado e deteção da borda descendente (transição HIGH→LOW) para evitar múltiplas alterações durante uma única pressão.
#define BOTAO 4
#define LED_BRANCO 5
bool ledLigado = false;
bool estadoAnterior = HIGH; // Pull-up → começa HIGH
void setup() {
pinMode(BOTAO, INPUT_PULLUP);
pinMode(LED_BRANCO, OUTPUT);
Serial.begin(9600);
}
void loop() {
bool estadoAtual = digitalRead(BOTAO);
// Detetar borda: de HIGH para LOW = nova pressão
if (estadoAnterior == HIGH && estadoAtual == LOW) {
ledLigado = !ledLigado; // Inverte o estado
digitalWrite(LED_BRANCO, ledLigado ? HIGH : LOW);
Serial.println(ledLigado ? "LED LIGADO" : "LED APAGADO");
delay(50); // Debounce simples
}
estadoAnterior = estadoAtual;
delay(10);
}
delay(50) após detetar a pressão ignora esses pulsos espúrios.
Para projetos mais avançados, usa a biblioteca Bounce2 para debounce robusto sem bloquear o loop.
Simula a campainha da casa: ao premir o botão toca o buzzer, abre a porta (servo) por 3 segundos e fecha novamente. Combina botão + buzzer + servo.
#include <Servo.h>
#define BOTAO 4
#define BUZZER 6
#define SERVO_PORTA 10
Servo portaServo;
void setup() {
pinMode(BOTAO, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
portaServo.attach(SERVO_PORTA);
portaServo.write(0); // Porta fechada
Serial.begin(9600);
}
void loop() {
if (digitalRead(BOTAO) == LOW) { // Botão premido
Serial.println("Campainha! Abrindo porta...");
// Toca campainha: 3 bips
for (int i = 0; i < 3; i++) {
tone(BUZZER, 1000, 150);
delay(300);
}
// Abre porta (servo vai a 90°)
portaServo.write(90);
delay(3000); // Porta aberta 3 segundos
// Fecha porta
portaServo.write(0);
Serial.println("Porta fechada.");
delay(500); // Aguarda soltar o botão
}
}
delay(50) de debounce pela biblioteca Bounce2 — compara o comportamento