Neste projeto, vais aprender a criar um sistema automático de rega interior com o Arduino IoT Cloud. Este sistema permite monitorizar e regar as tuas plantas a partir de qualquer lugar do mundo e é uma ótima introdução à internet das coisas.
Incluí instruções de montagem, um guia de início rápido para a Arduino IoT Cloud e todo o código necessário. Este projeto usa uma placa Arduino MKR1000 IoT, um sensor capacitivo de humidade do solo, sensor de temperatura e humidade, LCD I2C e bomba de água. Também é possível fazer este projeto com um Arduino normal (não ligado à internet).
Note que isto é principalmente uma prova de conceito, ou seja, construir este sistema para apenas uma planta é bastante caro e provavelmente não faz muito sentido. No entanto, agora que sei como tudo funciona, posso facilmente expandir o sistema e adicionar mais funcionalidades no futuro.
Se tiveres alguma dúvida ou sugestão, deixa um comentário abaixo.
Para mais informações sobre alguns dos componentes usados neste projeto, consulta os tutoriais abaixo:
Materiais
Componentes de hardware
Note que também podes usar qualquer uma das outras placas Arduino IoT com conectividade Wi-Fi, como a Arduino MKR WiFi 1010 ou a mais barata Arduino Nano 33 IoT. A vantagem das placas MKR é que elas encaixam no Arduino MKR Relay Proto Shield, o que facilita muito a ligação dos fios.
Para o depósito de água, podes usar qualquer recipiente que tenhas por casa (eu usei um recipiente de armazenamento de alimentos IKEA da minha cozinha).
Apps e serviços online
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Montagem do sistema
Todos os componentes estão ligados a uma caixa central do projeto que está montada na tampa do recipiente IKEA.

Para montar o Arduino MKR Relay Proto Shield, imprimi em 3D uma placa adaptadora simples. Um pequeno orifício na lateral da caixa do projeto permite o acesso à porta micro USB do MKR1000, usada para alimentar o sistema e programar a placa.

Sensor de humidade do solo
Para este projeto, usei um capacitive soil moisture sensor com saída analógica. Sensores capacitivos têm melhor resistência à corrosão do que sensores resistivos, mas não são 100% à prova de água. Como são feitos a partir de uma PCB padrão com substrato composto, a água pode facilmente entrar pelas laterais da PCB. A eletrónica na parte superior do sensor também não está protegida contra água.
Para tornar o sensor um pouco mais à prova de água, cobri as bordas e a eletrónica com verniz transparente para unhas. Um revestimento conformal real é provavelmente melhor, mas o verniz funciona bastante bem como alternativa barata.

O cabo que veio com o sensor era bastante curto, por isso fiz um novo. Também podes simplesmente soldar fios mais longos ao cabo original.

Ligação do sensor de humidade do solo ao Arduino MKR1000
A tabela abaixo mostra as ligações que precisas de fazer.
| Sensor de humidade do solo | Arduino MKR1000 |
|---|---|
| GND | GND |
| VCC | 3.3 V |
| AOUT | A2 |
Bomba e shield de relé

Para regar as plantas, usei uma small submersible pump que pode ser alimentada com 3.3 V. A bomba é controlada pelo relé 1 do Arduino MKR Relay Proto Shield. Como a bomba consome cerca de 200 mA, pode ser alimentada diretamente pela saída de 3.3 V do MKR1000.
Se quiseres usar uma bomba maior, tens de usar uma fonte de alimentação externa. Certifica-te de que a corrente da bomba está dentro das especificações dos relés.

O fio preto da bomba está ligado ao terra. O fio vermelho vai para o lado NO (normalmente aberto) do relé. O COM está ligado à saída de 3.3 V do MKR1000. Note que estes 3.3 V estão disponíveis num dos terminais de parafuso do Proto Shield.
Sensor de temperatura e humidade

Embora não seja estritamente necessário para regar automaticamente as plantas, achei que um sensor de temperatura e humidade seria uma boa adição ao sistema. Para este projeto, usei um AM2301A sensor que vem numa caixa com os fios já ligados. Este sensor é fabricado pela ASAIR, que também fabrica os populares sensores DHT11 e DHT22.
Para mais informações sobre sensores de temperatura e humidade DHT, consulta o tutorial abaixo:
Ligação do sensor de temperatura e humidade AM2301A
A tabela abaixo mostra as ligações que precisas de fazer.
| Sensor de temperatura e humidade AM2301A | Arduino MKR1000 |
|---|---|
| Preto | GND |
| Vermelho | 3.3 V |
| Amarelo | A1 |
Monteio o sensor na lateral da caixa do projeto. Note que fiz um pequeno orifício na caixa e na parte traseira do sensor para passar os fios.

LCD I2C
Além da Arduino IoT Cloud, os dados dos sensores também são exibidos no LCD I2C 20×4 montado na tampa da caixa do projeto.

Cortei uma abertura na caixa do projeto usando my homemade CNC router, mas também podes usar uma serra tico-tico ou até um estilete afiado.

O LCD normalmente é alimentado com 5 V, mas parece funcionar bem a 3.3 V. Graças ao módulo I2C montado na parte traseira do LCD, só precisas de ligar dois fios, SDA e SCL, ao MKR1000. As ligações estão disponíveis nos terminais de parafuso do shield, tornando a ligação do display muito fácil.
Ligações do LCD I2C
| LCD I2C 20×4 caracteres | Arduino MKR1000 |
|---|---|
| GND | GND |
| VCC | 3.3 V |
| SDA | SDA |
| SCL | SCL |
Escrevi um tutorial detalhado sobre o uso de LCDs I2C com Arduino que podes encontrar aqui:
Uma nota sobre a ligação dos fios
Como podes ter visto, todos os sensores, o LCD e a bomba precisam de estar ligados a 3.3 V e GND. O Arduino MKR Relay Proto Shield só tem uma saída de energia e enfiar todos os fios num único terminal de parafuso não é uma boa ideia. Em vez disso, podes usar algo como Wago lever nuts como ponto de distribuição de energia.
O tubo de água
Inicialmente, planeei simplesmente colocar a extremidade do tubo de PVC algures no meio do vaso. No entanto, descobri que isso deixava parte do vaso encharcada e o resto completamente seco.
A minha solução foi furar vários pequenos orifícios (1 mm) espaçados cerca de 2 cm nos últimos 30 – 40 cm do tubo. Imprimi em 3D uma tampa para a extremidade do tubo e alguns suportes para colocar na terra.
Podes descarregar os ficheiros STL aqui se quiseres imprimir os teus próprios:

Isto parece funcionar bastante bem para manter a terra uniformemente húmida.

Começar com a Arduino IoT Cloud
Na próxima secção, vou explicar como começar com a Arduino IoT Cloud.
O primeiro passo é ir a https://create.arduino.cc/. Nesta página web encontrarás o Web Editor, um guia de início rápido, o Gestor de Dispositivos e um link para a Arduino IoT Cloud.

Instalar o plugin Arduino Create
Existem várias formas de configurar uma nova placa, mas acho mais fácil fazê-lo através da página Getting Started. Clica no ícone Getting Started e desce até ao fim da página onde diz Install Arduino Create Plugin. Este plugin permite carregar sketches do Arduino Web Editor para a tua placa ou dispositivo.

Depois de clicares no ícone do Arduino Create Plugin no fim da página, clica em start e descarrega e instala o plugin. O assistente de configuração vai verificar se instalaste o plugin com sucesso. Se sim, deverás ver a página abaixo.

Configurar uma placa IoT
Agora volta à página Getting Started clicando no ícone no topo da página. O próximo passo é configurar uma nova placa IoT. Para este projeto, usei o Arduino MKR1000. Se não souberes o nome da tua placa, podes clicar no ícone Autodetect Arduino Board.

O assistente de configuração IoT abrirá e guiar-te-á na configuração e teste da placa.

Clica em start e liga a placa ao computador com um cabo USB. Se instalaste o plugin Arduino Create corretamente, o computador deverá detetar o teu dispositivo.

De seguida, dá um nome à tua placa. Eu chamei simplesmente MKR1000_1. Certifica-te de usar um nome fácil de reconhecer, especialmente se estiveres a usar várias placas para diferentes projetos.

Depois disso, o chip de criptografia do MKR1000 precisa de ser configurado, o que demora até 5 minutos. Cada MKR1000 está equipado com um Microchip ECC508 crypto chip. Este chip é usado para armazenar a identidade da tua placa de forma segura quando está ligada à tua conta Arduino.

De seguida, podes carregar um sketch de exemplo que te permitirá testar a funcionalidade da placa e ligar/desligar o LED integrado via Network Monitor. Na aba Secret do sketch, precisas de inserir o nome e a palavra-passe da tua rede wifi local.

Na página seguinte, clica no caractere LED para ligar e desligar o LED integrado.

Se tudo correu bem, deverás ver a página abaixo.

Criar um novo Thing
Após configurar um novo dispositivo IoT, podes voltar ao painel do Arduino Create e clicar no ícone Arduino IoT Cloud.

Ao clicares neste ícone, abrirá a página “Your Things” da Arduino IoT Cloud. Nesta página, podes criar novos Things, que é como a Arduino chama os dispositivos que podes ligar à internet. No nosso caso, o Thing representa a placa Arduino MKR1000 com vários sensores ligados. Cada Thing pode ter várias propriedades como temperatura, estado de um LED, coordenadas GPS, etc.
Na versão gratuita da IoT Cloud, podes criar apenas um Thing com até cinco propriedades. Se quiseres mais, tens de fazer upgrade para o plano pago da Arduino Cloud. Como este projeto usa apenas um Thing com menos de cinco propriedades, o plano gratuito é suficiente.

Clica em ADD NEW THING e dá-lhe um nome. Eu chamei o meu Automatic_indoor_garden. Seleciona a placa MKR1000 que acabámos de configurar no menu dropdown (MKR1000_1).

Agora serás redirecionado para uma página onde podes adicionar propriedades ao teu Thing.

Adicionar propriedades
Para este projeto, adicionei três propriedades diferentes: temperatura, humidade e conteúdo de humidade do solo. Propriedades representam variáveis no código Arduino e também são legíveis na Cloud. Depois de criar as propriedades e carregar o código, poderás vê-las no painel do teu Thing.
Adicionar propriedades é muito fácil clicando em ADD PROPERTY. Note que tens de repetir este processo três vezes.
Para cada propriedade precisas definir os seguintes parâmetros:
- Nome – o nome que será exibido na lista de propriedades e no widget.
- Nome da Variável – o nome da variável que usarás no teu Sketch para referenciar esta propriedade. Não pode incluir caracteres especiais.
- Tipo – seleciona o tipo correto da propriedade. Adiciona o mínimo e máximo para medições numéricas, para desenhar o widget corretamente.
- Permissão
- Leitura & Escrita : a propriedade pode ser definida e mostrada no painel da Arduino IoT Cloud.
- Só Leitura : a propriedade será enviada para a Arduino IoT Cloud e estará disponível no teu painel.
- Atualização
- Quando o valor muda : A propriedade será enviada para a Arduino IoT Cloud sempre que a alteração do valor for maior ou igual ao delta.
- Regularmente : a propriedade será enviada para a Arduino IoT Cloud a cada número especificado de segundos.
- Histórico – Mostra uma visualização dos dados históricos da propriedade.
Na imagem abaixo, podes ver os parâmetros que usei para a propriedade Temperatura. Note que podes selecionar um dos muitos tipos de propriedade incorporados, como Temperatura (Celsius), ou criar um personalizado.

Podes encontrar os parâmetros para as outras propriedades na tabela abaixo
Parâmetros das propriedades do Thing
| Nome | Variável Nome | Tipo | Permissão | Atualização |
|---|---|---|---|---|
| Temperatura | temperature | Temperatura (Celsius) -20 °C – 60 °C | RO | A cada 10s |
| Humidade | humidity | Humidade Relativa (Percentagem) 0 RH – 100 RH | RO | A cada 10s |
| Conteúdo de humidade do solo | soilMoistureContent | Float 0 – 100 | RO | A cada 1s |
Ao selecionar mostrar visualização do histórico, podes gravar os valores das tuas propriedades durante um certo período e guardá-los como gráficos. Infelizmente, só podes guardar os dados por 1 dia na versão gratuita da Arduino IoT Cloud.

Depois de adicionar todas as propriedades, clica em EDIT SKETCH. Isto abrirá o Arduino Web Editor.
Criar sketch
Depois de clicares em EDIT SKETCH, verás que um novo sketch foi criado automaticamente.

Note que o sketch tem o mesmo nome do nosso Thing mais a data de criação. Além deste ficheiro .ino, verás mais três ficheiros:
ReadMe.adoc : este é um ficheiro de texto simples onde podes adicionar informações sobre o autor e o projeto.
thingProperties.h : este ficheiro é gerado automaticamente pela Arduino IoT Cloud quando adicionas propriedades ao teu Thing. Em geral, não deves editar o código neste ficheiro manualmente. É atualizado automaticamente quando alteras as propriedades do Thing no painel.
Por favor, consulta a página IoT Cloud – Getting Started no Arduino Project Hub para uma explicação mais detalhada sobre as diferentes funções em thingProperties.h.

Secret: esta aba permite preencher as credenciais da tua rede. SECRET_SSID e SECRET_PASS são o nome e a palavra-passe da rede wifi à qual o MKR1000 vai ligar-se. Depois de preencheres estes dados, clica em guardar.

Código Arduino
Os ficheiros gerados automaticamente facilitam bastante o início com a IoT Cloud, mas claro que ainda precisas de escrever algum código.
No sketch principal, não em thingProperties.h, adicionei código que lê os sensores, controla a bomba de água e mostra informações no LCD I2C de caracteres.
Podes substituir o código no sketch principal pelo código abaixo. Liga a placa MKR1000 ao computador se ainda não o fizeste e carrega o código clicando no botão de upload (seta para a direita no topo da página). Recomendo desligar a bomba por enquanto e deixar apenas os sensores instalados.
De seguida, vou explicar como o código funciona e mostrar-te como podes alterar vários parâmetros.
Podes copiar o código clicando no botão no canto superior direito do campo de código.
/*
Sketch for automatic indoor garden project. More info: https://www.makerguides.com
Arduino IoT Cloud Properties description
The following variables are automatically generated and updated when changes are made to the Thing properties
float soilMoistureContent;
float humidity;
float temperature;
Properties which are marked as READ/WRITE in the Cloud Thing will also have functions
which are called when their values are changed from the Dashboard.
These functions are generated with the Thing and added at the end of this sketch.
*/
#include "thingProperties.h"
#include "DHT.h"
#include "LiquidCrystal_I2C.h"
#define DHTPIN A1
#define DHTTYPE DHT21
#define RELAYPIN 1
#define SOILPIN A2
DHT dht = DHT(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);
const unsigned long pumpPeriod = 20000;
const unsigned long waitPeriod = 120000;
unsigned long previousMillis;
float moistureSensorData;
void setup() {
// Initialize serial and wait for port to open:
Serial.begin(9600);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500);
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
/*
The following function allows you to obtain more information
related to the state of network and IoT Cloud connection and errors
the higher number the more granular information you’ll get.
The default is 0 (only errors).
Maximum is 4
*/
setDebugMessageLevel(4);
ArduinoCloud.printDebugInfo();
pinMode(LED_BUILTIN, OUTPUT);
pinMode(RELAYPIN, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
}
void loop() {
ArduinoCloud.update();
// Your code here
temperature = dht.readTemperature();
humidity = dht.readHumidity();
lcd.setCursor(0, 0);
lcd.print("Temperature:");
lcd.setCursor(13, 0);
lcd.print(temperature);
lcd.print("\xDf" "C");
lcd.setCursor(0, 1);
lcd.print("Humidity:");
lcd.setCursor(10, 1);
lcd.print(humidity);
lcd.print("%");
moistureSensorData = analogRead(SOILPIN);
//Serial.println(moistureSensorData);
soilMoistureContent = map(moistureSensorData, 883, 469, 0, 100);
soilMoistureContent = constrain(soilMoistureContent, 0, 100);
lcd.setCursor(0, 2);
lcd.print("Soil moisture:");
lcd.setCursor(15, 2);
lcd.print(soilMoistureContent, 0);
lcd.print("% ");
if (soilMoistureContent <= 30 && millis() - previousMillis >= waitPeriod) {
digitalWrite(RELAYPIN, HIGH);
digitalWrite(LED_BUILTIN, HIGH);
delay(pumpPeriod);
digitalWrite(RELAYPIN, LOW);
digitalWrite(LED_BUILTIN, LOW);
previousMillis = millis();
}
}
Como o código funciona
Na secção loop do código, a temperatura e humidade são lidas com dht.readTemperature() e dht.readHumidity() respetivamente. As variáveis temperature e humidity foram adicionadas automaticamente em thingProperties.h e os seus valores serão enviados para a cloud a cada 10 segundos.
A secção seguinte do código imprime os valores no LCD I2C.
lcd.setCursor(0, 0);
lcd.print("Temperature:");
lcd.setCursor(13, 0);
lcd.print(temperature);
lcd.print("\xDf" "C");
lcd.setCursor(0, 1);
lcd.print("Humidity:");
lcd.setCursor(10, 1);
lcd.print(humidity);
lcd.print("%");
De seguida, a saída analógica do sensor de humidade do solo é lida com analogRead(). Este valor é então escalado para 0 a 100 % de humidade. Para calibrar o sensor, podes imprimir os dados no Monitor Serial. O valor 833 corresponde ao valor que obtive ao segurar o sensor no ar e 469 quando o mergulhei num copo de água.
moistureSensorData = analogRead(SOILPIN);
//Serial.println(moistureSensorData);
soilMoistureContent = map(moistureSensorData, 883, 469, 0, 100);
soilMoistureContent = constrain(soilMoistureContent, 0, 100);
lcd.setCursor(0, 2);
lcd.print("Soil moisture:");
lcd.setCursor(15, 2);
lcd.print(soilMoistureContent, 0);
lcd.print("% ");
Na última secção do código, verifico se o conteúdo de humidade do solo está abaixo de 30 % e, se estiver, as plantas são regadas por um período definido. Adicionei um tempo mínimo de espera entre ciclos de rega para dar tempo ao solo de absorver a água.
if (soilMoistureContent <= 30 && millis() - previousMillis >= waitPeriod) {
digitalWrite(RELAYPIN, HIGH);
digitalWrite(LED_BUILTIN, HIGH);
delay(pumpPeriod);
digitalWrite(RELAYPIN, LOW);
digitalWrite(LED_BUILTIN, LOW);
previousMillis = millis();
}
Provavelmente terás de ajustar os parâmetros pumpPeriod e waitPeriod no topo do código para se adequarem à tua configuração.
Criar um painel
Depois de carregar o código, clica em GO TO IOT CLOUD. Agora clica em Dashboards no topo da página.

Quando estiveres nesta página, clica em create dashboard. Podes adicionar widgets ao teu painel para mostrar valores, gráficos, etc.

Clica no widget e seleciona Link Property

Agora seleciona qual propriedade queres mostrar.

Depois de adicionares vários widgets, o teu painel deverá ficar parecido com isto:

Conclusão
Neste artigo, mostrei-te como criar um sistema simples de rega automática com o MKR1000 e a Arduino IoT Cloud. Espero que este tutorial tenha sido útil e te inspire.
Na configuração atual, a Arduino IoT Cloud é usada apenas para mostrar e registar os dados dos sensores. Portanto, também poderias fazer isto como um sistema autónomo com um Arduino Uno ou similar. Pessoalmente, só queria experimentar a Arduino IoT Cloud e ver quão difícil era configurar. Foi bem mais fácil do que pensei e certamente vou usá-la em outros projetos no futuro.
Tenho usado este sistema por pouco tempo e parece estar a funcionar muito bem. Voltarei a dar notícias daqui a um mês, depois de o testar por mais tempo.
Uma coisa que talvez adicione no futuro é um interruptor de nível de água para o depósito e ligá-lo a um sistema de alertas por email. Tenho receio de me esquecer de reabastecer o depósito agora que não preciso de me preocupar em regar as plantas…
Se tiveres alguma dúvida ou sugestão, deixa um comentário abaixo.


