Bom, agora que temos tudo montado e conectado vamos precisar do nosso primeiro software. Ele é bem bagunçado, pouco comentado, nem um pouco polido. Mas funciona e serviu para validar a ideia, fiz um teste e ele leu e gravou corretamente os dados. Quando você faz a compilação do código inteiro para o UNO ele já te apresenta o aviso:
Pouca memória disponível, problemas de estabilidade podem ocorrer.
Quando isso acontece você deixa o código rolando do Arduino para ver se realmente terá problemas, mas em um logger não podemos correr riscos, e tendo que minimizar ao máximo eles é necessário retirar código para que o UNO possa rodar nosso logger.
Como o código rodou sem problemas ou já não preciso mais ficar olhando serial para ver se está tudo iniciando corretamente, eu sei que está pois já testei. Então para usar o UNO toda a estrutura que era responsável pela serial foi removida.
Esse código ele já pode te servir como um parâmetro para ver como funciona cada módulo, mas não precisa preocupar em entender, embora eu quero registrar alguns passos, nós vamos passar o nosso sistema para o Arduino MEGA 2560 e reestruturar todo o código, dividindo ele corretamente e fazendo comentários, pois esse código reescrito será a base para as outras implementações necessárias.
Você pode realizar o download do código abaixo, lembrando que o código sem serial não teve as partes do serial removidas, e sim colocadas em forma de comentário (/* * */), e algumas outras mudanças também foram feitas, como remoção de uma parte da tela OLED e de verificações, como dos sensores DS18B20.
ATENÇÃO: O código possui um erro, corrija da seguinte forma. Logo após a linha void setup() adicione a seguinte linha: pinMode(10, OUTPUT); E deixe a porta 10 vazia.
ATENÇÃO: O código possui um erro, corrija da seguinte forma. Logo após a linha void setup() adicione a seguinte linha: pinMode(10, OUTPUT); E deixe a porta 10 vazia.
Vamos comentar brevemente o código, você pode baixar e acompanhar ou usar a caixa de texto acima.
Primeiro incluímos as bibliotecas, a <Adafruit_Sensor.h> foi só para não ter dor de cabeça, essa versão da biblioteca do DHT usa ela. Depois foi definida a porta única de dados do DS18B20, aqui um detalhe, a maioria dos tutoriais em português do DS18B20 usam a porta 10, mas quando você iniciar o SD o sensor vai parar de funcionar, isso porque a porta 10 é usada pelo protocolo PSI do SD, então usei a porta 7 que estava livre. Logo em seguida definimos que a variável dados é um arquivo.
Abaixo configurei o DHT e defini suas variáveis para armazenar os dados, a variável tempC é usada para o DS18B20. Iniciamos o OneWire, dizemos o que está nele e no final cadastramos um nome para cada sensor, sen1, sen2 e sen3. Foi definido o controlador do OLED que foi usado.
Chegamos ao nosso setup, onde o código será rodado apenas uma vez, aqui iniciamos a comunicação serial padrão, definimos o pino do DHT como entrado e iniciamos nossos sensores e atuadores, observe no momento de ligar o SD o 4, esse é o pino de dados dele, pino CS na porta 4.
Nos "sensors.setResolution(sen1, 12);" é definido a quantidade de bits do BS18B20, o ideal é usar 10 e seus resistor padrão, eu usei 12bits por causa do resistor de 10K usado, pois era o que tinha, mas aí a informação de temperatura perde confiabilidade.
Dentro do setup nós ainda vamos verificar o SD e o DS18B20. A verificação do SD ocorre da seguinte forma, abrimos o arquivo em que os dados serão gravados, se ele abrir gravamos um cabeçalho nele e fechamos, mostrando no OLED que deu tudo certo. Se o arquivo não abrir (else), mostramos na serial e no visor que houve um erro. O delay de 4 segundo é usado para que o usuário tenha tempo de ler o OLED, embora o próximo delay no loop ainda seja somado a este.
Ainda no setup vamos verificar se o DS18B20 está funcionando. Ele vai capturar a temperatura do sensor na variável tempC, quando o sensor não está funcionando devidamente ele envia a informação de -127 graus, então se receber essa informação tem um erro, caso contrário segue o jogo.
Agora chegamos ao loop, que é onde tudo vai correr, de forma repetida. Iniciamos com um delay, ele vai ser o principal controle do intervalo de escrita dos dados no SD, mas atenção, ainda não é o único e temos que melhorar isso. Então vamos pedir as temperaturas do DS18B20 e mostrar no serial. Depois vamos gravar a temperatura de cada um em uma variável, pois antes a biblioteca era capaz de identificar, agora não teremos mais esse auxílio. Mesma coisa para o DHT, lê os dados, grava em uma variável e imprime ela na serial.
Agora vamos mostrar os dados no OLED, limpei a tela, coloquei o tamanho da fonte e mostrei na tela os dados do DHT, espero 3000ms para mostrar os dados do DS18B20. Aqui alguns detalhes, o tempo entre as gravações no SD será a somatória do primeiro delay com o segundo delay (vamos arrumar isso), e enquanto as informações do DHT ficam sendo mostradas pelo tempo do segundo delay, as dos DS18B20 ficam na tela pelo tempo do primeiro delay.
Ok, agora gravamos os dados, essa parte também precisa ser melhorada, com alguma concatenação. Então abrimos o arquivo, se ele abrir gravamos, os dados separados por vírgula e no final quebramos a linha, e fechamos o arquivo. Se ele não abrir mostra erro na serial.
No código estruturado já adicionei mostrar se o arquivo está correto ou não na tela OLED.
O código completo compilado para o UNO ocupa 77% do espaço para programa e 75% de memória.
O código sem serial para o UNO ocupa 74% do espaço para programa e 64% de memória.
O código completo para o MEGA ocupa 9% do espaço para programa e 18% de memória.
Então já definimos que para polir, adicionar mais recursos e variações ao código vamos ter que migrar de Arduino, próximo passo: trocar de Arduino.
Nenhum comentário:
Postar um comentário