Como fazer um Datalogger com Arduino Adilson Thomsen

 

Como fazer um Datalogger com Arduino


COPIA DA PAGINA
https://www.filipeflop.com/blog/datalogger-com-arduino-cartao-sd/



Como fazer um Datalogger com Arduino125

No tutorial de hoje nós vamos mostrar como montar um Datalloger com Arduino usando um Cartão SD. Para fazer este registrador de dados você vai precisar de um Arduino Uno, módulo RTC DS3231 e módulo cartão SD. Esse projeto vai registrar os dados de data, hora e temperatura a cada 1 minuto, gravando-os em um arquivo texto no cartão SD.

Circuito Datalogger

O módulo cartão SD nós já vimos anteriormente no post Como Gravar Dados no Cartão Sd com Arduino. Já o módulo DS3231 é um módulo RTC (Real Time Clock, ou Relógio de Tempo Real), sucessor do DS1307, com cristal oscilador embutido que torna o módulo muito mais preciso em relação aos modelos anteriores. Além disso, esse módulo também já tem embutido um sensor de temperatura.

Modulo RTC DS3231

A comunicação do módulo é feita pela interface I2C, possui alimentação de 3,3 a 5V e trabalha com nível de sinal de 5V, podendo ser ligado diretamente ao microcontrolador. Possui também uma bateria que preserva os dados na memória do DS3231 em caso de falta de energia.

Circuito Datalogger com Arduino

Ligue o DS3231 ao Arduino utilizando os pinos da interface I2C (pinos analógicos A4 (SDA) e A5 (SCL)). Na ligação do módulo cartão SD, que trabalha com nível de sinal de 3.3V, vamos utilizar um conversor de nível lógico 3,3-5V Bidirecional, que vai reduzir a tensão das portas do Arduino (5V) para os 3.3V suportados pelo módulo. Você também pode montar um divisor de tensão com resistores, se preferir.

Circuito Datalogger

No conversor de nível lógico, observe a ligação das tensões de referência (5V para o lado do Arduino, 3.3V para o lado do módulo SD). Sem essa ligação, o conversor não funciona.

Programa Datalogger

Nesse programa vamos utilizar as seguintes bibliotecas, além da SPI, Wire e Sd, já presentes na IDE do Arduino:

Baixe as três bibliotecas e coloque-as dentro da pasta LIBRARIES da IDE do Arduino.

O programa que captura a data e a hora do módulo é baseado no programa de exemplo SetSerial, da própria biblioteca. Adicionamos a função de gravar no cartão SD as informações de data, hora e temperatura à cada 1 minuto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
//Programa: Datalogger com Arduino, modulo RTC DS3231 e cartao SD
//Alteracoes e adaptacoes: FILIPEFLOP
 
#include <DS3232RTC.h>
#include <Streaming.h>
#include <Time.h>
#include <Wire.h>
#include <SD.h>
#include <SPI.h>
 
//Pino CS do modulo cartao SD
int CS_PIN = 4;
 
File file;
 
void setup(void)
{
  Serial.begin(9600);
  //Inicializa o cartao SD
  inicia_SD();
 
  //Sincroniza a biblioteca Time com o RTC a cada 5 minutos
  setSyncProvider(RTC.get);
  Serial << F("Sincronizando com o RTC...");
  if (timeStatus() != timeSet) Serial << F(" Falha!");
  Serial << endl;
}
 
void loop(void)
{
  static time_t tLast;
  time_t t;
  tmElements_t tm;
 
  //Verifica se foi setado um novo horario
  //Formato: ano, mês, dia, hora, minuto, segundo
  if (Serial.available() >= 12) {
    int y = Serial.parseInt();
    if (y >= 100 && y < 1000)
      Serial<<F("Erro: Ano deve ter dois ou quatro digitos!") <<endl;
    else {
      if (y >= 1000)
        tm.Year = CalendarYrToTm(y);
      else    //(y < 100)
        tm.Year = y2kYearToTm(y);
      tm.Month = Serial.parseInt();
      tm.Day = Serial.parseInt();
      tm.Hour = Serial.parseInt();
      tm.Minute = Serial.parseInt();
      tm.Second = Serial.parseInt();
      t = makeTime(tm);
      RTC.set(t);
      setTime(t);
      Serial << F("Horario modificado para: ");
      printDateTime(t);
      Serial << endl;
      while (Serial.available() > 0) Serial.read();
    }
  }
 
  t = now();
  if (t != tLast) {
    tLast = t;
    printDateTime(t);
    //Grava dados no cartao a cada 1 minuto
    if (second(t) == 0)
    {
      float c = RTC.temperature() / 4.;
      float f = c * 9. / 5. + 32.;
      Serial << F("  ") << c << F(" C  ") << f << F(" F");
      Serial.println("nGravando dados no cartao SD...");
      grava_SD(t);
    }
    Serial << endl;
  }
}
 
//Mostra data e hora na serial
void printDateTime(time_t t)
{
  printI00(day(t), 0);
  Serial << monthShortStr(month(t)) << _DEC(year(t));
  Serial << ' ';
  //printTime(t);
  printI00(hour(t), ':');
  printI00(minute(t), ':');
  printI00(second(t), ' ');
}
 
//Grava dados no cartao SD
void grava_SD(time_t t)
{
  float c = RTC.temperature() / 4.;
  abre_arquivo_gravacao("data.txt");
  file.print("Data: ");
  file.print(day(t));
  file.print("/");
  if (month(t) < 10)
  {
    file.print("0");
  }
  file.print(month(t));
  file.print("/");
  file.print(year(t));
  file.print(" Hora: ");
  if (hour(t) < 10)
  {
    file.print("0");
  }
  file.print(hour(t));
  file.print(":");
  if (minute(t) < 10)
  {
    file.print("0");
  }
  file.print(minute(t));
  file.print(":");
  if (second(t) < 10)
  {
    file.print("0");
  }
  file.print(second(t));
  file.print(" Temperatura: ");
  file.println(c);
  fecha_arquivo();
}
 
//Correcao para imprimir "00" ao inves de "0" caso
//o valor seja menor do que 10
void printI00(int val, char delim)
{
  if (val < 10) Serial << '0';
  Serial << _DEC(val);
  if (delim > 0) Serial << delim;
  return;
}
 
void inicia_SD()
{
  pinMode(CS_PIN, OUTPUT);
 
  if (SD.begin())
  {
  } else
  {
    return;
  }
}
 
int abre_arquivo_gravacao(char filename[])
{
  file = SD.open(filename, FILE_WRITE);
 
  if (file)
  {
    return 1;
  } else
  {
    return 0;
  }
}
 
void fecha_arquivo()
{
  if (file)
  {
    file.close();
  }
}

Para setar a data e hora do módulo, entre no serial monitor e digite as informações no formato abaixo:

ano, mês, dia, hora, minuto, segundo

Serial Monitor - Horario

Para verificar as informações registradas, retire o cartão SD do módulo e abra o arquivo data.txt no seu computador utilizando o notepad ou outro editor de textos de sua preferência:

Serial Monitor - Dados

 Gostou? Deixe seu comentário logo abaixo.






















Comentários

Postagens mais visitadas deste blog

GPS NEO 6M NO ARDUINO PAGINA ELETROGATE

ESQUEMA DE ARDUINO DIY BÁSICO

Endereços Barramento I2C