Contapersone con Arduino
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.

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

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