Comunicador Inteligente de Plantas: Arduino MKR IoT Bundle para Jardinagem Automatizada
Componentes (Kit MKR IoT Bundle)
| Componente | Quantidade | Descrição |
|---|---|---|
| Arduino MKR1000 (WiFi + Crypto) | 1 | Placa principal SAMD21 Cortex-M0+, WiFi nativo, RTC, criptografia |
| Sensor de Temperatura TMP36 | 1 | Analógico, -40 a +125°C, 10mV/°C |
| Fototransistor (LDR) | 1 | Sensor de luminosidade |
| Componentes para sensor de umidade DIY | 1 kit | 2 fios/sondas + resistor 1MΩ |
| LED RGB, resistores, jumpers, protoboard | Vários | Para indicação visual e montagem |
Sobre o Projeto
Este projeto utiliza o Arduino MKR IoT Bundle para criar um monitor inteligente de plantas que mede temperatura, luminosidade e umidade do solo, enviando relatórios diários por e-mail com gráficos e alertas de emergência quando a planta precisa de água.
Nota: Este tutorial pode estar desatualizado. Consulte a versão mais recente no Arduino Project Hub.
Objetivos de Aprendizado
- Serviço de automação Zapier (webhooks → e-mail)
- Envio de requisições HTTP/HTTPS do MKR1000
- Gerenciamento de RTC (Real Time Clock) e alarmes
- Construção de sensor de umidade DIY (divisor de tensão)
- Plotagem de dados no ThingSpeak (#ProTip)
- Estilização de e-mails com HTML/CSS (#ProTip)
- Teste de APIs com Postman (#ProTip)
Configuração do Zapier (Webhook → Gmail)
O Zapier atua como ponte: recebe HTTP POST do Arduino e envia e-mail formatado.
Passos:
- Crie conta em zapier.com
- Trigger: "Webhooks by Zapier" → "Catch Hook" → copie a URL gerada
- Teste a URL no navegador:
https://hooks.zapier.com/hooks/catch/XXXX/YYYY/?temperature=22&moisture=150&light=40&warning=Teste - Action: "Gmail" → "Send Email" → conecte sua conta Google
- Configure: To, Subject, Body (pode usar HTML – veja #ProTip abaixo)
- Ative o Zap
Envio de Requisição HTTP do MKR1000
O MKR1000 usa WiFi101.h + WiFiSSLClient.h para HTTPS.
Certificados SSL (Obrigatório!)
Para HTTPS, o MKR1000 precisa dos certificados raiz do servidor de destino.
- Abra:
Arquivo → Exemplos → WiFi101 → FirmwareUpdater - No código, adicione
hooks.zapier.comà lista de domínios - Carregue no MKR1000 via Arduino Desktop IDE (Web Editor não suporta)
- Aguarde conclusão do upload de certificados
Sketch Básico de Envio
#include <WiFi101.h>
#include <WiFiSSLClient.h>
const char* ssid = SECRET_SSID;
const char* password = SECRET_PASS;
String httpsRequest = "/hooks/catch/XXXX/YYYY/"; // Sua URL Zapier (só o path)
const char* host = "hooks.zapier.com";
WiFiSSLClient client;
void setup() {
Serial.begin(9600);
while (!Serial); delay(2000);
Serial.print("Conectando: "); Serial.println(ssid);
while (WiFi.begin(ssid, password) != WL_CONNECTED) {
Serial.print("."); delay(500);
}
Serial.println("\nWiFi conectado!");
}
void loop() {
float temperature = 22.5;
int moisture = 150;
int light = 40;
String warning = "Planta precisa de agua";
warning.replace(" ", "%20"); // URL encoding
sendEmail(temperature, moisture, light, warning);
delay(20000); // Teste: a cada 20s. Produção: usar RTC alarme diário.
}
void sendEmail(float temp, int moist, int light, String warn) {
String _temp = String(temp);
String _moist = String(moist);
String _light = String(light);
if (client.connect(host, 443)) {
client.println("POST " + httpsRequest +
"?temperature=" + _temp +
"&moisture=" + _moist +
"&light=" + _light +
"&warning=" + warn +
" HTTP/1.1");
client.println("Host: " + String(host));
client.println("Connection: close");
client.println();
delay(1000);
while (client.available()) {
Serial.write(client.read());
}
client.stop();
} else {
Serial.println("Falha conexao HTTPS");
}
}
RTC e Alarmes Diários
O MKR1000 possui RTC interno (RTCZero.h). Use alarmes para enviar relatório diário em horário fixo.
#include <RTCZero.h>
RTCZero rtc;
const byte hora = 8; // 08:00
const byte minuto = 0;
const byte segundo = 0;
const byte dia = 1;
const byte mes = 1;
const byte ano = 24;
bool emailEnviado = false;
void setup() {
Serial.begin(9600);
rtc.begin();
rtc.setTime(hora, minuto, segundo);
rtc.setDate(dia, mes, ano);
// Alarme diário às 08:01
rtc.setAlarmTime(8, 1, 0);
rtc.enableAlarm(rtc.MATCH_HHMMSS);
rtc.attachInterrupt(alarmeDisparado);
}
void loop() {
if (!emailEnviado) {
// sendEmail(...); // Chame sua função de envio
emailEnviado = true;
}
}
void alarmeDisparado() {
emailEnviado = false; // Permite novo envio no próximo dia
}
Importante: A ISR do alarme não pode ter delay() ou operações longas. Use apenas flags booleanas.
Sensor de Umidade DIY (Divisor de Tensão)
Dois fios/parafusos no solo formam resistor variável. Com resistor de 1MΩ em série:
3.3V ---[1MΩ]---●---[Solo/Sondas]--- GND
│
Pino A2 (ADC)
Princípio: Solo úmido → menor resistência → maior tensão no pino A2.
Leitura com média (reduz ruído):
int moisturePin = A2;
int threshold = 800; // Calibre: teste solo seco vs. molhado
int getAverageMoisture() {
long sum = 0;
for (int i = 0; i < 10; i++) {
sum += analogRead(moisturePin);
delay(10);
}
return sum / 10;
}
void checkMoisture() {
int val = getAverageMoisture();
Serial.print("Umidade: "); Serial.println(val);
if (val < threshold) {
// Enviar e-mail de ALERTA URGENTE
}
}
Sensores de Temperatura (TMP36) e Luz (Fototransistor)
TMP36 – Temperatura
TMP36: Pin 1 (VCC) → 3.3V, Pin 2 (Vout) → A1, Pin 3 (GND) → GND
float getTemperature() {
int reading = analogRead(A1);
float voltage = reading * 3.3 / 1024.0;
float tempC = (voltage - 0.5) * 100.0; // 10mV/°C, offset 500mV
return tempC;
}
Fototransistor – Luminosidade
LDR + Resistor 10kΩ em divisor:
3.3V ---[LDR]---●---[10kΩ]--- GND
│
Pino A0
int getLight() {
return analogRead(A0); // 0-1023 (maior = mais luz)
}
#ProTip: Plotagem no ThingSpeak
Visualize dados em tempo real com gráficos automáticos.
- Crie conta em thingspeak.com
- New Channel → 3 fields: Temperature, Moisture, Light
- Copie Write API Key
- Instale biblioteca
ThingSpeakvia Gerenciador
#include <ThingSpeak.h>
WiFiClient tsClient;
unsigned long channelID = 123456;
const char* writeAPIKey = "SUA_WRITE_KEY";
void setup() {
// ... WiFi connect ...
ThingSpeak.begin(tsClient);
}
void loop() {
ThingSpeak.setField(1, getLight());
ThingSpeak.setField(2, getTemperature());
ThingSpeak.setField(3, getAverageMoisture());
ThingSpeak.writeFields(channelID, writeAPIKey);
delay(60000); // 1 min (limite free: 15s)
}
Combine com RTC alarme para envio a cada minuto exato.
#ProTip: E-mails Estilizados com HTML/CSS no Zapier
No Zapier, na ação Gmail, mude "Body Type" para HTML e use este template:
<!doctype html>
<html><head><meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
.container{margin:10%; background:#ECF1F1; padding:5% 10%; font-family:monospace; letter-spacing:2px;}
.title{text-align:center; color:#0CA1A6; font-size:1.5em; padding:0.2vh;}
.subtitle{text-align:center; color:#0CA1A6; font-size:1.1em; padding:4%;}
.data{padding:2% 5%; margin:0 15%; background:#F7F9F9; color:#4E5B61; font-weight:bold;}
.bttn{padding:3%; margin:10% 25% 0; background:#00979D; text-align:center; color:#F7F9F9; font-size:1.4em;}
.disclaimer{text-align:center; color:#DA5B4A; font-weight:bold; margin-top:10%;}
.bttn:hover{background:#008184;}
a{text-decoration:none;}
</style></head><body>
<div class="container">
<h2 class="title">OLÁ!</h2>
<h4 class="subtitle">Atualização diária do seu jardim ☘</h4>
<div class="data">🌡 Temperatura: {{querystring__temperature}} °C</div>
<div class="data">💧 Umidade: {{querystring__moisture}}</div>
<div class="data">☀ Luz: {{querystring__light}}</div>
<div class="disclaimer">{{querystring__warning}}</div>
<a href="https://thingspeak.com/channels/SEU_CANAL">
<div class="bttn">VER GRÁFICOS</div>
</a>
</div></body></html>
Variáveis {{querystring__campo}} vêm dos parâmetros da URL do webhook.
#ProTip: Teste APIs com Postman
Antes de programar o Arduino, teste sua URL Zapier no Postman:
- Método: POST
- URL:
https://hooks.zapier.com/hooks/catch/XXXX/YYYY/ - Params: temperature=22, moisture=150, light=40, warning=Teste
- Send → veja resposta e URL final composta
Esquemático de Ligação
Ver seção "Schematics" para diagrama completo. Resumo:
- A0: Fototransistor (divisor 10kΩ)
- A1: TMP36 Vout
- A2: Sensor umidade DIY (divisor 1MΩ)
- Pino digital (ex: D6): VCC sensor umidade (controle de corrosão)
- LED RGB: pinos PWM com resistores 220Ω
Limitações e Considerações
- Zapier Free: 100 tasks/mês – planeje frequência de envio (diário = 30/mês OK)
- Gmail: não suporta iframes/gráficos no corpo – use botão link para ThingSpeak
- MKR1000: memórias limitadas – otimize strings, use
F()para literais - Certificados: atualize periodicamente; domínios novos exigem re-upload
- Sensor DIY: corroí com tempo – use sondas inox/grafite ou alterne polaridade
Expansões Futuras
- Múltiplas plantas com multiplexador analógico (CD74HC4067)
- Bomba de irrigação acionada por relé (shield MKR Relay Proto)
- Integração com Home Assistant via MQTT
- Dashboard próprio (Grafana + InfluxDB) em vez de ThingSpeak
- Notificações push (Telegram, Pushover) via Zapier
- OTA updates (Arduino IoT Cloud)
Processo de manufatura
- Dominando a Sintaxe de Netlist SPICE: Nomenclatura de Componentes, Elementos Passivos e Ativos, e Definição de Fontes
- Fertilizantes: Ciência, Produção e Futuros Sustentáveis
- Circuitos Integrados (CIs): Chips Compactos e Poderosos Impulsionando a Eletrônica Moderna
- Lançamento da Reliable Plant: Seu Guia Confiável para Excelência em Manutenção
- Kit MOSMusic: MOSFET, Arduino e Mais - Iluminação Sincronizada com Música
- Manutenção de Planta Desmistificada: Melhores Práticas para Indústrias Modernas
- Desbloqueando Valor em Plantas Químicas a Granel: Estratégias para Crescimento
- Componentes Essenciais de uma Máquina de Furar: Visão Geral Completa
- Dominando a Manutenção de Usinas: Práticas Comprovadas para Produção Confiável de Energia
- Principais Componentes de um Motor de Combustão Interna