0

Datalogger Cartão SD + RTC + PIR Sensor Movimento

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?

Comments

Comentários

ArduinoPortugal.pt

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

To use BrandCaptcha you must get an API Key