Skip to Content

Sistema automático de rega de plantas com Arduino IoT Cloud

Sistema automático de rega de plantas com Arduino IoT Cloud

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

arduino-mkr1000Arduino MKR1000 × 1 Amazon
arduino-mkr-relay-proto-shieldArduino MKR Relay Proto Shield × 1 Arduino
Capacitive soil moisture sensor × 1 Amazon
AM2301-temperature-humidity-sensorAM2301A (DHT21) temperature and humidity sensor × 1 Amazon
LCD20×4 character I2C LCD × 1 Amazon
Mini submersible pump × 1 Amazon
PVC tube 6 x 9 mm 1 m Amazon
IKEA container with lid × 1 IKEA
Project box 120 x 80 x 50 mm × 1 Amazon

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

arduino-web-editorArduino Web Editor
arduino-iot-cloudArduino IoT Cloud

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.

Caixa do projeto 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.

3d printed adapter plate
Placa adaptadora impressa em 3D

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.

nail polish
Cobri as bordas do sensor e a eletrónica com verniz transparente para unhas

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.

longer cable
Novo cabo para o sensor de humidade do solo

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é

pump
Mini bomba submersível

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.

arduino mkr relay proto shield
Arduino MKR Relay Proto Shield (Fonte: Arduino.cc)

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

temperature and humidity sensor
Sensor de temperatura e humidade montado na lateral da caixa do projeto

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.

temperature and humidity sensor connection
Os fios são passados pela parte traseira do sensor

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.

LCD I2C 20×4 caracteres 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.

i2c lcd back
O LCD é fixado com quatro parafusos através dos orifícios de montagem na PCB

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.

wago lever nuts
Conectores de alavanca Wago

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:

tube with plug holes and holders
Suportes e tampa impressos em 3D

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

Tubo de água instalado

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.

arduino create dashboard
Painel do Arduino Create

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.

getting started arduino create agent 1
Descarrega e instala o plugin Arduino Create

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.

getting started arduino create agent 4
Deverás ver esta página após instalar o plugin Arduino Create

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.

Seleciona o Arduino MKR1000

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

getting started mkr1000 iot configuration
Assistente de configuração IoT MKR1000

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.

getting started mkr1000 iot configuration 1
Liga o MKR1000 ao computador com um cabo USB e espera que a placa fique disponível

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.

getting started mkr1000 iot configuration name
Introduz um nome para a tua placa

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.

Configuração do chip de criptografia

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.

Carrega o sketch de exemplo após inserir os dados wifi na aba Secret

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

Clica no caractere LED ou escreve ON ou OFF e clica em ‘SEND’

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.

arduino iot cloud icon
Painel do Arduino Create com o ícone Arduino IoT Cloud destacado

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.

create new thing
Página Your Things

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).

Introduz um nome para o teu Thing e seleciona um dispositivo para associar

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

add property
Página de propriedades do 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.

add new property window
Captura de ecrã da propriedade Temperatura

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.

automatic indoor garden thing properties
Aba de propriedades

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.

Editor com sketch gerado 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.

thingproperties
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.

Aba Secret

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.

arduino iot cloud dashboards
Painéis da Arduino IoT Cloud

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

arduino iot cloud dashboard add widget
Adicionar um widget de Valor

Clica no widget e seleciona Link Property

arduino iot cloud value
Clica em Link Property

Agora seleciona qual propriedade queres mostrar.

Ligar uma propriedade do nosso Thing

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

Painel com valores e gráficos

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.