Arduino Data Logger (Log de Temperatura, Umidade, Tempo no Cartão SD e Computador)

Tempo de leitura: 11 minutes

Como engenheiros/desenvolvedores, sempre contamos com os dados coletados para projetar ou melhorar um sistema. Gravar dados e analisá-los é uma prática comum na maioria dos setores, aqui estamos construindo Projeto Arduino Data Logger onde aprenderemos como podemos registrar dados em um intervalo específico de tempo. Usaremos uma placa Arduino para ler alguns dados (aqui temperatura, umidade, data e hora) e salvá-los em um cartão SD e no computador simultaneamente.

Os dados salvos podem ser facilmente abertos em uma planilha do Excel para análises adicionais. Para manter a data e a hora, usaremos os famosos Módulo RTC DS3231 e para obter a temperatura e a umidade, usaremos o Sensor DHT11  No final do projeto, você aprenderá.

  1. Como registrar dados no cartão SD com valores de data, hora e sensor.
  2. Como gravar dados diretamente no Excel Sheet no PC via comunicação serial.

Materiais necessários:

  1. ProtoBoard
  2. Arduino UNO (qualquer placa do Arduino)
  3. Sensor de temperatura DHT11
  4. Módulo DS3231 RTC
  5. Módulo de cartão SD
  6. Cartão SD
  7. Conectando fios
  8. Computador/laptop

 

Diagrama do circuito:

O diagrama do circuito para isso Projeto Arduino Temperature Logger é mostrado abaixo.

Como mostrado no diagrama de circuitos, as conexões são muito simples, pois as usamos como módulos, podemos construí-las diretamente em uma placa de ensaio. As conexões são classificadas na tabela abaixo

Arduino PinPino do módulo
Sensor de temperatura – DHT11
Vcc5V
GndGnd
NcNc
ForaPin 7
Módulo RTC DS3231
Vcc5V
GndGnd
SCLPino A5
SDAPino A4
Módulo do cartão SD
Vcc5V
GndGnd
MISOPino 12
MOSIPino 11
SCKPino 13
CSPin 4

Você pode substituir o sensor de temperatura DHT11 por qualquer um dos seus sensores dos quais você precisa registrar os valores. Você pode verificar LM35 com Arduino para ler a temperatura.

O módulo RTC DS3231 está em interface com o Arduino usando a comunicação I2C (SCL, SDA) e o módulo do cartão SD é em interface usando a Comunicação SPI (MISO, MOSI, SCK, CS). Os pinos 4 e 7 são definidos como o pino CS e o pino de saída pelo programa Arduino; você pode alterá-los para qualquer outro pino, se necessário. Nós anteriormente cartão SD com interface com o Arduino no projeto Music player.

Explicação do programa Arduino :

Temos que escrever o programa Arduino, que pode fazer o seguinte.

  1. Leia os dados do sensor DTH11 (ou quaisquer outros dados que você deseja registrar).
  2. Inicialize o barramento I2C para ler dados do módulo RTC.
  3. Inicialize o barramento SPI para interagir com o módulo do cartão SD com o Arduino.
  4. Armazene a data, hora, temperatura e umidade no cartão SD.
  5. Armazene a data, hora, temperatura e umidade em uma planilha do Excel em execução em um computador/laptop.

As etapas acima podem parecer complicadas, mas são muito fáceis, pois temos as bibliotecas para fazer o trabalho duro por nós. Você precisa baixar as duas bibliotecas a seguir

  1. Biblioteca de sensores DHT11 do GitHub
  2. Biblioteca do módulo DS3231 RTC  da Rinky-Dink Electronics

Depois de baixar a biblioteca, adicione-os ao seu IDE do Arduino seguindo

Sketch -> Include Library -> Add .ZIP Library

Para alimentar os dados do Arduino com animação em uma folha do Excel no computador, também precisaremos instalar o software chamado PLX-DAQ fornecido pela Parallax Inc. Siga o link para baixar o arquivo e instalá-los com base no seu sistema operacional.  Isso deveria ter criado uma pasta chamada PLS-DAQ na sua área de trabalho. Nós cuidaremos disso mais tarde em nossa seção de trabalho.

Agora, depois de adicionar as duas bibliotecas e depois de instalar o software, você pode usá-lo Código completo (fornecido na parte inferior do tutorial) e faça o upload para o seu Arduino. Eu tentei o meu melhor para manter o código o mais simples possível e as explicações também são dadas nas seções de comentários. Além disso, explicarei os segmentos importantes abaixo.

1. Leitura de dados do DS3231:

DS3231 é um módulo RTC (Relógio de Tempo Real). É usado para manter a data e a hora da maioria dos projetos de eletrônica. Este módulo possui sua própria fonte de alimentação de célula de moeda, usando a qual mantém a data e a hora, mesmo quando a energia principal é removida ou o MCU foi submetido a uma redefinição difícil. Assim, uma vez definida a data e a hora neste módulo, ela sempre será acompanhada.

Usar este módulo é muito fácil por causa da biblioteca fornecida pelo Arduino.

// Inicia o DS3231 usando a interface de hardware
DS3231  rtc(SDA, SCL);
void Initialize_RTC()
{
   // Inicialize o objeto rtc
  rtc.begin();

//#### as seguintes linhas podem ser descomentadas para definir a data e hora pela primeira vez### 
/*
rtc.setDOW(FRIDAY);          // Definir dia da semana para DOMINGO
rtc.setTime(18, 46, 45);     // Defina a hora para 12:00:00 (formato de 24 horas)
rtc.setDate(6, 30, 2017);    // Defina a data para 1º de janeiro de 2014
*/
}

Nota: Ao usar este módulo pela primeira vez, você deve definir a data e a hora. Isso pode ser feito simplesmente removendo os comentários mencionados acima e escrevendo a data e a hora. Certifique-se de comentá-los novamente e enviá-lo, caso contrário, cada vez que você executar o quadro, a data e a hora serão definidas novamente. Você também pode usar RTC IC DS1307 para ler o tempo com o Arduino.

2). Leitura de dados do DHT11:

DHT11 é um sensor de umidade com temperatura próxima. Ele envia os valores de temperatura e umidade como dados de 8 bits em série através do pino de saída do módulo. A biblioteca lê esses dados usando a função serial do software do Arduino.

#define DHT11_PIN 7 //O pino de saída do sensor está conectado ao pino 7
dht DHT; //Objeto de sensor nomeado como DHT
void Read_DHT11()
{
  int chk = DHT.read11(DHT11_PIN);
}

Aqui, conectei o pino de saída ao pino 7, como exemplo, você pode escolher qualquer pino que suporte o Software Serial. Ligando DHT.read (número do pino) ; lerá o valor da temperatura e umidade e o armazenará no parâmetro Temperatura DHT e DHT.Humidity respectivamente. Verifique também isso Medição de temperatura do arduino baseada em DHT11.

3). Inicializando o módulo do cartão SD:

void Initialize_SDcard()
{
  // veja se o cartão está presente e pode ser inicializado:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }

  // abra o arquivo. observe que apenas um arquivo pode ser aberto por vez,
  // então você tem que fechar este antes de abrir outro.
  File dataFile = SD.open("LoggerCD.txt", FILE_WRITE);
  // se o arquivo estiver disponível, escreva nele:
  if (dataFile) {
    dataFile.println("Date,Time,Temperature,Humidity"); //Escreva a primeira linha do arquivo excel
    dataFile.close();
  }
}

Usar um cartão SD com o Arduino é fácil por causa da biblioteca do cartão SD, que será adicionada ao IDE do Arduino por padrão. Na função de inicialização do cartão SD, criaremos um arquivo de texto chamado “LoggerCD.txt” e gravaremos a primeira linha do nosso conteúdo. Aqui separamos os valores usando um “,” como um delimitador. Ou seja, quando uma vírgula é colocada, significa que precisamos passar para a próxima célula na folha do Excel.

4). Escrevendo dados para o cartão SD

void Write_SDcard()
{
  // abra o arquivo. observe que apenas um arquivo pode ser aberto por vez,
  // então você tem que fechar este antes de abrir outro.
  File dataFile = SD.open("LoggerCD.txt", FILE_WRITE);

  // se o arquivo estiver disponível, escreva nele:
  if (dataFile) {
    dataFile.print(rtc.getDateStr()); //Armazenar data no cartão SD
    dataFile.print(","); //Mover para a próxima coluna usando um ","

    dataFile.print(rtc.getTimeStr()); //Armazenar data no cartão SD
    dataFile.print(","); //Mover para a próxima coluna usando um ","

    dataFile.print(DHT.temperature); //Armazenar data no cartão SD
    dataFile.print(","); //Move to next column using a ","

    dataFile.print(DHT.humidity); //Armazenar data no cartão SD
    dataFile.print(","); //Move to next column using a ","

    dataFile.println(); //Fim da linha move para a próxima linha
    dataFile.close(); //Feche o arquivo
  }
  else
  Serial.println("OPA!! Falha na gravação do cartão SD");
}

Como dito anteriormente, nossa intenção é salve a data, hora, temperatura e umidade no nosso cartão SD Com a ajuda da biblioteca DS3231 e da biblioteca DHT11, nosso Arduino será capaz de ler todos esses quatro parâmetros e armazená-los nos seguintes parâmetros, conforme mostrado na tabela abaixo

Datartc.getDateStr());
Horartc.getTimeStr());
TemperaturaDHT.temperature
UmidadeDHT.humidity

Agora podemos usar diretamente esses parâmetros para armazená-los no cartão SD usando a linha de impressão

dataFile.print(parameter);

Você pode notar que cada parâmetro é separado por uma vírgula para torná-lo legível e um dataFile.println(); é usado para indicar o fim da linha.

5). Escrevendo dados para PLX-DAQ

O PLX-DAQ é um software de plug-in do Microsoft Excel que nos ajuda a gravar valores do Arduino diretamente em um arquivo do Excel em nosso laptop ou PC. Este é o meu favorito por dois motivos:

1.Você pode gravar e monitorar os dados ao mesmo tempo e nos fornece uma maneira de plotá-los como gráficos.

2). Você não precisa de um módulo RTC como o DS3231 para acompanhar a data e a hora. Você pode simplesmente usar a data e a hora em execução no seu laptop/computador e salvá-los diretamente no Excel.

Para usar este software com o Arduino, precisamos enviar os dados em série em um padrão específico, assim como exibir valor no monitor serial. As linhas principais são explicadas abaixo:

void Initialize_PlxDaq()
{
Serial.println("CLEARDATA"); //limpa todos os dados deixados de projetos anteriores
Serial.println("LABEL,Date,Time,Temperature,Humidity"); //escreva sempre LABEL, para indicar como primeira linha
}
void Write_PlxDaq()
  {
    Serial.print("DATA"); //sempre escreva "DATA" para indicar o seguinte como dados
    Serial.print(","); //Mover para a próxima coluna usando um ","

    Serial.print("DATE"); //Armazenar data no Excel
    Serial.print(","); //Mover para a próxima coluna usando um ","

    Serial.print("TIME"); //Armazenar data no Excel
    Serial.print(","); //Mover para a próxima coluna usando um ","

    Serial.print(DHT.temperature); //Armazenar data no Excel
    Serial.print(","); //Mover para a próxima coluna usando um ","

    Serial.print(DHT.humidity); //Armazenar data no Excel
    Serial.print(","); //Mover para a próxima coluna usando um ","

    Serial.println(); //Fim da linha move para a próxima linha

  }

O software pode reconhecer palavras-chave como LABEL, DATA, TIME, DATE etc. Conforme mostrado na função Inicializar, a palavra-chave “LABEL” é usada para gravar a primeira ROW da planilha do Excel. Posteriormente na função Escrever, usamos a palavra-chave “DATA” para indicar que as seguintes informações devem ser consideradas como DATA. Para indicar que precisamos passar para a próxima linha, precisamos usar vírgula (“,”). Para indicar o final da linha, precisamos enviar um Serial.println ();.

Como dito anteriormente, podemos escrever a data e a hora do sistema enviando as palavras-chave “DATE” e “TIME”, respectivamente, como mostrado acima.

Nota: Não use o monitor serial ao usar este software PLX_DAQ.

Explicação de trabalho:

Trabalhando do Arduino Data Logger é simples. Quando o hardware e o software estiverem prontos, é hora de gravar o programa no seu Arduino Board. Assim que seu programa for carregado, seus valores de temperatura e umidade começarão a ser armazenados no seu cartão SD. Você deve seguir as etapas abaixo para permitir que o PLX-DAQ efetue login na folha do Excel no computador.

Etapa 1 : Abra o arquivo “Plx-Daq Spreadsheet” que foi criado na sua área de trabalho durante a instalação.

Etapa 2 : Se houver um bloco de segurança, clique em Options->Enable the content -> Finish -> OK para obter a seguinte tela.

Etapa 3 : Agora selecione a taxa de transmissão como “9600” e a porta à qual o seu Arduino está conectado e clique em Conectar. Seus valores devem começar a ser registrados como mostrado na figura abaixo.

Você pode deixar essa planilha do excel aberta e monitorar os valores à medida que eles são registrados. Como isso está acontecendo, nosso cartão SD também teria salvado os mesmos valores. Para verificar se está funcionando, basta remover o cartão SD e abri-lo no seu computador. Você deve encontrar um arquivo de texto chamado “LoggerCD.txt” nele. Quando aberto, ficaria algo assim.

Esse arquivo possui dados, mas seria difícil analisá-los em um bloco de notas. Portanto, podemos abri-lo no Excel como um arquivo CSV (valores separados por vírgula), tornando-o mais eficaz. Para abrir em excel

1.Open Excel. Click on File->Open and select “All file” at bottom right corner and select the “LoggerCD” file from the SD card. This will open a text import wizard.

2.Clique em “Avançar” e selecione vírgula como delimitador. Clique em “Avançar” novamente. Então termine.

3.Agora seus valores serão abertos em um arquivo do Excel, como mostrado abaixo

Eu registrei os valores a cada 5 segundos; você pode registrá-los pelo tempo desejado, alterando a função de atraso no programa.

Espero que você tenha gostado do projeto, se tiver alguma dúvida, escreva-o na seção de comentários abaixo e eu o ajudarei.

Melhoria de bônus – Registro de dados sem fio usando o Arduino :

Depois de ter conseguido esse ponto, com alguns avanços e apenas adicionando algumas linhas de código, você pode registrar dados sem fio.

Basta conectar um dispositivo Bluetooth como o HC-05 e gravar os dados no PLX-DAQ via Bluetooth em vez de serial. Isso é substituir Serial.print (parâmetro); com BluetoothName.print (parâmetro) ; e conecte seu laptop ao seu módulo Bluetooth e selecione a porta COM à qual o Bluetooth do laptop está conectado e o Taadaaa…… Você trabalha com um sistema de registro de dados sem fio em pouco tempo.

 

Código

/*
 * Programa para demonstrar Data Logging/Visualization usando Arduino
 * 
 * ###Conexão com módulo de cartão SD###
 * Vcc->5V
 * Gnd->Gnd
 * MISO->pin 12
 * MOSI->pin 11
 * SCK-> pin 13
 * CS-> pin 4
 * 
 * ###Conexão com DS3231###
 * Vcc->5V
 * Gns->Gnd
 * SCL->pin A5
 * SDA-> pin A4
 * 
 * ###Conexão com DT11###
 * Vcc->5V
 * Gnd->Gnd
 * Out-> pin 7
 * 
 * 
 */

#include <DS3231.h> //Library for RTC module (Download from Link in article)
#include <SPI.h> //Biblioteca para comunicação SPI (pré-carregada no Arduino)
#include <SD.h> //Biblioteca para cartão SD (pré-carregado no Arduino)
#include <dht.h> //Biblioteca para sensor de temperatura e umidade dht11 (Baixe do link no artigo)

#define DHT11_PIN 7 //Sensor output pin is connected to pin 7
dht DHT; //Sensor object named as DHT

const int chipSelect = 4; //SD card CS pin connected to pin 4 of Arduino

// Inicia o DS3231 usando a interface de hardware 
DS3231 rtc(SDA, SCL); 

void Initialize_RTC() { 
// Inicialize o objeto rtc 
rtc.begin(); 
//#### as seguintes linhas podem ser descomentadas para definir a data e hora pela primeira vez### /* 
rtc.setDOW(FRIDAY);       // Definir dia da semana para DOMINGO 
rtc.setTime(18, 46, 45);  // Defina a hora para 12:00:00 (formato de 24 horas) 
rtc.setDate(6, 30, 2017); // Defina a data para 1º de janeiro de 2014 */ 
}

void loop()
{
  Read_DHT11();
  Write_SDcard();
  Write_PlxDaq();
  delay(5000); //Aguarde 5 segundos antes de gravar os próximos dados 
}

void Write_PlxDaq()
  {
    Serial.print("DATA"); //sempre escreva "DATA" para indicar o seguinte como dados
    Serial.print(","); //Mover para a próxima coluna usando um ","

    Serial.print("DATE"); //Armazenar data no Excel
    Serial.print(","); //Mover para a próxima coluna usando um ","

    Serial.print("TIME"); //Armazenar data no Excel
    Serial.print(","); //Mover para a próxima coluna usando um ","

    Serial.print(DHT.temperature); //Armazenar data no Excel
    Serial.print(","); //Mover para a próxima coluna usando um ","

    Serial.print(DHT.humidity); //Armazenar data no Excel
    Serial.print(","); //Mover para a próxima coluna usando um ","

    Serial.println(); //Fim da linha move para a próxima linha
  }

void Initialize_PlxDaq()
{
Serial.println("CLEARDATA"); //limpa todos os dados deixados de projetos anteriores
Serial.println("LABEL,Date,Time,Temperature,Humidity"); //escreva sempre LABEL, para indicar como primeira linha
}

void Write_SDcard()
{
   // abre o arquivo. observe que apenas um arquivo pode ser aberto por vez,
   // então você tem que fechar este antes de abrir outro.
   File dataFile = SD.open("LoggerCD.txt", FILE_WRITE);

  // se o arquivo estiver disponível, escreva nele:
  if (dataFile) {
    dataFile.print(rtc.getDateStr()); //Armazenar data no cartão SD
    dataFile.print(","); //Mover para a próxima coluna usando um ","

    dataFile.print(rtc.getTimeStr()); //Armazenar data no cartão SD
    dataFile.print(","); //Mover para a próxima coluna usando um ","

    dataFile.print(DHT.temperature); //Armazenar data no cartão SD
    dataFile.print(","); //Mover para a próxima coluna usando um ","

    dataFile.print(DHT.humidity); //Armazenar data no cartão SD
    dataFile.print(","); //Mover para a próxima coluna usando um ","

    dataFile.println(); //Fim da linha move para a próxima linha
    dataFile.close(); //Feche o arquivo
  }
  else
  Serial.println("OPA!! Falha na gravação do cartão SD");
}

void Initialize_SDcard() { 
// veja se o cartão está presente e pode ser inicializado: 
    if (!SD.begin(chipSelect)) { 
        Serial.println("Card failed, or not present"); // don't do anything more: 
        return; 
    } 
    
    // abra o arquivo. observe que apenas um arquivo pode ser aberto por vez, 
    // então você tem que fechar este antes de abrir outro. 
    File dataFile = SD.open("LoggerCD.txt", FILE_WRITE); 
    
    // se o arquivo estiver disponível, escreva nele: 
    if (dataFile) { 
        dataFile.println("Date,Time,Temperature,Humidity"); //Escreva a primeira linha do arquivo excel 
        dataFile.close(); 
    } 
}

void Initialize_RTC()
{
   // Inicializa o objeto rtc
  rtc.begin();

//#### As seguintes linhas podem ser descomentadas para definir a data e hora pela primeira vez###  
/*
rtc.setDOW(FRIDAY);       // Definir dia da semana para DOMINGO
rtc.setTime(18, 46, 45);  // Defina a hora para 12:00:00 (formato de 24 horas)
rtc.setDate(6, 30, 2017); // Defina a data para 1º de janeiro de 2014
*/
}

void Read_DHT11()
{
int chk = DHT.read11(DHT11_PIN);
}

/*void Read_DateTime()
{  
  // Envia Data
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");

  // Envia Time
  Serial.println(rtc.getTimeStr());
}*/

/*void Read_TempHum()
{
  Serial.print("Temperature = ");
  Serial.println(DHT.temperature);
  Serial.print("Humidity = ");
  Serial.println(DHT.humidity);
 // delay(1000);
}*/