collapse

* Posts Recentes

Por que nunca se deve confiar no que diz o cliente por jm_araujo
[28 de Novembro de 2021, 11:08]


Loja a EVITAR por dropes
[27 de Novembro de 2021, 19:35]


Projecto LED fundem por pouco funcionamento? por filjoa
[24 de Novembro de 2021, 10:45]


Um recurso muito completo com implementações de algoritmos. por blabla
[23 de Novembro de 2021, 12:04]


Como resolver "uhmmm" 50Hz Colunas de PC por dropes
[22 de Novembro de 2021, 14:12]


Software TV sala espera + Publicidades por m90mine
[19 de Novembro de 2021, 14:32]


Stenography - Using programming to save ancient writing method por blabla
[18 de Novembro de 2021, 13:55]


Identificador Via Verde por almamater
[15 de Novembro de 2021, 16:20]


Meu novo robô por josecarlos
[13 de Novembro de 2021, 12:12]


Move Semantics in C++ and Rust por blabla
[11 de Novembro de 2021, 20:45]

Autor Tópico: Ajuda em contador de pessoas com IR  (Lida 405 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline luisjustin

  • Mini Robot
  • *
  • Mensagens: 161
    • Meu site
Ajuda em contador de pessoas com IR
« em: 13 de Julho de 2021, 22:09 »
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.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.719
  • Helpdesk do sitio
Re: Ajuda em contador de pessoas com IR
« Responder #1 em: 13 de Julho de 2021, 22:21 »
Tens alguma filtragem do sinal do sensor?
Avr fanboy

Offline luisjustin

  • Mini Robot
  • *
  • Mensagens: 161
    • Meu site
Re: Ajuda em contador de pessoas com IR
« Responder #2 em: 14 de Julho de 2021, 00:45 »
Desculpe não entendi o que quer dizer por filtragem se é em código ou hardware,

Código: [Seleccione]
#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.

Offline blabla

  • Mini Robot
  • *
  • Mensagens: 80
Re: Ajuda em contador de pessoas com IR
« Responder #3 em: 14 de Julho de 2021, 09:56 »
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