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.
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.
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
Componenti utilizzati
[modifica]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.