Datalogger para HAB (High Altitude Balloon) com Arduino

Olá pessoal, neste post irei abordar o desenvolvimento de um simples datalogger, com finalidade de utilização em projetos de HAB (High Altitude Balloon).

O que é um datalogger ?

O datalogger consiste em um coletor e armazenador eletrônico de dados, contendo diversos sensores, pode capturar informações como: umidade, pressão atmosférica, temperatura e altitude, dentre outras.
As informações capturadas, são armazenadas em um cartão SD, com finalidade de processamento posterior.

Desenvolvendo o datalogger – Hardware

Para iniciarmos o desenvolvimento do datalogger, é necessário que você disponha dos seguintes equipamentos, listados abaixo:

Todos os componentes citados acima, podem ser adquiridos com facilidade em sites de compras como Mercado Livre, AliExpress e eBay.

Especificações dos sensores utilizados

  1. DHT11 – Sensor responsável por capturar a umidade relativa do ar e temperatura, combinados de uma fórmula é possível obter os valores de ponto de orvalho.
    Sensor Especificação
    Umidade Relativa 20% ~ 90%
    Temperatura 0 ºC ~ 50 ºC

    Clique aqui para visualizar o datasheet.

  2. BMP085 – Sensor responsável por relatar a pressão atmosférica, altitude e temperatura.
    Sensor Especificação
    Pressão 300 hPa ~ 1.100 hPa
    Temperatura -40 ºC ~ 85 ºC

    Clique aqui para visualizar o datasheet.

  3. Dallas DS18B20 – Sensor responsável por relatar a temperatura externa da cápsula.
    Sensor Especificação
    Temperatura -55 ºC ~ 125 ºC

    Clique aqui para visualizar o datasheet.

 

Diagrama de ligação dos sensores no Arduino

Siga o diagrama abaixo para efetuar a ligação dos sensores no Arduino.

Diagrama Datalogger

Desenvolvendo o datalogger – Software

Para prosseguir com o desenvolvimento do datalogger, é necessário que sejam integradas as bibliotecas respectivas dos sensores a IDE do Arduino.
Segue abaixo os links para download:

DHT11 – Library BMP085 – Library DS18B20 – Library
donwload-icon donwload-icon donwload-icon

Para adicionar as bibliotecas a IDE do Arduino, é necessário que seja feita a extração das mesmas no diretório “libraries“, conforme imagem abaixo:

arduino_libraries

Segue abaixo o código fonte a ser aplicado na IDE, após o procedimento, faça o Upload do código para o Arduino.

// Inclusão das bibliotecas
#include <SD.h>
#include <dht.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_BMP085.h>
#include <dewpoint.h>

// Definições dos conectores
#define A0pin A0
#define ONE_WIRE_BUS 2

// Constantes e variáveis
const int sdChipSelected = 4;
const int delayTime = 5000; // Intervalo de captura
boolean SDCardStart = false;
String sensorDHTHumidity, sensorDHTTemperature, sensorDHTDewPointFast, sensorBMPPressure, sensorBMPTemperature, sensorBMPAltitude, sensorDSTemperature;
char strFloatToStr[20];
int frameCount = 0;

// Criando métodos dos sensores
dht DHT;
Adafruit_BMP085 bmp;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(){
  Serial.begin(9600);
  delay(1000); //-> Aguardar início dos sensores

  // Setando o I/O dos pinos
  setPins();

  // Iniciar o cartão SD
  if (!SD.begin(sdChipSelected)) {
    Serial.println("SD Card ausente...");
    return;
  }
  else{
    SDCardStart = true;
    Serial.println("SD Card iniciado");
  }

  // Iniciando Sensor BMP085
  if (!bmp.begin()){
    Serial.println("Sensor BMP085 não encontrado !");
  }

  // Iniciando Sensor Dallas DS18B20
  sensors.begin();
}

void loop(){
  if(SDCardStart){
    String infoLog = "";

    // Limpa os dados dos sensores
    clearValuesSensors();

    // Aloca os dados dos sensores
    readSensors();

    // Informa os frames
    String contFrame = String(frameCount);

    infoLog = contFrame + "," + sensorDHTHumidity + "," + sensorDHTTemperature + "," + sensorDHTDewPointFast + "," + sensorBMPTemperature + "," + sensorBMPPressure + "," + sensorBMPAltitude + "," + sensorDSTemperature;

    // Gravar no cartão SD
    File dataFileLog = SD.open("log.txt", FILE_WRITE);

    if(dataFileLog){
      dataFileLog.println(String(infoLog));
      dataFileLog.close();
    }

    Serial.println(infoLog);
    frameCount++;
    delay(delayTime);
  }
  else{
   // Beep caso o cartão SD não seja iniciado
   beep();
   delay(2000);
  }

}

// Limpar os valores das variáveis utilizadas no log
void clearValuesSensors(){
  sensorDHTHumidity = "";
  sensorDHTTemperature = "";
  sensorDHTDewPointFast = "";
  sensorBMPTemperature = "";
  sensorBMPPressure = "";
  sensorBMPAltitude = "";
  sensorDSTemperature = "";
}

// Ler valores dos sensores
void readSensors(){
  DHT.read11(A0pin);

  delay(1000);

  dtostrf(DHT.humidity,1,1,strFloatToStr);
  sensorDHTHumidity = String(strFloatToStr);

  dtostrf(DHT.temperature,1,1,strFloatToStr);
  sensorDHTTemperature = String(strFloatToStr);

  dtostrf(dewPointFast(DHT.temperature, DHT.humidity),1,1,strFloatToStr);
  sensorDHTDewPointFast = String(strFloatToStr);

  dtostrf(bmp.readTemperature(),1,2,strFloatToStr);
  sensorBMPTemperature = String(strFloatToStr);

  dtostrf(bmp.readPressure(),1,1,strFloatToStr);
  sensorBMPPressure = String(strFloatToStr);  

  dtostrf(bmp.readAltitude(),1,1,strFloatToStr);
  sensorBMPAltitude = String(strFloatToStr); 

  sensors.requestTemperatures();
  dtostrf(sensors.getTempCByIndex(0),1,1,strFloatToStr);
  sensorDSTemperature = String(strFloatToStr);
}

// Função beep
void beep(){
   tone(7,2100, 90);
}

// Setar pinos utilizados
void setPins(){
  pinMode(10, OUTPUT);
}

// ******* Funções de terceiros **********
// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
	double a = 17.271;
        double b = 237.7;
        double temp = (a * celsius) / (b + celsius) + log(humidity/100);
        double Td = (b * temp) / (a - temp);
        return Td;
}

Após ligação dos sensores e upload do software, o mesmo já está pronto para trabalhar, note que ao ligar o datalogger, com cartão SD ausente, um beep soará alertando a ausência do cartão, isso ocorre por questões de segurança ao efetuar o lançamento.

Obs.: Caso ouça o beep de alerta, desligue o datalogger e insira o cartão SD corretamente, logo após ligue o datalogger novamente.

Recuperando os dados gerados pelo datalogger

O datalogger armazena as informações em um arquivo de texto separado por vírgula, que pode ser localizado no cartão SD com o nome de “LOG.TXT”. Este arquivo contém as leituras dos sensores registradas frame-a-frame, essas informações estão catalogadas conforme imagem abaixo:

Resumo Datalogger

Pós-processamento dos dados gerados pelo datalogger

É possível utilizar-se de duas formas de processamento, a primeira delas é importar o arquivo de texto no Microsoft Excel ou qualquer outro gerenciador de planilhas, do qual é possível gerar gráficos e retrabalhar os dados conforme sua necessidade.

Também desenvolvi uma ferramenta denominada de “PU2VLW – DataLogger Reader”, um software que reprocessa os arquivos, gerando gráficos e informando os valores máximos, médios e mínimos. Conforme visto nas imagens abaixo.

Clique aqui para baixar o software PU2VLW – DataLogger Reader.
(Obs.: É necessário instalar o Microsoft .Net Framework 4.0).

Algumas imagens do datalogger

Este slideshow necessita de JavaScript.

Agradeço ao Bruno Sousa do Projeto Estratos, que disponibilizou todo o material para desenvolvimento, e está colaborando com os testes, para que sejam efetuadas todas as correções possíveis. Em breve será implementado um relógio RTC, para armazenar data e hora e um GPS para disponibilizar o posicionamento do experimento.

Bom pessoal, por hoje é só, desculpem pelo post extenso.
73 de PU2VLW.

Anúncios

11 comentários sobre “Datalogger para HAB (High Altitude Balloon) com Arduino

  1. Olá Vinicius, parabéns pela publicação. Sua exposição não é extensa. Para quem gosta fica uma sensação… de: “Já acabou?”….
    Lançamos um balão ano passado aqui em Boa Vista. Mas, não é de tão alta altitude. Foi mais ou menos 20 a 23 Km. Eu não sei se poderíamos aproveitar seu desenvolvimento para que ele possa transmitir alguns dados via algum modo digital. Pois nem sempre podemos resgatar o experimento. Uma vez mais, parabéns. 73 de Paulo PV8DX

  2. caro Vinicius .
    saberia me informar onde encontro o rtl2832u + r820t aqui no Brasil ?
    gostaria de montar meu sdr , mas está dificil …. grato .

  3. Gostei muito desta ideia. Por acaso você sabe como fazer para salvar no SD apenas dados médios de cada sensor: tipo de minuto em minuto? O interessante seria que a data e hora também fosse gravado no SD.

  4. PU2VLW, gostaria de fazer um projetinho com arduino porem não manjo muito de programação, a ideia seria fazer leitura de temperatura e umidade, verificar se a temperatura está entre 20 a 25° C, umidade < 60%, se estiver fora destes padrões acionar o ar condicionado ou o desumidificador, e se possível registrar com data e hora em sd para arquivo, e também mostrar em um lcd as informações de imediato, me corrige se eu estiver errado, para isso vou precisar de um lcd, um sensor dht 11, um relé para o umidificador, e um IR para o ar condicionado, um modulo data logger?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s