Escolar Documentos
Profissional Documentos
Cultura Documentos
Cascavel-PR
2022
Édipo Alexandre Pereira Carneiro
Cascavel-PR
2022
Édipo Alexandre Pereira Carneiro
Desenvolvimento de um datalogger configurável e de baixo custo para aplicação em pesquisas
ambientais/ Édipo Alexandre Pereira Carneiro. – Cascavel-PR, 2022-
236p. : il. (algumas color.) ; 30 cm.
Cascavel-PR
2022
Dedico esse trabalho ao meu pai Aurelino, que pavimentou meu caminho e à Regina, luz
dos meus olhos, eternamente.
Agradecimentos
Primeiramente, não posso deixar de agradecer ao meu Pai, que nunca deixou de,
mesmo que com alguns sacrifícios, prover condições para que eu pudesse alçar voos mais
longos. Sem seu esforço, não teria chegado aqui. A minha esposa, Regina, por tornar, dia
a dia, meu caminho menos árduo. Sem seu apoio, certamente essas palavras não estariam
sendo escritas (e revisadas).
Agradeço imensamente ao meu orientador Rogério Luis Rizzi. Direto, focado,
incansável. De uma dedicação ímpar, é de longe o Professor mais comprometido e atento
que pude conhecer. Você é um exemplo de servidor e foi um prazer compartilhar do seu
tempo e saber. Agradeço também a minha coorientadora Claudia Brandelero Rizzi, que
com seu conhecimento, paciência e sutileza nos apontamentos, foi de suma importância
para construção e finalização deste trabalho.
Agradeço aos meus colegas de trabalho, Lucas Rafael Castanhetti e Leonardo
Contini, por todo o apoio e suporte.
Agradeço aos Professores que participaram da banca de qualificação, cujas con-
tribuições enriqueceram esse trabalho de pesquisa. Agradeço ainda a todos os demais
professores do programa, que se desdobraram em tempos de pandemia para adequar suas
aulas ao ambiente virtual, para garantir que nossa formação não fosse afetada. Por fim,
mas não menos importante, agradeço também aos meus colegas de mestrado, que foram
uma grata surpresa encontrada ao longo desta caminhada.
"Quanto ao futuro, não se trata de prevê-lo, mas de torná-lo possível"
(Saint-Exupéry)
Resumo
Pesquisas que envolvem a avaliação de parâmetros ambientais necessitam da aquisição de
uma grande massa de dados em intervalos e grandezas diferentes. Tais dados necessitam
ser precisos e confiáveis e sua observação, devido a necessidade do registro de eventos
que ocorrem em um intervalo de tempo muito curto ou muito longo, extrapola os limites
da capacidade humana. Visando atender a essa demanda, o objetivo principal deste
trabalho foi a criação de um datalogger que pudesse ser utilizado em diversas pesquisas,
que fosse viável economicamente e de fácil operação. Para tanto, foram primeiramente
avaliadas algumas soluções acadêmicas e comerciais existentes e também aspectos técnicos
e metodológicos empregados nessas construções. Na sequência, foram aplicados conceitos
de metodologias ágeis de desenvolvimento de software para criação do projeto e elaboração
das camadas de hardware, firmware e software que compõe o datalogger. Uma vez concluída
a construção do protótipo, foram realizados testes piloto a fim de avaliar se o protótipo
atendia a todos os requisitos elicitados e em seguida foi realizado um estudo de caso,
com a aplicação do datalogger para automatização da coleta de dados de um simulador
de chuva construído na Universidade do Oeste do Paraná (UNIOESTE), campus de
Cascavel/PR, que tem por objetivo o desenvolvimento e validação de modelos de perda
de água e do solo por escoamento superficial em função da taxa de cobertura vegetal.
Para tanto, a automatização envolveu a utilização de nove sensores analógicos de umidade
de solo, um sensor digital de vazão de água e um sensor digital ultrassônico. Todo o
processo de calibração e coleta dos dados dessa aplicação é detalhado passo a passo e os
dados coletados são apresentados, analisados estatisticamente e na sequência comparados
em relação a um datalogger comercial, com a finalidade de atestar aspectos como o de
precisão e estabilidade da solução. Considerando-se todas as análises realizadas, foi possível
concluir que o datalogger acadêmico se mostrou estável e com boa precisão, possibilitando
a realização da coleta de dados sem incidência de falha e sem dificuldade de operação pelos
pesquisadores envolvidos. O custo total para construção de uma unidade do datalogger foi
de US$ 192,35, atendendo o principal objetivo: a criação de uma solução de baixo custo e
de fácil operação para aplicação em pesquisas ambientais.
AC Alternating Current
CI Circuito Integrado
DC Direct Current
ha Hectare
SD Secure Digital
t Tonelada
XP Extreme Programming
Sumário
1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.2 Objetivos, Geral e Específicos . . . . . . . . . . . . . . . . . . . . . . 28
1.3 Justificativa e relevância do trabalho . . . . . . . . . . . . . . . . . . 29
1.4 Organização do trabalho . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.5 Questão de pesquisa e sua contribuição . . . . . . . . . . . . . . . . . 31
2 REVISÃO BIBLIOGRÁFICA . . . . . . . . . . . . . . . . . . . . . . 33
2.1 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.2 Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.3 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.4 Dataloggers Comerciais . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.5 Comparativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3 MATERIAIS E MÉTODOS . . . . . . . . . . . . . . . . . . . . . . . 57
3.1 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.1.1 Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.1.2 Componentes e módulos utilizados . . . . . . . . . . . . . . . . . . . . . . 62
3.1.2.1 Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.1.2.2 Módulos RS485 e RS232 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.1.2.3 Módulo de relógio (RTC) . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.1.2.4 Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.1.3 Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.2 Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.2.1 Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.2.2 Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.3 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.3.1 Software de configuração . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.3.1.1 Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.3.1.2 Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.3.2 Software de exibição dos dados . . . . . . . . . . . . . . . . . . . . . . . . 73
3.3.2.1 Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.3.2.2 Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.4 Validação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.4.1 Cenários de teste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4 RESULTADOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.1 Datalogger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.1.1 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.1.2 Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.1.3 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.1.3.1 Software de Configuração . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.1.3.2 Software de Exibição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.1.4 Testes Piloto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
4.2 Aplicação em um simulador de chuva . . . . . . . . . . . . . . . . . . 86
4.2.1 Sensor de umidade de solo . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.2.2 Sensor de fluxo de água . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4.2.3 Sensor ultrassônico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4.2.4 Calibração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
4.2.4.1 Sensor de fluxo de água . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
4.2.4.2 Sensor ultrassônico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
4.2.4.3 Sensores de umidade de solo . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4.3 Avaliação de desempenho e análise de dados . . . . . . . . . . . . . 108
5 CONCLUSÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
APÊNDICES 121
ANEXOS 225
1 Introdução
1.1 Motivação
dados.
A proposta da criação de um datalogger de baixo custo visa propiciar seu acesso
a uma parcela maior de pesquisadores, facilitando o desenvolvimento de seus estudos ou
ampliando a captura de dados a mais de uma localidade. Igualmente importante é o uso de
dataloggers por empresas na criação de novos serviços ou produtos em áreas que necessitem
da coleta de dados.
Durante a fase de levantamento bibliográfico, buscando-se por artigos e trabalhos
científicos relacionados, notou-se nas soluções acadêmicas existentes a ausência de detalha-
mento metodológico, escassez na justificativa das escolhas técnicas empregadas em suas
construções e também não apresentam análise comparativa ou estatística. De tal modo,
este trabalho visou também elaborar uma significativa fundamentação metodológica, bem
como análises comparativas de algumas das funcionalidades do datalogger proposto em
relação a um datalogger comercial.
das camadas, suas ordens de criação e suas respectivas proporções, considerando-se como
métrica a complexidade e o tempo envolvido para planejamento e criação.
A construção desse tipo de dispositivo se inicia pelo planejamento, especificação e
montagem do hardware. O planejamento deve considerar o atendimento às demandas gerais
de um datalogger e também alternativas para atendimento a demandas mais específicas,
seja pela existência de interruptores ou conexões para ligação de outros hardwares. Em
sequência, é necessário projetar e desenvolver a camada de firmware, que é responsável por
operar todas as rotinas requisitadas. Essa camada deve ser capaz de considerar as mais
diversas configurações possíveis, reagindo e adequando seu funcionamento aos parâmetros
indicados. Posteriormente, projeta-se o software que irá possibilitar a configuração dos
parâmetros de funcionamento do equipamento e também exibir de forma gráfica os dados
que foram coletados.
Fonte: Autor
2 Revisão Bibliográfica
2.1 Hardware
Hardware é o conjunto de componentes (resistores, capacitores, microcontroladores)
que formam um equipamento (NIST-GLOSSARY, 2021). O projeto de um hardware
sempre envolve a elaboração de um diagrama elétrico e posteriormente de uma placa
de circuito impresso (PCB). As placas mães dos computadores são o principal exemplo
desta abordagem. No caso de um datalogger é a camada em que ficam os conectores de
36 Capítulo 2. Revisão Bibliográfica
sem a necessidade de passar pelo concentrador. Para tanto, seria necessária a adição de uma
shield wi-fi ao Arduino, mas ainda assim o valor e o consumo de energia da solução seriam
menores. Utilizando esse arranjo, seria possível em caso de falha ou indisponibilidade de
envio, a criação de uma fila de envio em arquivo para que, ao ser restabelecida a conexão,
essa massa de dados pudesse ser sincronizada.
O trabalho de Galdino et al. (2019) visou o desenvolvimento de um datalogger de
baixo custo utilizando a plataforma Arduino, com a motivação de propiciar a coleta de
dados de precipitação em escala subhorária. Os autores criaram seu datalogger utilizando
um Arduino Uno, um módulo de relógio de tempo real RTC DS3231, um módulo para
leitura e escrita de cartão SD, uma placa com fenolite cobreado e alguns componentes
eletrônicos adicionais (LEDs, resistores e conectores) conforme ilustrado no Anexo C,
Figura 57. Os sensores utilizados pelos autores estão descritos na Tabela 2.
0-
Pluviômetro Campbell TB-04 Pulso +- 2% 0,254mm
200mm/h
Pluviômetro Rainwise - - Pulso -% 0,206mm
Pluviômetro Rainwise - - Pulso -% 0,206mm
Fonte: Adaptado de Galdino et al. (2019)
Apesar do intuito dos autores ter sido a criação de uma solução de baixo custo, a escolha
dos sensores não foi condizente com essa proposta.
+- 0.5ºC
Temperatura Vaisala HMP60 -40-60ºC 0-2.5 V 5-28 VDC
(10-30ºC)
Umidade
Vaisala HMP60 0-100% 0-2.5 V +- 3%RH 5-28 VDC
Relativa
Velocidade 0.05-2.54
TSI TSI 8475 0-5 V +- 3% 11-30 VDC
do Ar m/s
Temperatura
ONSET type K thermocouple 0-285ºC - 0.0075 -
Global
0 - 10.000 4.5-14
CO2 CO2Meter K-30 0-4 V +- 3%
ppm VDC
0 - 46.168 3.8-28
Iluminância Licor LI-210SA 0-5 V +- 5%
klux VDC
Sensor de 10-2000
Sensky PIR sensor 0-5 V - 12 VDC
Presença lux
0-0.5
PM 2.5 Sharp GP2Y1010AU0F 0-3.4 V - 5-7 VDC
mg/m3
350-2000
VOCs CO2 Meter IAQ-2000 0-5 V - 5 VDC
ppm
Fonte: Adaptado de Karami, Mcmorrow e Wang (2018)
acordo com a necessidade e adicionar quantos dataloggers se fizerem necessários. Por outro
lado, a escolha de uma tecnologia sem-fio, como o XBee, pode aumentar a incidência de
erros e indisponibilidade nos dados, haja vista que diversos fatores podem influenciar no
alcance do sinal.
Na pesquisa de Netto e Arigony-Neto (2019) foi desenvolvido um datalogger de baixo
custo utilizando a plataforma Arduino, para criação de estação meteorológica automática.
Via de regra, dataloggers disponíveis para esse tipo de aplicação possuem um alto custo e
complexidade. Os autores utilizaram um Arduino Uno, um leitor de cartão micro SD e um
módulo de relógio RTC DS1307 para desenvolver o datalogger, e a Figura 58, contida no
Anexo C, ilustra o datalogger elaborado. A escolha do Arduino Uno limita a quantidade
de sensores que podem ser lidos devido à quantidade de portas e memória disponíveis.
Para validação do hardware criado, os autores utilizaram o datalogger para realiza-
ção da leitura de vários sensores ambientais, tais como sensores de temperatura, umidade,
pressão atmosférica, luminosidade, velocidade do vento e direção do vento. A Figura 3
apresenta o diagrama de ligação da estação montada pelos pesquisadores e a Tabela 4
detalha os sensores utilizados.
Tipo de Tipo de
Modelo Intervalo Precisão Alimentação
Sensor Sinal
2.2 Firmware
Firmware é uma categoria de software que é programada diretamente na memória
de um dispositivo de hardware (NIST-GLOSSARY, 2021). Ele possui todas as informações
para a inicialização das rotinas de funcionamento de um equipamento. O código do
firmware possui todas as informações necessárias para que o equipamento funcione de
forma autônoma e exerça a função para a qual foi projetado. No caso dos dataloggers é o
firmware que irá conter todas as rotinas de operação e validação durante a aquisição dos
dados. Esse código é responsável, com base nas configurações pré-definidas, por avaliar
quais sensores serão lidos, em qual periodicidade, quais cálculos deverão ser realizados
para correta aquisição, se esse dado deve ser enviado a alguma porta de comunicação e
demais condicionais.
Na sequência é descrito como cada autor realizou sua criação da camada de firmware
e quais aspectos foram considerados ou desconsiderados no processo.
No trabalho realizado por Abdalla (2015) a funcionalidade do firmware é centrada
na realização da conexão e autenticação com o módulo de armazenamento por meio de
conexão sem fio; na coleta dos dados de temperatura e umidade; na coleta das coordenadas
de localização; no envio dos dados por meio de um método HTTP GET e no envio
das informações ao módulo de armazenamento. O pesquisador não projetou meio para
configuração das rotinas ou alteração em seu comportamento, limitando seu funcionamento
apenas à rotina descrita.
O firmware desenvolvido por Galdino et al. (2019) para a plataforma Arduino teve
como objetivo registrar em arquivo de texto a ocorrência de precipitação, com data, hora,
minuto e segundo do evento, bem como a quantidade de chuva coletada. E assim como
Abdalla (2015), os pesquisadores não projetaram um meio para configuração das rotinas
ou alteração em seu comportamento.
No trabalho de Karami, Mcmorrow e Wang (2018) não é descrito o processo de
criação do firmware, o mesmo ocorrendo em Reges (2017). Ambos os autores focaram mais
2.2. Firmware 45
2.3 Software
Uma característica importante em um datalogger é possibilitar que funcionalidades
possam ser configuradas e adaptadas às necessidades do usuário. Dataloggers comerciais
comumente dispõe de uma interface gráfica que possibilita sincronização de horário, fuso
horário, configuração dos sensores existentes, periodicidade de registro, periodicidade de
envio, leitura momentânea dos valores adquiridos pelos sensores, entre outros. As marcas
mais conceituadas preocupam-se pouco com a interface e com a usabilidade, sendo muitas
vezes necessário, inclusive, realizar a compra de horas de suporte para que seja possível
compreender como realizar o processo desejado.
Na sequência está descrito se e como cada autor implementou sua camada de
software.
No trabalho realizado por Abdalla (2015), os softwares foram elaborados para o
módulo de armazenamento, sendo utilizado um Raspberry Pi para recepção e concentração
dos dados capturados pela interface de coleta. No Raspberry Pi foram instalados um
Servidor Apache, o Banco de Dados MySQL e o PHP. A informação é recebida por uma
página WEB hospedada no servidor Apache, escrita em PHP, que trata os dados e os insere
no banco de dados criado, conforme exemplificado pelo diagrama da Figura 8. O processo
de instalação e configuração dos recursos envolvidos foi adicionado pelo pesquisador como
um anexo em seu trabalho.
O autor não desenvolveu softwares que permitissem realizar de forma gráfica a sua
configuração ou a visualização de modo gráfico dos dados aquisitados.
2.4. Dataloggers Comerciais 49
Característica Descrição
Características de Firmware
Suporta os protocolos Modbus RTU & Tcp, TCP-IP, HTTP, FTP, SFTP, NTP, Telnet,
SMTP, Socket, I2CBus, SDI-12, RS232/485, SNMP e SSH
Características de Software
Configurações realizadas via browser por meio de interface WEB, sem necessidade da
instalação de nenhum software
Criação de múltiplos usuários, cada um com sua rotina de coleta e envio de dados
Característica Descrição
Processador Renesas H8S 2322 (16-bit CPU com 32-bit de core interno);
Memória externa Módulos adicionais podem ser comprados
Portas de comunicação 4 RS232, 4 SDI-12, 1 I/O port exclusiva para equipamentos
da Campbell e uma porta periférica para conexão de módulo
CompactFlash ou Ethernet
Alimentação 9,6 Vdc a 16 Vdc
Portas analógicas 8 diferenciais ou 16 single-ended
Resolução do conversor AD 24 bits
Portas digitais 8 portas
Fonte: Adaptado de Campbell Scientific (2013)
Características de Firmware
Características de Software
Característica Descrição
Características de Firmware
Características de Software
Para encerrar este capítulo, na seção seguinte são apresentados comparativos entre
os equipamentos caracterizados anteriormente, tanto acadêmicos quanto comerciais.
2.5 Comparativos
Nesta seção são apresentados dois quadros comparativos, o primeiro entre os
projetos acadêmicos e o segundo entre os dataloggers comerciais supracitados.
O comparativo exposto no Quadro 1 mostra de forma clara que os equipamentos
desenvolvidos nas pesquisas analisadas não buscaram avaliar ou se aproximar das caracte-
rísticas de equipamentos comerciais. Não houve preocupação dos pesquisadores em relação
à precisão do relógio, com saída de comunicação para interação com outros equipamentos
ou com desenvolvimento de softwares para facilitar a configuração do equipamento criado.
O comparativo apresentado no Quadro 2 mostra algumas características comuns
entre as soluções comerciais, como é o caso de uma alta precisão do relógio, saída de
comunicação em protocolo serial padrão RS232, um grande número de portas analógicas e
digitais para leitura de sensores e a existência de softwares para configuração do equipa-
mento. Destaca-se também a possibilidade de ser programável, ou seja, a inclusão funções
ou cálculos e a alteração nos formatos da mensagem de saída.
Quadro 1 – Comparativo entre projetos acadêmicos pesquisados
56
HARDWARE SOFTWARE
Exibição
Portas Precisão Saída de Precisão do Software de
Portas Digitais dos dados
Analógicas (em bits) Comunicação Relógio Configuração
coletados
ABDALLA 2 10 0 Ethernet e Wifi +- 3min/ano Não Não
GALDINO 1 10 1 Inexistente +- 30min/ano Não Não
KARAMI 6 (por nó) 10 1 Wifi Inexistente Não Não
NETTO 6 10 1 Inexistente +- 30min/ano Sim Não
PEREIRA 6 10 1 Bluetooth +- 30min/ano Sim Não
REGES 6 10 1 Inexistente +- 3min/ano Não Não
LOPEZ-
24 18 0 Inexistente +- 3min/ano Não Não
VARGAS
Fonte: Autor
3 Materiais e Métodos
O protótipo proposto foi idealizado para abarcar dois tipos diferentes de cenário,
uso em campo ou uso em laboratório.
O ambiente de campo exige o uso de equipamentos com menor consumo energético,
pois a maior parte dos locais onde se faz necessária a coleta deste tipo de dados, em
geral, não possuem rede elétrica, como por exemplo encostas de rio, montanhas, fazendas,
etc. Esta característica torna necessário o uso de energia proveniente de um conjunto de
baterias e/ou painéis solares. Com o objetivo de atender aos requisitos desse cenário, o
protótipo deve fazer uso apenas do Arduino Mega (ARDUINO, 2021b) para realização do
processo de coleta dos dados.
Já para uso em ambiente de laboratório, foi prevista e realizada a adição/conexão
de um módulo Raspberry PI para que os dados possam ser visualizados em tempo real
à medida em que são coletados, seja em um monitor, seja por meio da rede interna
(acessando-se ao endereço do equipamento). Essa configuração do equipamento possui
maior consumo de energia e deve ser alimentada diretamente na rede elétrica do local.
A Figura 16 ilustra a arquitetura geral do protótipo. Seu objetivo é apresentar um
modelo completo do sistema com seus diferentes componentes, suas interfaces e conexões,
envolvendo ambas as diferentes operações, em campo ou em laboratório.
58 Capítulo 3. Materiais e Métodos
Fonte: Autor
3.1 Hardware
A camada de hardware do protótipo foi elaborada para proporcionar a conexão
entre os diversos componentes e módulos que foram utilizados. A Figura 17 mostra uma
visão geral da arquitetura proposta, que contempla os ambientes de campo e de laboratório.
No ambiente de campo, destaca-se o uso do Arduino, do firmware desenvolvido e do arquivo
gerado com os dados coletados. O ambiente de laboratório, além de contemplar todas as
funcionalidades e componentes existentes para o ambiente de campo, possui também um
Raspberry Pi, um software para exibição dos dados de forma gráfica e um banco de dados
para armazenamento dos dados.
Na sequência são apresentados os requisitos que foram identificados durante a fase
de elicitação, posteriomente analisados e avaliados, e que balizaram o desenvolvimento do
hardware.
3.1.1 Requisitos
A Tabela 17 apresenta um recorte com os principais requisitos identificados para a
camada de hardware. Os demais requisitos elicitados, bem como seu detalhamento estão
disponíveis no Apêndice A.
60 Capítulo 3. Materiais e Métodos
Fonte: Autor
Priori- Depen-
Requisito Descrição Tipo dade dência
RFH-01: O equipamento deve possuir um hardware com conectores Funcional Alta Inexistente
Hardware de ligação para acoplamento de um Arduino Mega 2560,
principal um Raspberry Pi 3B+, um módulo de relógio, um módulo
conversor TTL-RS485 e demais componentes necessários
ao seu funcionamento.
RFH-02: O equipamento deve possuir um módulo relógio de tempo Funcional Alta RFH-01
Sistema de real (RTC - Real Time Clock) para controle de data e hora.
obtenção de Esse relógio servirá de base tanto para o intervalo e período
data e hora de coleta, quanto para marcação no arquivo de registro dos
dados.
3.1. Hardware 61
RFH-03: O equipamento deve possuir em seu hardware principal os Funcional Alta RFH-01
Sistema de componentes necessários para que seja possível realizar o
Armazena- armazenamento de dados em um dispositivo de memória
mento de não volátil (pen drive ou cartão SD), de forma que possam
dados ser recuperados a qualquer momento pelo usuário.
RFH-04: Por- O equipamento deve possuir a capacidade de capturar Funcional Alta RFH-01
tas analógicas leituras de até 16 sensores analógicos com sinais de 4-
de leitura 20mA ou 0-5V. As leituras podem ser capturadas de forma
individual ou sequencial.
RFH-05: Por- O equipamento deve possuir a capacidade de capturar leitu- Funcional Alta RFH-01
tas digitais ras de até 2 sensores de efeito hall, realizando a contagem
para conta- dos pulsos. As leituras podem ser capturadas de forma
gem de pulso individual ou sequencial.
RFH-09: O equipamento deve possuir saídas de comunicação em Funcional Média RFH-01
Saídas de padrão RS232 e RS485, para intercomunicação com outros
comunicação equipamentos.
RS232 ou
RS485
RFH-11: O equipamento deve possuir a capacidade de suportar a Funcional Baixa RFH-01
Microcompu- adição de um microcomputador Raspberry PI 3 B+, para
tador para prover ambiente Web para receber e exibir informações em
exibição dos tempo real.
dados
RNFH-01: O equipamento deve apresentar conectores/bornes devida- Não Alta Inexistente
Facilidade de mente identificados e posicionados de forma a facilitar as Funcio-
uso ligações, sejam elas de alimentação, sensores ou saída de nal
dados.
RNFH-03: O equipamento deve possuir módulo de relógio (RTC) de Não Alta Inexistente
Precisão de alta precisão, com variação de no máximo +- 3 minutos Funcio-
data por ano. nal
RNFH-05: O equipamento deve ser capaz de identificar as configu- Não Alta Inexistente
Desempenho rações pré-definidas e realizar sua inicialização de forma Funcio-
automática, sem qualquer tipo de intervenção. Após a inici- nal
alização, deve realizar todas as leituras necessárias e então
entrar em estado de stand-by até o próximo intervalo espe-
rado.
RNFH-07: O equipamento deve ser de baixo custo, não excedendo os Não Alta Inexistente
Custo R$ 1.100,00. Funcio-
nal
62 Capítulo 3. Materiais e Métodos
RNFH-08: O equipamento, quando em ambiente de campo, deve pos- Não Média Inexistente
Consumo de suir baixo consumo de energia, sendo de no máximo de Funcio-
energia 75mA/h. nal
Fonte: Autor
3.1.2.1 Arduino
O Arduino trabalha em suas portas de seriais nativas com o padrão TTL, que é
a sigla para Transistor–Transistor Logic (Lógica transistor-transistor), que consiste em
uma classe de circuitos digitais construídos a partir de transistores bipolares de junção
e resistores (SPARKFUN, 2021). Conforme previsto no requisito RFH-07 e RFH-08,
o equipamento deve ser capaz de se comunicar com sensores ou outros equipamentos
utilizando os padrões RS232 e RS485. O padrão TTL trabalha em uma tensão diferente
dos padrões RS232 e RS485, sendo necessária a adição de Circuitos Integrados (CIs)
ou módulos para possibilitar a comunicação com dispositivos que usem esses protocolos.
Para tanto, foi utilizado um módulo que contém o chip MAX485CSA para conversão
3.1. Hardware 63
Um relógio de tempo real (Real Time Clock - RTC) é um circuito integrado (CI)
que mede a passagem do tempo. Existem vários fabricantes e modelos disponíveis, que
apresentam características distintas de estrutura, consumo de energia e precisão. Para
a escolha do módulo RTC utilizado no protótipo, foram avaliados os datasheets dos
módulos mais comumente encontrados no mercado, que são o DS1307, DS3231, PCF8563
e o MCP79400. Além das características descritas pelos fabricantes em seus datasheets,
considerou-se um comparativo realizado pelo site SwitchDoc (2014) que avalia os módulos
citados anteriormente. Dadas características técnicas de consumo e precisão, como também
o resultado apurado no comparativo supracitado, o módulo DS3231 foi o escolhido para
utilização no protótipo.
3.1.2.4 Raspberry Pi
3.1.3 Projeto
Considerando as características que deveriam ser atendidas e também as escolhas
previamente apresentadas, foi elaborado o projeto do circuito com suas respectivas conexões
e módulos, originando o diagrama do circuito, que para ser devidamente representado, foi
dividido na Figura 18 e Figura 19. Na Figura 20 mostra-se o layout da placa de circuito
impresso, que foi construído a partir do diagrama. Tanto o diagrama do circuito quanto o
layout da PCB foram elaborados utilizando a ferramenta AutoDesk (2021).
Finalizado o projeto da camada de hardware, iniciaram-se os processos que envolvem
a criação do firmware, os quais são apresentados na próxima seção.
Fonte: Autor
3.2 Firmware
Como já mencionado, firmware, por definição, é um software ou conjunto de
instruções programado na ROM (ready-only memory) de um dispositivo de hardware
(NIST-GLOSSARY, 2021). Ele fornece as instruções necessárias para a inicialização das
rotinas de funcionamento de um equipamento.
Em relação ao protótipo proposto, é nessa camada que estão inseridas as rotinas
de operação e validação durante a aquisição dos dados. O firmware criado decide, com
base nas configurações pré-definidas, quais sensores irá ler, como irá realizar essa leitura,
quais cálculos deverão ser realizados para correta aquisição, além de decidir se esse dado
3.2. Firmware 65
Fonte: Autor
Fonte: Autor
deve ser registrado, em qual periodicidade, se será enviado a alguma porta, dentre outras
operações.
A Figura 21 mostra uma perspectiva lógica da camada de firmware, que contempla as
66 Capítulo 3. Materiais e Métodos
Fonte: Autor
3.2.1 Requisitos
Seguindo a metodologia proposta, a Tabela 18 apresenta um recorte com os princi-
pais requisitos identificados para a camada de firmware. Os demais requisitos existentes
bem como seu detalhamento estão disponíveis no Apêndice A.
Priori- Depen-
Requisito Descrição Tipo dade dência
RFF-01: Co- O firmware deve ser capaz de iniciar as portas de comuni- Funcional Alta Inexistente
municação Se- cação serial existentes no hardware.
rial
RFF-02: Reló- O firmware deve ser capaz de iniciar o módulo RTC exis- Funcional Alta RFF-01
gio de tempo tente no hardware, buscando data e hora atual com base
real (RTC) na sua última sincronização. Caso algum problema ocorra
nesse processo, uma mensagem de erro deve ser lançada na
interface serial RS232 e o processo deve ser interrompido.
3.2. Firmware 67
RFF-03: Car- O firmware deve ser capaz de iniciar o cartão de memória. Funcional Alta RFF-01
tão de memó- Caso algum problema ocorra nesse processo, uma mensa-
ria gem de erro deve ser lançada na interface serial RS232 e o
processo deve ser interrompido.
RFF-04: Ar- O firmware deve ser capaz de localizar o arquivo de confi- Funcional Alta RFF-01
quivo de con- guração e extrair todos os parâmetros necessários ao seu
figuração funcionamento. Caso algum problema ocorra nesse pro-
cesso, uma mensagem de erro deve ser lançada na interface
serial RS232 e o processo deve ser interrompido.
RFF-07: Co- O firmware deve ser capaz de coletar as informações dos Funcional Alta RFF-03
leta diversos sensores configurados, tanto analógicos quanto di- e RFF-
gitais, em seu intervalo previamente determinado e acionar 04
o processo de armazenamento. Durante o processo de coleta,
serão realizados também os cálculos necessários, conforme
configuração, para tornar o dado coletado interpretável ao
usuário final.
RFF-08: O firmware deve ser capaz de armazenar as informações Funcional Alta RFF-02,
Armazena- coletadas em arquivos no cartão de memória. RFF-03
mento e RFF-
04
RFF-09: En- O firmware deve ser capaz de enviar os dados coletados, se Funcional Média RFF-01,
vio dos da- assim configurado, para as portas de comunicação RS232 RFF-02,
dos em tempo e/ou RS485. O dado será enviado conforme padrão de RFF-03
real armazenamento, sendo: data e hora da coleta, identificação e RFF-
do sensor, valor bruto, valor interpretável pelo usuário. 04.
Essa funcionalidade permite a visualização em tempo real
dos dados coletados, evitando assim a retirada frequente do
cartão SD e facilitando o acesso às informações pelo usuário,
seja por interface gráfica ou por visualização textual em
um software de Terminal RS232.
RNFF-02: Ta- O firmware deve possuir tamanho máximo de 253.932 bytes, Não Alta Inexistente
manho limite da plataforma do Arduino Mega 2560, considerando Funcio-
todas suas linhas de código e bibliotecas necessárias ao seu nal
funcionamento.
68 Capítulo 3. Materiais e Métodos
RNFF-03: O processo de armazenamento deverá registrar dois ar- Não Alta RFF-08
Tipos de quivos com dados em formatos distintos, o primeiro em Funcio-
arquivo formato “.RAW” e o segundo em formato “.CSV”. O pri- nal
meiro, registrará a data e hora, a identificação do sensor e
seus respectivos valores, tanto brutos (leitura sem aplicação
de cálculo), quanto em formato interpretável ao usuário
(após aplicação dos cálculos previamente configurados).
Deve ser criado um arquivo por dia e seu nome deve ser
composto pela data em formato “ddmmaaaa”. Esse arquivo
deverá estar dentro de uma pasta com a identificação do
equipamento. O segundo arquivo, registrará a data, a hora
e os valores dos sensores (após a aplicação dos cálculos
previamente configurados). Deve ser criado um arquivo por
dia e seu nome deve ser composto pela data em formato
“ddmmaaaa”. Esse arquivo deverá estar dentro de uma
pasta com a identificação do equipamento e deve conter
um cabeçalho identificando a ordem dos dados coletados.
No firmware padrão, os dados provenientes da porta RS485
serão gravados em um arquivo adicional, com extensão
“.RS485”, dentro de uma pasta gerada com o nome do da-
talogger.
Fonte: Autor
3.2.2 Projeto
O projeto constitui-se da elaboração de um diagrama de atividades a fim de elencar
as funções internas, organizar o fluxo de suas execuções e guiar o desenvolvimento do
código fonte.
A Figura 22 mostra o diagrama de atividades elaborado, que apresenta a sequência
de validações e funções que devem ser realizadas pelo firmware.
Concluído o projeto do firmware, iniciou-se com o planejamento da camada de
software, que é apresentada na próxima seção.
3.3. Software 69
Fonte: Autor
3.3 Software
Fonte: Autor
70 Capítulo 3. Materiais e Métodos
3.3.1.1 Requisitos
Priori- Depen-
Requisito Descrição Tipo dade dência
RFSC-01: In- O sistema deve possuir campos para configuração de todas Funcional Média Inexistente
terface para as suas funcionalidades, sendo: nome da estação (limitado a
configuração 8 caracteres, sem acentos ou caracteres especiais), intervalo
de coleta, intervalo de transmissão, 16 portas analógicas
(com seus respectivos parâmetros para cálculo, necessários
para se chegar à grandeza desejada) e 2 portas digitais
contadoras de pulso.
RFSC-02: O sistema deve disponibilizar uma função para ajustar Funcional Alta Inexistente
Sincronizar o horário do equipamento de acordo com o horário do
RTC computador. Essa funcionalidade deverá ser executada no
primeiro uso ou caso permaneça por longo período fora de
operação.
3.3. Software 71
RFSC-03: O sistema deve estar apto a criar um arquivo em formato Funcional Média Inexistente
Criar arquivo “.TXT”, contendo todas as configurações realizadas na in-
de configura- terface gráfica. Esse arquivo deverá ser copiado para cartão
ção SD que será utilizado pelo equipamento.
RFSC-04: En- O sistema deve estar apto a realizar o envio de aplicações Funcional Alta Inexistente
vio de aplica- (firmwares) ao equipamento. O envio será feito por meio
ções (firmwa- de uma porta de comunicação que deve ser selecionada
res) antes do envio. As aplicações disponíveis devem ser: teste
de funcionamento (que exibirá os dados de segundo em
segundo), aplicação de produção (que realizará a coleta
e envio de acordo com o configurado) e atualização de
horário (que deverá ser utilizada na primeira utilização
do equipamento ou após ter ficado sem utilização durante
períodos maiores que uma semana).
RNFSC-01: O sistema deve dispor de uma tela de informação, onde Não- Baixa Inexistente
Tela de infor- são descritas a motivações do projeto. Funcional
mação
RNFSC-03: O sistema deve dispor de um manual de instalação, que irá Não- Baixa Inexistente
Manual de abrir um arquivo PDF para auxiliar o usuário a instalar o Funcional
instalação do ambiente de visualização do datalogger.
ambiente
RNFSC-04: O sistema de configuração deve estar apto a executar em Não- Média Inexistente
Multiplata- plataformas Linux e Windows. Funcional
forma
Fonte: Autor
3.3.1.2 Projeto
Fonte: Autor
Fonte: Autor
3.3. Software 73
3.3.2.1 Requisitos
Priori- Depen-
Requisito Descrição Tipo
dade dência
3.3.2.2 Projeto
Fonte: Autor
id INTEGER
data TIMESTAMP
sensorNome VARCHAR
valor DOUBLE
Fonte: Autor
3.4 Validação
Considerando que a validação de requisitos é o processo pelo qual se verifica se
os requisitos identificados para o sistema realmente o definem quanto às necessidades e
expectativas dos stakeholders (SOMMERVILLE, 2011), nesta seção, comenta-se sobre
como este processo foi conduzido para o projeto do datalogger.
3.4. Validação 75
Porcentagem
Cenário Resultado
de código
Iniciar o datalogger sem sincroni- Dados gravados ficarão com a data da compilação do
100%
zar relógio sistema, não reproduzindo a data/hora reais.
Iniciar o datalogger sem cartão Será gerado um erro informando ao usuário que o
7%
SD cartão não foi encontrado
Iniciar o datalogger com cartão O datalogger será iniciado com configuração padrão,
SD, mas sem arquivo de configu- sem nenhum sensor habilitado e irá ficar funcionando, 9%
ração porém sem executar nenhuma função
O datalogger será iniciado com configuração padrão,
Iniciar o datalogger com arquivo
sem nenhum sensor habilitado e irá ficar funcionando 9%
de configuração fora do padrão
porém sem executar nenhuma função
Iniciar o datalogger com arquivo
O datalogger irá realizar os processos previstos 100%
de configuração correto
Travamento por falha de proces- Caso fique por 8 segundos ou mais sem resposta, irá
-
samento reiniciar automaticamente
Fonte: Autor
Porcentagem
Cenário Resultado
de código
4 Resultados
4.1 Datalogger
4.1.1 Hardware
Após elaborados e revisados os projetos descritos na Subseção 3.1.3, foi necessário
realizar a confecção da placa de circuito impresso (PCB), de 200mm x 140mm, que se
encontra ilustrada na Figura 27 e foi executada pela empresa JLCPCB (2020).
Fonte: Autor
Fonte: Autor
4.1. Datalogger 79
4.1.2 Firmware
Seguindo um dos conceitos chave das Metodologias Ágeis de desenvolvimento que
é o de software em funcionamento ao invés de documentação completa (MANIFESTO,
2004), logo após a extração dos requisitos necessários para atendimento a solução proposta
e a elaboração do diagrama de atividades apresentado no Capítulo 3, foi realizada a criação
do código de programação contido no Apêndice C, que controla o datalogger. O código foi
desenvolvido na linguagem C++ (C++, 2021), que é a padrão da plataforma Arduino.
Para seu desenvolvimento, compilação e testes foi utilizada a interface de desenvolvimento
Arduino IDE, que também é disponibilizada pela Arduino (ARDUINO, 2021a).
80 Capítulo 4. Resultados
(c)
4.1.3 Software
4.1.3.1 Software de Configuração
Fonte: Autor
Fonte: Autor
Fonte: Autor
A Figura 32 identifica a opção “Aplicações”, que possibilita o envio das três opções
de aplicação existentes ao equipamento. O botão “Testar funcionamento” realiza a coleta
de informações de segundo em segundo, conforme configurações previamente realizadas, e
disponibiliza essas informações coletadas na aba “Dados em Tempo Real” para que possam
ser avaliadas e eventualmente corrigidas. Já o botão “Enviar aplicação de produção” faz
com que o equipamento entre em modo de “produção”, o que significa que passa a realizar
as coletas e envios de acordo com as configurações previamente determinadas. Por último,
a opção “Sincronizar horário” atualiza o relógio interno do equipamento. É necessária a
execução de tal processo na primeira utilização do equipamento ou após períodos maiores
do que 7 dias sem utilização (desligado).
4.1. Datalogger 83
Fonte: Autor
Fonte: Autor
84 Capítulo 4. Resultados
Fonte: Autor
Teste Resultado
Simuladores de chuva são equipamentos que utilizam aspersores para lançar quan-
tidades controladas de água sob uma amostra de solo. Tais equipamentos visam simular
condições de velocidade de distribuição e impacto das gotas de chuva, de intensidade de
precipitação, do ângulo de impacto das gotas e duração de chuvas intensas (BRANDÃO,
2006). Para análise dos resultados de experimentos realizados por meio desse tipo de
simulador, é imprescindível o uso de dataloggers, pois é necessário registrar, ao longo
de períodos de tempo pré-definidos, diversas amostras de dados dos múltiplos sensores
envolvidos.
O simulador de chuva construído por Chang (2021) na sua tese de doutorado (em
andamento) em Engenharia de Energia na Agricultura, vinculado ao Centro de Ciências
Exatas e Tecnológicas da UNIOESTE, tem como principal objetivo, por meio dos dados
adquiridos, realizar o desenvolvimento e validação de modelos de perda de água e do solo
por escoamento superficial em função da taxa de cobertura vegetal. A Figura 35 mostra o
projeto do simulador proposto pelo pesquisador, indicando suas partes e características.
A amostra de solo utilizada foi proveniente do Instituto Agronômico do Paraná -
IAPAR - polo regional de Santa Tereza do Oeste – PR, que é classificado como Latossolo
Vermelho Distroférrico típico, com textura argilosa a muito argilosa (SANTOS et al., 2018).
Na Tabela 26 são mostradas as proporções de silte, argila e areia do solo utilizado no
experimento realizado.
4.2. Aplicação em um simulador de chuva 87
Descrição Valor
Fonte: Autor
Fonte: Autor
Descrição Valor
O firmware do datalogger teve de ser adaptado para realizar a leitura do sensor, uma
vez que a especificação padrão do projeto não contempla a leitura de sensores de operação
específica. A implementação da adaptação se deu de forma rápida, pois o funcionamento
do sensor é simples e existem diversos exemplos de sua utilização na internet. É importante
ressaltar que o tempo envolvido entre o envio e o retorno dos pulsos (jitter) variou, nos
testes realizados, entre 80 ms e 120 ms e não impactou nas demais rotinas realizadas pelo
datalogger.
O funcionamento do sensor se baseia no envio e retorno (echo) de sinais ultrassônicos.
Com base no tempo entre envio e retorno, é possível calcular a distância entre o sensor e o
objeto detectado. Primeiramente é enviado um pulso de 10 microssegundos, indicando o
início da transmissão de dados. Depois disso, são enviados 8 pulsos de 40 KHz. O sensor
aguarda o retorno (em nível alto) para determinar a distância entre o sensor e o objeto,
utilizando a Equação 4.1 (FILIPEFLOP, 2020), em que D é a distância, T é o tempo do
echo em nível alto e Vs é a velocidade do som.
Na aplicação realizada no projeto de Chang (2021) esse sensor foi utilizado para
realizar medição da distância entre a borda e o fundo de um recipiente de dimensões
conhecidas, sendo possível, dessa forma, calcular o volume de água existente.
A Tabela 29 mostra as características técnicas do sensor de acordo com o fornecedor.
A especificação técnica completa do sensor foi adicionada no Anexo B.
92 Capítulo 4. Resultados
Descrição Valor
4.2.4 Calibração
Após a escolha dos sensores para atender a automação do simulador de chuva,
foi necessário avaliar se as características de funcionamento e precisão descritas nas
especificações disponibilizadas pelos fabricantes estavam condizentes com a realidade. Para
tanto, cada um dos sensores passou por um processo de calibração, comparando-se os dados
coletados com medições empíricas, para validar se os valores lidos refletiam a realidade.
Foram aplicados modelos estatísticos com o intuito de avaliar a aquisição de dados
de cada sensor por meio da leitura computada pelo datalogger. Após estimar os valores dos
parâmetros nos modelos usando ajuste por Regressão Linear Simples, três métricas foram
utilizadas para medir a qualidade dos ajustes, sendo elas o coeficiente de determinação
(r2 ), os resíduos quadráticos (θ2 ) e o erro quadrático médio (RMSE). Suas equações são
apresentadas, respectivamente, em (4.2), (4.3) e (4.4).
n
θ2 = (Xex − Xadj )2 (4.3)
X
i=1
sP
i=1 (Xex − Xadj )2
n
RM SE = (4.4)
n
Em que Xex representa os valores experimentais, Xadj os valores ajustados e n o tamanho
amostral. Para avaliação do teste de significância dos modelos construídos foi utilizado o
P-valor, sendo que, se P-valor < 0.05, então o modelo é significativo a 5%.
Nas subseções seguintes são detalhados os processos realizados para cada um dos
sensores.
Fonte: Autor
600
Vazão(L h-1)
400
200
25 50 75
Frequência (Hz)
Quadro 5 – Correlação entre vazão e frequência para cálculo da razão em mL por pulso
Vazão Frequência Vazão Pulsos por Razão
(L h−1 ) (Hz) (L/min) minuto (mL/pulso)
120 16 2 960 2,08
240 32,5 4 1950 2,05
360 49,3 6 2958 2,03
480 65,5 8 3930 2,04
600 82 10 4920 2,03
720 90,2 12 5412 2,22
Fonte: Autor
Antes de iniciar a coleta dos dados provenientes do sensor, foi necessário apurar
também qual a vazão (L h−1 ) encontrada para as diferentes pressões de entrada disponíveis
4.2. Aplicação em um simulador de chuva 95
no simulador, que são de 5, 10, 20, 30, 40, 50 e 60 mca. Assim sendo, o simulador foi
colocado em funcionamento durante 1 minuto e foi utilizado um balde graduado para
apurar qual o volume de água seria acumulado. Foram realizadas 3 repetições do teste
para então ser calculada a média dos valores (L h−1 ) registrados. O Quadro 6 apresenta os
dados encontrados.
Figura 43 – Regressão linear dos dados experimentais da vazão de água com a leitura do
sensor.
80
70
Vazão(L h-1)
60
50
40
30
20
150 200 250 300 350 400 450 500 550 600 650 700
Leitura do sensor (pulsos)
Fonte: Autor
4.2. Aplicação em um simulador de chuva 97
V = aF + b
a b r 2
θ2 RMSE P-valor
0,123 0,920 0,990 111,517 2,304 9,52E-20
Fonte: Autor
Fonte: Autor
Quadro 8 – Média de distância lida pelo sensor de acordo com volume adicionado
Média
Volume Medida R1 do Medida R2 do Medida R3 do
distância lida
(L) sensor (cm) sensor (cm) sensor (cm)
(cm)
0 25,72 25,7 25,7 25,71
1 23,1 23,1 23,62 23,27
2 21,25 20,94 20,92 21,04
3 19,17 19,22 19,28 19,22
4 16,46 16,62 16,67 16,58
5 14,9 15,02 14,52 14,81
6 12,42 13 12,49 12,64
7 10,91 10,52 10,52 10,65
Fonte: Autor
6
Volume de água (L)
10 15 20 25
Leitura do sensor ultrassônico (cm)
Fonte: Autor
V = aS + b
a b r2 θ2 RMSE P-valor
-0,466 11,890 0,999 0,161 0,082 2,45E-33
Fonte: Autor
4.2. Aplicação em um simulador de chuva 99
Com dados obtidos nesse teste, é possível notar que os sensores apresentam estabili-
dade na leitura dos dados entre as repetições (colunas). Porém, houve maior variabilidade
nos valores lidos quando comparadas às leituras realizadas por sensores diferentes (linhas).
Para confirmar tal inferência, foi realizada uma análise de variância (ANOVA) em
Delineamento Inteiramente ao Acaso para testar as hipóteses para verificar sua consistência
com os dados. Tais hipóteses estatísticas, que são complementares, são:
H0 : É a hipótese que está sendo testada, e nela admite-se que a diferença entre os
tratamentos não seja significativa, ou seja, que todos os tratamentos sejam iguais.
H1 : Admite-se que a diferença entre os tratamentos seja significativa, ou seja, que
a umidade em pelo menos um dos sensores seja diferente dos demais.
Na análise de variância, a regra de decisão é dada por: aceita-se H0 quando Fcal
≤ Ftab , em que Ftab corresponde ao valor da distribuição F para k − 1 e n − k graus de
liberdade das estimativas entre os tratamentos e dentro dos tratamentos a um nível de
significância de 5%. Caso contrário, rejeita-se tal hipótese.
100 Capítulo 4. Resultados
Observa-se, porém, que esta forma de apresentar o resultado pode não fornecer a
noção de quanto a variável calculada por meio do teste está distante da região crítica, e
qual é o risco que está se assumindo quando se aceita ou rejeita a hipótese nula. Uma
solução é realizar uma análise da Probabilidade de Significância, ou P-valor, que fornece
informações adicionais à decisão tomada, já que P-valor é a probabilidade de se obter um
valor da estatística de teste tão ou mais extremo que o valor observado, supondo-se H0
verdadeira. Como o P-valor é o menor nível de significância que leva à rejeição de H0 , se o
P-valor < α, rejeita-se H0 .
Foi utilizado o software R (RPROJECT, 2021) para realização do teste e os
resultados obtidos estão apresentados na Tabela 34 e Tabela 35, para a comparação dos
sensores na fase seca e úmida, respectivamente.
GL: graus de liberdade; SQ: soma dos quadrados; SQM: soma dos
quadrados médios.
Fonte: Autor
4.2. Aplicação em um simulador de chuva 101
GL: graus de liberdade; SQ: soma dos quadrados; SQM: soma dos quadrados
médios.
Fonte: Autor
Como o valor encontrado para P-valor foi menor do que 0,05, rejeita-se a hipótese
nula, ou seja, sabe-se que os tratamentos possuem diferença significativa.
Embora a análise de variância viabilize estudar que as médias das amostras no
problema em análise não são estatisticamente equivalentes, tal metodologia não propicia
detectar quais são as médias diferentes das demais, sendo usual complementar o método
ANOVA com testes de comparação múltiplas de médias, como os de Tukey, Ducan e
Scott-Knott, que localizam as diferenças entre as médias dos tratamentos. O Teste de
Tukey, por ser bastante rigoroso e de fácil aplicação, é amplamente utilizado na análise de
experimentos agrícolas para determinar quais médias diferem entre si quando a ANOVA
indica pela rejeição da hipótese de igualdade entre as médias.
O teste de Tukey consiste no cálculo da Diferença Mínima Significativa (DMS),
apresentado por (4.5):
√
qα QM R
∆α = (4.5)
r
Em que ∆ é a diferença mínima significativa, que é a amplitude mínima para que as
médias sejam estatisticamente diferentes entre si; QM R o quadrado médio dos resíduos e
r o número de repetições em cada tratamento. O teste de hipótese considerado são:
H0 : A comparação entre duas médias são iguais;
H1 : As médias são estatisticamente diferentes.
Dessa forma, se a amplitude entre duas médias for maior que ∆, então rejeita-se a
hipótese nula em favor de hipótese alternativa.
Por conseguinte, e considerando os resultados dos P-valores apresentados nas
Tabela 34 e Tabela 35, indicando respectivamente pela rejeição das hipóteses nulas para
as igualdades entre as médias dos resultados dos sensores de umidade nas fases seca e
úmida, deve-se realizar um teste de comparação múltiplas de médias para verificar quais
resultados são estatisticamente iguais (diferentes). O Quadro 10 mostra os resultados
obtidos por meio do Teste de Tukey para as leituras nos sensores de umidade nas fases
seca e úmida, quando realizada a análise por coluna no referido quadro. As letras latinas
minúsculas iguais apresentadas nas linhas deste quadro indicam que são estatisticamente
102 Capítulo 4. Resultados
iguais as médias, enquanto as letras diferentes indicam que são estatisticamente distintas
as médias analisadas. Assim, na fase Seco nota-se que são estatisticamente iguais as médias
das leituras dos sensores 3, 4 e 6, sendo distintas as demais médias. Na fase Úmida nota-se
que são estatisticamente iguais as médias das leituras dos sensores 2 e 5 e 3 e 7, também
sendo distintas as demais médias.
Quadro 10 – Teste de Tukey para a comparação das médias entre as leituras dos nove
sensores de umidade.
Médias seguidas de mesma letra na coluna não diferem estatisticamente entre si pelo teste
de Tukey a 5% de probabilidade.
Fonte: Autor
Foi possível concluir que a maioria dos sensores é estatisticamente diferente, mesmo
para fase seca e molhada, sendo necessário realizar uma calibração específica para cada
sensor por meio de regressão. Assim sendo, estabeleceu-se uma metodologia para realização
da calibração, que consiste na execução de uma sequência de procedimentos, que seguem
representados no Algoritmo 1 e que são detalhados individualmente na sequência do texto.
4.2. Aplicação em um simulador de chuva 103
Fonte: Autor
Com o resultado obtido, assumiu-se que o solo totalmente seco possui o peso de
500,05g e umidade de 0%. O solo totalmente úmido possui o peso de 793,47g, como
mostrado no Quadro 12. A Equação 4.6 foi utilizada para encontrar o percentual de
umidade, em que U é a umidade do solo, MSU a massa do solo úmido e MSS a massa do
solo seco.
(M SU − M SS)
U= (4.6)
(M SS)
(SA − SS)
QApote = (pote − 1) (4.7)
NA − 1
Uma vez que todos os potes estavam preparados com uma amostra de solo de
umidade conhecida, os sensores foram colocados no solo, em ordem de 1 a 9 (linha 16). Os
potes foram tampados com papel alumínio e elásticos para evitar a perda de umidade (linha
17). Uma vez que todas as amostras estavam devidamente preparadas e com seus respectivos
sensores, iniciou-se o registro dos dados, conforme exibido na Figura 48. Realizou-se a
partir deste ponto um processo de permutação cíclica dos sensores nas amostras de solo
(linhas 19 a 23), a fim de que se obtivesse a leitura de cada um dos 9 sensores em cada uma
das 9 amostras disponíveis. Para cada etapa da permutação, foram realizadas 3 repetições
de coleta de dados. Um esquema gráfico da metodologia é apresentado na Figura 47.
A média dos resultados brutos obtidos por meio das leituras dos sensores está
descrita no Quadro 13. O valor bruto trata-se de um valor referenciado à tensão lida na
porta analógica, com base na resolução do conversor analógico/digital do datalogger, que
é de 10 bits (1023), conforme abordado na Subseção 3.1.2. Com esse valor de referência
torna-se possível, após o processo de calibração e regressão, chegar a uma estimativa
confiável do valor de umidade do solo.
106 Capítulo 4. Resultados
Sensor
1 2 3 4 5 6 7 8 9
Dry Saturated
Sensor
Soil
Fonte: Autor
Uma vez finalizada a permutação, foram coletadas e pesadas três amostras de solo
de cada um dos potes (linhas 26 a 29). Essas amostras passaram por processo de secagem
na estufa a 105ºC e foram então pesadas novamente, a fim de possibilitar o cálculo da
umidade do solo.
Com a apuração da umidade realizada na linha 30 e com a massa de dados capturada
na linha 27, foi realizado o processo de regressão. Os resultados da análise de regressão são
apresentados na Tabela 36 e evidenciaram que todos os coeficientes foram significativos a
5%, com coeficientes de determinação (r2 ) todos acima de 0,85, o que representa um bom
desempenho dos sensores em relação à estabilidade das coletas. Foi adotada a hipótese
de que o tipo de solo e a temperatura causam pouca influênicia nas leituras, conforme
4.2. Aplicação em um simulador de chuva 107
identificado por Radi et al. (2018). A visualização dos dados observados e ajustados por
meio desses coeficientes é apresentada na Figura 49. Vale destacar que os sensores 8 e
9, que apresentaram melhor desempenho nas métricas tendo menores índices de RMSE,
foram os que receberam o isolamento do circuito por meio da fita isolante líquida, padrão
que passou a ser adotado conforme descrito na Seção 4.2.1.
Sensor U = aL + b
a b r 2
θ2 RMSE P-valor
1 -0,23 105,19 0,85 1914,85 7,29 1,23E-15
2 -0,26 120,32 0,95 701,14 4,41 4,46E-23
3 -0,24 108,50 0,90 1240,91 5,87 7,48E-19
4 -0,26 118,28 0,94 724,21 4,49 7,75E-23
5 -0,24 114,23 0,92 1172,06 5,71 2,83E-19
6 -0,24 112,78 0,94 777,04 4,65 2,57E-22
7 -0,25 114,51 0,95 679,68 4,35 2,63E-23
8 -0,26 125,31 0,99 281,18 2,79 7,89E-30
9 -0,28 102,64 0,97 389,21 3,29 1,93E-27
40
20
4 5 6
Umidade do solo (%)
60
40
20
7 8 9
60
40
20
200 300 400 500 200 300 400 500 200 300 400 500
Leitura dos sensores de umidade (V)
Observado Ajustado
Fonte: Autor
Logger, apresentado na seção 2.4. O DLight Logger foi escolhido para realização dos testes
pois foi o único que pôde ser disponibilizado em caráter de empréstimo. A escolha de
apenas 4 sensores para essa comparação se deu pela limitação da quantidade de portas
existentes no datalogger comercial.
O experimento realizado fez uso de 3 coberturas de resíduos da cultura de soja, de
0, 5 e 10 t ha−1 de massa seca sobre a amostra de solo e a 3% de declive. O objetivo foi
verificar a influência da cobertura no umedecimento do solo em 3 camadas de profundidade
(0-10 cm, 10-20 cm, e 20-30 cm), visto que a umidade no perfil representa o conteúdo de
água disponível para as plantas.
A coleta foi realizada em 3 períodos com o uso do simulador de chuvas, uma para
cada nível de cobertura e com duração de 20 minutos de aplicação do jato de água a
50 mca. Entre esses períodos, houve um intervalo de repouso de uma semana em que
foram utilizadas lâmpadas infravermelhas para acelerar a secagem do solo até que as
umidades inciais estivessem aproximadamente iguais. O esquema de secagem visualizado
na Figura 50 mostra o ângulo de visão da caixa de solo e o local em que estão embutidos
os sensores de umidade (??). A secagem foi monitorada diariamente via acesso remoto,
por meio do software anydesk, ao netbook conectado aos dataloggers.
15
Incremento de umidade (%)
10
Fonte: Autor
235
230
225 r = 0.973
0 25 50 75 100 125
Tempo (min)
Fonte: Autor
GL: graus de liberdade; SQ: soma dos quadrados; SQM: soma dos quadrados médios.
Fonte: Autor
a realização de toda a coleta de dados e análises descritas na Seção 4.2 sem a incidência
de falha e sem dificuldade de operação pelos pesquisadores envolvidos.
113
5 Conclusão
6 Trabalhos futuros
Referências
BRANDÃO, V. Infiltração da água no solo. [S.l.]: Viçosa: Editora UFV, 2006. Citado na
página 86.
CAMPBELL SCIENTIFIC. CR1000 Datalogger. [S.l.], 2013. Rev. 2/18. Citado 2 vezes
nas páginas 52 e 53.
RADI et al. Calibration of capacitive soil moisture sensor (sku:sen0193). In: 2018 4th
International Conference on Science and Technology (ICST). [S.l.: s.n.], 2018. p. 1–6.
Citado na página 107.
SANTOS, H. G. dos et al. Sistema brasileiro de classificação de solos. [S.l.]: Brasília, DF:
Embrapa, 2018., 2018. Citado na página 86.
STEVENS WATER. Manual for DLight Data Logger. [S.l.], 2013. Rev. 1. Citado 4 vezes
nas páginas 45, 53, 54 e 55.
1. Introdução
Para a Tecnologia da Informação, dado é uma representação simbólica de atributos qualitativos ou
quantitativos relacionados com observações de eventos, fenômenos, sistemas, processos ou
estados de qualquer natureza. A Informação é a resultante do processamento dos dados que pode
empregar uma abordagem sistemática em que são realizadas sua coleta, armazenamento,
tratamento e análise. O processamento de dados providos de relevância e propósito é a base da
transformação digital que afeta os atuais paradigmas de geração de conhecimentos, produtos,
1
processos e negócios com impacto direto em aplicações que requerem integração e análise dos
dados coletados.
Essa situação se repete no caso específico de dados ambientais, indispensáveis para o
monitoramento de recursos hídricos, eólicos e solares, e na prevenção ou mitigação de desastres
naturais, entre outras aplicações. Essas ações dependem da coleta de dados, que podem requerer
observações contínuas ou durante longo período de tempo, e que se realizados manualmente
podem ter elevado custo de recursos humanos e baixa confiabilidade. A automação da atividade de
coleta de dados viabiliza eliminar esses problemas, padronizar sua organização, garantir sua coleta
em situações temporais contínuas e em condições ambientais adversas, além de tornar sua
transmissão mais eficiente e robusta.
Nesse sentido, este texto constitui o documento de requisitos cuja elaboração teve por objetivo
principal especificar os requisitos funcionais e não funcionais de um coletor de dados (datalogger),
que consiste em um sistema de hardware, firmware e software que registra automaticamente os
dados de interesse, sendo composto basicamente por microprocessadores, memória interna,
conexões para sensores e conexões de entrada e saída dos dados, além dos softwares de
configuração e interface. Trata-se de uma das atividades decorrentes de um trabalho vinculado ao
mestrado em Ciência da Computação da Universidade Estadual do Oeste do Paraná cujo objetivo
principal é desenvolver e analisar o uso de um protótipo de datalogger de baixo custo, configurável
e com ampla aplicabilidade na coleta e registro de dados ambientais.
Cabe dizer que Requisitos Funcionais são declarações de serviços que o sistema deve fornecer, de
como o sistema deve reagir a entradas específicas e de como o sistema deve se comportar em
determinadas situações. Em alguns casos, os requisitos funcionais também podem explicitar o que
o sistema não deve fazer (Sommerville, 2011). Requisitos Não-Funcionais, também chamados de
atributos de qualidade, são restrições aos serviços ou funções oferecidas pelo sistema. Incluem
restrições de tempo, de processo de desenvolvimento, de normas, etc. Em geral, aplicam-se ao
sistema como um todo (Sommerville, 2011).
Este documento está assim organizado. A Seção 2 apresenta uma visão geral do datalogger
proposto. A Seção 3 apresenta os stakeholders envolvidos na concepção do protótipo. A Seção 4
apresenta os conceitos chave utilizados no texto. A Seção 5 apresenta a caracterização de prioridade
dos requisitos. A Seção 6 apresenta os requisitos funcionais, não funcionais e diagramas de
Hardware do datalogger. A Seção 7 apresenta os requisitos funcionais, não funcionais e diagramas
relativos ao Firmware. A Seção 8 apresenta os requisitos funcionais, não funcionais e protótipo não
funcional do Software de Configuração. A Seção 9 apresenta os requisitos funcionais e o protótipo
não funcional do Software de Exibição, exclusivo para operação em laboratório. A Seção 10
apresenta os diagramas de casos de uso e a interação dos atores com o datalogger e softwares
criados. A Seção 11 apresenta as validações e testes realizados no protótipo durante e após sua
confecção. A Seção 12 apresenta a referência bibliográfica utilizada.
2. O datalogger
O datalogger consiste em um sistema que deve contar com hardware para leitura e registro dos
dados, firmware configurável, software para sua configuração e software para exibição dos dados
coletados. A Figura 1 ilustra sinteticamente a estrutura do protótipo.
2
Figura 1 - Ilustração sintética da estrutura do protótipo
Fonte: Autoria própria
Tendo como uma das principais motivações ser simples e funcional, o protótipo pretende ser
suficientemente embasado tecnicamente, com interface adequada ao usuário comum, pois o
desenvolvimento desse projeto visa viabilizar coletas de dados acessíveis, tanto em termos de custo
da solução, quanto pela facilidade de configuração e utilização. Por essas características, espera-se
ampliar as possibilidades de coleta e registro de dados de aspectos relevantes ou de potencial
interesse na gestão de dados ambientais, seja por pesquisadores, usuários não especializados ou
empresas que atuem em áreas correlatas.
O protótipo foi idealizado para abarcar dois tipos diferentes de operação, uso em campo ou uso em
laboratório. Dessa forma, foram propostos 2 softwares distintos, um para configuração do
equipamento e coleta dos dados em arquivo .TXT (modo campo) e um para exibição dos dados por
meio de acesso via ambiente web (modo laboratório).
O ambiente de campo exige o uso de equipamentos com menor consumo energético pois a maior
parte dos locais onde se faz necessária a coleta deste tipo de dados, em geral, não possui rede
elétrica e, portanto, deve-se fazer uso de energia proveniente de um conjunto de baterias e/ou
painéis solares. Para atender os requisitos desses cenários, o protótipo deve fazer uso apenas do
Arduino Mega 2560 para realização do processo de coleta dos dados. A escolha do Arduino Mega
2560 se deu devido ao seu baixo custo e fácil aquisição, à quantidade de portas analógicas
disponíveis (16) e também devido à quantidade de memória existente para execução das rotinas
internas.
Já para uso em ambiente de laboratório, é prevista a adição/conexão de um módulo Raspberry PI
para que os dados possam ser visualizados em tempo real à medida em que são coletados, seja em
um monitor, seja através da rede interna (acessando-se o endereço do equipamento). Essa
configuração do equipamento possui maior consumo de energia, portanto, deve ser alimentada
diretamente na rede de energia do local.
O diagrama da Figura 2 ilustra as camadas de software, firmware e hardware que compõem o
protótipo em ambos os cenários previstos, o de laboratório e o de campo. Cabe dizer que estas
camadas justificaram a opção de especificação neste documento de requisitos, de duas aplicações
distintas, denominadas Software de Configuração e Software de Exibição, melhor descritas ao longo
deste texto.
3
Figura 2 - Diagrama ilustrativo das camadas do protótipo
Fonte: Autoria própria
Mais detalhadamente, a Figura 3 mostrada a seguir ilustra a arquitetura geral do protótipo. Seu
objetivo é apresentar um modelo completo do sistema com seus diferentes componentes, suas
interfaces e conexões (Sommerville, 2011), envolvendo ambas as diferentes operações, em campo
ou em laboratório.
4
As Figuras 4 e 5 acrescentam um nível a mais de detalhamento da arquitetura, ilustrando as camadas
física e lógica do protótipo, respectivamente.
5
Figura 5 – Visão da camada lógica da arquitetura do protótipo
Fonte: Autoria própria
3. Stakeholders
Os seguintes stakeholders contribuíram, em diferentes fases e escopos, com a coleta, análise e
validação dos requisitos do sistema:
Prof. Dr. Deonir Secco, do Programa de Pós Graduação em Engenharia de Energia na Agricultura,
PPGEA-UNIOESTE. Atuou como idealizador e patrocinador do projeto do simulador de regimes de
chuva.
Pablo Chang, doutorando do Programa de Pós Graduação em Engenharia de Energia na Agricultura,
PPGEA-UNIOESTE. Atuou como idealizador e principal envolvido no levantamento de requisitos para
o projeto do simulador de regimes de chuva.
Prof. Dr. Rogério Luis Rizzi, do Programa de Pós-Graduação em Ciência da Computação, PPGCOMP-
UNIOESTE. Atuou como orientador desse projeto, participando ativamente no levantamento de
requisitos no que tange a dados científicos.
Prof. Dra. Claudia Brandelero Rizzi, do Programa de Pós-Graduação em Ciência da Computação,
PPGCOMP-UNIOESTE. Atuou como coorientadora desse projeto, participando ativamente na
elaboração do documento de requisitos e demais aspectos relativos à Engenharia de Software.
Leonardo Contini, técnico em mecatrônica, formado em Engenharia de Produção pela PUC-PR e
aluno de Tecnologia em Sistemas para Internet – UTFPR. Atuou como revisor do circuito impresso
criado nesse projeto e como principal envolvido no levantamento de requisitos para o projeto de
coleta de dados meteorológicos.
6
4. Conceitos
Esta seção apresenta os principais conceitos envolvidos neste projeto e neste documento de
requisitos organizados em ordem alfabética.
Arduino Mega 2560: O Arduino Mega 2560 é uma placa microcontrolada baseada no
microcontrolador ATmega2560. Possui 54 pinos de entrada / saída digital (dos quais 15 podem ser
usados como saídas PWM), 16 entradas analógicas, 4 UARTs (portas seriais de hardware), um
oscilador de cristal de 16 MHz, uma conexão USB, um conector de alimentação, um conector ICSP,
e um botão de reset.
Casos de uso: Casos de uso são uma técnica de descoberta de requisitos e, em geral, são
documentados por um diagrama de alto nível. O conjunto de casos de uso representa as possíveis
interações descritas nos requisitos. Ele identifica os atores envolvidos em uma interação com o
sistema (Sommerville, 2011).
Conversor TTL-RS485: Hardware que converte o nível lógico proveniente do protocolo RS485 em
nível de lógico do padrão TTL (Transistor Transistor Logic), que é o padrão de comunicação utilizado
pelo Arduino e Raspberry PI.
Dados Brutos: São dados em seu estado original ou RAW; significa que não passaram por nenhum
processamento. Os dados brutos estão associados e decorrem dos parâmetros de cálculo (ver
conceito de parâmetros de cálculo).
Diagrama esquemático do Circuito: É um diagrama que mostra os componentes e as interconexões
do circuito usando representações simbólicas padronizadas. A apresentação das interconexões
entre os componentes do circuito no diagrama esquemático não corresponde necessariamente aos
arranjos físicos no dispositivo acabado.
Geração de casos de teste: Tipo de verificabilidade que visa, por meio de diversos tipos de testes,
identificar problemas de requisitos. O desenvolvimento de testes a partir dos requisitos do usuário
antes de qualquer código escrito é parte integrante do Extreme Programming (Sommerville, 2011).
Parâmetro para Cálculo: São parâmetros definidos no momento da configuração dos dados a serem
processados. Por exemplo, supondo um sensor de temperatura analógico que esteja medindo 32
graus. O valor lido pelo datalogger será um número inteiro relativo ao nível de tensão ou da
intensidade da corrente elétrica que o sensor retornará naquele momento. No exemplo dos 32
graus, haveria um valor como 590, que após aplicados os devidos cálculos com base nas
características do sensor, apresentaria novamente os 32 graus. Esse valor de 590, seria considerado
o dado bruto ou “RAW data”.
Porta analógica: Uma entrada analógica é um sinal elétrico, mensurável, e definido numa gama de
valores. Esta entrada é gerada por um sensor e recebida por um controlador. A entrada analógica
varia continuamente de uma forma definida em relação à propriedade medida.
Porta digital contadora de pulso: Uma entrada digital possui a capacidade de atuar com variáveis
discretas digitais (dois dígitos '0' ou '1'). Pode atuar de forma como entrada, para que interprete se
o nível de sinal está alto (1) ou baixo (0), ou como saída, para que ao produzir um sinal alto (1) possa
acionar um relé, ou ao produzir um nível baixo (0), possa desligá-lo, por exemplo. A porta contadora
do pulso contabilizará por quantas vezes houve uma alteração no sinal (de 1 para 0 ou de 0 para 1).
Protocolo I2C: Inter-Integrated Circuit (I2C) é um barramento serial desenvolvido pela Philips que é
usado para conectar periféricos de baixa velocidade a uma placa mãe, ou a um sistema embarcado.
É implementado apenas com duas linhas: SDA – Serial Data e SCL – Serial Clock.
7
Prototipação: Tipo de verificabilidade que visa, por meio da apresentação aos stakeholders de
modelos do sistema, executáveis ou não, verificar se ele efetivamente atende as demandas
identificadas (Sommerville, 2011).
Raspberry PI: O Raspberry PI é um computador de baixo custo, do tamanho de um cartão de crédito.
Possui a capacidade de rodar distribuições Linux embarcadas, o que facilita a utilização de diversos
softwares e sua aplicação nos mais diversos tipos de solução.
Revisões de requisitos: Tipo de verificabilidade que visa analisar o documento de requisitos
sistematicamente por uma equipe de revisores objetivando identificar erros e inconsistências
(Sommerville, 2011).
Sensor I2C: O protocolo I2C descreve o funcionamento de um barramento de comunicação serial
que utiliza apenas dois fios. Inventado pela Philips no início da década de 90, este protocolo é muito
utilizado para conectar periféricos de baixa velocidade a placas mãe, micro controladores e afins.
Vários sensores de baixo custo, voltados a operação com Arduino e Raspberry, fazem uso desse
protocolo.
Sensor RS485: RS485 é uma interface de comunicação operando em linhas diferenciais capaz de se
comunicar com 32 “unidades de carga”. Normalmente, um dispositivo transmissor/receptor
corresponde a uma “unidade de carga”, o que faz com que seja possível comunicar com até 32
dispositivos. Alguns sensores ambientais, principalmente os que trabalham com a leitura de mais
de uma grandeza, fazem uso desse protocolo de comunicação.
Stakeholders: Qualquer indivíduo ou organização que, de alguma forma, é impactado pelas ações
de uma determinada empresa. Em uma tradução livre para o português, o termo significa parte
interessada ou envolvidos no projeto.
Verificabilidade: Visa identificar se os requisitos podem ser verificados no sentido de que o sistema
atende a cada requisito especificado. A verificabilidade envolve processos de revisões de requisitos,
prototipação e geração de casos de testes (Sommerville, 2011).
Verificação de completude: Visa identificar se todas as funções necessárias para os stakeholders
foram efetivamente listadas. O documento de requisitos deve incluir requisitos que definam todas
as funções e as restrições pretendidas pelo usuário do sistema (Sommerville, 2011).
Verificação de consistência: Visa identificar se há conflitos entre os requisitos já listados, ou seja,
não deve haver restrições contraditórias ou descrições diferentes da mesma função do sistema
(Sommerville, 2011).
Verificação de realismo: Visa identificar se os requisitos podem ser implementados com a
tecnologia e orçamento disponíveis. Usando o conhecimento das tecnologias existentes, os
requisitos devem ser verificados para assegurar que realmente podem ser implementados
(Sommerville, 2011).
Verificação de validade: Visa responder se o sistema fornece as funções que melhor atendem as
necessidades do usuário. No entanto, como o sistema tem diferentes stakeholders com diferentes
necessidades, a validade precisa considerar esses diferentes tipos de demandas e expectativas
(Sommerville, 2011).
Watchdog timer: É uma função ou dispositivo eletrônico temporizador que dispara um reset ao
sistema se o programa principal, devido a alguma condição de erro, deixar de funcionar.
8
5. Caracterização dos Requisitos
Na próxima seção são listados os requisitos do sistema. Cada requisito tem um identificador
único, uma descrição, um nível de prioridade e sua dependência. Quanto ao nível de prioridade,
adotou-se o seguinte padrão:
Alta: Os requisitos marcados com essa prioridade são obrigatórios.
Média: Os requisitos marcados com essa prioridade são desejados, mas não obrigatórios,
significando que o sistema pode operar sem eles, mas com alterações.
Baixa: Os requisitos marcados com essa prioridade são desejados, mas o sistema pode
operar sem eles sem grandes alterações.
Quanto à dependência, menciona-se após o uso deste termo, o identificador do(s) requisito(s) que
está(ão) a ele relacionado(s) em termos de dependência.
6. Hardware
6.1 Requisitos Funcionais de Hardware (RFH)
RFH-01: Hardware principal
Descrição: O equipamento deve possuir um hardware com conectores de ligação para acoplamento
de um Arduino Mega 2560, um Raspberry PI 3B+, um módulo de relógio, um módulo conversor TTL-
RS485 e demais componentes necessários ao seu funcionamento.
Prioridade: Alta.
Dependência: Não há.
RFH-02: Sistema de obtenção de data e hora
Descrição: O equipamento deve possuir um módulo relógio de tempo real (RTC - Real Time Clock)
para controle de data e hora. Esse relógio servirá de base tanto para o intervalo e período de coleta,
quanto para marcação no arquivo de registro dos dados.
Prioridade: Alta.
Dependência: RFH-01.
RFH-03: Sistema de Armazenamento de dados
Descrição: O equipamento deve possuir em seu hardware principal os componentes necessários
para que seja possível realizar o armazenamento de dados em um dispositivo de memória não
volátil (pen drive ou cartão SD), de forma que possam ser recuperados a qualquer momento pelo
usuário.
Prioridade: Alta.
Dependência: RFH-01.
RFH-04: Portas analógicas de leitura
Descrição: O equipamento deve possuir a capacidade de capturar leituras de até 16 sensores
analógicos com sinais de 4-20mA ou 0-5V. As leituras podem ser capturadas de forma individual ou
sequencial.
Prioridade: Alta.
Dependência: RFH-01.
9
RFH-05: Portas digitais para contagem de pulso
Descrição: O equipamento deve possuir a capacidade de capturar leituras de até 2 sensores de
efeito hall, realizando a contagem dos pulsos. As leituras podem ser capturadas de forma individual
ou sequencial.
Prioridade: Alta.
Dependência: RFH-01.
RFH-06: Portas digitais adicionais
Descrição: O equipamento deve possuir a capacidade de capturar leituras de até 5 sensores digitais.
As leituras podem ser capturadas de forma individual ou sequencial. Nem todos os sensores serão
implementados e, portanto, compatíveis com o firmware padrão, dada a necessidade de utilização
de bibliotecas específicas. A depender da aplicação e sensor a ser utilizado, o firmware padrão terá
de ser adaptado ou personalizado.
Prioridade: Baixa.
Dependência: RFH-01.
RFH-07: Portas I2C
Descrição: O equipamento deve possibilitar a ligação de sensores que façam uso do protocolo I2C.
Nem todos os sensores serão implementados e, portanto, compatíveis com o firmware padrão,
dada a necessidade de utilização de bibliotecas específicas. A depender da aplicação e sensor a ser
utilizado, o firmware padrão terá de ser adaptado ou personalizado.
Prioridade: Baixa.
Dependência: RFH-01.
RFH-08: Porta RS485
Descrição: O equipamento deve possibilitar a ligação de sensores que façam uso do protocolo
RS485.
Prioridade: Baixa.
Dependência: RFH-01.
RFH-09: Saídas de comunicação RS232 ou RS485
Descrição: O equipamento deve possuir saídas de comunicação em padrão RS232 e RS485, para
intercomunicação com outros equipamentos.
Prioridade: Média.
Dependência: RFH-01.
RFH-10: Alimentação
Descrição: O equipamento deve ser alimentado por corrente contínua (CC). O sistema pode ser
alimentado por meio de uma fonte (ligada à tomada) ou então por meio de bateria, controlador de
carga e painel solar.
Prioridade: Alta.
Dependência: Não há.
RFH-11: Microcomputador para exibição dos dados
10
Descrição: O equipamento deve possuir a capacidade de suportar a adição de um microcomputador
Raspberry PI 3 B+, para prover ambiente Web para receber e exibir informações em tempo real.
Prioridade: Baixa.
Dependência: RFH-01.
As Figuras 6 e 7 apresentam o diagrama esquemático do circuito. Nelas, estão descritos todos os
componentes utilizados, empregando uma simbologia padronizada, bem como suas respectivas
ligações.
A Figura 8 apresenta o layout final do circuito impresso, com o posicionamento dos componentes e
respectivas trilhas de ligação.
As Figuras 9 e 10 apresentam a placa em seu estado atual, a qual é utilizada para realização dos
testes e validações.
11
6.2. Diagramas de Hardware
12
Figura 7 – Diagrama do circuito parte 2
Fonte: Autoria própria
13
Figura 8 – Layout da placa de circuito impresso
Fonte: Autoria própria
/
Figura 9 – Protótipo montado (parte superior)
Fonte: Autoria própria
14
Figura 10 – Protótipo montado (parte inferior)
Fonte: Autoria própria
15
Descrição: O equipamento deve possuir componentes eletrônicos de alta qualidade, a fim de
garantir seu funcionamento por um período mínimo de 1 ano, sem necessidade de manutenção.
Prioridade: Alta.
Dependência: Não há.
RNFH-05: Desempenho
Descrição: O equipamento deve ser capaz de identificar as configurações pré-definidas e realizar
sua inicialização de forma automática, sem qualquer tipo de intervenção. Após a inicialização, deve
realizar todas as leituras necessárias e então entrar em estado de stand-by até o próximo intervalo
esperado.
Prioridade: Alta.
Dependência: Não há.
RNFH-06: Espaço
Descrição: O equipamento deve ser capaz de suportar cartões de memória de até 32G e de
armazenar dados de todos os sensores por um período mínimo de 365 dias. Caso atinja o espaço
máximo, o equipamento deve descartar os arquivos mais antigos para possibilitar a gravação dos
mais novos.
Prioridade: Alta.
Dependência: Não há.
RNFH-07: Custo
Descrição: O equipamento deve ser de baixo custo, não excedendo os R$ 1.100,00.
Prioridade: Alta.
Dependência: Não há.
RNFH-08: Consumo de energia
Descrição: O equipamento, quando em ambiente de campo, deve possuir baixo consumo de
energia, sendo de no máximo de 75mA/h.
Prioridade: Média.
Dependência: Não há.
7. Firmware
7.1 Requisitos Funcionais de Firmware (RFF)
RFF-01: Comunicação Serial
Descrição: O firmware deve ser capaz de iniciar as portas de comunicação serial existentes no
hardware.
Prioridade: Alta.
Dependência: Não há.
RFF-02: Relógio de tempo real (RTC)
Descrição: O firmware deve ser capaz de iniciar o módulo RTC existente no hardware, buscando
data e hora atual com base na sua última sincronização. Caso algum problema ocorra nesse
16
processo, uma mensagem de erro deve ser lançada na interface serial RS232 e o processo deve ser
interrompido.
Prioridade: Alta.
Dependência: RFF-01.
RFF-03: Cartão de memória
Descrição: O firmware deve ser capaz de iniciar o cartão de memória. Caso algum problema ocorra
nesse processo, uma mensagem de erro deve ser lançada na interface serial RS232 e o processo
deve ser interrompido.
Prioridade: Alta.
Dependência: RFF-01.
RFF-04: Arquivo de configuração
Descrição: O firmware deve ser capaz de localizar o arquivo de configuração e extrair todos os
parâmetros necessários ao seu funcionamento. Caso algum problema ocorra nesse processo, uma
mensagem de erro deve ser lançada na interface serial RS232 e o processo deve ser interrompido.
Prioridade: Alta.
Dependência: RFF-01 e RFF-03.
RFF-05: Watchdog
Descrição: O firmware deve ser capaz de inicializar o processo de Watchdog timer, definindo o
tempo de checagem e o processo de reset em caso de falha.
Prioridade: Alta.
Dependência: Não há.
RFF-06: Sincronização
Descrição: O firmware, deve checar, em ciclo de segundo, se o horário condiz com o intervalo
configurado. Em caso afirmativo, deve chamar o processo para coleta dos dados. Caso contrário,
deve aguardar para que o momento seja o esperado.
Prioridade: Alta.
Dependência: Não há.
RFF-07: Coleta
Descrição: O firmware deve ser capaz de coletar as informações dos diversos sensores configurados,
tanto analógicos quanto digitais, em seu intervalo previamente determinado e acionar o processo
de armazenamento. Durante o processo de coleta, serão realizados também os cálculos necessários,
conforme configuração, para tornar o dado coletado interpretável ao usuário final.
Prioridade: Alta.
Dependência: RFF-03 e RFF-04.
RFF-08: Armazenamento
Descrição: O firmware deve ser capaz de armazenar as informações coletadas em arquivos no cartão
de memória.
Prioridade: Alta.
17
Dependência: RFF-02, RFF-03 e RFF-04.
RFF-09: Envio dos dados em tempo real
Descrição: O firmware deve ser capaz de enviar os dados coletados, se assim configurado, para as
portas de comunicação RS232 e/ou RS485. O dado será enviado conforme padrão de
armazenamento, sendo: data e hora da coleta, identificação do sensor, valor bruto, valor
interpretável pelo usuário. Essa funcionalidade permite a visualização em tempo real dos dados
coletados, evitando assim a retirada frequente do cartão SD e facilitando o acesso às informações
pelo usuário, seja por interface gráfica ou por visualização textual em um software de terminal
RS232.
Exemplo dos dados enviados pela RS232: DT=01/03/2021 23:0:0;D1=0;D2=0;A1-UMIDADE=987;
Prioridade: Média.
Dependência: RFF-01, RFF-02, RFF-03 e RFF-04.
19
Exemplo do caminho completo do arquivo: /EQUIP1/01122020.RS485.
Para leitura e gravação dos dados de forma específica, o firmware terá de ser adaptado ou
personalizado.
Prioridade: Alta.
Dependência: RFF-08.
8. Software de configuração
8.1 Requisitos Funcionais de Software de Configuração (RFSC)
RFSC-01: Interface para configuração
Descrição: O sistema deve possuir campos para configuração de todas as suas funcionalidades,
sendo: nome da estação (limitado a 8 caracteres, sem acentos ou caracteres especiais), intervalo de
coleta, intervalo de transmissão, 16 portas analógicas (com seus respectivos parâmetros para
cálculo, necessários para se chegar à grandeza desejada) e 2 portas digitais contadoras de pulso.
Prioridade: Média.
Dependência: Não há.
RFSC-02: Sincronizar RTC
Descrição: O sistema deve disponibilizar uma função para ajustar o horário do equipamento de
acordo com o horário do computador. Essa funcionalidade deverá ser executada no primeiro uso
ou caso permaneça por longo período fora de operação.
Prioridade: Alta.
Dependência: Não há.
RFSC-03: Criar arquivo de configuração
Descrição: O sistema deve estar apto a criar um arquivo em formato “.TXT”, contendo todas as
configurações realizadas na interface gráfica. Esse arquivo deverá ser copiado para cartão SD que
será utilizado pelo equipamento.
Prioridade: Média.
Dependência: Não há.
RFSC-04: Envio de aplicações (firmwares)
Descrição: O sistema deve estar apto a realizar o envio de aplicações (firmwares) ao equipamento.
O envio será feito por meio de uma porta de comunicação que deve ser selecionada antes do envio.
As aplicações disponíveis devem ser: teste de funcionamento (que exibirá os dados de segundo em
segundo), aplicação de produção (que realizará a coleta e envio de acordo com o configurado) e
atualização de horário (que deverá ser utilizada na primeira utilização do equipamento ou após ter
ficado sem utilização durante períodos maiores que uma semana).
Prioridade: Alta.
Dependência: Não há.
21
Figura 12 – Tela inicial do configurador com informações sobre o projeto
Fonte: Autoria própria
22
Figura 13 – Tela de configurações do datalogger e dos sensores existentes
Fonte: Autoria própria
A Figura 14 ilustra um exemplo da tela de confirmação que é exibida ao clicar no botão “Gerar
arquivo de configuração”. Essa tela apresenta um resumo dos campos que foram preenchidos
anteriormente.
23
“Testar funcionamento”: realizará a coleta de informações de segundo em segundo, conforme
configurações previamente realizadas, e trará essas informações coletadas na aba “Dados em
Tempo Real” para que possam ser avaliadas e eventualmente corrigidas.
“Enviar aplicação de produção”: entrará em modo de “produção”, que significa que realizará as
coletas e envios de acordo com as configurações previamente realizadas.
“Sincronizar horário”: função para atualizar o relógio interno do equipamento. Necessária durante
a primeira utilização do equipamento ou após períodos maiores do que 7 dias sem utilização
(desligado).
A Figura 16, identificando a opção “Dados em Tempo Real” possibilita a visualização, de forma
gráfica, dos dados que estão sendo coletados e registrados pelo datalogger. O campo “Console”
apresenta toda a troca de informação que estiver ocorrendo pela porta USB do equipamento.
24
Figura 16 – Tela de acompanhamento dos dados
Fonte: Autoria própria
9. Software de exibição
9.1 Requisitos Funcionais de Software de Exibição (RFSE)
RFSE-01: Consulta de dados
Descrição: O sistema deve possibilitar a visualização dos dados dos sensores em um determinado
intervalo de tempo. Os dados devem ser exibidos por meio de gráfico e por meio de uma tabela.
Prioridade: Alta.
Dependência: Não há.
RFSE-02: Exportação dos dados
Descrição: O sistema deve possibilitar a exportação dos dados em formato .CSV para utilização em
outras plataformas, como Excel e R.
Prioridade: Média.
Dependência: Não há.
RFSE-03: Suporte à visualização, em tempo real dos dados
Descrição: O sistema deve disponibilizar uma página web em que seja possível visualizar os dados
que estão sendo recebidos em tempo real. O objetivo dessa tela é, em casos de pesquisas em
laboratório, prover um monitor que exiba ao pesquisador os dados, pré-processados, conforme eles
são coletados, sem necessidade da retirada do cartão. Esta facilidade visa apresentar ao
pesquisador uma ferramenta de avaliação dos dados que estão sendo registrados, bem como a
exportação desses dados sem a necessidade de estar fisicamente no local.
Prioridade: Alta.
Dependência: Não há.
25
9.2. Estrutura de Banco de Dados
O quadro 1 lista os campos constantes na tabela de banco de dados criada para o armazenamento
dos dados coletados pelo datalogger. O banco de dados utilizado é o MySQL/MariaDB.
Quadro 1: Estrutura da tabela do banco de dados utilizada para armazenamento dos dados
coletados
NOME DO CAMPO TIPO DE DADO
Id INTEGER
Data TIMESTAMP
SensorNome VARCHAR
Valor DOUBLE
27
Figura 18 – Diagrama de casos de uso do datalogger
Fonte: Autoria própria
28
Pré-condições PC ou PL abrem o sistema e clicam na aba “configurações“.
Pós-condições PC ou PL preenchem os campos disponíveis na aba e clicam no botão “gerar
arquivo de configurações”.
Fluxo Principal 1 – PC ou PL abrem o sistema.
2 – PC ou PL clicam sobre a aba “configurações”.
3 – PC ou PL preenchem os campos de acordo com suas necessidades.
4 – PC ou PL clicam no botão “gerar arquivo de configuração”.
5 – PC ou PL escolhem o local onde será salvo o arquivo de configuração.
6 – PC ou PL copiam o arquivo gerado para o cartão SD do equipamento.
Fluxo Secundário Se algum campo obrigatório não tiver sido preenchido, o sistema alertará o
usuário para que o preencha.
29
2 – PC ou PL clicam sobre a aba “aplicações”.
3 – PC ou PL indicam a porta de comunicação na qual o equipamento está
conectado.
4 – PC ou PL certificam-se que a aplicação que está rodando é a aplicação de
teste ou de produção.
5 – PC ou PL clicam sobre a aba “dados em tempo real”.
6 – PC ou PL conseguem verificar, de acordo com o intervalo de tempo
previamente programado, os dados que estão sendo capturados.
Fluxo Secundário Se a aplicação de teste ou produção não tiver sido enviada, nenhum dado
será exibido.
30
2 – PL seleciona o intervalo de datas e sensor desejados.
3 – PL visualiza, por meio de gráficos e tabelas, os dados desejados.
Fluxo Secundário Se houver erro no acesso ao sistema, uma mensagem de erro é exibida.
31
RFH-09: Saídas de comunicação RS232 ou
RS485
RFH-10: Alimentação
RFH-11: Microcomputador para exibição
dos dados
RNFH-01: Facilidade de uso
RNFH-02: Precisão
RNFH-03: Precisão de data
RNFH-04: Confiabilidade
RNFH-05: Desempenho
RNFH-06: Espaço
RNFH-07: Custo
RNFH-08: Consumo de energia
RFF-01: Comunicação Serial
RFF-02: Relógio de tempo real (RTC)
RFF-03: Cartão de memória
RFF-04: Arquivo de configuração
RFF-05: Watchdog
RFF-06: Sincronização
RFF-07: Coleta
RFF-08: Armazenamento
RFF-09: Envio dos dados em tempo real
RNFF-01: Confiabilidade
RNFF-02: Tamanho
RNFF-03: Tipos de arquivo
RFSC-01: Interface para configuração
RFSC-02: Sincronizar RTC
RFSC-03: Criar arquivo de configuração
RFSC-04: Envio de aplicações (firmwares)
RFSC-05: Barra de Progresso
RNFSC-01: Tela de informação
RNFSC-02: Ajuda
RNFSC-03: Manual de instalação do
ambiente
RNFSC-04: Multiplataforma
32
RFSE-01: Consulta de dados
RFSE-02: Exportação dos dados
RFSE-03: Suporte à visualização, em tempo
real dos dados
RNFSE-01: Tela de ajuda
RNFSE-02: Ambiente
RNFSE-03: Restrições lógicas de base de
dados
RNFSE-04: Restrições de projeto
RNFSE-05: Acesso
Com relação à verificabilidade, o datalogger passou por revisões, sua prototipação foi realizada e
por fim, casos de testes foram propostos. Essas questões são discutidas a seguir.
A revisão dos requisitos foi realizada incremental e recursivamente conforme os dados foram sendo
coletados. A Tabela 2 documenta os diversos encontros realizados, as discussões efetuadas e as
contribuições decorrentes.
33
portas de cada tipo seriam
utilizadas.
01/07/2019 Édipo Revisão das necessidades Características principais definidas;
Carneiro, do hardware para aplicação Planejamento para execução de um
Pablo Chang, no simulador de chuva.
protótipo.
Rogério Rizzi
29/08/2019 Édipo Apresentação de Aprovação do esboço;
Carneiro, documento com esboço do
Planejamento para elaboração de
Deonir protótipo, com suas
projeto de circuito impresso e
Secco, Pablo principais características e testes iniciais; Software utilizado:
Chang, funcionalidades.
Eagle 7.2.0.
Rogério Rizzi
02/09/2019 Édipo Revisão do projeto da placa Ajustes no planejamento inicial;
Carneiro, de circuito impresso do
Revisão de componentes;
Leonardo protótipo.
Contini Revisão das trilhas de ligação.
30/10/2019 Édipo Apresentação do projeto da Aprovação para seguir com a
Carneiro, placa de circuito impresso elaboração da placa.
Pablo Chang, do protótipo.
Rogério Rizzi
36
Simulação Testar o Foi realizado teste do equipamento em ambiente de campo
em campo funcionamento para atestar sua funcionalidade. O datalogger foi deixado por
do datalogger em 3 dias, entre 06 e 08/02/2021, coletando e armazenando os
ambiente de dados de um sensor meteorológico 5 parâmetros (velocidade
campo e direção de vento, umidade relativa, temperatura e pressão
atmosférica) e saída RS485.
As Figuras 19 e 20 ilustram o ambiente da realização do teste.
37
161
Índice
1. Instalação do Raspberry PI OS ............................................................................ 2
2. Configuração geral do Raspberry Pi .................................................................... 3
3. Instalação do Servidor HTTP Apache .................................................................. 4
4. Instalação do PHP .............................................................................................. 5
5. Instalação do MySQL/MariaDB .......................................................................... 6
6. Instalação do Java.............................................................................................. 7
7. Instalação dos softwares do Datalogger ............................................................. 7
8. Instalação do PHPMyAdmin (opcional) .............................................................. 7
1. Instalação do Raspberry PI OS
1.1. Acesse o site da Raspberry, (https://www.raspberrypi.org/).
1.2. Na aba Software, faça o download do Raspberry PI OS.
2
Figura 2 - Tela do Software Raspberry Pi Imager
3
3. Instalação do Servidor HTTP Apache
3.1. Atualize a base de dados do APT
# sudo apt upgrade
# sudo apt update
3.2. Faça a instalação do pacote Apache2
# sudo apt-get install apache2
3.3. Identifique qual o IP do Raspberry na rede
# sudo if-config eth0
3.4. Acesse por meio de um browser o IP localizado no passo anterior. A página inicial do
projeto Apache2 deve ser exibida.
4
Figura 4 - Página inicial do Servidor Apache
4. Instalação do PHP
4.1. Faça a instalação do pacote PHP
# sudo apt-get install php php-mbstring
4.2. Remova o arquivo index.html padrão
# sudo rm /var/www/html/index.html
4.3. Crie um arquivo chamado index.php
# cd /var/www/html/
# sudo vi index.php
4.4. Adicione o seguinte conteúdo ao arquivo:
“<?php
phpinfo();
?>“
4.5. Acesse por meio de um browser o IP localizado no 3.4. Uma página com as
informações do PHP deverá ser exibida.
5
Figura 5 - Página com dados do PHP
5. Instalação do MySQL/MariaDB
5.1. Instale os pacotes necessários
# sudo apt-get install mariadb-server-10.0 php-mysql
5.2. Crie um usuário para acesso ao banco de dados
# sudo mysql --user=root
# CREATE USER 'mestrado'@'localhost' IDENTIFIED BY 'mestrado123';
# GRANT ALL PRIVILEGES ON *.* TO 'mestrado'@'%' WITH GRANT OPTION;
5.3. Crie o banco de dados padrão
# CREATE DATABASE ‘mestrado’;
5.4. Crie a tabela para recepção dos dados
# CREATE TABLE `dado` (
`id` bigint(20) UNSIGNED NOT NULL,
6
`data` timestamp NULL DEFAULT NULL,
`sensorNome` varchar(255) NOT NULL,
`valor` double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# QUIT;
6. Instalação do Java
6.1. Instale os pacotes necessários
# sudo apt install openjdk-8-jdk
# sudo apt-get install wiringpi
7
8.2. Adicione a extensão no Apache
# sudo phpenmod mysqli
# sudo /etc/init.d/apache2 restart
8.3. Acesse por meio de um browser o IP localizado no 3.4/phpmyadmin. Uma página com
campos para login deverá ser exibida.
8
171
char nivel_str[10];
struct parameters {
String nome = "DEFAULT";
int intervaloColeta = 5;
String portaSaida = "RS232";
String RS485 = "false";
String D1 = "true";
String D2 = "false";
String A1 = "'A1', true, 0, 10 ,0";
String A2 = "'A2', true, 0, 10 ,0";
String A3 = "'A3', true, 0, 10 ,0";
String A4 = "'A4', true, 0, 10 ,0";
String A5 = "'A5', true, 0, 10 ,0";
String A6 = "'A6', true, 0, 10 ,0";
String A7 = "'A7', true, 0, 10 ,0";
String A8 = "'A8', true, 0, 10 ,0";
String A9 = "'A9', true, 0, 10 ,0";
String A10 = "'A10', true, 0, 10 ,0";
String A11 = "'A11', true, 0, 10 ,0";
String A12 = "'A12', true, 0, 10 ,0";
String A13 = "'A13', true, 0, 10 ,0";
String A14 = "'A14', true, 0, 10 ,0";
String A15 = "'A15', true, 0, 10 ,0";
String A16 = "'A16', true, 0, 10 ,0";
} configs;
//Demais variaveis
volatile int pulseCounterD2 = 0;
volatile int pulseCounterD3 = 0;
volatile int mainLoopCounter = 0;
boolean alarmed = false;
boolean keepRunning = true;
boolean hasError = false;
int countError = 0;
AlarmId lastAlarm;
void setup() {
// Inicializa a comunicacao SERIAL -- debug USB
Serial.begin(9600);
// Serial 1 -- Conexão raspberry
Serial1.begin(9600);
// Serial 2 -- Conector 2
Serial2.begin(9600);
// Serial 3 -- Conector 3 (pode ser RS485 ou RS232, entrada ou saída)
Serial3.begin(9600);
//Inicializa o RTC
Wire.begin();
rtc.begin();
//Inicializa o SD card
Serial.print("Inicializando cartao SD... ");
if (!SD.begin(SDCARD)) {
Serial.print("Modulo SD falhou! ");
failSD = true;
hasError = true;
}
if (!card.init(SPI_HALF_SPEED, SDCARD)) {
Serial.print("Cartao SD falhou! ");
failSD = true;
hasError = true;
}
if (hasError) {
Serial.print("Inicializacao falhou! ");
} else {
Serial.println("Inicializacao completa. ");
}
Serial.println();
void loop() {
//Reinicia se ocorreu erro na inicialização
if (hasError) {
Serial.println(" Reiniciando devido erro de inicializacao");
delay(10000);
}
delay(1000);
//Reseta o watchdog, ou seja se o programa travar e não passar por esse
reset, em 8 segundos o módulo será reiniciado
wdt_reset();
}
if (!alarmed) {
//Quanto o resto da divisão do minuto pelo intervalo configurado for 0,
alarma
//----------------------------------------------------------------------
alterar para debug -------------------------------------------------------------
if ((dtPrincipal.second() % configs.intervaloColeta) == 0) {
//if ((dtPrincipal.minute() % configs.intervaloColeta) == 0) {
alarm();
} else
//Se intervalo = 60, testar minuto 0
//----------------------------------------------------------------------
alterar para debug -------------------------------------------------------------
if ((dtPrincipal.second() == 0) && (configs.intervaloColeta == 60)) {
//if ((dtPrincipal.minute() == 0) && (configs.intervaloColeta == 60)) {
alarm();
}
}
} else {
Serial.println("Erro!");
if (countError == 0) {
Serial2.print("Erro: ErroKeepRunning");
Serial2.println();
countError++;
}
delay(10000);
}
}
void alarm() {
alarmed = true;
//--------------------------------------------------------------------------------
---------- alterar para debug -----------------------------------
Alarm.timerRepeat((configs.intervaloColeta), mainLoop);
//Alarm.timerRepeat((configs.intervaloColeta * 60), mainLoop);
void mainLoop() {
mainLoopCounter++;
//Gerando arquivo (um por dia, dentro da pasta com o nome da estacao)
SD.mkdir(configs.nome);
String fileName = "/" + configs.nome + "/";
fileName += printFileName(dt);
fileName += ".txt";
String fileNameRAW = "/" + configs.nome + "/";
fileNameRAW += printFileName(dt);
fileNameRAW += ".raw";
/* Data
*/
dataStringRAW += "DT=";
dataStringRAW += printFormatedDate(dt);
dataStringRAW += " ";
dataStringRAW += printFormatedHour(dt);
dataStringRAW += ";";
dataString += printFormatedDate(dt);
dataString += ";";
dataString += printFormatedHour(dt);
dataString += ";";
/* Portas digitais
Registrador: Porta Digital (D1, D2);
Unidade de medida: cacambadas
*/
//Pega os valores dos sensores
int chuva;
if (configs.D1 == "true") {
dataStringRAW += "D1=";
dataStringRAW += pulseCounterD2;
dataStringRAW += ";";
dataString += "D1=";
dataString += pulseCounterD2;
dataString += ";";
}
if (configs.D2 == "true") {
dataStringRAW += "D2=";
dataStringRAW += pulseCounterD3;
dataStringRAW += ";";
dataString += "D2=";
dataString += pulseCounterD3;
dataString += ";";
}
dataStringOUT = dataStringRAW;
/* Analogicos
Registrador: Portas Analogicas (A1, A2, A3, A4);
*/
if (getSplittedValue(configs.A1, ',', 1) == "true") {
float auxRead = getAnalogRead(1, true);
dataStringRAW += getSplittedValue(configs.A1, ',', 0)+"=";
dataStringRAW += auxRead;
dataStringRAW += ";";
dataStringOUT += getSplittedValue(configs.A1, ',', 0)+"=";
dataStringOUT += getAnalogRead(1, false);
dataStringOUT += ";";
file.println(dataString);
file.close();
Serial.println("Escreveu a leitura!");
}
else {
//Se o arquivo nao abrir, exibir erro.
Serial.println("Erro ao abrir o arquivo");
}
String createHeader() {
String aux = "data;hora;";
if (configs.D1 == "true") {
aux += "digital1;";
}
if (configs.D2 == "true") {
aux += "digital2;";
}
if (getSplittedValue(configs.A1, ',', 1) == "true") {
aux += "analogico1;";
}
if (getSplittedValue(configs.A2, ',', 1) == "true") {
aux += "analogico2;";
}
if (getSplittedValue(configs.A3, ',', 1) == "true") {
aux += "analogico3;";
}
if (getSplittedValue(configs.A4, ',', 1) == "true") {
aux += "analogico4;";
}
if (getSplittedValue(configs.A5, ',', 1) == "true") {
aux += "analogico5;";
}
if (getSplittedValue(configs.A6, ',', 1) == "true") {
aux += "analogico6;";
}
if (getSplittedValue(configs.A7, ',', 1) == "true") {
aux += "analogico7;";
}
if (getSplittedValue(configs.A8, ',', 1) == "true") {
aux += "analogico8;";
}
if (getSplittedValue(configs.A9, ',', 1) == "true") {
aux += "analogico9;";
}
if (getSplittedValue(configs.A10, ',', 1) == "true") {
aux += "analogico10;";
}
if (getSplittedValue(configs.A11, ',', 1) == "true") {
aux += "analogico11;";
}
if (getSplittedValue(configs.A12, ',', 1) == "true") {
aux += "analogico12;";
}
if (getSplittedValue(configs.A13, ',', 1) == "true") {
aux += "analogico13;";
}
if (getSplittedValue(configs.A14, ',', 1) == "true") {
aux += "analogico14;";
}
if (getSplittedValue(configs.A15, ',', 1) == "true") {
aux += "analogico15;";
}
if (getSplittedValue(configs.A16, ',', 1) == "true") {
aux += "analogico16;";
}
return aux;
}
Serial.println("");
void printDate() {
Serial.print(rtc.getDateStr(FORMAT_LONG, FORMAT_LITTLEENDIAN, '/'));
Serial.print(" ");
Serial.println(rtc.getTimeStr());
Serial.println("");
}
void printTemp() {
Serial.println(rtc.getTemp());
}
String printDateString() {
String data = "";
data += rtc.getDateStr(FORMAT_LONG, FORMAT_LITTLEENDIAN, '/');
data += " ";
data += rtc.getTimeStr();
return data;
}
fileName += strMonth;
fileName += dt.year();
return fileName;
}
date += dt.year();
return date;
}
return date;
}
date += dt.month();
date += '/';
date += dt.day();
date += '/';
date += dt.year();
date += ' ';
date += dt.hour();
date += ':';
date += dt.minute();
date += ':';
date += dt.second();
date += ' ';
return date;
}
void countPulseD2() {
pulseCounterD2++;
}
void countPulseD3() {
pulseCounterD3++;
}
//Debug
// Serial.print("intervaloIni = ");
// Serial.println(intervaloIni);
// Serial.print("intervaloFim = ");
// Serial.println(intervaloFim);
// Serial.print("offset = ");
// Serial.println(offset);
// Serial.println(intervaloIni);
//Calcula range
float range = 0.0;
if (wasNegative) {
range = intervaloFim + intervaloIniAux;
} else {
range = intervaloFim - intervaloIniAux;
}
// Serial.println(range);
// Serial.println(fatorVariacao);
if (isRaw) {
return leituraBruta;
}
// Serial.print("Leitura Bruta:");
// Serial.println(leituraBruta);
//Leitura bruta
float valorBruto = (float)leituraLimpa / fatorVariacao;
// Serial.print("Valor Bruto");
// Serial.println(valorBruto);
//Leitura real
float leituraReal = valorBruto + (float) intervaloIniAux;
if (wasNegative) {
leituraReal = valorBruto - (float) intervaloIniAux;
}
// Serial.print("Leitura Real:");
// Serial.println(leituraReal);
//Valor final
float sensorFinal = leituraReal;
//Somar REGUA/OFFSET
if (isTopCase.indexOf("true") > -1) {
sensorFinal = offset - sensorFinal;
} else {
sensorFinal = offset + sensorFinal;
}
// Serial.print("Leitura Final:");
// Serial.println(sensorFinal);
return sensorFinal;
}
boolean getSettings() {
// Open the settings file for reading:
File myFile = SD.open("config.txt");
if (!myFile) {
Serial.println("Arquivo de configuracoes nao encontrado.");
Serial.println("Parando a aplicacao!");
return false;
}
Serial.print("Abrindo arquivo configuracoes... ");
char character;
String description = "";
String value = "";
// Varre o arquivo ate que nao haja mais nada a ser lido
while (myFile.available()) {
character = myFile.read();
//Ignora os comentários
if (character == '/') {
while (character != '\n') {
character = myFile.read();
};
} else if (isalnum(character)) { //Se for alfanumerico, faz parte da descricao
description.concat(character);
} else if (character == '=') {
//Remove espacos em branco
do {
character = myFile.read();
} while (character == ' ');
//Pega os parametros na ordem do arquivo
//Serial.println(description);
if (description == "nome") {
value = "";
//Concatena enquanto nao houver quebra de linha
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.nome = value;
// Serial.println(value);
} else if (description == "intervaloColeta") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.intervaloColeta = atoi(value.c_str());
// Serial.println(value);
} else if (description == "portaSaida") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.portaSaida = value;
// Serial.println(value);
} else if (description == "D1") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.D1 = value;
// Serial.println(value);
} else if (description == "D2") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.D2 = value;
// Serial.println(value);
} else if (description == "RS485") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.RS485 = value;
// Serial.println(value);
} else if (description == "A1") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A1 = value;
// Serial.println(value);
} else if (description == "A2") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A2 = value;
// Serial.println(value);
} else if (description == "A3") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A3 = value;
// Serial.println(value);
} else if (description == "A4") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A4 = value;
// Serial.println(value);
} else if (description == "A5") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A5 = value;
// Serial.println(value);
} else if (description == "A6") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A6 = value;
// Serial.println(value);
} else if (description == "A7") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A7 = value;
// Serial.println(value);
} else if (description == "A8") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A8 = value;
// Serial.println(value);
} else if (description == "A9") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A9 = value;
// Serial.println(value);
} else if (description == "A10") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A10 = value;
// Serial.println(value);
} else if (description == "A11") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A11 = value;
// Serial.println(value);
} else if (description == "A12") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A12 = value;
// Serial.println(value);
} else if (description == "A13") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A13 = value;
// Serial.println(value);
} else if (description == "A14") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A14 = value;
// Serial.println(value);
} else if (description == "A15") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A15 = value;
// Serial.println(value);
} else if (description == "A16") {
value = "";
do {
value.concat(character);
character = myFile.read();
} while (character != '\n');
configs.A16 = value;
// Serial.println(value);
} else {
while (character != '\n')
character = myFile.read();
}
description = "";
} else {
}
}
return true;
}
void fillSettings() {
//Inicializa portas digitais (contadoras de pulso)
if (configs.D1 == "true") {
pinMode(2, INPUT);
digitalWrite(2, HIGH);
attachInterrupt(0, countPulseD2, FALLING);
}
if (configs.D2 == "true") {
pinMode(3, INPUT);
digitalWrite(3, HIGH);
attachInterrupt(1, countPulseD3, FALLING);
}
void printConfigs() {
Serial.print("Nome: ");
Serial.println(configs.nome);
Serial.print("Intervalo de Coleta: ");
Serial.println(configs.intervaloColeta);
Serial.print("Porta de Saida: ");
Serial.println(configs.portaSaida);
Serial.print("D1: ");
Serial.println(configs.D1);
Serial.print("D2: ");
Serial.println(configs.D2);
Serial.print("RS485: ");
Serial.println(configs.RS485);
Serial.print("A1: ");
Serial.println(configs.A1);
Serial.print("A2: ");
Serial.println(configs.A2);
Serial.print("A3: ");
Serial.println(configs.A3);
Serial.print("A4: ");
Serial.println(configs.A4);
Serial.print("A5: ");
Serial.println(configs.A5);
Serial.print("A6: ");
Serial.println(configs.A6);
Serial.print("A7: ");
Serial.println(configs.A7);
Serial.print("A8: ");
Serial.println(configs.A8);
Serial.print("A9: ");
Serial.println(configs.A9);
Serial.print("A10: ");
Serial.println(configs.A10);
Serial.print("A11: ");
Serial.println(configs.A11);
Serial.print("A12: ");
Serial.println(configs.A12);
Serial.print("A13: ");
Serial.println(configs.A13);
Serial.print("A14: ");
Serial.println(configs.A14);
Serial.print("A15: ");
Serial.println(configs.A15);
Serial.print("A16: ");
Serial.println(configs.A16);
Serial.println("");
}
//Funções uteis
String getSplittedValue(String data, char separator, int index) {
/* Exemplo:
String split = "hi this is a split test";
String word3 = getValue(split, ' ', 2);
Serial.println(word3);
*/
int found = 0;
int strIndex[] = {0, -1};
int maxIndex = data.length() - 1;
time_t syncProvider() {
return rtc.getUnixTime(rtc.getTime());
}
203
# ____________________________________________
# ANÁLISES DO ARTIGO SOBRE SENSOR DE UMIDADE
# Criado em: 09/08/2021
# Atualizado em: 04/09/21
# ____________________________________________
# Leitura e preparação dos dados ----
# ____________________________________________
# Comando para definir a localização da pasta:
{
library(rstudioapi) # precisa ter instalado o pacote "rstudioapi"
current_path =
rstudioapi::getActiveDocumentContext()$path
setwd(dirname(current_path ))
print( getwd() )
}
# Troque o nome do arquivo de dados (entre " .csv"):
dados <- read.csv2(
"dados_calib2.csv",
header = T)
# Mostra as 6 primeiras linhas para visualização.
# As colunas devem seguir a ordem: tratamento // resposta;
head(dados)
# Definir as variáveis X e Y.
attach(dados)
dados <- data.frame(X = c(Valor),
Y = c(Umidade)*100, # para transformar em %
Sensor = c(Sensor)
)
# Fazer cópia dos dados
dados2 <- dados
# Mostra as 6 primeiras linhas para ver como ficou.
head(dados)
# Deletar o sensor 9 antigo da tabela
r <- with(dados, which(Sensor==9, arr.ind=TRUE))
dados <- dados[-r, ]
attach(dados)
# Renomear 9.2 para 9
dados$Sensor[dados$Sensor == 9.2] <-
rep("9", length(dados$Sensor[dados$Sensor == 9.2]))
attach(dados)
# ____________________________________________
# Gráficos da regressão ----
# ____________________________________________
{require(ggplot2)
require(gridExtra) # forma grade
require(cowplot)
# Gráficos em grade
grafico <- ggplot(dados, aes(X, Y)) +
labs(x = "Leitura dos sensores de umidade (V)",
y = "Umidade do solo (%)") +
facet_wrap(. ~ Sensor,ncol=3) + # Grade de gráficos
stat_smooth(method = "lm",
fill = "gray", # Cor do intervalo de confiança
aes(alpha = "Ajustado")) + # Método linear
panel_border() + # and a border around each panel
geom_point(aes(alpha = "Observado")) +
scale_alpha_manual(name = NULL,
values = c(1, 1),
204 APÊNDICE D. Roteiro em R das análises de dados
#write.csv2(tabela2,
# file =
# "tabela2 de coeficientes e métricas.csv")
# ____________________________________________
# ANÁLISES DO EXPERIMENTO: UMIDADE X PALHA ----
#
#
# ____________________________________________
# ____________________________________________
# Leitura dos dados ----
# ____________________________________________
dados_palha10 <- read.table("dados_experimento/02082021.txt",
sep = ";", # separado por ;
header = T) # Cabeçalho
dados_palha5 <- read.table("dados_experimento/09082021.txt",
sep = ";", # separado por ;
header = T) # Cabeçalho
dados_palha0 <- read.table("dados_experimento/16082021.txt",
sep = ";", # separado por ;
header = T,
fill = TRUE) # Cabeçalho
# Mostrar o início dos dados
head(dados_palha10)
head(dados_palha5)
head(dados_palha0)
colnames(dados_palha10)
colnames(dados_palha5)
colnames(dados_palha0)
# Alterando o dados_palha0
# Excluindo colunas desnecessárias:
dados_palha0 <- dados_palha0[,-c(14:19)]
# Trocando nome da coluna "analogico14"
colnames(dados_palha0)[14] <- "analogico10"
colnames(dados_palha0)
# Juntando tudo em uma tabela
require(dplyr)
dados_total <- bind_rows(dados_palha10,
dados_palha5,
dados_palha0)
# Deletar a coluna "analogico9"
dados_total <- dados_total[,-13]
# Deletar os caracteres "D1=" e "D2="
# require(stringr)
# dados_total$digital1 <- str_replace(dados_total$digital1,
# "D1=", # subst. este
# "") # por este
# dados_total$digital2 <- str_replace(dados_total$digital1,
# "D2=", # subst. este
# "") # por este
# Mostrar o início dos dados
head(dados_total)
# ____________________________________________
# Atribuindo variáveis temporais ----
# ____________________________________________
require(lubridate)
# convertendo para data/dia
dados_total$data <- as.POSIXct(dados_total$data,
format = "%d/%m/%Y")
# Convertendo para hora
dados_total$hora <- as.POSIXct(dados_total$hora,
format = "%H:%M:%S")
# Classe da variável
class(dados_total$data)
class(dados_total$hora)
# Corrigindo a coluna de horas
# paste(hour(tabela_palha10$hora[1]),minute(tabela_palha10$hora[1]), sep=":")
# Início dos dados
head(dados_total$data)
207
head(dados_total$hora)
# ____________________________________________
# Convertendo as leituras para umidade percentual ----
# ____________________________________________
# Correção dos sensores com influência do datalogger profissional
dados_total$analogico2 <- dados_total$analogico2 + 38
dados_total$analogico4 <- dados_total$analogico4 + 38
dados_total$analogico5 <- dados_total$analogico5 + 38
dados_total$analogico6 <- dados_total$analogico6 + 38
# Fazendo cópia da planilha
dados_total2 <- dados_total
# Calculando em função das equações dos 9 sensores.
# y = ax+b
# a = tabela$a[i]
# b = tabela$b[i]
# x = dados_total[,i+4] ## colunas da tabela de dados
for (i in 1:9){
dados_total[,i+4] <- tabela$a[i]*dados_total[,i+4]+tabela$b[i]
}
# Mostra a pós-conversão
head(dados_total)
# ____________________________________________
# Conversão para o sensor 9 quebrado ----
# "tabela2" é do sensor quebrado
# "tabela" é do sensor novo
# ____________________________________________
# Calculando em função das equações dos 9 sensores.
# y = ax+b
# a = tabela$a[i]
# b = tabela$b[i]
# x = dados_total[,i+4] ## colunas da tabela de dados
for (i in 1:9){
dados_total2[,i+4] <- tabela2$a[i]*dados_total2[,i+4]+tabela2$b[i]
}
# Mostra a pós-conversão
head(dados_total2)
# ____________________________________________
# Filtrando por período de tempo (20 minutos coletados) ----
# ____________________________________________
# Separando por datas
tabela_palha10 <- dados_total2 %>%
filter(data == as.Date("2021-08-02 -03"))
tabela_palha5 <- dados_total2 %>%
filter(data == as.Date("2021-08-09 -03"))
tabela_palha0 <- dados_total %>%
filter(data == as.Date("2021-08-16 -03"))
# Separando por hora
tabela_palha10 <- tabela_palha10 %>%
filter(between(hora, # coluna de data/dia
as.POSIXct("15:21:41", # hora inicial
format = "%H:%M:%S"),
as.POSIXct("17:21:41", # hora final
format = "%H:%M:%S")))
tabela_palha5 <- tabela_palha5 %>%
filter(between(hora, # coluna de data/dia
as.POSIXct("11:26:50", # hora inicial
format = "%H:%M:%S"),
as.POSIXct("13:26:50", # hora final
format = "%H:%M:%S")))
tabela_palha0 <- tabela_palha0 %>%
filter(between(hora, # coluna de data/dia
as.POSIXct("12:52:20", # hora inicial
format = "%H:%M:%S"),
as.POSIXct("14:52:20", # hora final
format = "%H:%M:%S")))
# ____________________________________________
# Converter para o "incremento de umidade" ----
# ____________________________________________
208 APÊNDICE D. Roteiro em R das análises de dados
# ____________________________________________
head(dados_alinhado)
# Filtrar dados por categorias, quando existir:
# Exemplo: mostrar somente dados da Profundidade 2.
# (Para usar, exclua o "#" abaixo e modifique)
require(dplyr)
dados_alinhado <- filter(dados_alinhado, tempo > 110)
head(dados_alinhado)
# ____________________________________________
# TESTE DE NORMALIDADE ----
# ____________________________________________
# Pacote com alguns testes:
library(nortest)
library(ExpDes)
# Tabela de dados
dados <- data.frame(TRAT = as.factor(dados_alinhado$TRAT),
BLOCO = as.factor(dados_alinhado$Camadas),
RESP = as.numeric(dados_alinhado$Umidade))
head(dados)
attach(dados)
class(UMIDADE)
# Cálculo dos resíduos:
mod = aov(dados$RESP ~ dados$TRAT + dados$BLOCO)
# Teste Tukey
easyanova::ea1(dados, design=2, plot=2)$‘Adjusted means‘
# Gráficos de resíduos:
# Para ser normal, o histograma deve ter formato de sino no centro.
# Se o gráfico Normal Q-Q se assemelhar a uma reta crescente,
# então existe normalidade.
plotres(mod)
# Testes:
# Se p-value > 0,05, os resíduos possuem distribuição normal.
shapiro.test(mod$res) # Shapiro-Wilk
ad.test(mod$res) # Anderson-Darling
# Os resíduos são normais?
# Se SIM, rode o comando abaixo e pule para a etapa 5).
{RESP.TR <- RESP
# Se NÃO, faça a transformação em 4.1).
# ____________________________________________
# 4.1) TRANSFORMAÇÃO DE DADOS NÃO-NORMAIS ----
# ____________________________________________
# Faça os testes, até atingir a normalidade!
# TR1. Raiz quadrada:
TR1 <- sqrt(dados$RESP)
modTR1 = aov(TR1 ~ dados$TRAT)
# Gráfico dos resíduos
plotres(modTR1)}
# Testes
shapiro.test(modTR1$res) # Shapiro-Wilk
ad.test(modTR1$res) # Anderson-Darling
# TR2. Logarítmica:
# Obs: precisa excluir valores = 0.
{TR2 <- log(dados$RESP)
modTR2 = aov(TR2 ~ dados$TRAT)
# Gráfico dos resíduos
plotres(modTR2)}
# Testes
shapiro.test(modTR2$res) # Shapiro-Wilk
ad.test(modTR2$res) # Anderson-Darling
# TR3. Hiperbólica
{TR3 <- 1/dados$RESP
modTR3 = aov(TR3 ~ dados$TRAT)
# Gráfico dos resíduos
plotres(modTR3)}
# Testes
shapiro.test(modTR3$res) # Shapiro-Wilk
ad.test(modTR3$res) # Anderson-Darling
# TR4. Box-Cox
{require(MASS)
# Cálculo
211
par(mfrow=c(1, 1))
bc=boxcox(RESP ~ TRAT, data=dados, plotit=T)
lambda.max <- bc$x[which.max(bc$y)]
lambda.max # Se for próximo de zero, usar logarítmico (TR2).
TR4 <- (RESP^(lambda.max)-1)/lambda.max
modTR4 = aov(TR4 ~ TRAT)
# Gráfico dos resíduos
plotres(modTR4)}
# Testes
shapiro.test(modTR4$res) # Shapiro-Wilk
ad.test(modTR4$res) # Anderson-Darling
# Digite o TR escolhido dentro de ( ):
RESP.TR <-
(dados$RESP) # troque aqui, por exemplo: (TR2).
# Com isso, as próximas análises irão usar os
# dados transformados!
# ____________________________________________
# 5) TESTE DE HOMOCEDASTICIDADE DAS VARIÂNCIAS ----
# ____________________________________________
# Isso implica que cada tratamento que está sendo
# comparado pelo teste F, deve ter aproximadamente
# a mesma variância para que a ANOVA tenha validade.
# Redefinição de dados:
{
dados.TR <- data.frame(dados$TRAT, dados$BLOCO, RESP.TR)
attach(dados.TR)
TRAT <- as.factor(dados$TRAT)
RESP.TR <- as.numeric(RESP.TR)
mod.TR <- aov(RESP.TR ~ TRAT)
}
# Teste de Bartlett:
# Se p-value > 0,05, há homogeneidade das variâncias.
bartlett.test(mod$res ~ dados$TRAT)
# Boxplot de tratamentos vs resíduos:
# Se os boxplots forem semelhantes, há homocedasticidade.
{
par(mfrow=c(1, 1))
boxplot(mod.TR$res ~ TRAT)
}
# ____________________________________________
# 6) TESTE DE INDEPENDÊNCIA ----
# ____________________________________________
# Os dados são aleatórios e independentes.
# Ou seja, uma observação não influencia na outra
# e não existe influência do tempo ou local da coleta.
# Teste de Durbin-Watson:
# Se p-value > 0,05, então há independência.
{
require(lmtest)
dwtest(mod)
}
# Gráfico de resíduos padronizados vs valores ajustados
# (Standardized Residuals vs Fitted Values):
# Se os pontos forem aleatórios e espalhados,
# então os dados são aleatórios e independentes;
# Se apresentar uma tendência, então há dependência.
plotres(mod.TR)
# ____________________________________________
# 7) ANOVA - análise de variância ----
# ____________________________________________
# Tabela ANOVA
# Se Pr(>F) < 0,05, então existe diferença
# significativa a 5%.
# df=graus de liberdade. Pr=probabilidade
# de ser maior que F tabelado.
summary(mod)
# Exportar tabela ANOVA para Excel:
write.csv2(
as.data.frame(summary(mod)[[1]]),
file =
212 APÊNDICE D. Roteiro em R das análises de dados
# ____________________________________________
# 11) GRÁFICO DE BARRAS DE TUKEY ----
# ____________________________________________
{
my_bar <- barplot(teste$Médias,
ylim=c(0, 1.3*max(teste$Médias)),
beside=T,
col="darkseagreen1",
names.arg = teste$Tratamentos,
xlab="Anos de avaliação",
ylab="Médias de notas")
# Barras de erro padrão médio
mean.worm = tapply(dados$RESP, dados$TRAT, mean) # média
sd.worm = tapply(dados$RESP, dados$TRAT,sd) # desvio padrão
n.worm = tapply(dados$RESP, dados$TRAT, length) # número por grupo
sem.worm = sd.worm/sqrt(n.worm) # erro padrão
mean.worm-sem.worm
arrows(my_bar,
mean.worm-sem.worm,
my_bar,
mean.worm + sem.worm,
code = 3,
angle = 90,
length = 0.1)
# Letras do Tukey
text(my_bar,
0.1*max(teste$Médias),
teste$Tukey, cex=1)
}
# ____________________________________________
# COMPARAÇÃO ENTRE DATALOGGER ACADÊMICO X PROFISSIONAL
# Criado em: 01/09/21
# Atualizado em: 08/11/21
library(tidyr)
require(dplyr)
# ____________________________________________
# DATALOGGER PROFISSIONAL ----
#
#
# ____________________________________________
# ____________________________________________
# Leitura e preparação dos dados # PROFISSIONAL ----
# ____________________________________________
# Comando para definir a localização da pasta:
{
library(rstudioapi) # precisa ter instalado o pacote "rstudioapi"
current_path =
rstudioapi::getActiveDocumentContext()$path
setwd(dirname(current_path ))
print( getwd() )
}
# Troque o nome do arquivo de dados (entre " .csv"):
dados <- read.csv(
"dados_experimento/082170EA.csv",
header = T)
# Mostra as 6 primeiras linhas para visualização.
# As colunas devem seguir a ordem: tratamento // resposta;
head(dados)
# Resumir as colunas
dados <- dados[,c(1:3)]
head(dados)
# Selecionando as variáveis
A1 <- dados$data[dados$name == "A1"]
A2 <- dados$data[dados$name == "A2"]
A3 <- dados$data[dados$name == "A3"]
A4 <- dados$data[dados$name == "A4"]
# Obs: eu tive que resumir manualmente no .csv, porque o
# A4 estava tendo 2 números faltantes! E isso compromete
# na minha estratégia de organização!!
# ____________________________________________
214 APÊNDICE D. Roteiro em R das análises de dados
header = T) # Cabeçalho
dados_palha0 <- read.table("dados_experimento/16082021.txt",
sep = ";", # separado por ;
header = T,
fill = TRUE) # Cabeçalho
# Escolhendo apenas 4 sensores
dados_palha10 <- dados_palha10[,c(1:2, 6, 8:10)]
dados_palha5 <- dados_palha5[,c(1:2, 6, 8:10)]
dados_palha0 <- dados_palha0[,c(1:2, 6, 8:10)]
head(dados_palha10)
head(dados_palha5)
head(dados_palha0)
# Juntando tudo em uma tabela
require(dplyr)
dados_total <- bind_rows(dados_palha10,
dados_palha5,
dados_palha0)
# ____________________________________________
# Atribuindo variáveis temporais ----
# ____________________________________________
require(lubridate)
# convertendo para data/dia
dados_total$data <- as.POSIXct(dados_total$data,
format = "%d/%m/%Y")
# Convertendo para hora
dados_total$hora <- as.POSIXct(dados_total$hora,
format = "%H:%M:%S")
# Classe da variável
class(dados_total$data)
class(dados_total$hora)
# Início dos dados
head(dados_total$data)
# ____________________________________________
# Filtrando por período de tempo (20 minutos coletados) ----
# ____________________________________________
# Separando por datas
tabela_palha10 <- dados_total %>%
filter(data == as.Date("2021-08-02 -03"))
tabela_palha5 <- dados_total %>%
filter(data == as.Date("2021-08-09 -03"))
tabela_palha0 <- dados_total %>%
filter(data == as.Date("2021-08-16 -03"))
# Separando por hora
tabela_palha10 <- tabela_palha10 %>%
filter(between(hora, # coluna de data/dia
as.POSIXct("15:21:41", # hora inicial
format = "%H:%M:%S"),
as.POSIXct("17:21:41", # hora final
format = "%H:%M:%S")))
tabela_palha5 <- tabela_palha5 %>%
filter(between(hora, # coluna de data/dia
as.POSIXct("11:26:50", # hora inicial
format = "%H:%M:%S"),
as.POSIXct("13:26:50", # hora final
format = "%H:%M:%S")))
tabela_palha0 <- tabela_palha0 %>%
filter(between(hora, # coluna de data/dia
as.POSIXct("12:52:20", # hora inicial
format = "%H:%M:%S"),
as.POSIXct("14:52:20", # hora final
format = "%H:%M:%S")))
# ____________________________________________
# Reorganizando a tabela para ANOVA ----
# ____________________________________________
# Juntar as 3 tabelas
tabela_uni <- bind_rows(tabela_palha10,
tabela_palha5,
216 APÊNDICE D. Roteiro em R das análises de dados
tabela_palha0)
# Criar uma coluna de tempo
tabela_uni$duracao <- rep(1:length(tabela_palha10$data),
3)
# Criar uma coluna de palha
tabela_uni$Palha <- rep(c("10", "5", "0"),
each = length(tabela_palha10$data))
# Selecionar apenas o que precisa
tabela_uni2 <- tabela_uni[,c(7,8,3:6)]
# Renomear as variáveis
colnames(tabela_uni2) <- c("duracao",
"Palha",
"A1",
"A2",
"A3",
"A4")
head(tabela_uni2)
# Juntar as colunas em uma linha só
library(tidyr)
dados_academico <- tabela_uni2 %>%
pivot_longer(
cols = c("A1",
"A2",
"A3",
"A4"),
names_to = "Sensor")
head(dados_academico)
# ____________________________________________
# COMPARANDO OS 2 DATALOGGERS ----
#
#
# ____________________________________________
# Criando uma coluna a mais sobre tipo do datalogger
dados_profissional$datalogger <- rep("Profissional",
length(dados_profissional$duracao))
dados_academico$datalogger <- rep("Academico",
length(dados_academico$duracao))
# Juntando as duas tabelas
require(dplyr)
dados <- bind_rows(dados_profissional, dados_academico)
head(dados)
attach(dados)
# Diferença média entre os dois dataloggers
difer <- mean(dados$value[dados$datalogger == "Profissional"])-
mean(dados$value[dados$datalogger == "Academico"])
difer
dados$value[dados$datalogger == "Profissional"] <-
dados$value[dados$datalogger == "Profissional"]-difer
# Filtrar apenas Datalogger profissional
require(dplyr)
valores_prof <- filter(dados, datalogger=="Profissional")
medias_prof <- tapply(valores_prof$value,
valores_prof$duracao,
mean)
# Filtrar apenas Datalogger profissional
valores_acd <- filter(dados, datalogger=="Academico")
medias_acd <- tapply(valores_acd$value,
valores_acd$duracao,
mean)
# Gráfico-teste
plot(medias_acd)
lines(medias_prof,
col="red")
t.test(medias_acd,
medias_prof)
td_acd <- dados$value[dados$datalogger == "Academico"]
td_prof <- dados$value[dados$datalogger == "Profissional"]
217
# ____________________________________________
# Correlação de Pearson ----
# ____________________________________________
# Correlação de Pearoson
cor_pear <- cor(td_acd, td_prof)
cor_pear
# Correlação com significância
cor.test(td_acd, td_prof)
# ____________________________________________
# Correlação de Spearman ----
# ____________________________________________
# Correlação de Spearman
spearman <- cor(td_acd, td_prof, method=c("spearman"))
spearman
# Correlação com significância
cor.test(td_acd, td_prof, method=c("spearman"))
# --------------------------------------------
# 12) Gráfico de comparação
# --------------------------------------------
# Legenda
require(latex2exp)
texto <- TeX(sprintf(r’($ r = %.3f $)’,
cor_pear))
plot(texto)
# Organizar para gráfico
tb <- data.frame(intervalo = c(1:length(tabela_palha10$data)),
medias_acd,
medias_prof)
tb2 <- tb %>% pivot_longer(
cols = c(medias_acd,
medias_prof),
names_to = "Datalogger"
)
head(tb2)
attach(tb2)
# Gráfico
require(ggplot2)
grafico <- ggplot(data = tb2,
aes(x = intervalo,
y = value),
group = factor(Datalogger)) +
geom_line(aes(colour = factor(Datalogger))) +
labs(x = "Tempo (min)",
y = "Leitura do sensor") +
scale_colour_brewer(palette = "Set1",
name = expression("Datalogger"),
labels = c("Acadêmico",
"Profissional")) +
theme_bw() +
theme(legend.position = c(0.9, 0.85)) +
annotate("text",
x = min(intervalo)*110,
y = min(value),
label= texto,
hjust= 0)
grafico
# Salvar
ggsave(file = "grafico_academicovsprofissional.svg",
plot = grafico,
width = 9,
height = 4)
# ____________________________________________
# Delineamento Inteiramente ao Acaso
# Elaborado por: Pablo Chang (27/07/2021)
# https://github.com/PabloChang/R
# ____________________________________________
# ____________________________________________
# FILTRAR OS ÚLTIMOS 10 MINUTOS ----
218 APÊNDICE D. Roteiro em R das análises de dados
# ____________________________________________
head(tb2)
# Filtrar dados por categorias, quando existir:
# Exemplo: mostrar somente dados da Profundidade 2.
# (Para usar, exclua o "#" abaixo e modifique)
require(dplyr)
tb2 <- filter(tb2, intervalo > 110)
head(tb2)
# ____________________________________________
# TESTE DE NORMALIDADE ----
# ____________________________________________
# Pacote com alguns testes:
library(nortest)
library(ExpDes)
# Tabela de dados
dados <- data.frame(TRAT = as.factor(tb2$Datalogger),
RESP = as.numeric(tb2$value))
# dados <- data.frame(TRAT = as.factor(dados_alinhado$TRAT),
# BLOCO = as.factor(dados_alinhado$Camadas),
# RESP = as.numeric(dados_alinhado$Umidade))
head(dados)
attach(dados)
# Cálculo dos resíduos:
mod = aov(RESP ~ dados$TRAT)
# mod = aov(RESP ~ dados$TRAT + dados$BLOCO)
# Gráficos de resíduos:
# Para ser normal, o histograma deve ter formato de sino no centro.
# Se o gráfico Normal Q-Q se assemelhar a uma reta crescente,
# então existe normalidade.
plotres(mod)
# Testes:
# Se p-value > 0,05, os resíduos possuem distribuição normal.
shapiro.test(mod$res) # Shapiro-Wilk
ad.test(mod$res) # Anderson-Darling
# Os resíduos são normais?
# Se SIM, rode o comando abaixo e pule para a etapa 5).
{RESP.TR <- RESP
# Se NÃO, faça a transformação em 4.1).
# ____________________________________________
# 4.1) TRANSFORMAÇÃO DE DADOS NÃO-NORMAIS ----
# ____________________________________________
# Faça os testes, até atingir a normalidade!
# TR1. Raiz quadrada:
{TR1 <- sqrt(dados$RESP)
modTR1 = aov(TR1 ~ dados$TRAT)
# Gráfico dos resíduos
plotres(modTR1)}
# Testes
shapiro.test(modTR1$res) # Shapiro-Wilk
ad.test(modTR1$res) # Anderson-Darling
# TR2. Logarítmica:
# Obs: precisa excluir valores = 0.
{TR2 <- log(dados$RESP)
modTR2 = aov(TR2 ~ dados$TRAT)
# Gráfico dos resíduos
plotres(modTR2)}
# Testes
shapiro.test(modTR2$res) # Shapiro-Wilk
ad.test(modTR2$res) # Anderson-Darling
# TR3. Hiperbólica
{TR3 <- 1/dados$RESP
modTR3 = aov(TR3 ~ dados$TRAT)
# Gráfico dos resíduos
plotres(modTR3)}
# Testes
shapiro.test(modTR3$res) # Shapiro-Wilk
ad.test(modTR3$res) # Anderson-Darling
# TR4. Box-Cox
{require(MASS)
# Cálculo
219
par(mfrow=c(1, 1))
bc=boxcox(RESP ~ TRAT, data=dados, plotit=T)
lambda.max <- bc$x[which.max(bc$y)]
lambda.max # Se for próximo de zero, usar logarítmico (TR2).
TR4 <- (RESP^(lambda.max)-1)/lambda.max
modTR4 = aov(TR4 ~ TRAT)
# Gráfico dos resíduos
plotres(modTR4)}
# Testes
shapiro.test(modTR4$res) # Shapiro-Wilk
ad.test(modTR4$res) # Anderson-Darling
# Digite o TR escolhido dentro de ( ):
RESP.TR <-
(dados$RESP) # troque aqui, por exemplo: (TR2).
# Com isso, as próximas análises irão usar os
# dados transformados!
}
# ____________________________________________
# 5) TESTE DE HOMOCEDASTICIDADE DAS VARIÂNCIAS ----
# ____________________________________________
# Isso implica que cada tratamento que está sendo
# comparado pelo teste F, deve ter aproximadamente
# a mesma variância para que a ANOVA tenha validade.
# Redefinição de dados:
{
dados.TR <- data.frame(dados$TRAT, RESP.TR)
attach(dados.TR)
TRAT <- as.factor(dados$TRAT)
RESP.TR <- as.numeric(RESP.TR)
mod.TR <- aov(RESP.TR ~ TRAT)
}
# Teste de Bartlett:
# Se p-value > 0,05, há homogeneidade das variâncias.
bartlett.test(mod.TR$res ~ TRAT)
# Boxplot de tratamentos vs resíduos:
# Se os boxplots forem semelhantes, há homocedasticidade.
{
par(mfrow=c(1, 1))
boxplot(mod.TR$res ~ TRAT)
}
# ____________________________________________
# 6) TESTE DE INDEPENDÊNCIA ----
# ____________________________________________
# Os dados são aleatórios e independentes.
# Ou seja, uma observação não influencia na outra
# e não existe influência do tempo ou local da coleta.
# Teste de Durbin-Watson:
# Se p-value > 0,05, então há independência.
{
require(lmtest)
dwtest(mod.TR)
}
# Gráfico de resíduos padronizados vs valores ajustados
# (Standardized Residuals vs Fitted Values):
# Se os pontos forem aleatórios e espalhados,
# então os dados são aleatórios e independentes;
# Se apresentar uma tendência, então há dependência.
plotres(mod.TR)
# ____________________________________________
# 7) ANOVA - análise de variância ----
# ____________________________________________
# Tabela ANOVA
# Se Pr(>F) < 0,05, então existe diferença
# significativa a 5%.
# df=graus de liberdade. Pr=probabilidade
# de ser maior que F tabelado.
summary(mod.TR)
# Exportar tabela ANOVA para Excel:
write.csv2(
as.data.frame(summary(mod.TR)[[1]]),
220 APÊNDICE D. Roteiro em R das análises de dados
file =
"prof x acd - Tabela ANOVA.csv")
# ____________________________________________
# 8) TESTE DE COMPARAÇÃO DE MÉDIAS ----
# ____________________________________________
# Teste Tukey, SNL (Student-Newman-Keuls), Duncan, t e
# Scott-Knott a 5% de significância.
# Tabela usando dados transformados (quando for o caso),
# mas mostrando médias originais:
{
require(easyanova)
require(dplyr)
par(mfrow=c(1, 1))
ttuk <- easyanova::ea1(dados.TR, design=1, plot=2)
teste <- arrange(ttuk$Means, ttuk$Means$treatment)
ttuk.o <- easyanova::ea1(dados, design=1, plot=2)
teste.o <- arrange(ttuk.o$Means, ttuk.o$Means$treatment)
teste$mean <- teste.o$mean
colnames(teste) <- c(
"Tratamentos",
"Médias",
"Erro padrão",
"Tukey",
"SNK",
"Duncan",
"t",
"Scott-Knott"
)
teste
}
# Exportar para Excel:
write.csv2(teste, file =
"prof x acd - Testes de Comparação de Médias.csv")
# ____________________________________________
# 9) DMS - Diferença Mínima Significativa do teste Tukey ----
# ____________________________________________
# Valor que retrata a diferença mínima para que duas
# médias tenham diferença significativa a 5%.
# Cálculo do DMS com transformação inversa:
{
t.HSD <- TukeyHSD(mod.TR, ordered=TRUE)
dms <- unname(0.5*diff(t.HSD$TRAT[1, 2:3]))
LimSup <- mean(RESP.TR)
LimInf <- LimSup-dms
if(RESP.TR != RESP){
# TR1. Raiz quadrada:
if(RESP.TR == TR1){
dms <- (LimSup)^2-(LimInf)^2
}
# TR2. Logarítmica:
if(RESP.TR == TR2){
dms <- exp(LimSup)-exp(LimInf)
}
# TR3. Hiperbólica:
if(RESP.TR == TR3){
dms <- (LimSup)^(-1)-(LimInf)^(-1)
}
# TR4. Box-Cox:
if(RESP.TR == TR4){
dms <- ((LimSup*lambda.max)+1)^(1/lambda.max) -
((LimInf*lambda.max)+1)^(1/lambda.max)
}
}
}
dms # Valor do DMS
# ____________________________________________
# 10) TABELA RESUMIDA (COM TESTE TUKEY) ----
# ____________________________________________
{
tabela <- data.frame(
221
Tratamentos = c(
teste$Tratamentos,
"Média Geral",
"CV (%)",
"DMS"),
Médias = c(
teste$Médias,
mean(RESP),
100*sd(RESP)/mean(RESP),
dms),
Tukey =
c(
as.character(teste$Tukey),
" ",
" ",
" "),
stringsAsFactors = FALSE)
tabela
}
# Exportar para Excel:
# Pode acumular resultados de testes anteriores num mesmo arquivo.
# Pode colocar títulos diferentes em "TÍTULO":
if(file.exists("DIC - Tabela Resumida.csv")){
tabela.comb <- read.csv2(file="DIC - Tabela Resumida.csv")
tabela.comb <- cbind(tabela.comb, "TÍTULO", tabela)
write.csv2(tabela.comb, file =
"DIC - Tabela Resumida.csv")
}else{
write.csv2(tabela, file =
"DIC - Tabela Resumida.csv")
}
# ____________________________________________
# 11) GRÁFICO DE BARRAS DE TUKEY ----
# ____________________________________________
{
my_bar <- barplot(teste$Médias,
ylim=c(0, 1.3*max(teste$Médias)),
beside=T,
col="darkseagreen1",
names.arg = teste$Tratamentos,
xlab="Anos de avaliação",
ylab="Médias de notas")
# Barras de erro padrão médio
mean.worm = tapply(dados$RESP, dados$TRAT, mean) # média
sd.worm = tapply(dados$RESP, dados$TRAT,sd) # desvio padrão
n.worm = tapply(dados$RESP, dados$TRAT, length) # número por grupo
sem.worm = sd.worm/sqrt(n.worm) # erro padrão
mean.worm-sem.worm
arrows(my_bar,
mean.worm-sem.worm,
my_bar,
mean.worm + sem.worm,
code = 3,
angle = 90,
length = 0.1)
# Letras do Tukey
text(my_bar,
0.1*max(teste$Médias),
teste$Tukey, cex=1)
}
222 APÊNDICE D. Roteiro em R das análises de dados
Fonte: Autor
Fonte: Autor
223
Fonte: Autor
Anexos
227
Description:
Water flow sensor consists of a plastic valve body, a water rotor, and a hall-effect sensor. When water flows through the rotor, rotor rolls. Its speed changes with
different rate of flow. The hall-effect sensor outputs the corresponding pulse signal. This one is suitable to detect flow in water dispenser or coffee machine. We
have a comprehensive line of water flow sensors in different diameters. Check them out to find the one that meets your need most.
Features:
Compact, Easy to Install
High Sealing Performance
High Quality Hall Effect Sensor
RoHS Compliant
Specifications:
Working Voltage: DC 4.5V~24V
Normal Voltage: DC 5V~18V
Max. Working Current: 15mA (DC 5V)
Load capacity: ≤ 10 mA (DC 5V)
Flow Rate Range: 1~30L/min
Load Capacity: ≤10mA (DC 5V)
Operating Temperature: ≤80℃
Liquid Temperature: ≤120℃
Operating Humidity: 35%~90%RH
Allowing Pressure: ≤1.75MPa
Storage Temperature: -25~+ 80℃
Storage Humidity: 25%~95%RH
Electric strength 1250V/min
Insulation resistance ≥ 100MΩ
External threads: 1/2"
Outer diameter: 20mm
Intake diameter: 9mm
Outlet diameter: 12mm
Application:
Water heaters, credit card machines, water vending machine, flow measurement device!
N° Item Material
1 Wire PVC
2 Bonnet PA
3 Screw Zinc Plated
4 Valve Body PA
5 Press Valve
6 Magnet
7 Hall
8 Impeller POM
9 Steel Sharft SUS304
Closed
229
Product features:
5V Supply
Trigger Pulse Input
Echo Pulse Output
0V Ground
Electric Parameter
Working Voltage DC 5 V
Working Current 15mA
Working Frequency 40Hz
Max Range 4m
Min Range 2cm
MeasuringAngle 15 degree
Trigger Input Signal 10uS TTL pulse
Echo Output Signal Input TTL lever signal and the range in
proportion
Dimension 45*20*15mm
Vcc Trig Echo GND
Timing diagram
The Timing diagram is shown below. You only need to supply a short 10uS
pulse to the trigger input to start the ranging, and then the module will send out
an 8 cycle burst of ultrasound at 40 kHz and raise its echo. The Echo is a
distance object that is pulse width and the range in proportion .You can
calculate the range through the time interval between sending trigger signal and
receiving echo signal. Formula: uS / 58 = centimeters or uS / 148 =inch; or: the
range = high level time * velocity (340M/S) / 2; we suggest to use over 60ms
measurement cycle, in order to prevent trigger signal to the echo signal.
Attention:
www.Elecfreaks.com
233
Figura 57 – Datalogger desenvolvido pelo autor, com destaque ao módulo RTC e ao módulo
SD-Card
Figura 59 – PCB criada por Pereira (2013) utilizando microcontrolador ATMEL, e Shield
do cartão SD, respectivamente
(a) PCB utilizando microcontrolador Arduino. (b) Shield do cartão SD.