ContaPersone in entrata e uscita

Ciao a tutti, io starei costruendo un contapersone che tenga conto di quanta persone ci sono in una stanza capendo se qualcuno entra od esce.
Per fare questo dispongo di un Arduino Mega e dei sensori a ultrasuoni (HC-SR04).
Però sto avendo molti problemi a scrivere il codice, qualcuno mi può aiutare?

Quanti ingressi ci sono in quella stanza ?

Se dalla porta può uscire od entrare una sola persona alla volta, potresti usare due sensori (A e B) distanziati tra loro di una decina di centimetri, in modo da creare una sorta di encoder che, secondo la sequenza di attivazione (A-B oppure B-A), possa determinare il verso di passaggio e quindi incrementere o decrementare un contatore (numero persone presenti nella stanza).

La stanza ha un solo ingresso.
Che dovevo usare due sensori distanziatgià l'avevo già capito, ho anche già connesso tutto su breadboard, il mio problema è che non riesco a scrivere un codice funzionante, qualcuno me ne potrebbe dare uno?

Di esempi ce ne sono parecchi in giro.
Comunque ti ho abbozzato un inizio a cui devi aggiungere la parte logica.

const int PingAPin = 2;
const int PingBPin = 3;
const int EchoAPin = 4;
const int EchoBPin = 5;

long Durata = 0;
float DistanzaA = 0;
float DistanzaB = 0;
int Persone = 0;

void setup() {
  pinMode(PingAPin, OUTPUT);
  pinMode(PingBPin, OUTPUT);
  pinMode(EchoAPin, INPUT);
  pinMode(EchoBPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(PingAPin, LOW);
  delayMicroseconds(2);
  digitalWrite(PingAPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(PingAPin, LOW);

  Durata = pulseIn(EchoAPin, HIGH);
  DistanzaA = Durata / 29.0 / 2.0;
  
  digitalWrite(PingBPin, LOW);
  delayMicroseconds(2);
  digitalWrite(PingBPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(PingBPin, LOW);

  Durata = pulseIn(EchoBPin, HIGH);
  DistanzaB = Durata / 29.0 / 2.0;
  
  if (DistanzaA < 20.0) {
    ...
  }
}

Grazie per la risposta, ma credo di essermi spiegato male, il codice per eseguire le misure io l'avevo già preparatoed era qualcosa del genere:

int triga=52;
int echoa=53;
int trigb=50;
int echob=51;
long durationa;
long durationb;

void setup() {
pinMode( triga, OUTPUT );
pinMode( echoa, INPUT );
pinMode( trigb, OUTPUT );
pinMode( echob, INPUT );
Serial.begin( 9600 );
}

void loop(){
digitalWrite( triga, LOW );
digitalWrite( triga, HIGH );
delayMicroseconds( 10 );
digitalWrite( triga, LOW );
durationa = pulseIn( echoa, HIGH ); 

digitalWrite( trigb, LOW );
digitalWrite( trigb, HIGH );
delayMicroseconds( 10 );
digitalWrite( trigb, LOW );
durationb = pulseIn( echob, HIGH );

ed in questo modo ottenevo le misure in millisecondi (non è importante che siano iim centimetri). il mio problema sta nel fargli capire se qualcuno sta entrando o uscendo, ed evitare errori vari del tipo che se uno resta fermo davanti a un sensore arduino inizia ad incrementare il numero di persone ecc...

Bene, allora la logia è questa: detta X la Distanza dallo stipite della porta (diciamo 90cm) ogni corpo che passa davanti al sensore genererà una distanza minore di X.

Se passa davanti ad A, il contatore aumenta di uno e viceversa se passa davanti a B il contatore decrementa di uno.
Ovviamente se la persona passa davanti ad A passerà anche per B, ma se passa entro un certo tempo (diciamo 1 secondo) il passaggio per B deve esser ignorato e viceversa.

Non ci avevo pensato a questo sistema, sta sera lo proverò...
ma comunque non mi sembra completamente effica come sistema perché se adempio uno entrasse troppo piano, o uno entra quando il tempo di attesa della persona prima non è ancora finito si verificherebbero vari errori

cyberhs:
Se dalla porta può uscire od entrare una sola persona alla volta, ...

@p4blo, ma questo è vero? Nel tuo sistema solo uno alla volta può uscire?

io ci metterei un girello, tipo metropolitana

p4bl0:
ma comunque non mi sembra completamente effica come sistema perché se adempio uno entrasse troppo piano, o uno entra quando il tempo di attesa della persona prima non è ancora finito si verificherebbero vari errori

Questo è il più grosso problema di tutti i sistemi containgressi, che non stai lavorando in un ambiente perfetto, dove ognuno si comporta in modo prevedibile ed ordinato.
Che succede se 2 persone attraversano il varco insieme, una in ingresso ed una in uscita?
Che succede se una persona, a metà del varco, fa un passo indietro? Che succede se 2 persone sfilano esattamente allineate tra di loro? Oppure che succede su due persone passano talmente ravvicinate da non mostrare un distacco fra loro? ecc...

Brunello:
io ci metterei un girello, tipo metropolitana

Questo è unico sistema efficace per 1 persona alla volta.

A meno che uno non lo salti. :wink:
Ma qui si entra nel paranoico, se dobbiamo pensare a tutti i modi in cui il sistema può entrare in crisi :wink:

ciao
mi permetto di proporre una mia idea:
invece di distanziare i sensori io li avvicinerei, a pochi cm, in modo che a secondo di come avviene la commutazione si capisce se una persona sta entrando o uscendo inoltre sempre a secondo di come avviene la commutazione si capisce se la persona è completamente entrata oppure a fatto un passo indietro,
resta comunque il fatto che il passaggio deve permettere il transito di una persona alla volta,

stefano

Siete mai entrati in un parcheggio soterraneo automatizzato con tanto di biglietto, semaforo di attesa, code interminabili e poi una volta avuto l'ingresso girate tutto il piano e il posto non c'è o altre volte aspettiamo 5 minuti davanti alla sbarra e poi entrando vediamo che ci sono 3-4 posti liberi, eppure il sistema di conteggio dovrebbe essere a prova di bomba ..... 1 auto esce, si libera un posto abilito l'ingresso a una auto sola ... pare però che alcune volte nonostante ci sia un controllo ben definito e preciso il computer commette qualche errore o si perde qualche evento.
Figuriamoci farlo quando passa una persona attraverso un accesso di 90 cm che può essere bidirezione, dove braccia e gambe possono ingannare i sensori, dove è possibile che la persona passando porti con se un oggetto che anch'esso puo ingannare i sensori. Prima o poi ti ritroverai una condizione di errore, è pressochè inevitabile.
Come ti è stato detto i tornelli tipo metropolitana sono la soluzione, ma chi vorrebbe una cosa così in casa? :slight_smile:

Ricordo qualche anno fa quando ho fatto un corso sull'installazione di impianti antitrusione complessi, il sistema permetteva tramite la triangolazione di 3 sensori di determinare l'esatta posizione dell'intruso in un giardino di circa 50mq, di segnarlo sulla mappa e fare una serie di fotografie digitali oltre a memorizzare e ricostruire gli eventi.

Non riuscirai a fare un contapersone esatto utilizzando solo 2 laser ... fotosensori ..... fotocellule su una porta casalinga, devi integrarlo ad altri sensori di conferma all'interno del locale se vuoi una condizione eccellente.

Siete mai entrati in un parcheggio soterraneo automatizzato.....

vero. E presumo che si basino sugli scontrini emessi.
Tot scontrini emessi - Tot scontrini usciti
Poi c'e' sempre chi trova il modo di non pagare..... e allora sballano i conti

Comunque, visto che da anni costruisco e uso contapersone per locali pubblici, posso dire di aver fatto e provato tante metodologie, ma mai mi sognerei di usare dei sensori a ultrasuoni messi come barriera.
Gia', come e' stato detto qui, e' un casino.... figuriamoci ad usare dei sensori che hanno come minimo 15° di angolo d'apertura

io non è che devo monitorare un entrata con un flusso di persone enorme, e credo che raramente 2 persone si incrocino quindi penso che proverò a continuare il progetto con i sensori ad ultrasuoni ed i consigli dati prima, ma visto che alcuni stanno dicendo che i sensori ad ultrasuoni non sono una buona scelta mi è venuta la curiosità di sapere cosa usereste ed il prezzo approssimativo

per una barriera?
Sensori a infrarosso http://www.ebay.it/itm/370711912779?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1423.l2649

Tornando ai parcheggi... essendo del... mestiere :sweat_smile: posso dirvi che di gente che si comporta senza logica è pieno! XD
Poi ci sono altri fattori che non avete tenuto in considerazione. Ossia che un parcheggio può avere anche posti fissi mensili per cui se il sistema vede che esce un abbonato mensile in teoria (se l'impianto è fatto bene) esso dovrebbe tenerne conto e non considerare il posto liberato come disponibile: avendo pagato in anticipo, un abbonato deve (o dovrebbe) avere il posto garantito anche in caso di parcheggio pieno.
Un altro fattore è quello umano, ossia gli operatori del parcheggio che possono (anche da remoto) modificare la disponibilità dei posti a seconda di specifiche esigenze. In ultimo, potrebbe darsi che il parcheggio sia agganciato ad un sistema di prenotazione online per cui ci sta che dei posti siano riservati.

Tornando ai parcheggi... essendo del... mestiere smiley-sweat

Ma Leo, fai il softwaerista - parcheggiatore? :smiley: