quinta-feira, 30 de agosto de 2018

Um datalogger simples para monitorar meu cachorro


O intuito do meu uso com microcontroladores se dá em resolver problemas e ter dados concretos para tomar decisões lúcidas. Então me vi no primeiro problema que usar um Arduino para capturar informações me seria de imensa valia. Vou explicar o problema:

Eu não tenho um abrigo de animais, mas minha casa é espaçosa, então sempre que tenho algum dinheiro a mais dou lar temporário para um animal que tiro da rua até encontrar um lar. Esses animais dormem junto a mim no meu quarto, mas o animal do momento é o Taurus, um cachorro de porte médio que venho com traumas e doença do carrapato. Devido ao fato dele não poder tomar banho e outros fatores não posso colocá-lo para dormir como os outros. Então ele dorme na área de serviço, em uma casinha improvisada, protegida por papelão, a máquina de lavar, PVC e caminhas de pano.

O problema é que após ser curado da doença de carrapato, tratamento este bem caro, o Taurus começou a apresentar tosses, acredito que pela combinação de baixa temperatura e baixa umidade. Desta forma eu precisei coletar dados sobre a noite dele. Então determinei quais os dados seriam de grande valia para que eu possa avaliar a situação e resolver o problema.

Foi então que decidi coletar os seguintes dados:
  • A umidade do ar, esse fator é importante para o bem estar da garganta, ainda mais para cães grandes que respiram pela boca boa parte do tempo.
  • A temperatura do ambiente geral, para saber se seria necessário o uso de algum artifício para gerar calor
  • A temperatura do ambiente dele, para saber se toda a proteção improvisada estava servindo para manter o animal mais aquecido que se não tivesse a proteção (o local não pega vento)
  • A movimentação do animal, preciso saber se ele passa mais tempo exposto ou dentro do local protegido que pensei que tinha feito
A lógica do produto criado foi a seguinte, ao ligar ele verifica se o cartão SD foi iniciado corretamente. Caso verdadeiro ele ativa o buzzer por um breve tempo para informar que tudo se encontra bem. Assim ele começa a analisar repetidamente o sensor pir. Se o sensor de movimento for ativado se incia o loop:
Se lê os dados do sensores DHT22 e DS18B20, se lê o horário por meio do RTC, grava esses dados no cartão SD e mostra algumas informações na tela para controle. Quando se tem um protótipo é muito difícil monitorar seu funcionamento sem uma tela, claro que depois de tudo operando normalmente a mesma pode ser removida. Caso se passe uma hora sem que o sensor de movimento se ative o sistema inicia o loop sozinho. Tudo rodando em um arduino UNO e alimentado pela tomada, utilizando uma fonte para protoboard. Foram utilizados dois LEDs, um de alto brilho branco que se ativa quando um movimento é detectado. E um vermelho normal que se ativa quando existe algum erro com a gravação no SD.

Esse datalogger foi de valia pelos novos modos de trabalho que não haviam sido incorporados nos dataloggers que construímos anteriormente no blog. Primeiro que a gravação de dados não é mais efetuada apenas por um fator, que no caso era o tempo. Agora a leitura é efetuada se acordo com um fator externo (movimentação), e se esse fator não se manisfestar durante uma hora a leitura é realizada automaticamente. Outra questão é que não apenas podemos mais trabalhar com millis. O RTC se demonstrou necessário porque eu preciso saber a hora exata da gravação, ele não ocorre mais de 15 em 15 minutos, ela ocorre em qualquer hora, e saber essa hora é crucial. Mesmo que o millis ainda seja utilizado para controle de tempo.



Bom, vou comentar um pouco das estruturas do código ao invés de comentar ele propriamente dito, uma questão de organização pessoal. O código se inicia com algumas declarações, são apenas aquelas que seriam muito importantes por serem repetitivas, umas vez que muitas portas digitais foram usadas. Depois se procede a inclusão das bibliotecas padrões dos dispositivos. Para o oled eu usei a MicroLCD, gosto muito dela por ser leve e simples para somente escrever um texto na tela. Depois que todas as configurações das bibliotecas e as variáveis são declaradas vamos ao setup básico. Utilizei a serial para testes usando o PC, mas ela não é mais necessária, incio os LEDs e buzzer como nível baixo e imprimo uma mensagem no OLED.
A parte do SD é interessante para a verificação inicial, se tudo ok o buzzer se ativa por 300ms. Se existe um erro chama a função erro(). No momento ela apenas acende o LED, mas chamar a função é uma estratégia para o futuro, quando for necessário implementar algo mais para alertar um erro basta implementar na função, assim não precisa editar no software inteiro.

O loop também é bem tranquilo e reaproveita o raciocínio do datalogger anterior. A cada 100ms atualiza a variável que armazena o tempo do millis(), e verifica o estado do sensor de movimento. O próximo laço IF apenas acende o LED quando o sensor se ativar. O próximo laço é o da leitura e gravação. Nele temos o comando "or", ou seja, se passaram uma hora da última gravação ou se o sensor foi ativado o laço IF rodará. Ele se inicia com a leitura dos sensores e depois passa para a gravação no SD. Assim se verifica se o tamanho do arquivo onde os dados estão sendo gravados aumentou, caso verdadeiro segue o loop, se falso chama a função erro().
Por fim as informações são mostradas na tela, mostra se houve movimento, para saber se a última gravação foi ativada pelo sensor ou pelo timer, os tamanhos do arquivo para garantir que está ocorrendo gravação e os dados dos sensores. O último delay prender o loop por nove segundos, já que o sensor quando ativado envia sinal em nível alto por cerca de sete segundos, sem o delay o loop ficaria rodando por sete segundos repetidamente se fosse acionado pelo sensor.

De posse as explicações vamos verificar os resultados:
Com os resultados eu gerei os gráficos abaixo:
A primeira análise que eu gostaria de fazer é do último gráfico, o da umidade ao longo do tempo, como os intervalos de tempo não são fixos a inclinação da linha se torna um problema. Mas a informações aqui importante não é a tendência, e sim os valores brutos. Podemos verificar que como esperado a umidade se elevou durante a madrugada, mas o dado importante é a umidade mínima, que se apresentou em 53%, baixa, mas não tão alarmante. Mas a primeira conclusão é que se torna interessante tomar um providência para elevar essa umidade.

Já o segundo gráfico é muito importante, ele responde se o Taurus passa a maior parte do seu tempo no abrigo, ou fora deste, assim posso determinar onde concentrar os esforços e entender quais fatores o levam a tomar essa decisão. Verifica-se que às 23:06 ele termina de comer e se dirige a sua cama (horários anteriores foram induzidos por mim para testes), lá ele dorme por praticamente 4 horas, assim ele acorda, e possivelmente se ausenta da cama por vinte minutos, acredito que para esfriar o corpo, movimentar ou tomar água. 03:35, cerca de 20 minutos depois de voltar a cama ele sai novamente, fica 40 minutos fora e retorna, onde dorme por mais uma hora. Assim ele acorda pois é o horário que os moradores se levantam. Isso responde a várias questões, a primeira é que o Taurus teve um sono tranquilo, com poucos intervalos. A segunda é que vale investir esforços na caminha, pois é o local que ele passa a maior parte de sua noite. Claro que seria necessário coleta de dados por várias noites e uso de técnicas de data science para afirmar o padrão noturno do animal, mas apenas essa noite já serviu como um bom parâmetro.

Já o primeiro gráfico é o da temperatura, observe que a temperatura ambiente possui números decimais e a do abrigo apenas números inteiros. Isso se origina da linha "int tempCama = DS18B20.getTempCByIndex(0);", onde a variável usada não foi do tipo float. Tomei essa decisão para poupar memória do atmega328p e evitar travamentos. Mas mesmo assim podemos analisar. A temperatura mínima foi de 17,9°C, o que não apresenta risco alarmante. Mas mesmo com o dado raso de temperatura foi possível ver que a temperatura do abrigo foi inferior que a temperatura do ambiente externo. É possível ver isso às 04:18, em que o ambiente estava a 18,7°C e o abrigo a no máximo 17,9°C. Ou seja, será necessário repensar toda a estratégia de construção do abrigo, pois o mesmo não cumpre totalmente seu papel. Mesmo que ali o cão esteja mais protegido do vento, em cima de uma cama fofa e com isolamento do chão. Mas se tivesse tudo isso protegido do vento a temperatura seria a ambiente da mesma forma, então o abrigo não está sendo útil, mesmo com todo o esforço para armá-lo.

Concluímos que o datalogger operou corretamente, me fornecendo informações para que assim eu possa tomar decisões e chegar a conclusões, como de que meu esforço para o abrigo não está sendo devidamente aproveitado. Claro que melhorias podem e devem ser feitas no mesmo, como a substituição do UNO por um Pro Mini, alterações e código e pontos de medição diferentes. Mas no geral estou feliz com o resultado.

Não apenas foi adicionado conhecimento de programação, como uma mudança ambiental para ativação do loop e o uso do RTC mas também me surgem ideias se uso agronômico para esse tipo de aparelho. Que tal gravar sempre que um animal faz uma ação, como passar por uma porta? Ou então monitorar a movimentação de uma vaca, para assim detectar seu cio com maior precisão? Esse ramo de monitoramento conjunto de animais e de ambientes me parece ser muito interessante no âmbito rural e comercial, e não apenas doméstico. Sendo o custo do produto em si bem baixo.

Esse é o Taurus, a "cobaia"


2 comentários:

  1. Play Cafe Casino Games
    We bring 포천 출장샵 you an exciting blend of slots, table games, and classic casino games 문경 출장마사지 from the all-time 토토 꽁머니 best provider at Cafe 창원 출장샵 Casino. Play today! Rating: 4.5 충청북도 출장샵 · ‎12 votes

    ResponderExcluir