Como fazer um Datalogger com Arduino Adilson Thomsen
Como fazer um Datalogger com Arduino
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.
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.
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.
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
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:
Gostou? Deixe seu comentário logo abaixo.
Comentários
Postar um comentário