Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

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

Aplicações e Serviços Online

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

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:

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

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

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

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)

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.

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

  1. Cartão de Visita PCB 4×4 Jogo da Velha Personalizado – Guia de Design, Montagem e Código
  2. Sistema Multi-Posição de Sensores de Temperatura para Integração em Casa Inteligente
  3. Controlador DIY para Ferro de Solda 862D+ — Precisão e Confiabilidade
  4. MotionSense: Detecção Inteligente de Intrusão com Arduino e ESP8266
  5. Prevenção de Incêndio em Impressoras 3D: Sistema de Segurança com Sensor Inteligente
  6. Crie um Medidor IoT Web com Arduino, Yaler e IFTTT
  7. Levitação Magnética Repulsiva com Arduino: Circuito Simples e Guia DIY
  8. Robô Garra Controlado Remotamente para Manipulação de Precisão
  9. Registrador de Dados de Balão Meteorológico Arduino de Alto Desempenho
  10. CoroFence Detector Térmico: Sensor PIR Avançado & Integração IoT