• Welcome to LusoRobótica - Robótica em Português.
 

Ajuda em contador de pessoas com IR

Started by luisjustin, 13 de July de 2021, 22:09

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

luisjustin

Olá pessoal, estou criando um contador de pessoas usando Infravermelho utilizando o sensor E18-d80nk


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.

senso

Tens alguma filtragem do sinal do sensor?
Avr fanboy

luisjustin

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.

blabla

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