Dispositivo IoT Inteligente DIY: ATmega32U4, ESP8266 e Sensores para Agricultura Indoor
Componentes e Materiais
| Microchip ATmega32U4 | 1 |
| ESP8266 ESP-12E | 1 |
| Cristal 16 MHz | 1 |
| MOSFET N-Channel de Potência | 4 |
| Módulo Regulador de Tensão | 1 |
| Sensor DHT11 (Temp/Umid, 4 pinos) | 1 |
| Sensor DS18B20 (Termômetro Digital 1-Wire) | 1 |
| Sensor de Nível de Água (MikroE Water Detect) | 1 |
| Display LCD Gráfico 128x64 | 1 |
| Fotorresistor (LDR) | 1 |
Ferramentas e Máquinas
- Impressora 3D
- Cortadora a Laser
Aplicações e Serviços Online
- Autodesk Fusion 360 (CAD)
- Arduino IDE
Sobre o Projeto
Introdução
Inspirado na palestra TED de Caleb Harper (MIT Open Agriculture) sobre "Digital Farming": E se pudéssemos cultivar alimentos deliciosos e nutritivos em qualquer lugar do mundo? Nasceu a ideia de uma caixa/incubadora que cria condições climáticas ideais: luz, nutrientes, irrigação, controle de clima — tudo em design elegante.
Tecnologias Planejadas
- LED de Cultivo: Combinação vermelho (650nm) + azul (450nm) para crescimento vegetativo e floração
- Atomizador Ultrassônico (FogPonics): Irrigação por névoa rica em nutrientes (aeroponia)
- Dosagem Automática de Nutrientes
- Sistema de Sensoriamento de Água: pH e TDS (sólidos dissolvidos totais)
- Sistema de Troca de Água: Automatizado por botão
- Controle de Ar: Temp/umidade precisos (DHT22/11 + ventilador + coil)
- App Móvel: Dados em tempo real, gráficos históricos, alertas inteligentes, controle remoto de clima
Projetos similares existem, mas têm desvantagens (espaço, custo, uma cultura por vez). Objetivo: sistema open-source avançado, reduzindo desvantagens e integrando o melhor.
Experimentos com Plantas
Testei 4 grupos por 1,5 semanas:
- Solo + Luz Solar (controle natural)
- Névoa + Luz Solar
- Solo + LED Cultivo
- Névoa + LED Cultivo (grupo "HERO" — esperado melhor resultado)
Sementes de ervas mistas germinadas em papel toalha úmido (quase 100% sucesso). Transplantadas para pellets de coco, depois para sistema de teste com névoa, bolas de argila e solo. Resultados iniciais modestos: poucas plantas sobreviveram no sistema de névoa — meio de cultivo inadequado (névoa não mantinha argila/solo úmidos).
Pausa de Páscoa & Novo Experimento
Plantas morreram durante pausa (laboratório fechado). Novo teste com Lã de Rocha (Rock Wool) como meio — melhor retenção de umidade para névoa. Também testei germinação apenas com névoa.
Projeto Eletrônico e Produção da PCB
Listei todos os requisitos e pinos necessários. Escolha entre satshakit (ATmega328P, 16MHz, cristal, compatível Arduino Uno) e FABLEO (ATmega32U4, USB nativo). Optei pelo FABLEO (Jonathan Grinham) para aprender o 32U4.
Guia principal: Pinout do ATmega32U4. Software: EAGLE (Schematic .sch + Board Layout .brd).
Principais Bloco do Esquemático
- Headers AVRISP para programação
- Circuito USB + cristal
- Regulador de tensão (12V → 5V)
- 4 circuitos MOSFET: 3 diretos na entrada 12V, 1 com step-up para 24V (atomizador ultrassônico)
Layout da Placa
Roteamento rápido. Polígono GND preenche área (economiza tempo/espaço). Exportação PNG 1500 dpi monocromático para fresagem CNC. Placa dupla face: face inferior espelhada horizontalmente.
Fresagem CNC (Roland via FabModules)
Ferramenta 0.2mm para gravação, 1mm para corte externo. Configurações de Z-axis ajustadas. Fresagem face superior (Inside/Outside Cut) e face inferior.
Soldagem e Debug
Verificação com multímetro após cada componente. Curto-circuito VCC-GND encontrado e corrigido (raspagem com faca). Regulador step-up calibrado para 24V na bancada antes de soldar no verso. Módulo Wi-Fi (feito na semana de Networking) também no verso.
Arquivos para Download
- Esquemático GIY (.sch)
- Layout GIY (.brd)
- Cortes Internos/Externos Placa 1 e 2 (.png)
Fiação e Programação Embarcada (I/O)
Programação via Arduino IDE: Arduino como ISP (pinos 10,11,12,13 + VCC/GND) → Burn Bootloader (Arduino Leonardo) → Teste Blink → Sensores.
DHT11 - Temp/Umid
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() { Serial.begin(9600); dht.begin(); }
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("Temperatura = "); Serial.println(t, 2);
Serial.print("Umidade = "); Serial.println(h, 2);
delay(2000);
}
DS18B20 - Temp Digital 1-Wire
Requer resistor pull-up 4.7k (esqueci na PCB, soldei manualmente). Bibliotecas: OneWire.h, DallasTemperature.h.
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() { Serial.begin(9600); sensors.begin(); }
void loop() {
sensors.requestTemperatures();
Serial.print("Temperatura: "); Serial.print(sensors.getTempCByIndex(0));
delay(1000);
}
Primeiro sensor falhou na integração; substituí por outro à prova d'água (cabos soldados + heat shrink).
LDR - Sensor de Luz
Resistência varia com luz (escuro ~1MΩ, claro ~kΩ). Saída analógica no pino A0. Leitura 0-1023: >800 = muito claro.
int sensorPin = A0;
void setup() { Serial.begin(9600); }
void loop() {
int v = analogRead(sensorPin);
Serial.print("LDR = "); Serial.print(v);
if (v < 100) Serial.println(" (Escuro)");
else if (v < 200) Serial.println(" (Fraco)");
else if (v < 500) Serial.println(" (Claro)");
else if (v < 800) Serial.println(" (Brilhante)");
else Serial.println(" (Muito Brilhante)");
delay(3000);
}
Sensor de Nível d'Água (DIY)
Usei sensor de umidade de solo (princípio: condutividade elétrica). Calibrado: 0 = vazio, ~800 = baixo, >900 = cheio.
Display LCD Gráfico 128x64 (3 pinos!)
Conexão via 3 pinos digitais (E, RW, RS) usando biblioteca U8glib. Pinos declarados: U8GLIB_ST7920_128X64 u8g(4, 12, 6, U8G_PIN_NONE).
Exibição de logo FabLab: imagem .bmp 128x64 → conversão para array HEX via LCD Assistant (Byte orientation: Horizontal, Little endian).
Sensor de pH (logo pH sensor v1.1)
Sonda gera mV (positivo/negativo conforme pH). Placa "op amp" converte para 0-5V. Calibração com soluções tampão (pH 4.01, 6.86, 9.18 — pó mais barado e durável).
Calibração Offset: Curto-circuito BNC → ajuste potenciômetro (perto do BNC) para 2.5V no pino Po (pH 7 = 2.5V = 511 ADC).
Calibração Step: Sonda em tampão pH 4.01 → leitura estabilizada (ex: 3.05V). Step = (2.5 - 3.05) / (7 - 4.01) = -0.1839 V/pH.
Fórmula no código: pH = 7 + ((2.5 - tensao) / 0.18).
int ph_pin = A7;
void setup() { Serial.begin(9600); }
void loop() {
int measure = analogRead(ph_pin);
double voltage = 5.0 / 1024.0 * measure;
float pH = 7 + ((2.5 - voltage) / 0.18);
Serial.print("Medida: "); Serial.print(measure);
Serial.print("\tTensao: "); Serial.print(voltage, 3);
Serial.print("\tpH: "); Serial.println(pH, 3);
delay(2000);
}
Saídas MOSFET
- LED RGB:
digitalWrite(LED, HIGH)sempre ligado quando sistema ativo - Atomizador (Fog):
if (água) digitalWrite(FOG, HIGH); else digitalWrite(FOG, LOW);
Código Final Integrado (GIY Board)
#include "dht.h"
#include "U8glib.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#define DHT11_PIN 2
#define ONE_WIRE_BUS 3
#define WATER_LEVEL A4
#define LDR_PIN A3
#define PH_PIN A5
#define GROW_LIGHT 10
#define FOG_PUMP 13
int waterLevel, LightLevel, pH;
dht DHT;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature waterTemp(&oneWire);
U8GLIB_ST7920_128X64 u8g(4, 12, 6, U8G_PIN_NONE);
// Array do logo FabLab (omitido por brevidade)
const unsigned char logo[] PROGMEM = { ... };
bool first = true;
float hum = 0.0;
double T = 0.0;
void dht_test(float *humPerc);
void RefreshDisplay(float *humPerc, double *T, int *WL, int *LL, int *pH_value);
void setup() {
waterTemp.begin();
pinMode(GROW_LIGHT, OUTPUT);
pinMode(FOG_PUMP, OUTPUT);
digitalWrite(GROW_LIGHT, HIGH);
// Config display
if (u8g.getMode() == U8G_MODE_R3G3B2) u8g.setColorIndex(255);
else if (u8g.getMode() == U8G_MODE_GRAY2BIT) u8g.setColorIndex(3);
else if (u8g.getMode() == U8G_MODE_BW) u8g.setColorIndex(1);
else if (u8g.getMode() == U8G_MODE_HICOLOR) u8g.setHiColorByRGB(255,255,255);
// Splash logo
u8g.firstPage();
do { u8g.drawBitmapP(32, 0, 16, 64, logo); } while(u8g.nextPage());
dht_test(&hum);
}
void RefreshDisplay(float *humPerc, double *T, int *WL, int *LL, int *pH_value) {
u8g.setFont(u8g_font_fub11);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
u8g.drawStr(4, 0, "Hum%"); u8g.setPrintPos(68, 0); u8g.print(*humPerc);
u8g.drawStr(4, 15, "Temp"); u8g.setPrintPos(68, 15); u8g.print(*T);
u8g.drawStr(4, 30, "Wlvl");
if (*WL == 0) { u8g.drawStr(68, 30, "EMPTY!"); digitalWrite(FOG_PUMP, LOW); }
else { if (*WL < 800) u8g.drawStr(68, 30, "LOW"); else { digitalWrite(FOG_PUMP, HIGH); u8g.drawStr(68, 30, "HIGH"); } }
if (*LL < 100) u8g.drawStr(68, 45, "Dark");
else if (*LL < 200) u8g.drawStr(68, 45, "Dim");
else if (*LL < 500) u8g.drawStr(68, 45, "Light");
else if (*LL < 800) u8g.drawStr(68, 45, "Bright");
else u8g.drawStr(68, 45, "2Bright");
double voltage = 5.0 / 1024.0 * (*pH_value);
float Po = 7 + ((2.5 - voltage) / 0.18);
u8g.drawStr(4, 45, "pH"); u8g.setPrintPos(28, 45); u8g.print(Po);
}
void loop() {
waterTemp.requestTemperatures();
T = waterTemp.getTempCByIndex(0);
waterLevel = analogRead(WATER_LEVEL);
LightLevel = analogRead(LDR_PIN);
pH = analogRead(PH_PIN);
int chk = DHT.read11(DHT11_PIN);
hum = DHT.humidity;
dht_test(&hum);
if (first) { first = false; }
else {
u8g.firstPage();
do { RefreshDisplay(&hum, &T, &waterLevel, &LightLevel, &pH); } while(u8g.nextPage());
}
}
void dht_test(float *humPerc) { delay(1000); }
Design 3D e Impressão
Design no Fusion 360. Foco: estética "sexy" + funcionalidade + montabilidade. Integração de habilidades: impressão 3D, CNC, laser.
Recipiente de Água (BigRep 1m³, Simplify3D)
- Espaço para plantas + furo central para atomizador nivelado (nível zero = 2cm acima do atomizador = aproveita toda água)
- Passagem de cabos sensores, slot para display, alças para remoção, sliders de fixação
- Configurações: PLA, 205°C nozzle, 70°C bed, suporte, infill otimizado
Net Pots (Ultimaker 2+)
Melhoria: espaços maiores para passagem de névoa/raízes. Filete superior suave, esfera inferior com subtração booleana para curvatura.
Base do Sistema + Cantos Arredondados (BigRep + Ultimaker)
Configurações semelhantes. Cantos transparentes para passagem de luz.
Design 2D e Corte a Laser
Peças acrílicas (5mm) para acabamento interno. Sketches do Fusion 360 exportados como DXF, editados no Rhino.
- Verde (orgânico): laterais internas, suporte de plantas
- Branco: tampa frontal (furo display) e traseira (acesso programação)
- Transparente: tampa superior (passagem luz LED + solar), cortes para aliviar peso
Laser Epilog Fusion 60W (1016x711mm). Configurações únicas para acrílico 5mm.
Fresagem CNC
Estrutura em compensado 18mm. Máquina e(sign Easy Worker MasterPro 2513 (2600x1400x300mm, spindle 3.9kW 24k RPM). DXF do Fusion 360 → CAM → G-Code. Homing, zero X/Y/Z, simulação de trajetória, execução.
Peça adicional: molde para vazamento (madeira 10mm, 7 peças coladas).
Molde e Vazamento (Vacuum Forming)
Objetivo: impermeabilizar recipiente impresso (furos nas bordas). Máquina Formech Manual Vacuum Forming.
Solução: primeira camada fina + spray silicone → segunda camada real. Permite desmoldar sem quebrar.
Montagem Final
Estrutura → fiação sensores → fixação PCB na seção eletrônica → fitas LED RGB cortadas/soldadas → sistema completo GIY (Grow It Yourself).
Vídeo de Apresentação Final
© 2017 Albot Dima. Licença Creative Commons BY-NC-SA 4.0. Fonte oficial: Fab Academy Archive.
Códigos Adicionais
GIY Board - LCD + Luz (Teste Simples)
#include "U8glib.h"
int led = 10;
U8GLIB_ST7920_128X64 u8g(4, 12, 6, U8G_PIN_NONE);
void draw() {
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(0, 20);
u8g.print("GIY Project v1.0!");
}
void setup() {
pinMode(led, OUTPUT);
digitalWrite(led, HIGH);
}
void loop() {
u8g.firstPage();
do { draw(); } while(u8g.nextPage());
delay(500);
}
Esquemáticos
Duas imagens disponíveis na seção de esquemáticos do projeto original.
Processo de manufatura
- Cartão de Visita PCB 4×4 Jogo da Velha Personalizado – Guia de Design, Montagem e Código
- Sistema Multi-Posição de Sensores de Temperatura para Integração em Casa Inteligente
- Controlador DIY para Ferro de Solda 862D+ — Precisão e Confiabilidade
- MotionSense: Detecção Inteligente de Intrusão com Arduino e ESP8266
- Prevenção de Incêndio em Impressoras 3D: Sistema de Segurança com Sensor Inteligente
- Crie um Medidor IoT Web com Arduino, Yaler e IFTTT
- Levitação Magnética Repulsiva com Arduino: Circuito Simples e Guia DIY
- Robô Garra Controlado Remotamente para Manipulação de Precisão
- Registrador de Dados de Balão Meteorológico Arduino de Alto Desempenho
- CoroFence Detector Térmico: Sensor PIR Avançado & Integração IoT