Sistema IoT de estufa automatizada para monitoramento e controle ambiental, desenvolvido com Arduino MEGA 2560 para gerenciamento local de sensores/atuadores e ESP32 para conectividade Wi-Fi e notificações remotas via WhatsApp.
- Visão Geral
- Funcionalidades
- Tech Stack
- Pré-requisitos
- Lista de Componentes
- Diagrama de Conexões
- Configuração do Ambiente
- Calibração de Sensores
- Upload do Código
- Arquitetura do Sistema
- Configuração de Notificações
- Troubleshooting
- Contribuição
- Licença
O Auto Greenhouse é um projeto DIY de automação agrícola que monitora condições ambientais críticas para o cultivo de plantas e executa ações automáticas para manter o ambiente ideal. O sistema combina:
- Arduino MEGA 2560: Cérebro principal responsável por leitura de sensores, controle de atuadores e interface local via LCD.
- ESP32: Módulo de conectividade Wi-Fi que envia notificações para WhatsApp via API CallMeBot.
- Sensores: Umidade do solo, luminosidade (LDR) e temperatura (LM35 - opcional).
- Atuadores: Bombas de irrigação, ventilador, servo para teto, LEDs de crescimento.
💡 Caso de Uso Ideal: Pequenas estufas residenciais, projetos educacionais de IoT, prototipagem de agricultura de precisão.
- 💧 Irrigação Inteligente: Bomba ativa quando umidade do solo < 33% (ajustável), desliga automaticamente ao atingir nível ideal
- 💡 Iluminação Adaptativa: LEDs acionados quando luminosidade ambiente < 75 (escala 0-100)
- 🌬️ Ventilação Manual: Ventilador controlado por botão físico com feedback no LCD
- 📺 Display LCD 16x2: Exibe em tempo real:
- Umidade do solo (%), Luminosidade (0-100)
- Status da irrigação (
Irr ON/) - Status do ventilador (
FAN ON/FAN OFF)
- 🔘 Botão Servo (Pino 32): Alterna abertura/fechamento do teto (0° ↔ 45°)
- 🔘 Botão Ventilador (Pino 33): Liga/desliga ventilador manualmente
- 📡 Conexão Wi-Fi: ESP32 conecta-se à rede local
- 📱 Notificações WhatsApp: Envia alertas via CallMeBot API quando eventos ocorrem (ex: teto aberto)
- 🔗 Comunicação Serial: Arduino sinaliza eventos para ESP32 via pino digital
- 🖥️ Serial Monitor: Debug em tempo real via USB (9600 baud)
- 📊 Logs Estruturados: Saída formatada para análise de comportamento do sistema
| Camada | Tecnologia | Versão/Função |
|---|---|---|
| Microcontrolador Principal | Arduino MEGA 2560 | Leitura de sensores, controle de atuadores |
| Módulo de Conectividade | ESP32 Dev Module | Wi-Fi, HTTP requests para notificações |
| IDE de Desenvolvimento | Arduino IDE 2.x | Compilação e upload de sketches |
| Bibliotecas Arduino | LiquidCrystal, Servo |
Controle de LCD 16x2 e servo motor |
| Bibliotecas ESP32 | WiFi, HTTPClient |
Conexão Wi-Fi e requests HTTP |
| API de Notificação | CallMeBot | Envio de mensagens para WhatsApp |
| Protocolo de Comunicação | UART Serial | Comunicação Arduino ↔ ESP32 (9600 baud) |
- Arduino MEGA 2560 com cabo USB
- ESP32 Dev Module com cabo USB ou adaptador serial
- Fonte de alimentação 12V para atuadores de potência (ventilador, bombas)
- Arduino IDE 2.0+ instalado
- Drivers USB instalados:
- CH340/CP210x para ESP32: Drivers Silabs
- Acesso à internet para instalação de bibliotecas
- Conta no CallMeBot para obter API token do WhatsApp
| Qtd | Componente | Observações |
|---|---|---|
| 1x | Arduino MEGA 2560 | Placa principal |
| 1x | Display LCD 16x2 | Interface local (modo 4-bit) |
| 1x | Sensor de Umidade do Solo | Analógico (A0) |
| 1x | Sensor LDR (Luminosidade) | Analógico (A1) |
| 1x | Servo Motor SG90/MG996R | Controle do teto (Pino 44) |
| 2x | Botões momentâneos | Controle manual (Pinos 32, 33) |
| 1x | Módulo Relé 2 canais 5V | Controle de bombas (Pino 52) |
| 2x | Bombas d'água 5V/12V | Irrigação e drenagem |
| 1x | Ventilador 12V DC | Ventilação (Pino 8 via transistor/relé) |
| 1x | LED branco/amarelo | Simulação de luz de crescimento (Pino 11) |
| 1x | LM35 (opcional) | Sensor de temperatura (não implementado no loop principal) |
| Vários | Resistores 220Ω, 1kΩ, 10kΩ | Pull-ups, limitação de corrente |
| Vários | Jumpers e protoboard | Montagem do circuito |
| Qtd | Componente | Observações |
|---|---|---|
| 1x | ESP32 Dev Module | Conectividade Wi-Fi |
| 1x | Cabo USB ou adaptador FTDI | Para upload do código |
| Item | Especificação | Observações |
|---|---|---|
| Fonte 12V 2A+ | Para ventilador e bombas | Não alimentar atuadores diretamente do Arduino |
| Cabo USB 5V | Para Arduino e ESP32 | Alimentação lógica |
LCD 16x2 (4-bit mode):
RS → Pino 2
E → Pino 3
DB4 → Pino 4
DB5 → Pino 5
DB6 → Pino 6
DB7 → Pino 7
VSS → GND
VDD → 5V
RW → GND
VO → Potenciômetro 10k para contraste
A/K → 5V/GND (backlight com resistor 220Ω)
Sensores Analógicos:
Umidade do Solo:
VCC → Pino 12 (controlado por software)
GND → GND
SIG → A0
LDR (Luminosidade):
VCC → 5V
GND → GND
SIG → A1 (com resistor 10k em divisor de tensão)
Atuadores Digitais:
Servo (teto):
Sinal → Pino 44
VCC → 5V (ou externo para servos de alta torque)
GND → GND (comum)
Ventilador:
Controle → Pino 8 (via transistor MOSFET ou relé)
Alimentação → Fonte 12V externa
LED Crescimento:
Ânodo → Pino 11 (com resistor 220Ω)
Cátodo → GND
Relé Bomba Irrigação:
IN → Pino 52
VCC → 5V
GND → GND
COM/NO → Bomba + Fonte 12V
Botões (INPUT_PULLUP):
Servo Toggle → Pino 32 ↔ GND
Fan Toggle → Pino 33 ↔ GND
Comunicação com ESP32:
Arduino TX (Pino 18) → ESP32 RX (Pino 16)
Arduino GND → ESP32 GND (comum obrigatório)
ESP32:
VCC → 5V (USB ou regulador)
GND → GND (comum com Arduino)
RX → Pino 16 (recebe sinal do Arduino)
TX → Pino 17 (não utilizado neste projeto)
Fluxo de Notificação:
Arduino detecta evento (ex: servo aberto)
→ Sinal digital HIGH no Pino 18
→ ESP32 lê sinal via digitalRead()
→ ESP32 conecta ao Wi-Fi (se necessário)
→ ESP32 faz HTTP GET para CallMeBot API
→ CallMeBot encaminha mensagem para WhatsApp
⚠️ Atenção: Sempre use GND comum entre Arduino e ESP32 para comunicação serial funcionar corretamente.
- Baixe em arduino.cc/en/software
- Instale seguindo o assistente do seu sistema operacional
- Abra Arduino IDE →
Arquivo→Preferências - Em URLs adicionais para Gerenciadores de Placas, adicione:
https://dl.espressif.com/dl/package_esp32_index.json - Vá em
Ferramentas→Placa→Gerenciador de Placas... - Busque por "esp32" e instale o pacote esp32 by Espressif Systems
- Selecione a placa:
Ferramentas→Placa→ESP32 Arduino→ESP32 Dev Module
Via Sketch → Incluir Biblioteca → Gerenciar Bibliotecas...:
| Biblioteca | Necessária Para | Status |
|---|---|---|
LiquidCrystal |
Controle do LCD 16x2 | ✅ Incluída no IDE |
Servo |
Controle do servo motor | ✅ Incluída no IDE |
WiFi (ESP32) |
Conexão Wi-Fi no ESP32 | ✅ Incluída no core ESP32 |
HTTPClient (ESP32) |
Requests HTTP para CallMeBot | ✅ Incluída no core ESP32 |
O código usa mapeamento linear para converter leitura ADC (0-1023) para porcentagem (0-100%):
humidity = map(humidity, 1023, 372, 0, 100);Como calibrar para seu sensor:
- Faça upload do código com
Serial.println(analogRead(humSensor));temporário - Anote o valor com sensor seco no ar (ex: ~1023)
- Anote o valor com sensor totalmente submerso em água (ex: ~372)
- Atualize o
map():map(valor, valor_seco, valor_molhado, 0, 100)
💡 Sensores capacitivos são mais duráveis que resistivos para uso contínuo no solo.
brightness = map(brightness, 100, 970, 100, 0);Calibração:
- Meça o valor ADC no escuro total (ex: ~970)
- Meça o valor ADC sob luz direta (ex: ~100)
- Ajuste o
map()conforme seus valores - O mapeamento inverte a escala: mais luz = menor valor numérico
| Parâmetro | Valor Padrão | Localização no Código | Recomendação |
|---|---|---|---|
| Umidade mínima para irrigar | 33 |
Linha ~135: if (humidity < 33) |
Ajuste conforme tipo de planta/solo |
| Luminosidade para acender LED | 75 |
Linha ~148: if (brightness < 75) |
Teste em diferentes condições de luz |
- Conecte o Arduino via USB
- No Arduino IDE:
Ferramentas→Placa→Arduino AVR Boards→Arduino Mega or Mega 2560 Ferramentas→Porta→ Selecione a porta COM correta- Abra
ARDUINO_MEGA/ARDUINO_MEGA.ino - Clique em Upload (→) ou pressione
Ctrl+U - Aguarde a mensagem "Done uploading."
- Conecte o ESP32 via USB
- No Arduino IDE:
Ferramentas→Placa→ESP32 Arduino→ESP32 Dev Module Ferramentas→Porta→ Selecione a porta COM do ESP32- Configure as opções:
Upload Speed: 921600 CPU Frequency: 240MHz (WiFi/BT) Flash Frequency: 80MHz Flash Mode: QIO Partition Scheme: Default 4MB with spiffs - Abra o sketch do ESP32 e configure as credenciais Wi-Fi:
const char* ssid = "SEU_WIFI"; const char* password = "SUA_SENHA"; const char* token = "SEU_TOKEN_CALLMEBOT"; const char* phoneNumber = "5511999999999"; // Com código do país
- Clique em Upload
⚠️ Se falhar, pressione e segure o botão BOOT no ESP32 durante o upload
graph LR
A[Sensores] --> B[Arduino MEGA]
B --> C{Lógica de Controle}
C --> D[Atuadores]
C --> E[Display LCD]
C --> F[Serial Monitor]
C --> G[Sinal Digital]
G --> H[ESP32]
H --> I[Wi-Fi]
I --> J[CallMeBot API]
J --> K[WhatsApp]
-
Leitura de Sensores (
humRead(),brightRead())- Ativa VCC do sensor de umidade apenas durante leitura (economia + prevenção de corrosão)
- Mapeia valores brutos para escala 0-100
- Atualiza LCD com valores formatados
-
Controle de Irrigação
if (humidity < 33) { digitalWrite(relayIrrigation, LOW); // Relé ativo = bomba LIGA lcd.print("Irr ON "); } else { digitalWrite(relayIrrigation, HIGH); // Relé inativo = bomba DESLIGA lcd.print(" "); }
🔁 Lógica invertida: relés normalmente abertos (NO) exigem
LOWpara ativar -
Controle de Iluminação
if (brightness < 75) { digitalWrite(ledPin, HIGH); // Acende LED }
-
Leitura de Botões (com debounce manual)
- Detecta transição
HIGH → LOW(pressão do botão comINPUT_PULLUP) - Alterna estado do servo (0° ↔ 45°) ou ventilador (ON ↔ OFF)
- Detecta transição
-
Atualização do LCD
- Posições fixas para evitar flickering:
- Linha 0:
U: XX Irr ON - Linha 1:
LUM: XXX FAN OFF
- Linha 0:
- Posições fixas para evitar flickering:
// No Arduino (transmissor)
const byte signalPin = 18; // Pino de sinal para ESP32
void notifyESP32() {
digitalWrite(signalPin, HIGH); // Sinaliza evento
delay(100); // Pulso de 100ms
digitalWrite(signalPin, LOW);
}
// No ESP32 (receptor)
const byte arduinoSignalPin = 16;
void loop() {
if (digitalRead(arduinoSignalPin) == HIGH) {
sendWhatsAppNotification("🌱 Teto da estufa aberto!");
delay(500); // Evita múltiplos envios
}
}- Acesse CallMeBot - WhatsApp API
- Adicione o contato +34 644 68 78 08 no WhatsApp
- Envie a mensagem:
I allow callmebot to send me messages - Você receberá seu API Token (ex:
1234567890)
// Credenciais Wi-Fi
const char* ssid = "MinhaRede";
const char* password = "SenhaDaRede";
// Credenciais CallMeBot
const char* token = "1234567890"; // Seu token recebido
const char* phoneNumber = "5511999999999"; // +55 + DDD + número
// Função de envio (já implementada no sketch)
void sendWhatsAppNotification(String message) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "https://api.callmebot.com/whatsapp.php?phone=" +
String(phoneNumber) +
"&text=" + message +
"&apikey=" + String(token);
http.begin(url);
int responseCode = http.GET();
http.end();
}
}// No Arduino, após abrir o teto:
if (servoOpen) {
digitalWrite(18, HIGH); // Sinaliza para ESP32
delay(100);
digitalWrite(18, LOW);
}
// No ESP32, ao detectar sinal:
if (digitalRead(16) == HIGH) {
sendWhatsAppNotification("🔓 Teto da estufa aberto manualmente");
}🔐 Segurança: O token da API é sensível. Em produção, considere usar variáveis de ambiente ou armazenamento seguro no ESP32.
| Sintoma | Causa Provável | Solução |
|---|---|---|
| LCD exibe quadrados/sem texto | Contraste (VO) mal ajustado | Gire o potenciômetro de contraste do LCD |
| Sensor de umidade sempre 0% ou 100% | Calibração incorreta ou sensor desconectado | Verifique conexões e recalibre com map() |
| Bomba não liga mesmo com umidade baixa | Lógica invertida do relé ou alimentação insuficiente | Confirme: LOW liga relé; use fonte externa 12V para bombas |
| ESP32 não conecta ao Wi-Fi | SSID/senha incorretos ou sinal fraco | Verifique credenciais; aproxime ESP32 do roteador |
| Notificação não chega no WhatsApp | Token inválido ou número formatado errado | Confirme token recebido; use formato 55DDNNNNNNNNN |
| Arduino e ESP32 não se comunicam | GND não conectado ou pinos trocados | Conecte GNDs; confirme: Arduino TX (18) → ESP32 RX (16) |
| Servo treme ou não move | Alimentação insuficiente para servo | Use fonte externa 5V/2A para servo de alto torque |
- Abra
Ferramentas→Monitor Serial(ouCtrl+Shift+M) - Configure baud rate para 9600
- Observe saída formatada:
Humidity: 28 Brightness: 65 Irrigation pump ON (continuous) LEDs ON Servo button pressed Fan turned ON
Se o ESP32 travar ou não responder:
# Via Arduino IDE:
# 1. Segure BOOT + EN (RESET) por 2 segundos
# 2. Solte EN, mantenha BOOT por mais 1 segundo
# 3. Solte BOOT
# 4. Tente upload novamente
# Ou via comando esptool:
esptool.py --chip esp32 erase_flashContribuições são bem-vindas! Siga estas etapas:
- Fork o repositório
- Crie uma branch para sua feature:
git checkout -b feature/melhoria-sensor-temperatura
- Implemente suas alterações com commits descritivos:
git commit -m "feat: adiciona leitura do sensor LM35 no LCD" - Teste em hardware real antes de enviar
- Envie um Pull Request descrevendo:
- O que foi alterado
- Como testar a mudança
- Impacto no consumo de energia/performance
- Mantenha compatibilidade com Arduino MEGA 2560 e ESP32 Dev Module
- Documente novos pinos ou bibliotecas no README
- Use
INPUT_PULLUPpara botões (evita resistores externos) - Evite
delay()longo em loops críticos; prefiramillis()para timing não-bloqueante
Este projeto é licenciado sob a GNU Affero General Public License v3.0 (AGPL-3.0).
✅ Você pode:
- Usar, modificar e distribuir o código
- Criar derivados para uso pessoal ou comercial
- Disponibilizar o código-fonte completo de qualquer versão modificada se o software for acessado via rede (ex: dashboard web da estufa)
- Manter os avisos de licença e autoria originais
- Licenciar derivados sob a mesma licença AGPL-3.0
❌ Você não pode:
- Fechar o código de uma versão modificada que seja acessada remotamente
- Remover avisos de licença ou autoria
📄 Leia a licença completa em: LICENSE
🌐 Mais informações: https://www.gnu.org/licenses/agpl-3.0.html
💡 Dica Final: Este projeto foi desenvolvido para fins educacionais. Para uso em produção, considere adicionar:
- Proteção contra surtos elétricos (varistores, fusíveis)
- Sensor de temperatura e umidade do ar (DHT22)
- Bateria de backup para falhas de energia
- Dashboard web local (ESP32 como servidor HTTP)
Happy gardening! 🌿