Contapersone con Arduino

Da testwiki.
Vai alla navigazione Vai alla ricerca

Template:Lavori in corso Template:Risorsa

In questo progetto descriviamo come realizza un conta-persone. Utilizzeremo due sensori di prossimità per stabilire se una persona entra o esce.


Principio di funzionamento

Per rilevare se una persona entra o esce in un ambiente, vengono utilizzati due sensori di prossimità.

A seconda della sequenza dell'interruzione dei segnali (come indicato dalle frecce) è possibile stabilire se il soggetto entra o esce dall'ambiente.

Sensori per il conta-persone
Sensori per il conta-persone

Sensoristica

I sensori utilizzati per questo progetto sono due HC-SR04 (sensori ad ultrasuoni).

I sensori ad ultrasuoni rilevano oggetti e liquidi utilizzando onde ultrasoniche e calcolano la distanza dall'oggetto utilizzando il principio della misura del tempo di transito.

Schema di montaggio

Lo schema di montaggio è quello riportato in figura

Schema elettrico conta persone
Schema elettrico conta persone

Componenti utilizzati

Componenti importanti utilizzati
Componenti Quantità
Sensore ad ultrasuoni

(HC-SR04)

2
Potenziometro 1
Display LCD 1
Resistenza 220Ω 1

Codice sorgente

//Includo la libreria per comunicare con il display LCD
#include <LiquidCrystal.h>

//Definisco come costanti i pin dei due sensori ad ultrasuoni
#define trigger1 9
#define echo1 10
#define trigger2 6
#define echo2 7

//Defisco la costante della velocità del suono, questa mi servirà per trovare la distanza
#define velSound 0.034
//Definisco la costante per che mi servirà per stabilire se c'è stato un errore
#define delayS 1000
//Definisco la costante che mi servirà per limitare le interferenze esterne
#define offset 7

//Inizializzo la libreria che gestisce il display LCD
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//Stabilisco la variabile dove sarà contenuto il numero di persone
int numeroPersone = 0;

void setup() {
    //Dico ad Arduino che i pin di trigger dei due sensori sono in output
    pinMode(trigger1, OUTPUT);
    pinMode(trigger2, OUTPUT);
    
    //Dico ad Arduino che i pin di echo dei due sensori sono in input
    pinMode(echo1, INPUT);
    pinMode(echo2, INPUT);

    //Inizializzo il display e ne stabilisco il tipo
    lcd.begin(16, 2);
}

void loop() {
    //Verifico se il primo sensore capta qualcosa
    if (calcolaDistanza(trigger1, echo1) <= offset) {
        //Aspetto un tempo predefinito (1s) entro la quale deve venire rilevato il passaggio anche davanti al sensore dopo
        int i = millis();
        bool x = false;
        while((millis() - i) <= delayS) {
            //Se il sensore dopo ha captato qualcosa incremento il numero di persone
            if (calcolaDistanza(trigger2, echo2) <= offset) {
                numeroPersone++;
                break;
            }
        }
    }
    
    //Verifico se il secondo sensore capta qualcosa
    if (calcolaDistanza(trigger2, echo2) <= offset) {
        //Aspetto un tempo predefinito (1s) entro la quale deve venire rilevato il passaggio anche davanti al sensore dopo
        int i = millis();
        bool x = false;
        while((millis() - i) <= delayS) {
            //Se il sensore dopo ha captato qualcosa decremento il numero di persone fino a zero e non oltre
            if (calcolaDistanza(trigger1, echo1) <= offset) {
                if (numeroPersone > 0) {
                    numeroPersone--;
                }
                else {
                    numeroPersone = 0;
                }
                break;
            }
        }
    }

    //Scrivo i valori sul display LCD
    
    scritturaDisplay(numeroPersone);
}

//Funzione per scrivere i valori sul display LCD
void scritturaDisplay(int score) {
    //Pulisco il display
    lcd.clear();
    //Scrivo la stringa "Persone" sulla prima riga
    lcd.print("Persone:");
    //Sposto il cursore sulla seconda riga
    lcd.setCursor(0, 1);
    //Scrivo il numero di persone
    lcd.print(score);
}

//Funzione per utilizzare il sensore
int calcolaDistanza(int tr, int ec) {
    //Imposto il pin di trigger su basso
    digitalWrite(tr, LOW);
    //Aspetto 2 microsecondi
    delayMicroseconds(2);
    //Imposto il pin di trigger su alto per 10us dopo di che lo riporto su basso
    digitalWrite(tr, HIGH);
    delayMicroseconds(10);
    digitalWrite(tr, LOW);
    //Prendo il tempo che ci ha messo per tornare al sensore
    long duration = pulseIn(ec, HIGH);
    //Il tempo lo converto in distanza attraverso 
    int distance = (duration * velSound) / 2;
    return distance;
}

Espansioni suggerite

È possibile aggiungere un sensore di temperatura per monitorare la temperatura delle persone che entrano ed escono, oltre a stabilire un tetto massimo di persone all'interno dell'ambiente.

Altresì, è auspicabile rilevare il livello di COA2 nell'aria per attivare un motore che automaticamente apre le finestre per un dato lasso di tempo.