Módulo Cartão micro SD com NodeMCU – Construindo um datalogger
Neste tutorial, iremos desenvolver um datalogger bem simples, voltado ao armazenamento de informações de temperatura e umidade de um ambiente, coletados através de um sensor DHT11, usando um módulo leitor de cartão micro SD ou módulo cartão SD em conjunto com um NodeMCU.
Apesar de usarmos um NodeMCU, esse projeto pode ser facilmente adaptado para outras plataformas como ESP32 ou Arduino.
Você pode conhecer mais sobre o NodeMCU no tutorial: Conhecendo a Família ESP8266
[toc]
Armazenando informações
Ao desenvolver projetos voltados a coleta de informações, iremos precisar armazenar estas informações geradas para uma análise posterior. Se o volume de informações não for muito grande, podemos armazenar estes dados utilizando a própria memória não volátil que grande parte das plataformas já disponibilizam. Porém, dependendo do tempo que o nosso projeto esteja coletando dados, o volume de informação gerada, será tão grande, que não seremos capazes de armazenar todos estes dados apenas utilizando a memória nativa. Com isso, uma solução barata e eficiente, é o uso de cartões SD ou micro SD, que devido ao baixo custo e alta capacidade de armazenamento, permitem que o sistema armazene informações de forma estruturada e fácil.
Módulo micro SD
Para construir o nosso sistema de datalogger, iremos utilizar o módulo leitor cartão micro SD, que irá funcionar como ponte entre o microcontrolador e o cartão SD. A comunicação entre microcontrolador e módulo é feita através do protocolo SPI utilizando um total de 6 pinos, sendo dois para alimentação do circuito e os outros para comunicação.
Sensor de temperatura e umidade DHT11
O DHT11 é um sensor básico e de baixo custo que utiliza um termistor e um sensor capacitivo para medir a temperatura e a umidade do ar ambiente. Ele é bem simples de usar mas reque atenção com o tempo entre duas leituras consecutivas, uma vez que é necessário um intervalo de, no mínimo, 1 segundo entre uma leitura e outra.
Mãos à obra – Construindo a estrutura do nosso datalogger
Componentes utilizados
- 1x NodeMCU
- 1x Módulo micro sd
- 1x Cartão micro sd (Formatado em FAT 32)
- 1x Sensor temperatura e umidade DHT11
- Fios Jumper
Montando o projeto
Neste projeto, teremos dois módulos conectados ao nosso NodeMCU, com base nisso iremos utilizar a seguinte ordem de conexão dos fios:
A montagem final do sistema, deve estar semelhante a figura abaixo:
Veja só como ficou a montagem de todo o circuito:
Antes de ligar o seu circuito, verifique se todas as conexões foram feitas corretamente. Um curto circuito causado por uma ligação errada pode danificar todo o seu projeto.
Programando
– Bibliotecas
Neste tutorial iremos utilizar duas bibliotecas para construir o sistema. Uma dessas bibliotecas SD, já é nativa do arduino logo não precisamos realizar a sua instalação. Já a biblioteca utilizada pelo sensor DHT 11 será necessária a instalação, que pode ser feita da seguinte forma:
- Na ide do arduino, navegamos até a opção Sketch, selecionamos a opção Incluir biblioteca e navegamos até a opção Gerenciar Bibliotecas como mostra a figura abaixo:
- Ao selecionar a opção Gerenciar bibliotecas, será aberto um painel como mostra a figura a seguir:
- Nesta janela, iremos buscar pela biblioteca DHT sensor library by Adafruit, e realizar seu download/instalação
– Código utilizado
Agora que temos o nosso sistema montado, e as bibliotecas já instaladas, podemos partir para o código. Observem o código a seguir que utilizaremos como base para o nosso datalogger.
#include "DHT.h" // Biblioteca Adafruit para sensor de temperatura DHT11 #include <SPI.h> // Biblioteca de comunicação SPI Nativa #include <SD.h> // Biblioteca de comunicação com cartão SD Nativa #define DHTPIN 0 // Define para o pino D3 do nodeMCU -> D3 #define DHTTYPE DHT11 // DHT 11 que será utilizado para comunicação const int chipSelect = 4; // Constante que indica em qual pino está conectado o Chip Select do módulo de comunicação DHT dht(DHTPIN, DHTTYPE); // Objeto responsável pela comunicação microcontrolador/sensor File dataFile; // Objeto responsável por escrever/Ler do cartão SD bool cartaoOk = true; void setup() { Serial.begin(9600); // Inicialização da porta de comunicação Serial dht.begin(); // Inicialização do objeto de comunicação com sensor // Se não for possível se comunicar com o cartão SD o código não deve prosseguir if (!SD.begin(chipSelect)) { Serial.println("Erro na leitura do arquivo não existe um cartão SD ou o módulo está conectado corretamente ?"); cartaoOk = false; return; } } void loop() { // Caso o cartão esteja ok é criado um arquivo no cartão SD com o nome datalog.csv em modo de escrita if (cartaoOk){ dataFile = SD.open("datalog.csv", FILE_WRITE); Serial.println("Cartão SD Inicializado para escrita :D "); } //Limpando Variáveis String leitura = ""; // Limpo campo contendo string que será armazenada em arquivo CSV float temperatura = 0 ; // Limpo variável de temperatura a cada nova leitura float umidade = 0; // Limpo variável de umidade a cada nova leitura //Leitura do sensor temperatura = dht.readTemperature(); // Função que realiza a leitura da temperatura do sensor dht11 umidade = dht.readHumidity(); // Função que realiza a leitura da umidade do sensor dht11 // Caso os valores lidos do sensor não sejam válidos executamos as seguintes linhas if (isnan(temperatura) || isnan(umidade)){ Serial.println ("Falha na leitura do sensor"); // Informar ao usuário que houve uma falha na leitura do sensor delay(1500); // Aguardamos 1,5 segundos return ; // Retornamos a função para o seu ponto inicial } // Se tudo estiver ok, escrevemos os dados a serem armazenados em uma String leitura = String(millis()) + ";" + String(temperatura) + ";" + String(umidade) + ";"; // Se o arquivo estiver realmente aberto para leitura executamos as seguintes linhas de código if (dataFile) { Serial.println(leitura); // Mostramos no monitor a linha que será escrita dataFile.println(leitura); // Escrevemos no arquivos e pulamos uma linha dataFile.close(); // Fechamos o arquivo } delay(1500); // Aguardamos 1,5 segundos para executar o loop novamente }
Colocando pra funcionar
Se tudo estiver montado corretamente, o nosso sistema já deve estar funcionando e coletando informações sobre a temperatura e umidade do ambiente. Uma coisa interessante, é que o arquivo construído está no formato CSV, então podemos abrir ele utilizando o excel, ou o software editor de planilhas de sua preferência.
Entendendo a Fundo
Software
– Incluindo bibliotecas necessárias
Inicialmente, adicionamos as bibliotecas que iremos utilizar para comunicação com o módulo DHT11 e o módulo micro SD. Todas elas são essenciais para que a comunicação com os dispositivos possa ser feita de forma transparente. Como a biblioteca SD e SPI já são nativas do arduino não é necessária a sua instalação. Porém a biblioteca do sensor dht deveremos instalar como mostrado anteriormente.
#include "DHT.h" // Biblioteca do sensor DHT 11 da Adafruit #include <SPI.h> // Biblioteca de comunicação SPI Nativa #include <SD.h> // Biblioteca de comunicação com cartão SD Nativa
Existem diversas implementações da biblioteca DHT, utilizei esta em especial por achar mais simples o seu funcionamento. Porém fica a critério do usuário :)
– Criando parâmetros de configuração e objetos de comunicação
Inicialmente iremos criar dois parâmetros para configurar os pinos onde estão conectados o sensor DHT11 e o módulo micro sd. Neste caso o sensor dht11 está conectado ao pino 0 e o pino Chip Select está conectado ao pino 4.
#define DHTPIN 0 // Define para o pino D3 do nodeMCU -> D3 #define DHTTYPE DHT11 // DHT 11 que será utilizado para comunicação const int chipSelect = 4; // Constante que indica em qual pino está conectado o Chip Select do módulo de comunicação
Logo em seguida, iremos criar dois objetos pelos quais iremos nos comunicar com o módulo dht11 e o módulo micro SD. Também criamos uma variável do tipo bool, responsável por informar se a comunicação com o cartão SD está funcionando ou não.
DHT dht(DHTPIN, DHTTYPE); // Objeto utilizado para comunicação entre sensor e microcontrolador File dataFile; // Objeto responsável por escrever/Ler do cartão SD bool cartaoOk = true;
O objeto dht, tem como objetivo realizar a comunicação entre o microcontrolador e o sensor de temperatura/umidade. Ele recebe como parâmetros em seu método construtor, o pino com o qual está conectado ao microcontrolador e o tipo de sensor DHT que está sendo utilizado (neste caso o dht11).
– Função setup
A função setup, será utilizara para inicializarmos a comunicação com o cartão micro SD e a comunicação serial (caso você queira debugar o que está acontecendo no microcontrolador no momento). Com base nisso, este código executa o seguinte fluxograma
- Inicializamos a comunicação serial na taxa de comunicação padrão
- Inicializamos o objeto dht para comunicação microcontrolador/sensor
- Tentamos inicializar a comunicação com o cartão sd
- Se estiver tudo ok, a comunicação é inicializada e a escrita pode começar
- Caso o cartão não esteja presente ou exista alguma conexão errada, o sistema irá escrever na serial que houve um erro na comunicação com o cartão SD e a variável cartaoOk é marcada como falso
void setup() { Serial.begin(9600); // Inicialização da porta de comunicação Serial dht.begin(); // Inicialização do objeto de comunicação com sensor // Se não for possível se comunicar com o cartão SD o código não deve prosseguir if (!SD.begin(chipSelect)) { Serial.println("Erro na leitura do arquivo não existe um cartão SD ou o módulo está conectado corretamente ?"); cartaoOk = false; return; } }
– Condição inicial ( É possível escrever no arquivo ? )
Este trecho de código, será utilizado para identificar se é possível escrever no arquivo ou não. Caso seja possível iremos abrir o arquivo para escrita na linha 2 com o comando SD.open(“datalog.csv”, FILE_WRITE). Caso não seja possível realizar a escrita no arquivo o código irá pular esta condição
// Caso o cartão esteja ok é criado um arquivo no cartão SD com o nome datalog.csv em modo de escrita if (cartaoOk){ dataFile = SD.open("datalog.csv", FILE_WRITE); Serial.println("Cartão SD Inicializado para escrita :D "); }
– Variáveis de armazenamento
A leitura dos dados é feita a cada intervalo de 1,5 segundos, e a cada leitura realizada precisamos limpar a leitura feita anteriormente, para isso dentro da função loop do código adicionamos o trecho de código que será responsável por limpar as variáveis a cada leitura realizada.
//Limpando Variáveis String leitura = ""; float temperature = 0; float humidity = 0;
– Leitura da temperatura
Neste bloco de código, iremos realizar a leitura da temperatura utilizando o sensor, o processo é bem simples, realizamos a leitura utilizando a função, readTemperature(). Que irá nos retornar um valor válido, ou inválido caso ocorra algum problema na comunicação com o sensor
temperatura = dht.readTemperature(); // Função que realiza a leitura da temperatura do sensor dht11
– Leitura da umidade
O processo de leitura da umidade será feito de forma semelhante ao que foi feito na leitura da temperatura. a única mudança será no método utilizado, que no caso será readHumidity();
umidade = dht.readHumidity(); // Função que realiza a leitura da umidade do sensor dht11
– Validando a leitura dos dados
Já com os dados de temperatura e umidade lidos, iremos agora validar se estes dados são válidos ou não. Para isso, iremos utilizar o método isnan(), ou is not a number. Esta função, tem como objetivo verificar se o valor contido dentro de uma variável é realmente um número ou não. Como a função readTemperature() e readHumidity(), apenas retornam números válidos se a leitura for feita com sucesso, podemos considerar que a leitura será válida apenas quando as variáveis temperatura e umidade forem valores reais. Com base nisso, este trecho de código verifica se as variáveis lidas são realmente números válidos, caso não sejam todo o código dentro do if será executado.
// Caso os valores lidos do sensor não sejam válidos executamos as seguintes linhas if (isnan(temperatura) || isnan(umidade)){ Serial.println ("Falha na leitura do sensor"); // Informar ao usuário que houve uma falha na leitura do sensor delay(1500); // Aguardamos 1,5 segundos return ; // Retornamos a função para o seu ponto inicial }
– String para gravação
Após uma leitura ser feita com sucesso, iremos prosseguir para o processo de estruturação dos dados a serem armazenados no arquivo .csv, para isso iremos utilizar o seguinte comando:
// Se tudo estiver ok, escrevemos os dados a serem armazenados em uma String leitura = String(millis()) + ";" + String(temperatura) + ";" + String(umidade) + ";";
Com este comando, estamos basicamente criando uma String que irá armazenar todas as informações que queremos armazenar em nosso arquivo csv. O “;” que está sendo utilizado como separador será compreendido pela aplicação de tabelas utilizada como uma nova posição na tabela, ou seja estamos separando o tempo, a temperatura e a umidade em células diferentes.
– Gravando dados em arquivo
Por fim, mas não menos importante, devemos gravar os dados gerados em nosso cartão micro sd. Para isso iremos antes verificar se está tudo ok com o arquivo ( utilizando aquele flag que criamos anteriormente)
// Se o arquivo estiver realmente aberto para leitura executamos as seguintes linhas de código if (dataFile) { Serial.println(leitura); // Mostramos no monitor a linha que será escrita dataFile.println(leitura); // Escrevemos no arquivos e pulamos uma linha dataFile.close(); // Fechamos o arquivo }
Se estiver tudo ok, iremos gravar a nossa String criada utilizando o comando
dataFile.println(leitura); // Escrevemos no arquivos e pulamos uma linha
e em seguida fechamos o arquivo com:
dataFile.close(); // Fechamos o arquivo
Por fim, aguardamos o nosso intervalo de 1,5 segundos para recomeçar todo o processo novamente, e para isso utilizando o comando
delay(1500);
Desafio
Neste tutorial, utilizamos o tempo de funcionamento do microcontrolador para contabilizar o tempo onde foi feita a leitura das variáveis de temperatura e umidade. Uma proposta que seria bem interessante e usual, seria utilizar um relógio de tempo real, ou até mesmo o protocolo NTP para obter o horário real da leitura. Como desafio, proponho a modificação deste código para que ao invés do tempo do microcontrolador ele grave com a data e hora real em que foi feita a leitura. Como base para este desafio, vocês podem utilizar os tutoriais já apresentados aqui no blog como:
Considerações finais
Este tutorial, teve como objetivo mostrar a estrutura de um datalogger bem simplificado, onde utilizamos sensores para obter dados do ambiente e um módulo para armazenar estes dados de forma transparente para o desenvolvedor. Espero que tenham gostado do conteúdo apresentado, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.
Formado em Ciência da computação pela UFV-CAF em 2017 e atualmente cursando pós-graduação Stricto Sensu em Ciência da computação pela Universidade Federal de Viçosa, na área de arquitetura de computadores. É um entusiasta na área de sistemas embarcados e robótica.
40 Comments
Deixe uma pergunta, sugestão ou elogio! Estamos ansiosos para ter ouvir!Cancelar resposta
Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.
Boa tarde, fiz o projeto, porem nao pula uma linha da tabela, os dados sao sobreescritos
Os pinos para serem conectados foram posto como pinos ou GPIOS?
Estou usando um cartao micro sd formatado com FAT32 mas so tenho micro sd de 8GB e nao consigo fazer funcioonar…
Danilo, você ja tentou escrever em dois arquivos distintos? um dado X no arquivo1.txt e um dado Y no arquivo2.txt?
Sempre quando abro um arquivo, o outro não deixa ser aberto, mesmo eu fechando o anterior, e não acho nada relacionado a trabalhar com mais de um arquivo.
Danilo vê se voce pode me ajudar, fiz exatamente essa ligação porém quando rodo um programa teste chamado CardInfo (um dos exemplos da biblioteca) aparece isso:
⸮n?⸮4⸮Ҷ⸮⸮OCA”⸮⸮
Initializing SD card…initialization failed. Things to check:
* is a card inserted?
* is your wiring correct?
* did you change the chipSelect pin to match your shield or module?
Soft WDT reset
>>>stack>>>
ctx: cont
sp: 3ffffde0 end: 3fffffc0 offset: 01b0
3fffff90: feefeffe feefeffe feefeffe 3ffee7b0
3fffffa0: 3fffdad0 00000000 3ffee780 40204d30
3fffffb0: feefeffe feefeffe 3ffe84f8 40100a0d
<<<stack<<<
Ja testei esse modulo em um arduino e gravou os dados certinho, pode ser alimentação? Pois o arduino trabalha com nivel logico 5 e 0 e o node 3.3 e 0.
Se não oque pode ser?. Ja conferi a ligação umas 4 vezes sodksodksdo….
Pedro, muito possívelmente o código que você está tentando rodar possui algum trecho de código que está estourando o tempo do watchdog timer, que acaba gerando esse erro por pensar que seu código está travando em um loop infinito. Tente realizar uma análise no código para ver se existe algum loop travando o seu código
PERFEITO! agora como copiar esse arquivo para uma unidade da rede automaticamente?
Uma opção para fazer isso seria implementar uma rotina em alguma linguagem de programação ( python por exemplo ) onde você faria uma solicitação dos dados do nodeMCU via sockets
Olá Danilo,
é possível fazer um desse com sensor mq7?
É possível sim Joao, você só vai precisar conectar o dispositivo a porta ADC do seu NodeMCU/Arduino
Boa tarde, Danilo!
Não entendi o porquê de você mostrar acima uma foto e um esquemático mostrando o uso do CS PIN do módulo SD conectado ao pino D8 do NodeMcu (que na Arduino IDE é equivalente a 15), e no código você nomeou o chipSelect pin = 4 (equivalente ao pino D2 do NodeMcu). Você pode me explicar?
Muito obrigado.
Também estou com essa duvida.
Olá Vitor e Maike, desculpe a demora na resposta, realmente houve um equivoco no código, o pino CS pode ser conectado em qualquer outro pino, porém para utilizar o canal de comunicação ele deve estar em nível lógico baixo.
Olá Danilo, existe a possibilidade de alterar as portas do modulo?
No meu caso as portas citadas já estão em uso, poderia eu utilizar de D0 a D3? Se sim, como faço para altera-las?
Abraços.
Eu estive fazendo alguns testes com este módulo micro SD e descobri alguns possíveis problemas com seu uso.
Ele tem um CI de buffer eletrônico que gera algum problema que não analisei por equipamentos.
Mas se tentar utilizar alguma outra conexão na USART SPI junto com ele cria problemas de funcionamento em ambos.
Tá ai algo interessante a ser testado. Utilizando um chip select para cada módulo era pra ser possível utilizar mais de um dispositivo conectado ao barramento sem problemas.
Montei novamente e deu certo. Obrigado e parabéns pelo tutorial.
O esquema de ligação da figura não bate com a tabela e com o programa. Poderia me ajudar fica aparecendo “Falha na leitura do sensor”. Meu email: [email protected]
Olá Israel. Acabei de testar e funcionou beleza, tente testar o seu sensor de temperatura separadamente pode ser que ele esteja com problema
Ótimo tutorial, passo a passo muito bem explicado.
Gostaria que tu me tirasse uma dúvida, se possível…
Eu estou fazendo um datalogger usando um módulo SD card, um DS3231, e por enquanto um sensor DHT22 apenas como teste, no futuro o datalogger será usado par armazenar dados de um sensor de temperatura por infravermelho. O meu problema no momento é que quando eu inicio o módulo SD (SD.begin()) todas as leituras do DHT passam a ser “nan”. Quando carrego a placa com o código sem iniciar o módulo as leituras são normais…
Obrigado e parabéns pelo ótimo trabalho
Segue abaixo o sketch que está apresentando este erro:
#include
#include
#include
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN,DHTTYPE); ‘
#include
DS3231 rtc(SDA, SCL);
#include
#include
File datafile;
const int chipSelect = 4;
bool cartaoOK = true;
int i=0;
float somatemp=0;
float somaumid=0;
float mediatemp=0;
float mediaumid=0;
float h = dht.readHumidity();
float t = dht.readTemperature();
float temp[5];
float umid[5];
String cabecalho;
void setup() {
Serial.begin(9600);
dht.begin();
rtc.begin(); //Inicia o relógio
// Ajuste de hora e data do relógio
//rtc.setDOW(WEDNESDAY); // Ajusta o dia da semana (DOW – day of week)
//rtc.setTime(17, 15, 0); // Ajusta o tempo (hora, minutos, segundos) no formato 24 horas
//rtc.setDate(21, 2, 2018); // Ajusta o dia do ano (dia, mês, ano) OBS: este foi o dia em que o relógio foi ajustado
//Faz o cabeçalho da tabela
cabecalho= “Data, Hora, Temperatura 1, Umidade 1, Temperatura 2, Umidade 2, Temperatura 3, Umidade 3, Temperatura 4, Umidade 4, Temperatura 5, Umidade 5, Soma Temp, Média Temp, Soma Umid, Média Umid, “;
Serial.println(cabecalho);
//Inicia o módulo SD
SD.begin();
}
void loop() {
// zerar o vetor
for (i = 0; i < 5; i++){
temp[i] = 0;
umid[i]=0;
}
somatemp=0;
somaumid=0;
mediatemp=0;
mediaumid=0;
/
Serial.print(rtc.getDateStr());
Serial.print(", ");
Serial.print(rtc.getTimeStr());
Serial.print(", ");
for (i=0;i<5;i++){
h = dht.readHumidity();
t = dht.readTemperature();
temp[i]=t;
umid[i]=h;
Serial.print(temp[i]);
Serial.print(",");
Serial.print(umid[i]);
Serial.print(",");
delay(2000);
}
for (i=0;i<5;i++){
somatemp=temp[i]+somatemp;
somaumid=umid[i]+somaumid;
}
mediatemp=somatemp/5;
mediaumid=somaumid/5;
Serial.print(somatemp);
Serial.print(",");
Serial.print(mediatemp);
Serial.print(",");
Serial.print(somaumid);
Serial.print(",");
Serial.print(mediaumid);
Serial.println(" ");
}
Ótimo tutorial Danilo.
Será útil no meu projeto, mas possuo uma dificuldade.
Eu preciso acessar esse arquivo via rede, utilizando o NodeMCU, isto é, preciso acessar o arquivo .csv de uma máquina da rede, sem a necessidade de retirar o SD.
Penso utilizar o ESP8266 para enviar uma cópia do arquivo para um diretório na rede, ou fazer o computador remoto coletar uma cópia do arquivo.
Teria como me ajudar com isso em um novo tutorial?
Obrigado e parabéns pelo ótimo trabalho.
Opa, que bom que curtiu o tutorial Diogo, o próximo passo que pretendo implementar será um sistema no computador capaz de ler esses dados do nodeMCU sem a necessidade de você precisar retirar o cartão SD.
Muito bom tutorial!
Parabéns Daniel Almeirda!
Estou tentando agora fazer um data logger de um alarme. Fazer o registro de data e hora acionado por um
botão(simbolizando o alarme) com um arduino nano. Ou seja, eu só teria os registro de hora e data quando foi acionado o botão.
Poderia me ajudar?
Att
Opa Tiago, que bom que curtiu o tutorial ^^. Posso ajudar sim, qual é a sua dúvida ?
Mais uma dúvida: No meu não aparece os títulos das colunas (millis, temperatura, umidade) tem como colocar esses títulos na hora da leitura? Ou somente de forma manual depois que retirar o cartao? Obrigado!
Boa noite Hugo, neste código eu adicionei manualmente, porém você pode adicionar isso através do código, basta na hora de abrir pela primeira vez verificar se a primeira linha já conta com os campos millis temperatura e umidade. Caso não tenha você usa a função datafile.println()
Danilo…. Muito Obrigado… Fiz como vc falou e consegui gravar com cabeçalho… Hj está gravando certinho no SD, gostaria de saber como faço para enviar essas informações para um arduino via wifi ou acessar essas informações por um notebook via wifi… É possível? Abraços…
Que bom que deu tudo certo :D. É possível sim, você pode fazer isso através de sockets, e dessa forma criar uma função no algoritmo do datalogger que seja capaz de ler toda essa informação e enviar para um computador no WiFi. Assim que tiver um pouco de tempo irei elaborar uma parte 2 neste tutorial onde ensinarei a se fazer isso.
Danilo.. Boa Tarde… Consegui armazenar numa planilha tudo certo.. Porém acrescentei um módulo rtc e os dados (hora, minutos e segundos) estão sendo armazenados em colunas separadas. Como faço para armazenar todos os dados do rtc numa única coluna??? Abraços…
Parte do código do rtc .:
// Le as informacoes do CI
myRTC.updateTime();
// Imprime as informacoes no serial monitor
Serial.print(“Data : “);
// Chama a rotina que imprime o dia da semana
imprime_dia_da_semana(myRTC.dayofweek);
Serial.print(“, “);
Serial.print(myRTC.dayofmonth);
Serial.print(“/”);
Serial.print(myRTC.month);
Serial.print(“/”);
Serial.print(myRTC.year);
Serial.print(” “);
Serial.print(“Hora : “);
// Adiciona um 0 caso o valor da hora seja <10
if (myRTC.hours < 10)
{
Serial.print("0");
}
Serial.print(myRTC.hours);
Serial.print(":");
// Adiciona um 0 caso o valor dos minutos seja <10
if (myRTC.minutes < 10)
{
Serial.print("0");
}
Serial.print(myRTC.minutes);
Serial.print(":");
// Adiciona um 0 caso o valor dos segundos seja <10
if (myRTC.seconds < 10)
{
Serial.print("0");
}
Serial.println(myRTC.seconds);
delay( 1000);
Boa tarde,
estou com uma dúvida sobre Módulo Cartão SD . A minha proposta é fazer um datalogger para medir temperatura e umidade com data e horário. Estou usando um cartão de memória de 2Gb a placa Arduino Uno, sensor DHT11 e o módulo DS3231. No entanto não consigo escrever os dados no arquivo. Escrevi um código mais simples para armazenar somente temperatura (sensor LM35), mas os dados não são escrito no cartão de memória. Há alguma capacidade máxima para o cartão de memória?
Segue o código abaixo. Obrigado.
#include
#include
// Saída digital usada para o CS do cartão SD
const int chipSelect = 4;
// Arquivo de dados
File dataFile;
// Iniciação
void setup()
{
// Abre a porta inicial
Serial.begin(9600);
while (!Serial)
{
; // wait for serial port to connect. Needed for native USB port only.
}
// Acesso o cartão SD
Serial.print(“Acessando cartao SD…”);
if (!SD.begin(chipSelect)) {
Serial.println(” falha ao acessar o cartão, ou cartão não presente.”);
return;
}
Serial.println(” sucesso.”);
}
// Laço de coleta
void loop()
{
// Se arquivo está aberto, lê o sensor e grava a leitura
dataFile = SD.open(“temp4.txt”, FILE_WRITE);
if (dataFile)
{
//Serial.println (“Arquivo aberto”);
unsigned int sensor = analogRead(A0);
sensor = (sensor*500)/1024; // converte para temperatura
dataFile.println(sensor);
Serial.println(sensor);
}
else
{
Serial.println(“Erro ao abrir temp4.txt”);
}
dataFile.close(); // Onde devo colocar esta parte???????
//Serial.println (“Arquivo fechado”);
delay (2000); // 5 segundos entre leituras
}
O cartão de memória está em FAT 32 ? talvez ele não esteja gravando por estar com um sistema de arquivos não compatível com o módulo microsd. E outra coisa, no seu código você deve colocar o método dataFileclose() dentro do if onde você realiza a escrita no arquivo, já que da forma como está ele vai tentar fechar o arquivo mesmo que ele não esteja aberto. Qual microcontrolador você está utilizando ?
Olá Danilo
o cartão está em FAT32.
Testei o programa usando uma placa Arduino MEGA 2560 e Arduino UNO Rev3.
Estou alimentado a placa pelo porta usb do notebook. E o modulo do cartão estou usando as duas alimentações 5Vcc e 3.3Vcc. Testei com somente uma limentação e não funcionou. Estou desconfiado que o cartão precisa de mais corrente.
O programa para na linha de comando :
// Acesso o cartão SD
Serial.print(“Acessando cartao SD…”);
if (!SD.begin(chipSelect)) {
Serial.println(” falha ao acessar o cartão, ou cartão não presente.”);
Ou seja, acesso negado ao cartão SD.
Obrigado pela dica do dataFileclose().
Obrigado por enquanto
Olá Carlos, antes de tudo tente ligar apenas o módulo SD e faça um programa que escreva uma mensagem no arquivo temp4.txt que você criou, dessa forma podemos ter garantia de que o módulo está funcionando corretamente. Acredito que não seja problema de energia, você adicionou as bibliotecas SD e SPI ao seu sktech ?
Olá Danilo,
consegui resolver o problema. De fato, a alimentação do módulo cartão SD, DS3231 e do sensor DHT11 estava com erro. Estava energizando os três com pino 5V da placa Arduino Uno. Havia também problemas de contato elétrico quando usei uma matriz de contato.
Testei cada um em separado usando os pinos 3.3V e 5V. O o módulo cartão SD não funciona energizado com 3.3V. Assim, liguei somente o módulo cartão SD no pino 5V. Liguei em paralelo o DS3231 com o DHT11 em 3.3V da placa. Somente deste jeito consegui fazer o “data logger” funcionar.
Abraço e obrigado pelas dicas.
Carlos
Boa tarde Carlos, poderia compartilhar seu projeto? Meu email é [email protected]
Olá Danilo, tudo bem?
Estou tentando usar a biblioteca SD.h com o Nodemcu porém está ocorrendo o seguinte erro.
Arduino: 1.8.1 (Windows 10), Board: “NodeMCU 1.0 (ESP-12E Module), 80 MHz, 115200, 4M (3M SPIFFS)”
In file included from C:\Users\Loures\Documents\Arduino\libraries\SD\src/utility/Sd2Card.h:26:0,
from C:\Users\Loures\Documents\Arduino\libraries\SD\src/utility/SdFat.h:29,
from C:\Users\Loures\Documents\Arduino\libraries\SD\src/SD.h:20,
from C:\Users\Loures\Documents\Arduino\SD_Usina\SD_Usina.ino:2:
C:\Users\Loures\Documents\Arduino\libraries\SD\src/utility/Sd2PinMap.h:510:2: error: #error Architecture or board not supported.
#error Architecture or board not supported.
^
exit status 1
Error compiling for board NodeMCU 1.0 (ESP-12E Module).
Sabe o que pode ser? Desde já, grato
Olá Lucas, tudo bem sim e com você ?
Tentei reproduzir o erro e não consegui. você está utilizando a última versão do nodeMCU para o arduino ? pode ser que a versão que você está utilizando esteja com problema de suporte ao protocolo SPI. Tente atualizar tanto a ide quanto a versão do pacote nodeMCU que está agora na versão 2.3.0. Se o problema persistir me fala que te passo meu email para tentar te ajudar
Fiquei pensando em fazer um servidor de logs (syslog), para coletar os logs de vários servidores.
O legal de utilizar o nodeMCU é que com o Wifi nativo dele, você consegue até mesmo construir uma pequena rede de sensores e ir armazenando estes dados em uma unidade central. :D
Danilo… Estou tentando implementar algo parecido com o que vc comentou mas estou tendo algumas dificuldades. Ja consegui fazer o nodemcu escrever a temperatura no cartão mas não consigo fazer a leitura dos dados via wifi (sem ter que retirar o cartao) e não consigo coloca o modulo rtc ds1302 para registrar as horas das leituras… Vc pode me ajudar?