collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]


Focos LED SMD por almamater
[16 de Dezembro de 2023, 14:12]


I Belive por dropes
[15 de Dezembro de 2023, 13:59]


Carga de corrente eletrónica ZPB30A1 60W por jm_araujo
[11 de Dezembro de 2023, 13:27]

Autor Tópico: Ajuda em contador de pessoas com IR  (Lida 1580 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.733
  • 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: 257
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