Monitoramento com sensor PIR e log

O sensor de presença e movimento PIR é um sensor de fácil uso, e, com certeza você já bateu de frente com um desses.

Nesse tutorial você vai aprender como usa-lo, além de criar um sistema de monitoramento simples que aciona um relay(e consequentemente uma lâmpada), e grava a hora e data em um arquivo no cartão SD.

O sensor PIR é extremamente fácil de se usar, de uma forma simples, quando ele detecta um movimento dentro de sua área(até 7m), ele manda um sinal HIGH no seu pino OUT, dessa forma, tudo que precisamos fazer é esperar por um HIGH no pino em que conectamos ele:

#define pir_pin 7
void setup(){
pinMode(pir_pin, OUTPUT);
}
void loop(){
if(digitalRead(pir_pin) == HIGH){
//movimento detectado
}
}

A conexão também é simples:

pir_sensor_bb

 

Continuando com o tutorial, agora vamos conectar o nosso relay.
Nesse tutorial só vamos utilizar um relay, o do pino 8, mas você também pode adicionar o outros.

modulo_rele_2canais_lampadas_
Imagem: Filipe Flop

O nosso RTC:

circuito_ds1307_serial_monitor2
Imagem: Filipe Flop

E por ultimo, mas não menos importante, o módulo SDCard.

ligacao

Sketch completo:

#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 relay_pin 8   //pino do relay

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_relay(boolean relay_onoff){  //funcao para scionar o relay
  if(relay_onoff){//se true aciona o relay
    digitalWrite(relay_pin, HIGH);
  }else{//se false, libera o relay
    digitalWrite(relay_pin,  LOW);
  }
}

void gravar_registro(String text){//funcao para gravar o registro no SD Card
  String line = text + "[" + RTC.getTimeString(':') + " - " + RTC.getDateString('/', true) + "]"; //linha q vamos gravar. ex: Movimento detectado.[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(relay_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.

  //fique a vontade para colocar um tratamento caso nao seja possivel abrir o arquivo.
  logFile =SD.open(fileName);  //abrimos o arquivo para pegarmos o tamanho
  logSize = logFile.size();     //pegamos 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 monitoramento iniciado!");  //dizemos que o monitoramento foi iniciado
  gravar_registro("Sistema de monitoramento iniciado!");  //imprimimos no arquivo.
  delay(5000);  //esperamos 5 segundos para comecarmos a verificar
}

void loop(){
  while(!movimento()){  //enquanto nao tiver movimento()
    acionar_relay(false); //deixamos o relay desligadao
  }
  acionar_relay(true);  //quando detectado um movimento, ele sai do loop e aciona o relay
  gravar_registro("Movimeto detectado."); //imprime que detecatamos um movimento, junto com hora e data que e automaticamente adicionado pela funcao
  delay(300000);  //5 minutos
}

Saiba mais sobre os módulos utilizados nesse tutorial:

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s