Contapersone con Arduino

Questa risorsa è stata scritta dagli studenti dell'Istituto ITIS "Enrico Mattei" di Urbino, della classe 4A/EN (Matteo Coccia, Piergiovanni Andrea) nell'a.s. 2021/2022, all'interno del corso di Sistemi Elettronici.

Per favore, prima di apportare modifiche, attendi sino alla fine dell'anno scolastico (termina il 30 giugno 2022) oppure contatta il docente di riferimento Giacomo Alessandroni nel caso venissero rilevati contenuti non in linea con le linee guida della comunità.

Se leggi questo avviso ad anno scolastico concluso puoi rimuoverlo.

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

laboratorio
laboratorio
Contapersone con Arduino
Tipo di risorsa Tipo: laboratorio
Materia di appartenenza Materia: Sistemi elettronici
Avanzamento Avanzamento: laboratorio completa al 100%


Principio di funzionamento

modifica

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

Sensoristica

modifica

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

modifica

Lo schema di montaggio è quello riportato in figura

 
Schema elettrico conta persone

Componenti utilizzati

modifica
Componenti importanti utilizzati
Componenti Quantità
Sensore ad ultrasuoni

(HC-SR04)

2
Potenziometro 1
Display LCD 1
Resistenza 220Ω 1

Codice sorgente

modifica
//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

modifica

È 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   nell'aria per attivare un motore che automaticamente apre le finestre per un dato lasso di tempo.