O que é um datalogger?
Um datalogger é um dispositivo que regista numa base de dados, com registos datados, quando aconteceu uma alteração/deteção de algo.
Neste exemplo, vamos registar numa base de dados (excel) a data e hora em que o sensor de movimento PIR, deteta presença de alguém. Neste caso, ainda poderemos ativar ou desativar algo que esteja ligado aos nossos relés, como por exemplo uma lâmpada.
O sensor de presença e movimento PIR é um sensor de fácil uso, deteta movimento, e para o tamanho “mini” verifica uma distância considerável.
Nesse tutorial vai demonstrar como usa-lo, além de criar um sistema de monitorização simples que aciona um relé (e consequentemente uma lâmpada), e grava a hora e data num arquivo no cartão SD.
O sensor PIR é extremamente fácil de se usar, de uma forma simples, quando ele deteta um movimento dentro de sua área(até 7m), e manda um sinal HIGH no seu pino OUT, dessa forma, tudo que precisamos fazer é esperar por um HIGH no pino em que o ligamos:
#define pir_pin 7 void setup(){ pinMode(pir_pin, OUTPUT); } void loop(){ if(digitalRead(pir_pin) == HIGH){ //movimento detetado } }
A conexão também é simples:
Continuando com o tutorial, agora vamos ligar o nosso relé.
Nesse tutorial só vamos utilizar um relé, o do pino 8, mas podemos também pode adicionar outros conforme o pretendido.
O nosso RTC (real time clock):
E por ultimo, mas não menos importante, o módulo SDCard:
Código completo para Arduino + RTC + PIR + Cartão Memoria:
#include <DSM_DSRTC.h> //Incluimos a biblioteca para se comunicar com o RTC #include <SD.h> #include <SPI.h> #define pir_pin 7 //pino do PIR #define rele_pin 8 //pino do rele const String fileName = "monitor.log"; //nome do nosso arduivo de log DSM_DSRTC RTC; //definimos RTC como um relogio File logFile; //definimos logFile como um arquivo uint32_t SDCardSize, logMaxSize, logSize = 0; //variaveis uint32_t que vão guardar o tamanho do SDCard, tamanho maximo do log, e o tamanho do log Sd2Card card; //##vamos usar essas duas variaveis para pegarmos o tamanho do SDCard SdVolume volume; //##veja mais nos exemplos de SD boolean movimento(){ //funcao para facilitar a leitura do sensor PIR return digitalRead(pir_pin); //se HIGH = true; se LOW = false; } void acionar_rele(boolean relay_onoff){ //funcao para acionar o rele if(rele_onoff){//se true aciona o rele digitalWrite(rele_pin, HIGH); }else{//se false, libera o rele digitalWrite(rele_pin, LOW); } } void gravar_registo(String text){//funcao para gravar o registo no SD Card String line = text + "[" + RTC.getTimeString(':') + " - " + RTC.getDateString('/', true) + "]"; //linha q vamos gravar. ex: Movimento detetado.[hora - data] logFile =SD.open(fileName, FILE_WRITE); //abrimos o arquivo logSize = logFile.size(); //pegamos o tamanho do arquivo Serial.print("Escrevendo..."); //imprimimos na serial que estamos escrevendo if(logSize < logMaxSize){ //se o tamanho atual do arquivo for menor que o tamanho maximo do log logFile.println(line); //imprimimos a linha no arquivo.Serial.println("terminado(" + String(c2MB(logSize)) + "Mb/" + String(c2MB(logMaxSize)) + "Mb)."); //imprimimos que escrevemos e o tamanho do arquivo }else{Serial.println("erro."); //se nao foi possivel escrever, escrevemos erro. } logFile.close(); //fechamos o arquivo } uint32_t c2MB(uint32_t value){ //essa funcao vai retornar o value em megabytes. return (value / 1024.0) / 1024.0; // B : 1024 = KB; KB / 1024 = MB } void setup(){ pinMode(pir_pin, INPUT); //definimos o pino do pir como entrada pinMode(rele_pin, OUTPUT); //e o do relay como saidaSerial.begin(9600); //iniciamos a Serial para notificarmos o que esta acontecendoSerial.print(" Iniciando cartao SD..."); //dizemos que vamos tentar iniciar o cartao SD if(!card.init(SPI_HALF_SPEED, 4)){ //se nao conseguir iniciar o card em SPI_HALF_SPEED dizemos que ocorreu um erroSerial.println("Ocorreu um erro."); return; }else{ //se conseguiu, dizemos que terminouSerial.println(" teminado."); }Serial.println("Iniciando cartao SD..."); if(SD.begin(4)){ //tentamos iniciar o SDSerial.println("terminado.") ; //se sim... }else{Serial.println("erro."); //se nao return; } volume.init(card); //iniciamos volume com card SDCardSize = (volume.blocksPerCluster() * volume.clusterCount()) * 512; //pegamos o tamanho total do cartao SD. Saiba mais nos exemplos da biblioteca SD logMaxSize = (80 * SDCardSize) / 100; //pegamos o valor de 80% do tamanho do SD. logFile =SD.open(fileName); //abrimos o arquivo logSize = logFile.size(); //verificamos o tamanho atual logFile.close(); //fechamos o arquivoSerial.println("SD Card size: " + String(c2MB(SDCardSize)) + "Mb"); //imprimimos o tamanho do cartao SDSerial.println("Max Log Size: " + String(c2MB(logMaxSize)) + "Mb"); // o tamanho maximo do arquivoSerial.println("Log Size: " + String(c2MB( logSize)) + "Mb"); // o tamanho atual do arquivoSerial.println(); //pulamos uma linha para separar, pode ser substituido por \n na linha anterior logFile = SD.open(fileName);Serial. println ("Sistema de monitorização iniciado!"); //dizemos que o monitorização foi iniciado gravar_registo("Sistema de monitorização iniciado!"); //imprimimos no arquivo. delay(5000); //esperamos 5 segundos para comecarmos a verificar } void loop(){ while(!movimento()){ //enquanto nao tiver movimento() acionar_rele(false); //deixamos o relé desligado } acionar_rele(true); //quando detetado um movimento, ele sai do loop e aciona o relé gravar_registo("Movimeto detetado."); //imprime que detetamos um movimento, junto com hora e data que e automaticamente adicionado pela funcao delay(300000); //5 minutos }
No futuro iremos falar mais detalhadamente sobre cada um destes módulos como o Real Time Clock (RTC), Modulo de relés e Modulo para Cartão SD/Micro SD.
—————
Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica ElectroFun.
Gostaram deste artigo ? Deixem o vosso comentário no formulário a baixo.
Não se esqueçam de fazer like na nossa Página no Facebook.
Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nossoGrupo no acebook Arduino Portugal – Qual o teu projeto?