Este documento contém 15 projetos práticos que combinam diferentes sensores e módulos do Arduino.
Cada projeto traz ideia, fluxo, componentes, conexões de pinos (tabelas), notas e um exemplo de código funcional.
Boas práticas rápidas
- Use resistores de 220–330 Ω em cada LED.
- Mantenha GND comum entre Arduino e fontes externas de atuadores (relés/servos).
- Em cargas 127/220 V, procure um profissional qualificado.
- Para botões, prefira
INPUT_PULLUP+ debounce por software.- Alguns módulos de relé são ativo-LOW; ajuste a lógica no código.
(DHT11/DHT22 + LCD 16x2)
Ideia: Exibir temperatura e umidade no LCD e registrar dados via Serial.
Componentes:
- Arduino Uno/Nano
- DHT11 (ou DHT22)
- LCD 16x2 (modo 4 bits)
- Potenciômetro 10 kΩ (contraste do LCD)
- Jumpers + Protoboard
Conexões (sugeridas):
| Dispositivo | Pino | Arduino |
|---|---|---|
| DHT | VCC | 5V (ou 3.3V para alguns DHT22) |
| DHT | GND | GND |
| DHT | DATA | D7 (10 kΩ pull‑up para VCC se sensor de 4 pinos) |
| LCD | RS | D12 |
| LCD | E | D11 |
| LCD | D4 | D5 |
| LCD | D5 | D4 |
| LCD | D6 | D3 |
| LCD | D7 | D2 |
| LCD | V0 (contraste) | pino central do potenciômetro (extremos em 5V e GND) |
| LCD | A/K (backlight) | 5V (ideal com 100–220 Ω) / GND |
Código:
#include <LiquidCrystal.h>
#include <DHT.h>
#define DHTPIN 7
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(16, 2);
dht.begin();
Serial.begin(9600);
}
void loop() {
float t = dht.readTemperature();
float h = dht.readHumidity();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C ");
lcd.setCursor(0, 1);
lcd.print("Umid: ");
lcd.print(h);
lcd.print("% ");
delay(2000);
}(LDR + Relé)
Ideia: Aciona uma lâmpada pelo relé quando escurece (LDR baixo).
Componentes:
- LDR
- Resistor 10 kΩ (divisor)
- Módulo Relé 5 V (1 canal)
- Carga (ex.: fita 12 V) + fonte externa
- Jumpers + Protoboard
Conexões (lógica):
| Dispositivo | Pino | Arduino |
|---|---|---|
| LDR | Lado 1 | 5V |
| LDR | Lado 2 | A0 e resistor 10 kΩ → GND |
| Relé | IN | D8 |
| Relé | VCC/GND | 5V/GND |
Contatos de potência: COM → +Fonte, NO → +Carga, −Carga → −Fonte.
Código:
int ldr = A0;
int rele = 8;
void setup() {
pinMode(rele, OUTPUT);
Serial.begin(9600);
digitalWrite(rele, LOW); // ajuste se seu relé for ativo-LOW
}
void loop() {
int valor = analogRead(ldr);
Serial.println(valor);
if (valor < 300) { // ajuste o limiar conforme ambiente
digitalWrite(rele, HIGH);
} else {
digitalWrite(rele, LOW);
}
delay(500);
}(PIR + Buzzer + Relé + Receptor IR)
Ideia: Controle IR arma/desarma. Se armado e PIR detecta movimento: buzzer + relé por alguns segundos.
Componentes: PIR HC‑SR501, Receptor IR (VS1838B/TSOP), buzzer ativo, módulo relé 5 V.
Conexões:
| Dispositivo | Pino | Arduino |
|---|---|---|
| PIR | VCC/GND/OUT | 5V/GND/D2 |
| Receptor IR | OUT | D5 |
| Receptor IR | VCC/GND | 5V/GND |
| Buzzer | + | D3 (GND no outro pino) |
| Relé | IN | D4 (VCC/GND → 5V/GND) |
Código (IRremote estilo antigo):
#include <IRremote.h>
int pir = 2, buzzer = 3, rele = 4, irPin = 5;
bool alarmeAtivo = false;
IRrecv irrecv(irPin);
decode_results results;
void setup() {
pinMode(pir, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(rele, OUTPUT);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)) {
if (results.value == 0xFFA25D) alarmeAtivo = !alarmeAtivo; // substitua pelo seu código
irrecv.resume();
}
if (alarmeAtivo && digitalRead(pir)) {
digitalWrite(buzzer, HIGH);
digitalWrite(rele, HIGH);
delay(3000);
} else {
digitalWrite(buzzer, LOW);
digitalWrite(rele, LOW);
}
}Notas: antes, use um “sniffer IR” para descobrir os códigos do seu controle.
(HC-SR04 + Buzzer + LEDs V/A/R)
Ideia: Mede distância e indica por LEDs e beeps conforme aproximação.
Componentes: HC‑SR04, 3× LEDs + resistores, buzzer.
Conexões:
| Dispositivo | Pino | Arduino |
|---|---|---|
| HC‑SR04 | TRIG/ECHO | D9/D10 |
| LED Verde | A | D11 (resistor) |
| LED Amarelo | A | D12 (resistor) |
| LED Vermelho | A | D13 (resistor) |
| Buzzer | + | D3 (ou D8), GND no outro pino |
Código:
#define trig 9
#define echo 10
#define buzzer 3
#define ledR 13
#define ledG 11
#define ledY 12
long duracao;
int distancia;
void setup() {
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(ledR, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledY, OUTPUT);
}
void loop() {
digitalWrite(trig, LOW); delayMicroseconds(2);
digitalWrite(trig, HIGH); delayMicroseconds(10);
digitalWrite(trig, LOW);
duracao = pulseIn(echo, HIGH, 30000);
distancia = duracao * 0.034 / 2;
digitalWrite(ledG, distancia > 60);
digitalWrite(ledY, distancia <= 60 && distancia > 30);
digitalWrite(ledR, distancia <= 30);
if (distancia <= 30 && distancia > 10) { tone(buzzer, 2000, 200); delay(150); }
else if (distancia <= 10) { tone(buzzer, 2500, 100); delay(80); }
else { noTone(buzzer); delay(200); }
}(3 LEDs + Botão + Buzzer)
Ideia: Ciclo veicular; se pedestre solicitar, para no vermelho e bipa por alguns segundos.
Componentes: 3× LEDs + resistores, botão, buzzer.
Conexões:
| Dispositivo | Pino | Arduino |
|---|---|---|
| LED V/A/R (ânodos) | A | D11/D12/D13 (com resistores) |
| Botão | um lado | D2 (modo INPUT_PULLUP) |
| Botão | outro lado | GND |
| Buzzer | + | D8 (GND no outro pino) |
Código:
int ledV = 11, ledA = 12, ledE = 13, botao = 2, buzzer = 8;
bool pedido=false;
void setup() {
pinMode(ledV, OUTPUT);
pinMode(ledA, OUTPUT);
pinMode(ledE, OUTPUT);
pinMode(botao, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
}
void cicloBase(){
// Verde 5s
digitalWrite(ledV, HIGH); digitalWrite(ledA, LOW); digitalWrite(ledE, LOW);
for(int i=0;i<50;i++){ if(!digitalRead(botao)) pedido=true; delay(100); }
// Amarelo 2s
digitalWrite(ledV, LOW); digitalWrite(ledA, HIGH); digitalWrite(ledE, LOW);
for(int i=0;i<20;i++){ if(!digitalRead(botao)) pedido=true; delay(100); }
// Vermelho 5s
digitalWrite(ledV, LOW); digitalWrite(ledA, LOW); digitalWrite(ledE, HIGH);
delay(5000);
}
void travessia(){
digitalWrite(ledV, LOW); digitalWrite(ledA, LOW); digitalWrite(ledE, HIGH);
for(int i=0;i<8;i++){ tone(buzzer, 2000, 200); delay(300); }
noTone(buzzer);
}
void loop() {
pedido=false;
cicloBase();
if(pedido) travessia();
}(DHT + Relé + LCD opcional)
Ideia: Liga exaustor (relé) se temperatura > limiar; histerese para estabilidade.
Componentes: DHT11/22, módulo relé 5 V, (opcional) LCD.
Conexões: DHT DATA→D7, Relé IN→D8 (VCC/GND→5V/GND).
Código (com histerese):
#include <DHT.h>
#define DHTPIN 7
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const int rele = 8;
const bool ACTIVE_LOW = true;
const float T_ON=27.0, T_OFF=26.0;
bool on=false;
void writeRelay(bool s){
digitalWrite(rele, ACTIVE_LOW ? (s?LOW:HIGH) : (s?HIGH:LOW));
}
void setup() {
dht.begin();
pinMode(rele, OUTPUT);
writeRelay(false);
Serial.begin(9600);
}
void loop() {
float t = dht.readTemperature();
if(isnan(t)){ Serial.println("Falha DHT"); delay(2000); return; }
if(!on && t > T_ON){ on=true; writeRelay(true); }
else if(on && t < T_OFF){ on=false; writeRelay(false); }
Serial.print("T="); Serial.print(t); Serial.print("C Fan="); Serial.println(on?"ON":"OFF");
delay(2000);
}(Servo SG90 + Receptor IR)
Ideia: Abrir/fechar por controle remoto IR.
Componentes: Servo SG90, receptor IR.
Conexões: Servo Sinal→D9, V+→5V, GND→GND; IR OUT→D2 (VCC/GND→5V/GND).
Código:
#include <Servo.h>
#include <IRremote.h>
Servo servo;
IRrecv irrecv(2);
decode_results results;
void setup() {
servo.attach(9);
servo.write(0);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)) {
if (results.value == 0xFFA25D) servo.write(0); // FECHA (exemplo)
if (results.value == 0xFF629D) servo.write(100); // ABRE (exemplo)
irrecv.resume();
}
}(HC-SR04 + Display 7 segmentos 4 dígitos)
Ideia: Mostrar distância em cm em 4 dígitos 7‑segmentos.
Componentes: HC‑SR04, display 7‑seg 4 dígitos (comum ânodo/cátodo), resistores em cada segmento.
Conexões (exemplo com biblioteca SevSeg, comum cátodo):
| Pinos | Arduino |
|---|---|
| Dígitos (D1..D4) | D2, D3, D4, D5 |
| Segmentos (a,b,c,d,e,f,g,dp) | D6, D7, D8, D11, D12, D13, A0, A1 |
| HC‑SR04 TRIG/ECHO | D9/D10 |
Código:
#include <SevSeg.h>
SevSeg sevseg;
#define trig 9
#define echo 10
void setup() {
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 11, 12, 13, A0, A1};
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
}
void loop() {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
long duracao = pulseIn(echo, HIGH, 30000);
int distancia = duracao * 0.034 / 2;
sevseg.setNumber(distancia);
sevseg.refreshDisplay();
}(LDR + Servo)
Ideia: Abre/fecha persiana conforme luminosidade.
Componentes: LDR + 10 kΩ, Servo SG90.
Conexões: LDR→A0 (com 10 kΩ para GND), Servo Sinal→D9, V+→5V, GND→GND.
Código:
#include <Servo.h>
Servo servo;
int ldr = A0;
const int TH_OPEN=700, TH_CLOSE=400; // ajuste ao seu ambiente
void setup() {
servo.attach(9);
}
void loop() {
int v = analogRead(ldr);
if (v > TH_OPEN) servo.write(100); // abre
else if (v < TH_CLOSE) servo.write(10); // fecha
delay(300);
}(DHT + LED RGB)
Ideia: Cor indica faixa de temperatura (azul=frio, verde=ok, vermelho=quente).
Componentes: DHT11/22, LED RGB (comum cátodo), resistores.
Conexões: DHT DATA→D7; RGB R/G/B→D9/D10/D11 (com resistores), COM→GND.
Código:
#include <DHT.h>
#define DHTPIN 7
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const int R=9, G=10, B=11;
void setRGB(int r,int g,int b){ // 0..255
analogWrite(R,r); analogWrite(G,g); analogWrite(B,b);
}
void setup(){
dht.begin();
pinMode(R,OUTPUT); pinMode(G,OUTPUT); pinMode(B,OUTPUT);
}
void loop(){
float t=dht.readTemperature();
if(isnan(t)) { setRGB(0,0,0); delay(500); return; }
if(t<18) setRGB(0,0,255); // azul
else if(t<26) setRGB(0,255,0); // verde
else setRGB(255,0,0); // vermelho
delay(800);
}(PIR + Servo)
Ideia: Detecta mão (PIR) e aciona servo para pressionar a bomba.
Componentes: PIR, Servo SG90.
Conexões: PIR OUT→D2, VCC/GND→5V/GND; Servo Sinal→D9, V+→5V, GND→GND.
Código:
#include <Servo.h>
Servo s;
const int PIR=2;
void setup(){
s.attach(9);
pinMode(PIR, INPUT);
s.write(0);
}
void loop(){
if(digitalRead(PIR)){
s.write(90);
delay(800);
s.write(0);
delay(800);
}
}(Receptor IR + Relé + Buzzer)
Ideia: Liga/desliga um ventilador (via relé) pelo controle IR; buzzer confirma ação.
Componentes: Receptor IR, Relé 5 V, Buzzer.
Conexões: IR OUT→D2, Relé IN→D8, Buzzer→D3 (opcional), VCC/GND→5V/GND.
Código:
#include <IRremote.h>
int rele = 8, buz=3;
IRrecv irrecv(2); decode_results r;
void setup() {
pinMode(rele, OUTPUT);
pinMode(buz, OUTPUT);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&r)) {
if (r.value == 0xFFA25D) { digitalWrite(rele, HIGH); tone(buz,1200,150); }
if (r.value == 0xFF629D) { digitalWrite(rele, LOW); tone(buz,800,120); }
irrecv.resume();
}
}(PIR + LDR + Relé)
Ideia: Liga luz externa apenas à noite (LDR baixo) e com movimento (PIR).
Componentes: PIR, LDR + 10 kΩ, Relé 5 V.
Conexões: PIR OUT→D2, LDR→A0 (com 10 kΩ para GND), Relé IN→D8.
Código:
int pir=2, ldr=A0, rele=8;
void setup() {
pinMode(pir, INPUT);
pinMode(rele, OUTPUT);
}
void loop() {
bool escuro = analogRead(ldr) < 350; // ajuste limiar
bool mov = digitalRead(pir);
digitalWrite(rele, (escuro && mov) ? HIGH : LOW);
delay(50);
}(Módulo Microfone + Buzzer + LCD opcional)
Ideia: Se nível de ruído passar limiar, aciona buzzer (e pode exibir no LCD).
Componentes: Módulo microfone analógico (AO), Buzzer, (opcional) LCD.
Conexões: Microfone AO→A0, VCC/GND→5V/GND; Buzzer→D3.
Código:
int micPin=A0, buzzer=3;
void setup() {
pinMode(buzzer, OUTPUT);
Serial.begin(9600);
}
void loop() {
int valor=analogRead(micPin);
Serial.println(valor);
digitalWrite(buzzer, valor>500 ? HIGH : LOW); // ajuste limiar
delay(150);
}(DHT + Módulo SD + RTC)
Ideia: Registra temperatura/umidade com timestamp em cartão SD.
Componentes: DHT11/22, Módulo SD (SPI), RTC (DS1307/DS3231).
Conexões (UNO padrão):
| Dispositivo | Pino | Arduino |
|---|---|---|
| DHT | DATA | D7 |
| SD | CS | D10 |
| SD | MOSI/MISO/SCK | D11/D12/D13 |
| RTC | SDA/SCL | A4/A5 (UNO) |
| Todos | VCC/GND | 5V/GND |
Código:
#include <SD.h>
#include <DHT.h>
#include <RTClib.h>
#define DHTPIN 7
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 rtc;
File arquivo;
void setup() {
Serial.begin(9600);
if(!SD.begin(10)){ Serial.println("Falha SD"); while(1); }
if(!rtc.begin()){ Serial.println("Falha RTC"); }
dht.begin();
}
void loop() {
float t = dht.readTemperature();
float h = dht.readHumidity();
DateTime now = rtc.now();
arquivo = SD.open("clima.txt", FILE_WRITE);
if (arquivo) {
arquivo.print(now.timestamp());
arquivo.print(" T:");
arquivo.print(t);
arquivo.print("C U:");
arquivo.println(h);
arquivo.close();
Serial.println("Gravado.");
} else {
Serial.println("Falha ao abrir arquivo.");
}
delay(5000);
}Observação: Caso use versões recentes de algumas bibliotecas (ex.: IRremote), a API e pinos padrão podem mudar. Ajuste
#includee pinos conforme a documentação da sua versão.