Smart Herb Box: Sistema de Jardinagem Inteligente com Alexa e Arduino
Componentes e Materiais
| Componente | Quantidade | Função |
|---|---|---|
| Amazon Alexa Echo Dot | 1 | Interface de voz |
| Arduino UNO R3 | 1 | Controlador principal |
| ESP8266 ESP-01 | 1 | Conectividade WiFi |
| Arduino Proto Shield | 1 | Base para circuitos personalizados |
| Shield 4 Relés (5V) | 1 | Controle de bombas (12V) e lâmpada (220V) |
| Bomba de Água Submersa 12V | 2 | Irrigação por gravidade/pressão |
| Lâmpada de Crescimento para Plantas (220V) | 1 | Iluminação suplementar |
| Fonte 220V/12V DC (para bombas) | 1 | Alimentação bombas |
| Fonte 12V DC (para Arduino/relés) | 1 | Alimentação lógica |
| Carregador USB + Cabo | 1 | Alimentação 5V do Arduino |
| Mangueira de Ar/Água (silicone 4-6mm) | 1 | Conexão bombas → vasos |
| Jumpers (macho-macho, macho-fêmea) | 1 kit | Conexões |
| Sensores de Umidade de Solo YL-69 | 4 | Monitoramento por vaso |
| Madeira (compensado/MDF 12-18mm) | Conforme corte | Caixa estrutural |
| Vasos de ervas (supermercado, ~11cm) | 3 | Recipientes das plantas |
| Reservatório de água externo | 1 | Garrafa/balde 2-5L |
Sobre o Projeto
O Smart Herb Box é um sistema de irrigação automática para ervas culinárias em ambiente interno, com monitoramento de umidade, iluminação suplementar e controle por voz via Amazon Alexa. A caixa acomoda 3 vasos padrão de supermercado, cada um com sensor de umidade dedicado e linha de irrigação independente.
Funcionalidades principais:
- Monitoramento contínuo de umidade do solo (4 sensores)
- Irrigação automática baseada em limiares configuráveis
- Controle manual/agendado de bomba por vaso
- Lâmpada de crescimento controlada (horário/voz)
- Interface web para configuração e gráficos de histórico
- Comandos de voz via Alexa (português/inglês/alemão)
- Notificações de "planta seca" e histórico de irrigação
Arquitetura do Sistema
┌─────────────┐ Serial ┌──────────────┐ WiFi/HTTP ┌─────────────┐
│ Arduino │ ◄─────────────► │ ESP-01 │ ◄────────────────► │ Web API │
│ (UNO) │ (9600 baud) │ (AT cmds) │ (REST/JSON) │ (PHP/JSON) │
└──────┬──────┘ └──────────────┘ └──────┬──────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Sensores/ │ │ AWS Lambda │
│ Atuadores │ │ (Alexa) │
└─────────────┘ └─────────────┘
Passo a Passo Detalhado
Passo 1: Sensor de Umidade YL-69
O sensor YL-69 usa duas sondas que formam um resistor variável: solo úmido = menor resistência = maior condutividade.
Ligação otimizada (evita corrosão):
- VCC do sensor → Pino digital (ex: D6) – ligado apenas durante leitura
- GND → GND
- A0 (saída analógica) → Pino analógico (ex: A1)
Código de leitura:
byte vccPin = 6;
byte dataPin = A1;
int readHumidity() {
digitalWrite(vccPin, HIGH); // Liga sensor
delay(500); // Estabilização
int value = analogRead(dataPin); // 0-1023
digitalWrite(vccPin, LOW); // Desliga sensor (evita eletrólise)
return 1023 - value; // Inverte: maior valor = mais úmido
}
Calibração: teste em solo seco (valor ~200-400) e solo encharcado (valor ~800-1000). Defina limiar de "seco" (ex: < 500) para acionar irrigação.
Passo 2: Shield de Relés para Bombas e Lâmpada
O shield de 4 relés isola eletricamente o Arduino (5V) das cargas:
- Relé 1-2: Bombas 12V (uma por vaso, ou uma bomba + válvulas)
- Relé 3: Lâmpada 220V (cuidado: isolamento reforçado!)
- Relé 4: Reserva / futura expansão
Lógica de acionamento (relés "active LOW"):
// Desligado = pino INPUT ou HIGH
// Ligado = pino OUTPUT + LOW
void setup() {
pinMode(pump1Pin, OUTPUT); digitalWrite(pump1Pin, HIGH); // Inicia desligado
pinMode(pump2Pin, OUTPUT); digitalWrite(pump2Pin, HIGH);
pinMode(lampPin, OUTPUT); digitalWrite(lampPin, HIGH);
}
void activatePump(byte pin, int seconds) {
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW); // Liga
delay(seconds * 1000);
digitalWrite(pin, HIGH); // Desliga
pinMode(pin, INPUT); // Garante desligado (high-Z)
}
Passo 3: WiFi com ESP-01 (AT Commands)
O ESP-01 é um microcontrolador separado que requer comunicação serial:
- ESP VCC/CH_PD → 3.3V (use divisor de tensão ou regulador 3.3V dedicado)
- ESP GND → GND
- ESP TX → Arduino D2 (via divisor 5V→3.3V: 1kΩ + 2kΩ)
- ESP RX → Arduino D3 (direto funciona, mas divisor recomendado)
Configuração inicial (baud rate 9600):
AT+RST // Reset
AT+CWMODE=1 // Modo Station
AT+CWJAP="SSID","SENHA" // Conecta WiFi
AT+CIPMUX=1 // Múltiplas conexões
AT+CIPSERVER=1,80 // Servidor porta 80 (opcional)
Comunicação HTTP GET para API:
AT+CIPSTART=0,"TCP","meuservidor.com",80
AT+CIPSEND=0,
GET /api/planta?action=humidity&code=LEFT&humidity=750 HTTP/1.0
Host: meuservidor.com
Connection: close
Passo 4: Caixa de Madeira (Estrutura)
Dimensões sugeridas (para 3 vasos 11cm + eletrônica):
- Externo: 40cm (L) × 18cm (P) × 20cm (A)
- Interno: 36cm × 14cm × 18cm
- Furos para vasos: 3 círculos 11.5cm diâmetro, espaçados
- Painel traseiro removível (parafusos) para manutenção
- Bandeja coletora interna (PVC ou metal) para vazamentos
Montagem: cola madeira D3 (resistente à água) + parafusos. Acabamento com verniz marítimo ou epóxi nas partes internas.
Passo 5: Website/API (Backend)
Tecnologias: PHP, jQuery, Bootstrap, Chart.js, ArduinoJson.
Endpoints principais:
| Endpoint | Método | Função |
|---|---|---|
| /api/plant?action=get&code=LEFT | GET | Retorna config: dataPin, interval |
| /api/plant?action=humidity&code=LEFT&humidity=750 | GET | Recebe leitura do Arduino |
| /api/action?action=pop | GET | Arduino busca comandos pendentes |
| /api/action?action=processed&entryNo=123 | GET | Confirma execução de comando |
Interface Web: dashboard com gráfico Chart.js (últimas 24h/7d/30d), formulários inline (X-editable) para ajustar pinos, intervalos, limiares.
Passo 6: Integração Alexa (Alexa Skill + AWS Lambda)
Fluxo: Usuário fala → Alexa → AWS Lambda (Node.js) → Web API → Arduino (polling) → Execução → Resposta → Lambda → Alexa
Intents implementados:
ReadHumidityIntent– "Como estão minhas plantas?" / "Como está o manjericão?"IrrigatePlantIntent– "Irrigue minhas plantas" / "Irrigue o manjericão por 5 segundos"SwitchIntent– "Ligue a lâmpada" / "Desligue a luz"ReadIrrigateIntent– "Quais plantas precisam de água?"ReadLastIrrigationIntent– "Quando foi a última irrigação do manjericão?"
Lambda (Node.js) – encaminhamento:
const https = require('https');
exports.handler = (event, context, callback) => {
const postData = JSON.stringify(event);
const options = {
host: 'meuservidor.com',
path: '/api/alexa',
port: 443,
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Content-Length': postData.length }
};
const req = https.request(options, (res) => {
let body = '';
res.on('data', (chunk) => body += chunk);
res.on('end', () => callback(null, JSON.parse(body)));
});
req.write(postData);
req.end();
};
Passo 7: Código Arduino (Estrutura Modular)
O código está organizado em classes/structs:
Plant– gerencia um vaso: pino sensor, intervalo, leitura, envioEcoActionBuffer– fila de comandos vindos da API (ligar bomba, lâmpada)WhiteWalnutApi– comunicação HTTP/JSON com ESP-01StensTimer– agendamento não-bloqueante (timers por objeto)
Loop principal (WhiteWalnut.ino):
void setup() {
Serial.begin(9600);
while(!WhiteWalnutApi::connectToWiFi()) delay(2000);
leftPlant.code = "LEFT"; centerPlant.code = "CENTER";
rightPlant.code = "RIGHT"; externalPlant.code = "EXTERNAL";
leftPlant.checkHumidity(); // Inicia leituras periódicas
centerPlant.checkHumidity();
rightPlant.checkHumidity();
externalPlant.checkHumidity();
// Timers: API a cada 60s, ações a cada 1s
StensTimer::getInstance()->setInterval(&apiTimer, ACTION_PLANT_UPDATE, 60000);
StensTimer::getInstance()->setInterval(&actionBuffer, ACTION_ECOACTION_READ, 1000);
}
void loop() {
stensTimer->run(); // Processa todos timers
}
Exemplos de Comandos de Voz (Alexa)
| Comando | Resposta Esperada |
|---|---|
| "Alexa, pergunte à herb box como estão minhas plantas" | "Planta 1 está boa, Planta 2 está seca, Planta 3 está úmida" |
| "Alexa, diga à herb box para irrigar o manjericão por 5 segundos" | "Irrigando manjericão por 5 segundos" |
| "Alexa, pergunte à herb box quais plantas precisam de irrigação" | "Planta 1 e Planta 3 estão secas" |
| "Alexa, pergunte à herb box quando foi a última irrigação do meu manjericão" | "Última irrigação do manjericão foi há 36 horas" |
| "Alexa, diga à herb box para ligar a lâmpada" | "Lâmpada de crescimento ligada" |
Recursos Planejados (Roadmap)
- Modo economia de energia (deep sleep Arduino + wake por RTC)
- Nós remotos: Arduino Nano + nRF24L01/LoRa para sensores distribuídos (bateria)
- API multi-instância (compartilhar caixa com amigos/família)
- Botões físicos na caixa para irrigação/lâmpada sem app/voz
- Cards visuais na resposta Alexa (imagens das plantas)
- Integração com Home Assistant / MQTT
- Previsão de irrigação baseada em clima (API tempo)
Arquivos de Código (Resumo)
WhiteWalnut.ino– sketch principal, setup de timers e objetosPlant.h/.cpp– classe vaso (umidade, agendamento)EcoActionBuffer.h/.cpp– buffer de comandos (liga/desliga com duração)WhiteWalnutApi.h/.cpp– cliente HTTP/JSON via ESP-01 AT commands- Bibliotecas:
ArduinoJson,StensTimer,SoftwareSerial,MemoryFree
Esquemático Resumido
Ver seção "Schematics" para diagramas de: comunicação Arduino↔ESP↔API↔Lambda, intents Alexa, fluxo de dados JSON.
Processo de manufatura
- Sistema de Iluminação DMX Controlado via Web – Controlador Mestre Arduino
- Construa um Spybot Controlado por Bluetooth com Arduino
- SERENA: Sistema de Alarme Personalizado Arduino Mega 2560 com Touchscreen TFT LCD
- Estação Meteorológica Compacta: Arduino Nano e ESP8266 com BMP280 e Display OLED/Nokia LCD
- Sistema Inteligente de Ventilação de Porão: Controle de Umidade com Arduino
- Sistema de Presença em Tempo Real com RFID, Arduino e Google Sheets
- Shield de Programação Wireless Arduino com HC-05 Bluetooth – Sem Cabo USB
- Sistema Avançado de Alerta de Colisão com Arduino – Alertas Visuais e Sonoros para Segurança Veicular
- Shield TFT 2,8" para Arduino Nano – Display SPI 320×240 de Alto Desempenho
- Shield Relógio Nixie NCS314 para Arduino UNO/MEGA – Compatibilidade IN‑14/IN‑12