O sistema de alerta por SMS de baixa umidade é essencial para qualquer casa que possui plantas. Em várias casas encontrarmos diversas plantas no jardim. Essas plantas necessitam diariamente de nutrientes e água para o seu crescimento. A água é um elemento essencial para o seu crescimento, porém, corre o risco de a pessoa esquecer e, consequentemente, a planta irá morrer. Vamos resolver isso hoje com o Projeto Sensor de Umidade do Solo Arduino.
Dessa forma, para evitar que a planta morra por falta de água, devemos criar um mecanismo para alertar o usuário, quando o solo da planta estiver com baixa umidade.
Assim, esse artigo tem a finalidade de apresentar como criar um sistema de alerta por mensagem no celular, para sinalizar ao usuário que a planta está com baixa umidade, conforme apresentado na Figura 1.
Logo, por meio desse projeto, você aprenderá os seguintes pontos:
- Como desenvolver um sistema de alerta por mensagem com o Módulo SIM800L;
- Como funciona o Módulo SIM800L;
- Funcionamento do Sensor de Umidade Resistivo;
Para você montar o circuito e alcançar esses objetivos, serão necessários alguns componentes eletrônicos.
Itens Necessários para o Projeto Sensor de Umidade do Solo Arduino:
- Vaso com uma Planta (Pode ser da sua mãe!);
- Sensor de Umidade do Solo;
- Módulo SIM800L;
- Diodo 1N4007;
- Arduino UNO;
- Jumpers.
Portanto, de acordo com a lista apresenta iremos abordar cada etapa do projeto e todos os tópicos de aprendizado serão apresentados.
Sistema de Alerta SMS de Umidade da Planta
O Sistema de Alerta por SMS consiste em um projeto que irá monitorar a umidade através de um sensor de umidade do solo. Quando a umidade estiver abaixo do valor de 60%, o sistema deverá enviar um SMS para o celular do usuário. Dessa forma, o usuário irá receber o alerta e colocar água em sua planta.
Após a umidade ultrapassar o valor de 60%, o sistema enviará uma nova mensagem para informar que a umidade está normal.
Dessa forma, foi desenvolvido o seguinte circuito com o objetivo de solucionar esse problema.
O circuito apresentado na Figura 2 é relativamente simples. Conforme é possível observar, temos o Arduino UNO, que será responsável por fazer a leitura do sinal do sensor de umidade e enviar o SMS através do módulo SIM800L.
Primeiramente, devemos espetar o sensor no solo e em seguida, o sistema iniciará a leitura da umidade do solo. O valor lido será comparado com um valor padrão de 60%, ou seja, se o valor for menor que 60%, o usuário será alertado.
Assim, o sistema enviará a mensagem “Umidade Baixa!” para o celular registrado pelo usuário. Portanto, ele receberá a notificação em seu celular e deverá colocar água em sua planta.
Após colocar água e a umidade ultrapassar o valor de 60%, o sistema irá enviar a mensagem “Umidade Normal”, para informar que a umidade está acima dos 60%.
Em seguida, explicaremos a lógica completa para você desenvolver o seu próprio sistema de alerta SMS de baixa umidade para suas plantas.
O Programa de Leitura de Umidade e Envio de Alerta SMS
Inicialmente, disponibilizamos o código completo do Projeto Sensor de Umidade do Solo Arduino com Alerta por SMS. Em seguida, explicaremos o passo a passo da lógica desenvolvida nesse sistema.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#include <SoftwareSerial.h> SoftwareSerial chip(10, 11); String SeuNumero = "+55SEUNUMERO"; //Digite seu celular com +55, o DDD da sua cidade e o seu numero com o 9 na frente #define sensor A0 bool BaixaUmid = 0, AltaUmid = 0; byte UmidPercent = 0, umidade = 0, ValorAnterior = 0; int ValorAnalog = 0; void setup() { Serial.begin(9600); Serial.println("Inicializando Sistema..."); delay(5000); chip.begin(9600); delay(1000); pinMode(sensor, INPUT); //Configura o Pino do Sensor como Entrada ValorAnterior = analogRead(sensor); //Captura um primeiro valor de referencia inicial para a variavel ValorAnterior } void loop() { //Le o valor do pino A0 do sensor ValorAnalog = analogRead(sensor); //Leitura do Valor Analógico do Sensor UmidPercent = map(ValorAnalog, 0, 1023, 0, 100); //Mapeando o valor entre 0 e 100 umidade = 100 - UmidPercent; if ( (umidade > (ValorAnterior) + 1) || (umidade < (ValorAnterior) - 1)) { if (umidade < 60 && BaixaUmid == 0) { BaixaUmid = 1; AltaUmid = 0; MensUmidBaixa(); } if (umidade >= 60 && AltaUmid == 0) { MensUmidNormal(); AltaUmid = 1; BaixaUmid = 0; } ValorAnterior = umidade; } } void MensUmidBaixa() //Funcao para enviar mensagem de alerta Umidade Baixa { chip.println("AT+CMGF=1"); delay(1000); chip.println("AT+CMGS=\"" + SeuNumero + "\"\r"); delay(1000); String SMS = "Baixa Umidade"; chip.println(SMS); delay(100); chip.println((char)26); delay(1000); } void MensUmidNormal()//Funcao para enviar mensagem de alerta Umidade Normal { chip.println("AT+CMGF=1"); delay(1000); chip.println("AT+CMGS=\"" + SeuNumero + "\"\r"); delay(1000); String SMS = "Umidade Normal"; chip.println(SMS); delay(100); chip.println((char)26); delay(1000); } |
Primeiramente, a biblioteca SoftwareSerial foi declarada e os pinos Tx e Rx foram definidos, conforme apresentado na porção de código a seguir.
1 2 3 |
#include <SoftwareSerial.h> SoftwareSerial chip(10, 11); |
Posteriormente, devemos inserir o número do celular que será responsável por receber as mensagens de alerta, conforme apresentado a seguir.
1 |
String SeuNumero = "+55SEUNUMERO"; //Digite seu celular com +55, o DDD da sua cidade e o seu numero com o 9 na frente |
Na hora de inserir o número do celular, é importante ficar atento à forma correta. Primeiramente, insira o código do Brazil (+55), depois insira o DDD da sua cidade e, por fim, insira o número do seu celular com o número 9 na frente.
Após isto, foi definido o pino do sensor e foram declaradas as variáveis do programa.
1 2 3 4 5 6 7 |
#define sensor A0 bool BaixaUmid = 0, AltaUmid = 0; byte UmidPercent = 0, umidade = 0, ValorAnterior = 0; int ValorAnalog = 0; |
Em seguida, foram realizadas as configurações do projeto na função setup().
Função Setup – Configurações Iniciais
Inicialmente, foi realizada a inicialização da comunicação serial e comunicação do objeto chip, que foi criado a partir da biblioteca SoftwareSerial.
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { Serial.begin(9600); Serial.println("Inicializando Sistema..."); delay(5000); chip.begin(9600); delay(1000); pinMode(sensor, INPUT); //Configura o Pino do Sensor como Entrada ValorAnterior = analogRead(sensor); //Captura um primeiro valor de referencia inicial para a variavel ValorAnterior } |
Por fim, o pino do sensor é configurado como entrada e é realizada uma primeira leitura do valor do sensor. Esse valor será utilizado como valor de referencia inicial para a variável ValorAnterior.
Em seguida, o fluxo entrará na função loop.
Função Loop – Execução da Lógica Principal
Nesta função será executada toda a lógica principal do nosso projeto. A seguir, apresentaremos a estrutura do código na função loop.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
void loop() { //Le o valor do pino A0 do sensor ValorAnalog = analogRead(sensor); //Leitura do Valor Analogico do Sensor UmidPercent = map(ValorAnalog, 0, 1023, 0, 100); //Mapeando o valor entre 0 e 100 umidade = 100 - UmidPercent; if ( (umidade > (ValorAnterior) + 1) || (umidade < (ValorAnterior) - 1)) { if (umidade < 60 && BaixaUmid == 0) { BaixaUmid = 1; AltaUmid = 0; MensUmidBaixa(); } if (umidade >= 60 && AltaUmid == 0) { MensUmidNormal(); AltaUmid = 1; BaixaUmid = 0; } ValorAnterior = umidade; } } |
Primeiramente, é realizada a leitura do valor analógico do sensor. O sensor de umidade varia o sinal de saída com base no nível de umidade do solo. De acordo com essa resistência, haverá uma variação de tensão na saída do pino do sensor e esse sinal será lido pela linha de código a seguir.
1 2 |
//Le o valor do pino A0 do sensor ValorAnalog = analogRead(sensor); //Leitura do Valor Analógico do Sensor |
Em seguida, o valor lido é mapeado em uma escala de 0% a 100%, conforme é apresentado no código abaixo.
1 |
UmidPercent = map(ValorAnalog, 0, 1023, 0, 100); //Mapeando o valor entre 0 e 100 |
Dessa forma, o valor 0 representa uma umidade alta e o valor 100 representa baixa umidade. Entretanto, para facilitar a compreensão, foi realizada uma inversão desses valores, de modo que o 0 represente baixa umidade e o 100 representará alto percentual de umidade. Isto foi realizado através da linha de código a seguir.
1 |
umidade = 100 - UmidPercent; |
Finalmente, o sistema entrará na condição para testar se o valor lido pelo sensor está acima ou abaixo do percentual de 60% de umidade, conforme apresentado a seguir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
if ( (umidade > (ValorAnterior) + 1) || (umidade < (ValorAnterior) - 1)) { if (umidade < 60 && BaixaUmid == 0) { BaixaUmid = 1; AltaUmid = 0; MensUmidBaixa(); } if (umidade >= 60 && AltaUmid == 0) { MensUmidNormal(); AltaUmid = 1; BaixaUmid = 0; } ValorAnterior = umidade; } |
Para que estas duas condições sejam verificadas, é preciso que a condição abaixo seja verdadeira.
1 |
if ( (umidade > (ValorAnterior) + 1) || (umidade < (ValorAnterior) - 1)) |
O fluxo de código só passará nessa condição, se o valor da umidade variar em uma unidade para cima ou para baixo em relação ao valor anterior. Isto evita que o sistema realize a verificação de forma contínua. Portanto, caso o valor seja alterado em relação ao valor anterior em no mínimo uma unidade, serão executadas as seguintes condições internas.
Verificação do valor de umidade do alerta GSM de baixa umidade
Dessa forma, se o valor da umidade for menor que 60%, o sistema entrará na primeira condição e enviará um alerta de baixa umidade para o usuário. Essa condição pode ser vista no bloco de código abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
if (umidade < 60 && BaixaUmid == 0) { BaixaUmid = 1; AltaUmid = 0; MensUmidBaixa(); } if (umidade >= 60 && AltaUmid == 0) { MensUmidNormal(); AltaUmid = 1; BaixaUmid = 0; } |
Após entrar na condição, o sistema atribuirá o valor 1 á variável BaixaUmid. Esta variável é utilizada para garantir que o fluxo de código entre apenas uma única vez na condição, quando a umidade está abaixo de 60%. Isto serve para evitar que o sistema entre continuamente na condição e envie inúmeras mensagens para o usuário e consuma os créditos do celular.
Em seguida, atribuirá o valor 0 à variável AltaUmid. Isto servirá para garantir que o fluxo de código possa entrar na condição de umidade acima de 60%. Finalmente, o sistema executará a função MensUmidBaixa().
1 2 3 4 5 6 |
if (umidade >= 60 && AltaUmid == 0) { MensUmidNormal(); AltaUmid = 1; BaixaUmid = 0; } |
A partir dessa mensagem, o usuário irá receber a mensagem de Umidade Baixa em seu celular, conforme apresentado na figura abaixo.
Após o usuário receber a mensagem, colocar água na planta e o sistema verificar que a umidade ultrapassou 60%, o usuário receberá uma mensagem de Umidade Normal, conforme apresentada na figura abaixo.
Finalmente, o sistema atribui o valor da variável umidade para a variável ValorAnterior a fim de atualizar e usá-la como referência para entrar na condição de testar os valores de umidade.
1 |
ValorAnterior = umidade; |
Todas essas mensagens são enviadas através de comandos implementados nas funções MensUmidBaixa() e MensUmidNormal(). A seguir, explicaremos o processo de implementação dessas duas funções.
O Módulo SIM800L e suas funções de envio de SMS
O Módulo SIM800L é o coração do Projeto Sensor de Umidade do Solo Arduino. Ele é o responsável por enviar o SMS para o celular do usuário. Porém, ele possui uma linguagem de programação própria, ou seja, ele utiliza o que conhecemos como comandos AT. A Figura 3 apresenta o módulo SIM800L.
O termo AT é uma abreviação da palavra ATtention. Os comandos AT são instruções utilizadas para controlar um modem. Nesses comandos, toda e qualquer instrução de controle começará com o termo AT e entre as diversas tecnologias que suportam esses comandos, destacamos a tecnologia GSM/GPRS, que é a tecnologia utilizada em nosso projeto.
Portanto, baseado nessas instruções, iremos apresentar o passo a passo da implementação das funções de envio das mensagens.
Implementação da função de Envio de SMS
A implementação da função de envio de SMS consiste em enviar comandos AT para o seu módulo SIM800L. Para isso, foi necessário criar uma comunicação serial entre o Arduino e o Módulo SIM800L.
A seguir, explicarei a função de envio de mensagem de umidade baixa. O processo de implementação é o mesmo para outra função. Apenas alteramos a mensagem enviada.
1 2 3 4 5 6 7 8 9 10 11 12 |
void MensUmidBaixa() //Funcao para enviar mensagem de alerta Umidade Baixa { chip.println("AT+CMGF=1"); delay(1000); chip.println("AT+CMGS=\"" + SeuNumero + "\"\r"); delay(1000); String SMS = "Baixa Umidade"; chip.println(SMS); delay(100); chip.println((char)26); delay(1000); } |
Conforme é possível observar na função MensUmidBaixa(), foram implementados diversos comandos AT. Cada comando tem sua finalidade e isso será explicado agora.
O Envio do Texto SMS
Todos os comandos são enviados pela serial que criamos através da biblioteca SoftwareSerial. O primeiro comando enviado é o AT+CMGF=1.
1 2 |
chip.println("AT+CMGF=1"); delay(1000); |
Conforme citado anteriormente, é obrigatório em qualquer comando colocar o prefixo AT na frente. O termo CMGF = 1 determina o modo de operação de envio de mensagens. Quando utiliza-se o valor 1, o módulo é configurado para enviar mensagens em formato de texto.
Após a execução desse comando, aguarde o tempo de 1 segundo para finalizar a configuração. Em seguida, é necessário enviar o próximo comando e, mais uma vez, aguarda-se 1 segundo, conforme apresentado no bloco de código abaixo.
1 2 |
chip.println("AT+CMGS=\"" + SeuNumero + "\"\r"); delay(1000); |
Esse comando é utilizado para enviar um SMS para um número GSM. Conforme é possível observar, a estrutura da mensagem que será impressa carrega a string SeuNumero. Essa string possui o número de telefone cadastrado para receber a mensagem.
Após a string número, temos um caractere de retorno “\r”. Finalmente, o sistema aguardará 1 segundo, carregará a mensagem “Baixa Umidade” na string SMS e executará um delay de 100 ms, conforme apresentado no bloco de código a seguir.
1 2 3 4 5 6 |
delay(1000); String SMS = "Baixa Umidade"; chip.println(SMS); delay(100); chip.println((char)26); delay(1000); |
Após o tempo de 100 ms, o sistema deve enviar o comando char(26), que é referente ao comando CTRL + Z. Ele é utilizado para indicar o fim de mensagem. Dessa forma, teremos o envio completo de uma mensagem para o usuário.
Conclusão
Portanto, através do Projeto Sensor de Umidade do Solo Arduino com Alerta por SMS foi possível compreender passo a passo como funciona o processo de uso do sensor de umidade resistivo para leitura de umidade do solo, verificação do nível de umidade e, finalmente, enviar um texto SMS para o usuário cadastrado através módulo SIM800L.
Além desse projeto, você pode alterar o código e desenvolver novas funcionalidade. Sugerimos que você insira um LCD 16×2 e adicione um menu de configuração para cadastro do telefone de usuário no sistema. Portanto, por meio desse mecanismo, o operador poderá inserir ou apagar qualquer usuário cadastrado.
Dessa forma, o sistema ficará dinâmico e independente de um único número cadastrado.
Para que você compreenda esse processo de criação de menu, sugerimos a leitura de outros artigos em nosso blog e que te ajudam a compreender a respeito dessas funcionalidades.
Opa Diogo,
meu môdulo GSM SIM800L parou de funcionar sem mais nem menos, tem alguma dica, estava funcionando perfeitamente.
Oi, Alex! É importante, primeiramente, você verificar o circuito. Verifique a alimentação e realize alguns testes.
Primeiro, faça teste via comando AT pra verificar se o seu dispositivo está respondendo.
Verifique a alimentação e a montagem do circuito também. Além disso, nesse próprio artigo eu deixei um circuito básico para você realizar a montagem do projeto. Você já verificou como eu montei?
É difícil oferecer uma resposta para resolver o seu problema, pois é preciso avaliar circuito e hardware.
Mas faça a avaliação por partes. Primeiro faça testes de comando AT e verifique se o seu módulo está respondendo. Isso já será um bom sinal que o seu dispositivo está funcionando e respondendo aos comandos.
Forte abraço da Equipe UsinaInfo.
Olá meu sensor não está fazendo a leitura do solo estou usando as porta A0, GND E VCC sabe me dizer qual o motivo de não está fazendo a leitura do solo ou tenho que fazer alguma modificação na programação
Olá Bruno! A princípio, pelo que vi não é necessário nenhuma alteração no código, além do número os detalhes de uso do GSM, recomendo realizar o tese apenas do sensor de umidade assim como no projeto a seguir, caso suspeite que o seu sensor poça estar com algum problema: https://www.usinainfo.com.br/blog/sensor-de-umidade-de-solo/
Olá Matheus preciso de uma ajuda sua por favor, eu estou usando seu código não editei nada. No Modulo sim800l estou usando o Diodo na porta VCC o RXD está conectado na porta 11 do Arduino e TXD está na porta 10 do Arduino e o GND está no negativo da protoboard, na parte de SENSOR o VCC dele está conectado no positivo da protoboard junto do GND no negativo e o A0 está na porta Analog do Arduino, a protoboard está todo alimentada com o 5V do Arduino. Quando eu executo o programa era para ir logo fazendo a leitura do solo correto pra depois manda o SMS para um usuário cadastrado! o problema está na leitura do sensor pois foi feito teste tanto com sensor e com modulo e está tudo ok quando o código e lido ele só aparece isto (Inicializando Sistema…) e fica nisso não desenvolver para função principal. Será que pode da uma ajuda nesse minha duvida pois tentei de tudo e nada. Desde já agradeço.
e de qnts Volts seria a alimentação ? 5v serve ?
Boa Tarde Rafael! A alimentação do SIM800L é feita através de fontes de 3.7V a 4.2V e com corrente máxima de aproximadamente 2A.
e quanto ao problema da Anatel bloquear o Modulo SIM 800L, tem alguma resolução ? ou algo pra prevenir o bloqueio? estou fazendo um projeto semelhante de TCC e queria saber sobre essas coisas
Bom Dia Rafael! Infelizmente até o momento não consegui encontrar nenhuma resolução para este problema.
poderiam me enviar uma foto ou video da parte de cima do circuito no meu email pfvr? pois ficou meio confuso pra mim
Bom Dia Anderson! Para visualizar de uma maneira diferente o projeto, recomendo que verifique o esquema de ligação, mesmo que as conexões pareçam não ser as mesmas que as da foto, ele é utilizado como base para a instalação de todos os dispositivos.
preciso de um chip com créditos para enviar a mensagem ?
Bom Dia Gilberto! Sim, o projeto é desenvolvido com microcontrolador, mas mantem-se todos os padrões de uso das operadoras, é necessário ter disponibilidade de crédito tanto para realizar ligações quanto enviar mensagens.
Boa tarde !! estou montando um projeto parecido e estou com dificuldade na parte de montar o circuito, acima mostra um circuito diferente do projeto em execução, poderia me da uma ajuda quais porta no Arduino foi usada, e na questão do chip no código tem que por o numero que vai está no modulo (chip) ou de outro celular
Olá Renato! O sistema de funcionamento é o mesmo, a única diferença é que o produto do esquema possui um módulo integrado ao sensor e o utilizado no projeto possui o sensor conectado a um módulo externo. Quanto ao número que vai no código, este deve ser o número que irá receber as mensagens, por exemplo.
MUITO OBRIGADO
Boa tarde, pode me tira mais uma duvida na linha de código O “Envio do Texto SMS” está dando o seguinte erro (“exit status 1
invalid operands of types ‘const char*’ and ‘const char [3]’ to binary ‘operator+”).
Onde estou errado
Olá você pode me da uma ajuda quando eu vou enviar o sms no final do processo ele não enviar deve ser nos comando chip.println((char)26);
delay(1000)
você pode me da uma diga eu vir que seu código não esta fora do padrão de proposito kkk mais eu entendi só não essa parte no final, só um diga pode ser
Bom dia, parabéns pelo trabalho, minha dúvida é se é possível uma adaptação desse código para, por exemplo, alterar o sensor de umidade do solo por sensor de temperatura e umidade como o DHT 11.
Olá Pedro! Algumas alterações serão necessárias na programação, porém é possível adaptar outro sensor sem problema.