Professional Documents
Culture Documents
Volume 1
ArduFarmBot
Automatizando uma horta de tomates com
a ajuda da Internet das Coisas - IoT
ArduFarmBot
Automatizando uma horta de tomates com a ajuda
da Internet das Coisas -IoT
2
ArduFarmBot: Automatizando uma horta de tomates com a ajuda da Internet das Coisas - IoT
ndice
O que vemos hoje em dia no nada diferente do que sonhvamos ter quando crianas -
as coisas se comunicam entre si e interagem com seu dono. E isso j tem um nome:
IoT Internet of Things, a Internet das Coisas!
claro que voc no pode predizer o futuro mas pode ajudar a constru-lo.
Para aqueles que se interessam por participar ou ajudar a construir essa realidade que
estamos lanando estes tutoriais.
Mas cuidado com os hackers ... eles podero invadir a sua geladeira.
Prefcio - ArduFarmBot
...
Afagar a terra
Conhecer os desejos da terra
Cio da terra, propcia estao
E fecundar o cho
Muitos milnios depois essa coisa de plantar e colher passou a ser um hobby para o
comum dos mortais.
Para muitos pode ser uma tarefa impossvel! Quanta gua, quanto calor devo dar?
Quanto tempo para colher? Est crescendo como deveria?
Internet das Coisas vem para te ajudar se voc quiser ajuda, claro.
Foi pensando nisso que ns, mortais comuns interessados por eletrnica e por uma boa
macarronada ao sugo, resolvemos desenvolver este projeto de automatizar uma horta de
tomates.
Esperamos que o ArduFarmBot possa trazer muitos frutos para vocs. Literalmente!
O livro
O livro usa o ArduFarmBot como base para o aprendizado de como se trabalhar (HW e
SW) com displays (LCD e OLED), LEDs e botes. Como acionar rels e ler sensores tais
como: DHT22 (temperatura e umidade relativa do ar), DS18B20 (temperatura do solo),
YL69 (umidade do solo) e LDR (luminosidade).
7
ArduFarmBot: Automatizando uma horta de tomates com a ajuda da Internet das Coisas - IoT
Introduo
Atuadores:
o Rel para controle de bomba
o Rel para controlo da lmpada
Sinalizao (dados digitais):
o Visual e sonoro para indicao de status / erro
o Visual de Estado da bomba
o Visual para o estado da lmpada
Display dos dados:
o Todos os dados analgicos e digitais devem estar disponveis para
avaliao instantnea
Armazenamento de dados:
o Dados histricos deve ser de armazenamento remotamente na internet e
opcionalmente tambm localmente (EEPROM do Arduino)
https://youtu.be/SwgKzfAvWlI
https://youtu.be/fcRA6g8ZGS8
10
ArduFarmBot: Automatizando uma horta de tomates com a ajuda da Internet das Coisas - IoT
2X Soil Moisture Sensor ($1.99) (Opcional, pode ser do tipo caseiro -DIY)
Caixa Plstica
O primeiro sensor a ser testado e instalado o DHT 22, um sensor digital de umidade
relativa do ar e temperatura. Ele usa internamente um sensor capacitivo de umidade e
um termistor para medir o ar circundante, gerando um sinal digital em sua sada de
dados.
https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf,
O DHT22 tem 4 pinos (de frente para o sensor, o pino 1 o mais esquerda):
1. VCC (3 a 5V)
2. Sada de dados
3. No conectado
4. GND (Terra)
Uma vez que normalmente voc usar o sensor em distncias inferiores a 20m, um
resistor de 10K deve ser conectado entre os pinos de dados e o VCC. O pino de sada
deve ser conectado ao pino D5 do Arduino como mostrado no diagrama anterior.
Uma vez que o sensor instalado fisicamente no Arduino, baixe a biblioteca DHT a
partir do repositrio de programas da Adaffruit
https://github.com/adafruit/DHT-sensor-library
Uma vez que voc recarregue o IDE, a biblioteca para o sensor de DHT dever aparecer
como instalada.
Execute o cdigo abaixo para verificar que tudo esteja funcionando OK:
B. Sensor de luminosidade
Com o DHT funcionando, hora de instalar e testar o sensor de luminosidade. Para isso,
podemos usar um simples LDR (Resistor varivel com luz). Basicamente, o que se deve
fazer criar um divisor de tenso, onde um dos resistores o LDR e o outro um fixo,
sendo o ponto mdio do divisor conectado a uma entrada analgica do Arduino. Desta
forma, uma vez variando-se a luminosidade sobre o sensor, sua resistncia variar
proporcionalmente e por conseguinte, a tenso no ponto mdio do divisor tambm
variar.
A funo getLumen (LDR_PIN) ler algumas vezes a sada do sensor (poderia ser de 3,
10 ou mais, voc decide o que melhor para o seu caso) calculando a mdia dessas
leituras (isso para diminuir o risco que uma nica leitura seja na verdade um rudo).
Alm disso, uma vez que a sada do conversor analgico digital (ADC) interno do
Arduino ser um nmero de 0 a 1023, deveremos mapear esses valores, a fim de obter
os seguintes resultados como porcentagens:
Um sensor para testar a umidade do solo (ou higrmetro) muito simples. Ele possui o
mesmo princpio de funcionamento que o sensor de luminosidade. Um divisor de tenso
ser usado como ponto de entrada de uma das portas analgicas do Arduino, mas em
vez de um resistor que varie com luz, usaremos um que varie com a umidade do solo. O
circuito bsico muito simples e pode ser visto abaixo.
A seguir um cdigo de teste simples, baseado no post How to: Soil Moisture
Measurement? (http://forum.arduino.cc/index.php?topic=37975.0)
Agora que todas as rotinas para os sensores esto prontas e testadas individualmente,
criaremos uma funo especfica onde todos os sensores sero lidos ao mesmo tempo:
Procure fazer alguns testes com os sensores, como cobrir o LDR com um pano ou a mo,
colocar o dedo diretamente no DHT, etc., como variam o range os dados, utilizando-se
do Monitor Serial.
https://github.com/Mjrovai/ArduFarmBot/tree/master/Sensors_Setup_
and_Test
claro que nem sempre ser possvel usar o monitor serial para observar a leitura de
nossos sensores. Assim, para monitorizao local, ser adicionado ao projeto um
mdulo LCD de 4 linhas e 20 caracteres cuja comunicao se d via protocolo I2C. Este
mdulo permite a configurao de contraste atravs de um potencimetro instalado em
sua parte traseira.
Para comunicao serial do tipo I2C com o Arduino, o LCD possui 4 pinos:
O pino SDA ser ligado em nosso caso a entrada A4 do Arduino e o pino SCL ao A5,
como mostrado no diagrama acima.
Uma vez que os 4 fios so conectados, a prxima coisa a fazer baixar e instalar a
biblioteca I2C para o seu display LCD, a qual pode ser usada tanto para um display do
tipo 20 x 4 quanto para o 16 x 2 (2 linhas de 16 caracteres):
https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
Execute em seu Arduino o programa exemplo Hello World que vem includo com a
biblioteca, mudando o setup padro (16 2) para o nosso 20 x 4. O endereo default
0x27 funcionou bem em meu caso:
Se voc no tem certeza sobre o seu endereo I2C de seu LCD, uma
simples varredura em seu HW ir mostrar se existem dispositivos I2C
conectados, se esto funcionando corretamente e em qual seu endereo.
O cdigo para fazer o scanner pode ser encontrado aqui:
http://playground.arduino.cc/Main/I2cScanner
Scanning...
done
https://github.com/Mjrovai/ArduFarmBot/tree/master/Sensors_Setup_
and_Test_LCD/Sensors_Setup_and_Test_LCD.ino
At agora, pudemos obter os dados gerados pelos sensores e exibi-los no monitor serial
e no LCD. hora de fazer alguma coisa com esses dados. Vamos pensar sobre os
atuadores!
Como discutido na introduo, nosso objetivo final aqui cuidar de uma plantao de
tomate. Com os dados fornecidos por sensores, saberemos a temperatura e umidade do
ar, a luminosidade e o mais importante quo seco se encontra o solo onde est a
plantao. Com esses dados em mos, o nosso programa dever decidir se seria
necessrio irrigar a plantao, ligando uma bomba eltrica para bombear gua ou uma
lmpada eltrica para fornecer o calor necessrio para a cultura. Para isso, usaremos
pequenos Mdulos de %V para rels para a ativao da bomba e lmpada. O diagrama
do Mdulo de Rel pode ser visto abaixo.
Mdulos de rels podem apresentar vrias nomenclaturas para seus pinos de entrada,
tais como: G, V, S ou S, -, + ou In, Vcc, GND , etc.
Arduino 5V V ou + ou Vcc
Arduino GND G ou - ou GND
Arduino OUT S ou In (em nosso caso o Arduino OUT deve ser D10
para a bomba e D8 para lmpada)
Normalmente voc encontrar como sada, 3 pinos: NA (ou NO), Ref, e NF (ou
NC), que so: Normal Open ou Aberto, Referncia e Normal Closed ou Fechado .
Ns usaremos o par: NA e Ref (centro). No diagrama acima, NA o terminal para
conectar-se ao positivo da fonte de alimentao (12 ou 9VDC para Bomba e 127 ou
220VAC para a lmpada, conforme seu caso). O Ref ser conectado bomba ou da
lmpada, como mostrado na figura acima.
https://arduino-info.wikispaces.com/ArduinoPower
Juntamente com os rels, opcionalmente 2 LEDs podem ser utilizados para mostrar se
os rels esto ligados ou desligados:
B. Botes
Com base nas leituras dos sensores, um operador poderia decidir controlar
manualmente a bomba e/ou lmpada. Para isso, dois botes do tipo push-button sero
incorporados ao projeto. Eles vo trabalhar em um modo de alternncia (Toggle): Se
um atuador est ON, pressionando- se o boto, ele passa a OFF e vice-versa. A lgica
do boto ser normalmente fechada, o que significa que a entrada do Arduino estar
constantemente em HIGH (ser usado um resistor de pull-up interno do Arduino).
Pressionando-se o boto, um estado LOW ser aplicada ao pino do Arduino.
Da mesma maneira que fizemos com os sensores, toda vez que executemos o loop(),
uma funo readLocalCmd() ser executada. Esta funo ler o estado dos botes,
atualizando o status de variveis correspondentes aos atuadores (pumpSatus e
lampStatus).
https://www.arduino.cc/en/Tutorial/Debounce
No caso em que um boto pressionado, uma outra funo ser chamada: aplyCmd(), e
como o prprio nome diz, ela aplicar o comando correspondente, ligando ou
desligando os atuadores:
1. Ler sensores
2. Ler botes (comando local)
3. Atuar sobre Bomba / Lmpada
4. Exibir todos os dados
Esta leitura ir acontecer toda a vez que o programa execute o loop ().
O cdigo completo para testar a nossa Estao local pode ser baixado do repositrio de
arquivos:
https://github.com/Mjrovai/ArduFarmBot/tree/master/Ardufarmbot1_L
ocal_Station
Sabendo disso, podemos construir um sensor muito simples usando-se duas sondas
metlicas construdas com materiais simples tais com como parafusos ou pregos
comuns ligados a fios. Conforme descrito anteriormente no item 1.2, denominaremos a
resistncia medida entre estas duas pontas metlicas de R1, que a resistncia do
solo (no o melhor termo cientfico, mas est bem para o que necessitamos).
Vin = R2 / (R1 + R2) * VCC ou Vin / VCC = 10K / (R1 + 10K) * 100 [%]
Pelos valores reais medidos com o multmetro, podemos antecipar que os resultados
devem ser:
Seco: 13%
mido: 62%
Molhado: 85%
Devido a que mudamos a posio dos sensores na terra, o valor medido de R1 variar
um pouco, alm de que o VCC tambm no exatamente 5V, se observa que os valores
obtidos na prtica so ligeiramente diferentes do terico. Mas como o que realmente
importa o intervalo de variao e no o valor absoluto, o resultado pode ser
considerado como satisfatrio.
Como voc pode observar, ajustando R2 em 10K ohm funcionou bem, o que nos nos leva
a substituir o potencimetro por um resistor fixo de 10K ohm a ser instalado ao nosso
sensor de umidade de solo caseiro.
Outra coisa que se pode perceber durante os testes, que ao se fazerem as medies vo
se acumulando pequenos erro s leituras. Isto porque o sensor tambm se comportar
como um capacitor. Ao se energizar o sensor para uma nica captura de dados
precisamos esperar um tempo razovel, mesmo depois de cortar o fornecimento de
energia para que o mesmo possa se descarregar . Revertendo-se a corrente ajudar,
mas no ser o suficiente.
Com base nos resultados acima, conclumos que no deveremos tomar amostras com
uma frequncia menor que 10 min, por exemplo.
https://youtu.be/bLhwOoBBWZ8
Como pudemos ver na ltima etapa, precisaremos esperar tempos maiores entre as
medies do sensor de umidade, por exemplo: 10minutos. Isto est Ok para as nossas
necessidades automticas, mas para a operao manual no vamos querer esperar
dezenas de minutos olhando para o ArduFarmBot para saber se um valor medido pelo
sensor mudou. Para solucionar o problema, introduziremos um terceiro boto de
controle em nosso projeto, o qual ser usado para exibir os dados reais e instantneos
dos sensores a qualquer momento, independente das programaes de leituras
automticas.
Para o Push-Button, usaremos o pino digital D17 (o mesmo que est compartilhado
com a entrada analgica A3). Introduziremos tambm um LED de aviso (o amarelo na
foto) conectada ao pino 13. Este LED acender toda a vez em que os sensores esto
sendo atualizados.
O nmero de amostras de cada ciclo tambm ser definido por uma varivel especfica:
numSamplesSMS. Em princpio apenas uma leitura suficiente, levando-se em
considerao que as leituras que fazemos em um curto espao de tempo introduziro
erros devido ao efeito de capacitncia. Se voc comear a ver erros na leitura, talvez
sejam necessrias tomar amostras extras.
int soilMoist;
int soilMoistAlert = 0;
int DRY_SOIL = 30;
int WET_SOIL = 60;
int numSM = 1; defines number of moisture sensors that are connected
int numSamplesSMS = 1; defines number of samples of each reading cycle
Umidade do solo:
Temperatura:
Luminosidade:
Voc dever ter em mente que cada tipo de semente possui uma faixa ideal de
temperatura na qual crescer mais rapidamente. Por exemplo para os tomates, o tempo
mnimo para as sementes germinarem ser de 6 dias em temperaturas entre 20oC e
25C, aumentando-se o nmero de dias para temperaturas superiores ou inferiores a
esta faixa:
Temperatura: [oC] 10 15 20 25 30 35
Voc poder verificar mais informaes sobre esta relao (temp / dias
de germinao) no link: http://tomclothier.hort.net/page11.html
int tempDHT;
int HOT_TEMP = 25;
int COLD_TEMP = 15;
lumen int;
int DARK_LIGHT = 40;
int soilMoist;
int DRY_SOIL = 40;
int WET_SOIL = 60;
O Cdigo:
Criaremos uma nova funo, que baseado na leitura dos sensores, lidar
automaticamente com os atuadores (ligar / desligar a bomba e lmpada):
AutoControlPlantation(). Esta funo, mostrada abaixo, ser chamada em cada ciclo de
leituras dos sensores:
Controle de bomba
Controle da lmpada
Esta varivel ser utilizada para evitar um falso verdadeiro. Ento por exemplo, se
tivermos um verdadeiro no resultado do teste: soilMoist <DRY_SOIL e que no seja
durante a noite (lumen> DARK_LIGHT), no ligaremos imediatamente na bomba, mas
ao invs disso, esperaremos o prximo ciclo verificando se o solo est muito seco . Se
o resultado for um sim (obtendo um verdadeiro como resposta duas vezes), somente
a a funo turnPumpOn() ser chamada:
Note que tambm mudaremos a funo que exibe dados no LCD criando um 3o. estado:
https://github.com/Mjrovai/ArduFarmBot/tree/master/ArduFarmBot1_
Local_Control_Station_Final
Uma vez que j contamos com nosso prottipo funcional, vamos monta-lo de uma forma
mais definitiva, utilizando-se para isto um Shield para o Arduino Nano e uma caixa
plstica, o que ajudar nos testes de campo. A grande vantagem de se usar um shield
para o Nano, que os componentes ficaro melhor montados reduzindo-se os maus
contatos e rudos.
1. Faa 4 furos na caixa de plstico para a instalao do LCD (eu o deixei para
dentro da caixa).
2. Faa furos laterais na caixa para que que voc possa acessar os sensores; ter
acesso ao Nano (seja para a fonte de alimentao externa ou atualizaes de
SW) e ligar os atuadores (Bomba / Lmpada) aos rels.
3. Para os botes de controle, usamos um teclado do tipo membrana de 4 teclas 1
4 Key Matrix Membrane Switch.
4. Voc poder decidir a melhor maneira de fixar os componentes caixa. Aqui
foram usados fixadores removvel da 3M para facilitar a instalao (veja as fotos).
Para os primeiros testes reais, liguei uma bomba eltrica que tinha disponvel (no
projeto final a bomba ser uma pequena bomba DC de 9V). Este primeiro teste s para
ver como o projeto vai funcionar, ento no se preocupam com as gotas que voc vai ver
no vdeo).
https://youtu.be/kIQePtzSjP0
https://youtu.be/HBhg5NtLcs0
Agora s torcer para que tudo de certo e possamos comer uma deliciosa salada no final
do projeto!!!! Salut!
48
ArduFarmBot: Automatizando uma horta de tomates com a ajuda da Internet das Coisas - IoT
Em nosso caso, construiremos um divisor de tenso para ser usado como um conversor de
nvel de tenso.
Note que estamos usando o ESP8266 conectado aos pinos 2 (Tx) e 3 (Rx) do Nano,
utilizando-se da biblioteca SoftSerial. Se voc quiser livrar os pinos digitais, poder
alternadamente usar os pinos 0 e 1 do Nano (Serial por HW). Apenas lembre-se que
voc deve deslig-los ao enviar o cdigo para Nano.
O esquema elctrico abaixo, mostra com mais detalhes como se conectar o ESP8266.
https://github.com/Mjrovai/ArduFarmBot/tree/master/ESP8266%20Test%20Setup
As funes acima sero chamadas durante a fase de setup de nosso Cdigo. Se tudo foi
feito corretamente, voc deve ver pelo monitor serial, mensagens semelhantes como as
de abaixo:
No Loop(), depois de capturar os dados com readSensors (), chamaremos uma funo
especfica para carregar os dados capturados: updateDataThingSpeak ():
A fim de enviar esses dados, a primeira coisa a fazer iniciar-se a comunicao com
o ThingSpeak.com. Faremos isso, usando-se da funo: startThingSpeakCmd() :
Uma vez que o canal esteja aberto com o ThingSpeak e o string cmd esteja montado com
os dados, hora de fazer o upload de tudo isso no canal correspondente do ThingSpeak
usando-se da funo: sendThingSpeakCmd()
https://www.instructables.com/id/Arduino-IOT-Temperature-and-
Humidity-With-ESP8266-/
Field 7:
o Data = 1 PUMP should be Turn ON
o Data = 0 PUMP should be Turn OFF
Field 8:
o Data = 1 LAMP should be Turn ON
o Data = 0 LAMP should be Turn OFF
OK, mas como configurar esses campos diretamente no ThingSpeak? Podemos faz-lo,
escrevendo um plugin diretamente para ThingSpeak, ou podemos usar um site
externo para faz-lo (esta ltima ser a nossa escolha, como veremos mais adiante). De
qualquer forma, em ambos os casos, voc dever usar um comando como o de abaixo:
api.thingspeak.com/update?key=YOUR_WRITE_KEY&field7=1
Com o comando acima, por exemplo (e usando a sua chave de escrita de canal), voc vai
escrever 1 no Field 7, o que significa que a bomba deve ser ligada. Voc pode
facilmente test-lo, escrevendo a linha de comando acima no seu navegador, o campo
correspondente no seu canal ser alterado. Como um retorno, o navegador ir mostrar
uma pgina em branco com um nico nmero no canto superior esquerdo,
correspondente entrada de dados sequencial no seu canal.
At agora, 50% do trabalho est feito! Agora voc dever ler este comando (contedo
do campo), na estao local do ArduFarmBot.
O comando para fazer isso mostrado abaixo. Ele vai obter o ltimo dado que foi escrito
no campo especfico (que em nosso caso ser um comando).
api.thingspeak.com/channels/CHANNEL_ID/fields/7/last
Da mesma forma como fizemos antes, voc poder testar a linha de comando, usando
seu navegador. Neste caso, o navegador ir mostrar-lhe o dado armazenado esse campo
especfico. Veja abaixo:
Voltando terra, escreveremos uma funo que ler este ltimo campo:
Assim, a partir de agora voc poder usar a linha de comando em seu navegador para
ligar/desligar a bomba e a lmpada remotamente. Abaixo, se pode ver como o comando
recebido aparecer no monitor serial:
field7Data = pumpStatus;
field8Data = lampStatus;
Quando iniciar seus testes, perceber que qualquer comando executado manualmente
seja local ou via web, ser suplantado pelas aes automticas definidas pela
funo autoControlPlantation(). Neste ponto, voc dever considerar quem ser o
chefe (ou patroa), o qual ter a ltima palavra! Em nosso caso definiremos o
seguinte:
Voc poder alterar essa lgica da maneira que melhor se adapte a seu
projeto. Essa a vantagem no uso de um processador programvel,
como o Arduino para controlar as coisas!
https://github.com/Mjrovai/ArduFarmBot/tree/master/WebPage
Esta Matriz, nada mais que uma planilha onde foram definidas para cada sensor,
diferentes condies e como deveriam ser as respectivas sadas dos atuadores em funo
das mesmas.
Na planilha Excel, existem duas Tabs. Uma com filtro como mostrado acima e outra que
alm da seleo, te permite obter o cdigo binrio, o qual dever ser carregado na
varivel definida para a Matriz:
Uma vez definida, a matriz dever ser carregada em nosso cdigo. Um array de 18
linhas e 10 colunas foi criado para este propsito:
Para trabalhar com a Matrix, criou-se a funo defSensorStatus(). Esta funo testar
para cada linha se as condies das 8 primeiras colunas so verdadeiras. Se sim, as
condies definidas nas 2 ltimas colunas so executadas.
por exemplo:
else if (1 and 0 and 0 and 0 and 1 and 0 and 1 and 0) { pumpStatus = 1; lampStatus = 0}
Como parte da funo anterior outra array ser criada com o estado de cada leitura do
sensor:
boolean snsSts[8]={0, 0, 0, 0, 0, 0, 0, 0}; // SL, SM, SH, LL, LH, TL, TM, TH
https://github.com/Mjrovai/ArduFarmBot/blob/master/Matrix_Sensor_
Actuator.xlsx
A. Display LCD:
O display LCD deve estar apagado por default e a qualquer momento que uma leitura
de sensores seja necessria, poderemos acende-lo. Esta condio foi implementada no
cdigo e o boto de leitura de sensores dever ser utilizado no modo toggle para
ligar/desligar o LCD a qualquer momento. O ato de acender ou apagar o LCD,
automaticamente atualizar as leituras de sensores para a exibio, mas estas novas
leituras no sero utilizadas pelo ArduFarmBot em suas funes regulares.
B. Configurao inicial:
C. Registro do Log:
Por ltimo, uma vez que o cdigo acabou ficando com um tamanho razovel, decidimos
armazenar as constantes na memria flash (programa), em vez de na SRAM. Para isso,
usaremos a palavra-chave PROGMEM que um modificador de varivel. Por exemplo,
em vez de utilizar:
#define DHTPIN 5,
usaremos:
https://github.com/Mjrovai/ArduFarmBot/tree/master/ArduFarmBot_C
ontrol_Station_V4_1_BLOG
77
ArduFarmBot: Automatizando uma horta de tomates com a ajuda da Internet das Coisas - IoT
Parte 3 - O ArduFarmBot 2
Nas duas primeiras partes deste tutorial, desenvolvemos um sistema totalmente
automatizado baseado no Arduino e servios de Internet tal como o ThingSpeak. Nesta
nova verso, o ArduFarmBot 2, as principais especificaes originais sero mantidas,
porm agora o projeto estar baseado na plataforma NodeMCU ESP8266 e no aplicativo
para dispositivos mveis BLYNK.
A. Especificaes:
Com base nos dados coletados em uma plantao tais como, temperatura e umidade,
tanto do ar quanto do solo, o ArduFarmBot 2 decidir a quantidade certa (e quando) o
plantio deve receber calor e gua. O sistema dever tambm permitir a interveno
manual de um operador para controlar uma bomba de gua e uma lmpada eltrica para
gerar calor para a plantao. Esta interveno manual dever ser possvel de ser
executada tanto no local como remotamente via Internet.
ENTRADA:
Sensores:
o Temperatura do ar
o Umidade Relativa ao Ar
o Temperatura do solo
o Umidade do solo
Botes:
o Bomba ON / OFF
o Lmpada ON / OFF
SADA:
Atuadores:
o Rel para controle da bomba
o Rel para controle de lmpada
Mensagens automticas devem ser enviadas na ocorrncia de eventos, tais
como:
o Bomba LIGADA
o Lmpada LIGADA
o Sistema off-line
Exibio de dados
o Todos os dados analgicos e digitais devem estar disponveis para
avaliao imediata
Armazenamento de dados
o Dados histricos devem ser armazenados remotamente
B. O Diagrama em Blocos:
0.96 I2C IIC SPI Serial 128X64 Yellow&Blue OLED LCD ($8.99)
Module ($8.66)
Breadboard ($3.33)
3.2 - O NodeMCU
http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family,
Em suma, o NodeMCU ESP-12E um dispositivo pronto para ser usado, bastando que
voc instale os drivers USB ao seu computador e comece a escrever programas que se
conectam sua rede Wi-Fi!
Especificaes Tcnicas:
Caso voc j tenha o NodeMCU instalado com o IDE, ignore esta etapa
Se voc deseja programar e usar o NodeMCU como se fosse um Arduino, a boa notcia
que possvel escrever-se firmwares personalizados e carreg-los no chip (flash-it)
utilizando-se do IDE padro do Arduino. importante lembrar que qualquer novo
firmware personalizado ir substituir qualquer coisa previamente armazenada na
memria flash do chip, incluindo o firmware original carregado em fbrica (aquele que
aceita os comandos AT). Embora possamos usar o SDK do fabricante para o
desenvolvimento de firmwares personalizados, muito mais fcil usar o bom e velho
Arduino IDE.
Comecemos:
No Arduino IDE:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Selecione OK.
Clique INSTALL
https://www.silabs.com/products/development-tools/software/usb-to-
uart-bridge-vcp-drivers
Neste ponto estamos prontos para escrever nosso prprio firmware e envi-lo ao
dispositivo, mas vamos primeiramente testar com um dos exemplos includos na
biblioteca:
Um grande companheiro para o nosso ESP-12E o pequeno display do tipo OLED: SSD
1306. Ele ser muito til ao projeto, mostrando localmente os dados capturados,
mensagens, etc. O dispositivo um display de 128 X 64 pixels que se comunica via I2C e
cujas principais caractersticas so:
128 pixels na horizontal por 64 pixels na vertical. Assim se voc usar por
exemplo, caracteres de 88 pixels, obteremos um display de 16X8 (8
linhas de 16 caracteres cada).
Uma vez conectado o display, voc dever baixar e instalar sua biblioteca ao Arduino
IDE. Ns usaremos a verso ACROBOT:
https://github.com/acrobotic/Ai_Ardulib_SSD1306
O cdigo para o Hello World poder ser descarregado desde o repositrio de arquivos:
https://github.com/Mjrovai/ArduFarmBot-2/tree/master/OledTest
https://github.com/Mjrovai/ArduFarmBot-2/tree/master/OledTest
Como descrito anteriormente no item 1.5, um dos sensores mais utilizados na captura de
dados meteorolgicos o DHT22 (ou seu irmo, o DHT11), um sensor digital de
umidade relativa do ar e
temperatura.
Descarregue e execute o cdigo abaixo para verificar se tudo est funcionando OK:
https://github.com/Mjrovai/ArduFarmBot-
2/tree/master/DHT22_Test_with_Oled
LM393 A0 NodeMCU A0
LM393 VCC NodeMCU D3 ou VCC 5V externo
LM393 GND NodeMCU GND
LM393 D0 No conectado
https://github.com/Mjrovai/ArduFarmBot-
2/tree/master/ArduFarmBot2_PartialTest
Preto: GND
Vermelho: VCC
Amarelo: Dados (1-Wire)
https://cdn-shop.adafruit.com/datasheets/DS18B20.pdf
Para usar o DS18B20 com o IDE do Arduino, importe as bibliotecas abaixo e as instale
em seu computador:
OneWire
https://github.com/adafruit/ESP8266-
Arduino/tree/esp8266/libraries/OneWire
Dallas Temperature
https://github.com/milesburton/Arduino-Temperature-Control-Library
Para testar o sensor, voc pode usar o cdigo Simple.ino includo nos Exemplos da
Biblioteca, como mostrado na foto acima. Carregue o cdigo no seu NodeMCU e
monitore a temperatura usando o Monitor Serial.
A foto acima mostra o resultado esperado. Segure o sensor em sua mo, voc deve ver a
temperatura mudar para cerca de 32oC a 34C.
https://github.com/Mjrovai/ArduFarmBot-2/tree/master/OneWire
3.8 - Completando o HW
A. LEDs
Observe que os LEDs conectados ao NodeMCU so somente para serem usados como
teste. Eles simularo, a bomba (LED vermelho) e a lmpada (LED verde). Na
configurao final, rels sero conectados a essas sadas como descrito na prxima
etapa.
B. Botes
Com base nas leituras de sensores, um operador pode tambm decidir controlar
manualmente a bomba e/ou a lmpada. Para isto, trs botes sero incorporados ao
projeto:
No caso em que um boto pressionado, outra funo ser chamada: aplyCmd (). E
como o nome diz, esta aplicar o comando correspondente, ativando ou desativando os
atuadores:
1. Ler Sensores
2. Ler Botes (comando local)
3. Atuar na bomba / lmpada
4. Exibir dados
Portanto, devemos usar aqui um timer para controlar corretamente o timing correto
para a execuo dessas tarefas. Poderamos fazer isso usando o millis() , como fizemos
na Parte 2 do projeto, mas aproveitemos a oportunidade para conhecer outra tima
ferramenta, o SimpleTimer.h
http://playground.arduino.cc/Code/SimpleTimer
A biblioteca deve ser includa no corpo principal do seu cdigo, seguido de uma
definio para o Timer do projeto:
SimpleTimer timer;
Neste ponto, todo o HW est completo (utilizando-se LEDs como atuadores) e temos
tambm, todas as partes de SW desenvolvidas.
https://github.com/Mjrovai/ArduFarmBot-
2/tree/master/ArduFarmBot2_Local_Manual_Ctrl_V1
https://youtu.be/xJ9sSJw54PM
Para comear, definamos o intervalo inicial onde funcionaro os sensores. Esses valores
devem ser alterados mais tarde usando-se valores prticos a serem obtidos em uma
plantao real:
Umidade do solo:
Temperatura do ar:
Uma vez de posse desses dados: temperatura do ar, umidade do ar, umidade do solo e
temperatura do solo, como visto na parte 2, poderemos construir uma matriz complexa
definindo como queremos que o nosso sistema de jardinagem automtico funcione.
Com base nos parmetros acima, pensemos em algumas suposies muito simples a
serem implementadas no cdigo:
O cdigo:
Criemos uma nova funo, que com base na leitura dos sensores lidar
automaticamente com os atuadores, ligando ou desligando a bomba e a
lmpada: autoControlPlantation().
Esta funo conforme mostrado abaixo, ser chamada em todas os ciclos de leitura de
sensores:
Controle da bomba
Controle da lmpada
https://github.com/Mjrovai/ArduFarmBot-
2/tree/master/ArduFarmBot2_Local_Automatic_Ctrl_V2
https://youtu.be/sE_Lwgdjwbw
https://github.com/blynkkk/blynk-library/releases/tag/v0.3.10
Uma vez que o Arduino IDE recarregado, voc dever estar OK para comear a usar o
BLINK em seus projetos de IoT.
Anote seu cdigo do Authorization Token (voc pode envia-lo por e-mail e copia-
lo em seu cdigo):
OK, vamos tomar um momento e pensar sobre o nosso ArduFarmBot 2 Blynk App e
definir quais sero os Widgets a serem instalados. Revisitando a especificao geral
descrita na introduo do projeto, poderemos resumir que o nosso aplicativo precisar:
SENSORS
ACTUATORS / CONTROL
GRAPHICS
Tabs ser o primeiro Widget a ser instalado. Uma vez selecionado, defina Tab names
como especificado nos bullets acima.
Em seguida, entre em cada um dos Tabs criados e instale os Widgets como descritos
abaixo:
SENSORS
Gauge: Temp Air [C] Blue; input: V10 0 to 50; frequency: 5 sec
Gauge: Humidity Air [%] Green; input: V11 0 to 100; frequency: 5 sec
Gauge: Soil Humidity [%] Red; input: V12 0 to 100; frequency: 5 sec
Gauge: Soil Temperature[C] Yellow; input: V13 -10 to 50; frequency: 5 sec
LED: PUMP Red; V0
LED: LAMP Green; V1
ACTUATORS / CONTROL
Button: PUMP Red; output: V3 0 to 1; mode: Switch; label: on: ACT, off: OK
Button: LAMP Green; output: V4 0 to 1; mode: Switch; label: on: ACT, off: OK
LED: PUMP Red; V0
LED: LAMP Green; V6
Notifications: Notify When HW goes offline: ON
GRAPHICS
Data to Show:
o V10 Temp Air
o V11 Humidity Air
o V12 Soil Humidity
o V13 Soil Temp
Para executar um aplicativo Blynk juntamente com seu cdigo, voc precisar:
Outras consideraes:
Para se usar um Widget do tipo: Virtual LED na App do Blynk, voc necessitar defini-
lo no incio do cdigo:
Por exemplo, para acender ou apagar o LED virtual relacionado com a Bomba
(PUMPs(V0)), o qual est conectado ao virtual PIN V0, chame as funes
correspondentes abaixo:
PUMPs.on() ou
PUMPs.off()
Para receber um comando a partir de um boto (Widget button) includo na app Blynk,
uma funo BLYNK_WRITE () deve ser definida fora de uma funo, loop () ou setup ().
Para isso foi criado o cdigo abaixo, um para cada Boto Blynk (PUMP e LAMP):
https://youtu.be/Y9xoh-iykzg
O cdigo para o ArduFarmBot2 em sua verso Remote and Automatic control, usando
o Blynk pode ser descarregada do repositrio de arquivos:
https://github.com/Mjrovai/ArduFarmBot-
2/tree/master/ArduFarmBot2_Ext_Auto_Ctrl__V3_0
Para isso, usaremos um pequeno mdulo de rel de 5V tanto para a ativao da bomba
quanto da lmpada.
Normalmente encontramos como sada, 3 pinos para cada rel: NO (Normal Open),
Ref or COM (Reference or Common) and NC (Normal Closed). Usaremos o
NO e o COM para cada rel.
No caso do rel escolhido, normalmente o IN1 e o IN2 devem estar em ALTO e sua
ativao acontecer com um nvel BAIXO (menos de 2V). Com um nvel BAIXO na sada
do NodeMCU, a corrente fluir de VCC para o pino D6 do NodeMCU, ativando a entrada
do opto acoplador. O solenoide ser acionado, fechando a sada NO (normalmente
aberta) do rel, o que ligar a bomba.
O cdigo para o ArduFarmBot2 em sua verso Remote and Automatic control, usando
o Blynk e rels (ativos com LOW) pode ser baixado desde o repositrio de arquivos:
https://github.com/Mjrovai/ArduFarmBot-
2/tree/master/ArduFarmBot2_Ext_Auto_Ctrl__V4_0
Ligue um dos fios da bomba ao rel IN1 e o outro ao pino de alimentao externa de 5V
(+). Pegue o pino de alimentao (-) e ligue-o ao rel COM1.
https://youtu.be/cgTGbSn-g-0
https://youtu.be/ZR0xKFEuGuQ
123
ArduFarmBot: Automatizando uma horta de tomates com a ajuda da Internet das Coisas - IoT
Concluso
A ltima parte do nosso projeto ainda estar por ser escrita e ser com toda certeza uma
boa pasta italiana ao sugo, mas com molho de tomate orgnico, claro!
Parte 1 e 2: https://github.com/Mjrovai/ArduFarmBot
Parte 3: https://github.com/Mjrovai/ArduFarmBot-2
A propsito, na foto abaixo vocs podem ver os primeiros suspiros de vida na plantao
de Mauricio e seus tomates alguns meses depois
Esperamos que os projetos desenvolvidos neste livro, possam ajud-los a encontrar seu
caminho no excitante mundo da eletrnica, Internet das coisas e robtica!
Marcelo e Mauricio
125