LusoRobótica - Robótica em Português
Electrónica => Electrónica Geral => Tópico iniciado por: luisjustin em 13 de Julho de 2021, 22:09
-
Olá pessoal, estou criando um contador de pessoas usando Infravermelho utilizando o sensor E18-d80nk
(https://http2.mlstatic.com/D_NQ_NP_664112-MLB44146279669_112020-O.webp)
Mas ele as vezes está contando 2 vezes simultâneas ou mais ou as vezes sem ninguém passar na frente, regulei ele para aproximadamente 60cm de detecção mas o led que ele tem atrás parece que não fica estável e fica fraco, estou utilizando uma ESP32, alimentando com um carregador de celular que tenho certeza que sua corrente máxima é 3.0A e tensão de 5.0V já testei.
Não sei o que fazer para isso, alguém recomendaria um outro sensor ? ou alguma outra técnica ? eu tenho um sensor na porta de entrada e um na porta de saída sem apontar um ao outro.
Estou aceitando sugestão pois preciso resolver esse problema, obrigado a todos.
-
Tens alguma filtragem do sinal do sensor?
-
Desculpe não entendi o que quer dizer por filtragem se é em código ou hardware,
#include <Arduino.h>
#include <WiFi.h>
#include "esp_wifi.h"
#include <HTTPClient.h>
#define boardId 1
#define ssid "EMELTEC"
#define password "xxxxx$"
const int pinSensorIn = GPIO_NUM_35;
const int pinSensorOut = GPIO_NUM_34;
int counterIn = 0;
int counterOut = 0;
bool counterIsSend = false;
bool counterOverflow = false;
int wifiConnected = 0;
hw_timer_t *timer = NULL;
void cb_timer()
{
if (counterIn > 99)
{
counterOverflow = true;
}
if (counterOut > 99)
{
counterOverflow = true;
}
}
void startTimer()
{
/* 0 - seleção do timer a ser usado, de 0 a 3.
80 - prescaler. O clock principal do ESP32 é 80MHz. Dividimos por 80 para ter 1us por tick.
true - true para contador progressivo, false para regressivo
*/
timer = timerBegin(0, 80, true);
/*conecta à interrupção do timer
- timer é a instância do hw_timer
- endereço da função a ser chamada pelo timer
- edge=true gera uma interrupção
*/
timerAttachInterrupt(timer, &cb_timer, true);
/* - o timer instanciado no inicio
- o valor em us para 1s
- auto-reload. true para repetir o alarme
*/
timerAlarmWrite(timer, 1000000 * 10, true);
//ativa o alarme
timerAlarmEnable(timer);
}
void stopTimer()
{
timerEnd(timer);
timer = NULL;
}
void sendData()
{
stopTimer();
counterIsSend = true;
WiFi.begin(ssid, password);
int countRetry = 0;
// Aguardando conexão completar
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
if (countRetry >= 20)
{
ESP.restart();
}
wifiConnected = 0;
Serial.println("Aguardando WIFI!");
countRetry++;
}
Serial.println('\n');
Serial.println("Connection established");
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());
// Checar wifi conectou realmente ?
if (WiFi.status() == WL_CONNECTED)
{
wifiConnected = 1;
HTTPClient http;
http.begin("http://xxxxx.2labs.com.br/api.php");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int code = http.POST("data=" + String(boardId) + "#" + String(counterIn) + "#" + String(counterOut));
Serial.println(code);
Serial.println(http.getString());
http.end();
WiFi.disconnect(true, false);
}
counterIn = 0;
counterOut = 0;
counterIsSend = false;
counterOverflow = false;
startTimer();
}
void setup()
{
Serial.begin(115200);
pinMode(pinSensorIn, INPUT_PULLUP);
pinMode(pinSensorOut, INPUT_PULLUP);
startTimer();
Serial.println("Iniciando!");
}
bool sensorInBlocked = false;
bool sensorOutBlocked = false;
void loop()
{
// Serial.println(analogRead(34));
if (counterIsSend == false)
{
if (sensorInBlocked == false)
{
if (digitalRead(pinSensorIn) == HIGH)
{
sensorInBlocked = true;
counterIn++;
Serial.println("ALGUEM ENTROU");
Serial.print("Contagem IN: ");
Serial.print(counterIn);
Serial.println(" ");
}
}
if (digitalRead(pinSensorIn) == LOW)
{
sensorInBlocked = false;
}
if (sensorOutBlocked == false)
{
if (digitalRead(pinSensorOut) == HIGH)
{
//alguem saiu
sensorOutBlocked = true;
counterOut++;
Serial.println("ALGUEM SAIU");
Serial.print("Contagem OUT: ");
Serial.print(counterOut);
Serial.println(" ");
}
}
if (digitalRead(pinSensorOut) == LOW)
{
sensorOutBlocked = false;
}
}
if (counterOverflow)
{
sendData();
}
delay(300);
}
esse é o código que criei.
-
Eu acredito que contar pessoas sem uma cancela rotativa será sempre algo de complicado, mas entre as hipóteses de contar pessoas para além de um LED emissor que está permanentemente ligado a um foto transístor receptor e que é corta quando passa uma pessoa há altura da cintura (logo não muito fiável, pois as pessoas tem diferentes alturas e os braços mexem e podem causar falsas contagens), existe outras formas de o fazer com por exemplo a detecção de rostos numa stream de vídeo que vem com o openCV (não deve funcionar com mascaras) depois só tens de seguir o rosto, ou a detecção de rostos que pessoas em imagens (com mascaras) ou pelo volume do corpo de uma pessoa numa imagem que deves encontrar no github, coisas de inteligência artificial como o Yolo e assim, com modelos já treinados em que possas usar a definição em PyTorch e seja só carregar os weights de ficheiro . Poderás utilizar um destes usando algo como um Raspberry Pi.
Nota: A versão que mostras, parece funcionar por reflexão de infravermelhos, ora a amplitude deles depende do material onde é feita a reflexão, das suas características refletoras de infravermelhos e isso deve mudar muito consoante aquilo que uma pessoa tem vestida. Não me parece que seja um simples corte de um feixe. E mesmo esse terias de colocar um filtro passa baixo em software para retirar o corte por braços a mexerem-se ou algo assim. A forma mais simples de fazeres um filtro passa baixo seria de medires o tempo entre cortes do feixe e de depois descartares aqueles que fossem menores do que um certo tempo minimo correspondentes aos braços estarem a abanar quando se anda.
Cumprimentos,
João