Das alternativas de automatizar o ambiente, obtemos uma lista relativamente extensa de utensílios criados com tal objetivo. Desde interruptores a sensores de presença temos sistemas espalhados pelo mundo que tentam fornecer comodidade e segurança aos seus usuários em  residenciais e empresariais. Esses sistemas têm, cada um, maneiras e paradigmas diferentes de interagir com o local e por isso se tornam sistemas quase únicos. Mas dentre esses, qual seria o melhor paradigma? Nós viemos trazer uma alternativa a essa resposta: a catraca virtual.
       A catraca virtual é um sistema que consiste no posicionamento lado a lado entre dois sensores ultrassônicos, com a finalidade de saber o sentido em que um indivíduo está se movendo. Essa detecção é feita a partir da seguinte pergunta: "Qual sensor detectou uma pessoa primeiro?", pois um indivíduo em movimento vai passar primeiro em um dos sensores, dependendo do sentido. Isso dá ao usuário possibilidades diversas, dependendo apenas de onde a catraca será posicionada. Seja no controle da temperatura de uma sala de reuniões de acordo com o número de pessoas, seja no acendimento ou desligamento de uma luzes de acordo com a presença ou ausência de pessoas numa sala, seja na contagem de pessoas presentes em um evento, etc.


Materiais Utilizados:

  • 2 Arduinos;
  • 2 Sensores de Ultrassom;
  • 1 LCD;
  • 1 botão;
  • 1 LED;
  • 2 resistores de 220 ohm;
  • 1 Potenciômetro;
  • Jumpers.


Como fazer:

  • Coloque os sensores de ultrassom paralelos;
  • Utilize o botão como reset no Arduíno principal
  • Ligue o LED no pino 13;
  • Ligue a LCD segundo o Datasheet em um Arduíno diferente do que está sendo utilizado para os sensores de Ultrassom;
  • Comunique os dois Arduínos via Serial.


//*********************************************Arduino de controle*************************************
/************************************

 * SR 10 - Catraca Virtual          *
 * Gabriel Alves e Ruamberg Aguiar  *
 ************************************/

//********** Bibliotecas *************

#include  //Biblioteca para controlar elementos, como Leds e Ultrassônicos

//********** Diretivas de Pré-processamento ***************

#define SUB 3           //Constante para a determinação de um limite de distância
#define DELAY 600       //Constante para o delay de loop do código

//********** Variáveis globais ***************

boolean turn = 1, ldr = 0, left = 0, right = 1, ldrturn = 0;
int limit, controle = 0, r[2], sub;
int ldrpercent, ldrpin = 15;
unsigned long stream = 0;
unsigned long T0, TF;
unsigned long nPessoas = 0;
char trig[2] = {2,3}, echo[2] = {4,5};
char ledPin = 13;

char entrada[20];
char Char=-1;
byte index = 0; 
String leitura = "";

    //****** Ultrassônico *******
    US first(trig[left], echo[left]);
    US second(trig[right], echo[right]);
    //****** Led ******
    LED sig(ledPin);
    

void setup()
{
    //****** Serial ******
    Serial.begin(9600); //Para visualição de informações do código durante a execução
    Serial3.begin(14400); //Para comunicação com o arduino de visual.
}
void loop()
{
  if(serialIn("turnon") == 0)
  {
    turn = 1;
  }
  if(serialIn("turnoff") == 0)
  {
    turn = 0;
    sig.setState(LOW);
    nPessoas = 0;
  }
  while(turn)
  {
    //****** Const. de distância ********
    int x = first.getDistance();
    int y = second.getDistance();
    const int constante = (x + y)/2;
    sub = constante/SUB;
    limit = constante - sub;
    delay(100);
    while(turn)
    {
      //Faz leitura dos Ultrassônicos dependendo da situação de controle.
      //controle é a variável que indica se algum Ultrassônico foi recebido abaixo de limit
      //controle == 1 se uma pessoa está indo para um sentido. -1 para o outro.
      readUS(controle);
      
      if(r[0] < limit && controle == 0)
      {
          controle = 1;
          T0 = millis();
      }
      else if(r[0] < limit && controle == -1)
      {
              if(nPessoas >= 1)
                nPessoas--;
              controle = 0;
              delay(DELAY);
              while(second.getDistance() < limit)
              {
                  delay(1);
              } 
      }
      else if(r[1] < limit && controle == 0)
      {
          controle = -1;
          T0 = millis();
      }
      else if(r[1] < limit && controle == 1)
      {
          nPessoas++;
          stream++;
          controle = 0;
          delay(DELAY);
          while(first.getDistance() < limit)
          {
              delay(1);
          }
      }
      if(ldrturn == 1)
        ldrpercent = map(analogRead(ldrpin),0,1023,0,100);
        
      if(nPessoas > 0)
      {
        if(ldrturn == 0)
          sig.setState(HIGH);
        else if(ldrpercent < 60)
          sig.setState(HIGH);
        else if(ldrpercent >= 60)
          sig.setState(LOW);
      }
      else
        sig.setState(LOW);
    
      TF = millis() - T0;
    
      if(controle != 0 && TF > 1000)
      {
          controle = 0;
      }
      delay(100);
      serialTalk();
      //envia para o arduino o número de pessoas dentro de uma sala
      serialOut(nPessoas);
    }
  }
}

void readUS(int c)
{
    //lê os Ultrassônicos e salva em r
    if(c == 0)
    {r[0] = first.getDistance(); r[1] = second.getDistance();}
    else if(c == 1)
    {r[0] = 0; r[1] = second.getDistance();}
    else if(c == -1)
    {r[0] = first.getDistance(); r[1] = 0;}
}


char serialIn(char* This)
{
  //Recebe comandos na linha serial para configuração
  while(Serial.available() > 0) 
  {
    if(index < 19) 
    {
      Char = Serial.read(); 
      entrada[index] = Char; 
      index++; 
      entrada[index] = '\0';
      leitura = String(leitura + Char);// acumula os caracteres em forma de string
    }
  }

  if(strcmp(entrada,This)  == 0){
    for(int i=0;i<19;i++){
      entrada[i]=0;
    }
    index=0;
    return(0);

  }
  else{
    return(1);

  }
}

//envia um número para o arduino de visual
void serialOut(int inNum)
{
  Serial3.print(inNum);
  delay(50);
}
//utiliza a serialIn para implementação de comandos
void serialTalk()
{
    if(serialIn("resetlimit") == 0)
    {
      //****** Const. de distância ********
      int x = first.getDistance();
      int y = second.getDistance();
      const int constante = (x + y)/2;
      sub = constante/SUB;
      limit = constante - sub;
      delay(100);
    }      
    if(serialIn("resetnpessoas") == 0)
      nPessoas = 0;
    if(serialIn("resetstream") == 0)
      stream = 0;
    if(serialIn("turnon") == 0)
    {
      turn = 1;
    }
    if(serialIn("turnoff") == 0)
    {
      turn = 0;
      sig.setState(LOW);
      nPessoas = 0;
    }
    if(serialIn("usleft") == 0)
    {
      left = 0;
      right = 1;
      US first(trig[left], echo[left]);
      US second(trig[right], echo[right]);
    }
    if(serialIn("usright") == 0)
    {
      left = 1;
      right = 0;
      US first(trig[left], echo[left]);
      US second(trig[right], echo[right]);
    }
    if(serialIn("ldron") == 0)
    {
      ldrturn = 1;
    }
    if(serialIn("ldroff") == 0)
    {
      ldrturn = 0;
      ldrpercent = 0;
    }
  Serial.print(nPessoas);
  Serial.print("_");
  Serial.print(stream);
  Serial.print("_");
  Serial.print(r[0]);
  Serial.print("_");
  Serial.println(r[1]);
}

Programação do arduino com a LCD:

//*********************************************Arduino de controle*************************************

/************************************
 * SR 10 - Catraca Virtual          *
 * Gabriel Alves e Ruamberg Aguiar  *
 ************************************/
//*********BIBLIOTECAS************
#include // biblioteca glcd     
#include "SystemFont5x7.h" //fonte adicionada

#define LED 13
#define DELAYIN 40

//******VARIÁVEIS GLOBAIS*********
int controle = 0, nPessoas = 0, x, constante, k_erro, fluxo = 0;
int trig[2] = {12, 10};
int echo[2] = {11, 9};
int valor[2];
unsigned long T0, TF;
long remote;
int inutil = 0;
byte intensidade = 255;


char entrada[20];
char Char=-1;
byte index = 0; 
String leitura = "";
String nPessoasS = "0";
String fluxoS = "0";

void setup()
{
  //inicia as configurações da LCD
  GLCD.Init(INVERTED);
  GLCD.ClearScreen();//limpa a tela
  GLCD.SelectFont(System5x7);//seleciona o tipo da fonte
  
  //cria uma entrada
  GLCD.FillRect(0, 5, 13, 1, BLACK); //imprime um retangulo
  delay(DELAYIN);
  GLCD.FillRect(0, 5, 26, 1, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(0, 5, 39, 1, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(0, 5, 52, 1, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(0, 5, 65, 1, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(0, 5, 78, 1, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(0, 5, 91, 1, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(0, 5, 104, 1, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(0, 5, 117, 1, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(0, 5, 127, 1, BLACK);
  delay(DELAYIN);
  
  GLCD.FillRect(5, 0, 1, 7, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(5, 0, 1, 14, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(5, 0, 1, 21, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(5, 0, 1, 28, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(5, 0, 1, 35, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(5, 0, 1, 42, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(5, 0, 1, 49, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(5, 0, 1, 56, BLACK);
  delay(DELAYIN);
  GLCD.FillRect(5, 0, 1, 63, BLACK);
  delay(DELAYIN);
  
  GLCD.CursorTo(4,3);//coloca o cursor para o ponto 4,3
  GLCD.Puts("SR 10");///imprime "SR 10" 
  GLCD.CursorTo(6,4);
  GLCD.Puts("#CPRecife3"); 
  delay(2000);
  GLCD.ClearScreen();//limpa a tela
  
  // ****** Iniciando comunicação serial *******
  Serial.begin(9600);
  Serial3.begin(14400); //serial 3 de comunicação com o outro arduino
}

void loop()
{
   char inChar, inData[20];
   for(index = 0; index < 20; index++)//retira os valores da string
   {
      inData[index] = 0;
   }
   index = 0;
   while(Serial3.available())
   {
       if(index < 19) //Um a menos do tamanho do array
       {
           inChar = Serial3.read(); // le um caractere
           inData[index] = inChar; // guarda na string
           index++; //incrementa para o proximo valor na string
           inData[index] = '\0'; // coloca como nulo o proximo valor na string
       }
   }
   if(strcmp("",inData)) // se a string de entrada for diferente de "" (vazio)
   {
     Serial.println(inData);//printa o recebido na serial0
     GLCD.ClearScreen(); //limpa a tela
     GLCD.CursorTo(5,3); //leva o cursor para o ponta 5,3 da tela
     GLCD.Puts("n Pessoas:"); //imprime "n Pessoas:" na LCD 
     GLCD.CursorTo(9,4);
     GLCD.Puts(inData); //imprime a string na LCD
   }
   delay(50);
}



Imagens:







Atividades recentes

  • Rodrigo Medeiros

    Robô clas­si­fi­cado para a fase final hoje, dia 26, às 16:45 na área de Work­shop I da CPRecife3.

    • Sábado, 26.07.2014 13:16