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:
Ou