Contatore di oggetti con Arduino e sensore ostacoli KY-032
Realizziamo un contatore automatico che rileva il passaggio degli oggetti con il sensore infrarosso KY-032 e mostra il numero sul Monitor Seriale o su un display LCD 16×2 I2C.
Come funziona il contatore
Il modulo KY-032 integra un LED trasmettitore a infrarossi e un ricevitore. La radiazione IR emessa viene riflessa da un oggetto posto davanti al sensore e raggiunge il ricevitore, permettendo al modulo di cambiare lo stato della propria uscita digitale.
Il sensore dispone di regolazioni che permettono di adattare il rilevamento alla distanza e alle condizioni di utilizzo. La portata effettiva dipende dalla regolazione, dalla superficie dell’oggetto, dal colore, dalla luce ambientale e dall’orientamento del modulo.
Esempio di contatore di oggetti realizzato con Arduino.
Il modulo KY-032
Il KY-032 fornisce un’uscita digitale che può essere letta direttamente da Arduino. Nella configurazione utilizzata qui, l’uscita è normalmente HIGH quando non viene rilevato un ostacolo e passa a LOW quando il sensore rileva un oggetto.
Modulo KY-032 con trasmettitore e ricevitore infrarossi e regolazione della sensibilità.
Materiale necessario
🧰 Kit Arduino consigliato
Un kit completo è utile per avere a disposizione breadboard, cavetti, resistenze, sensori e molti dei componenti utilizzati nei progetti Arduino.
👉 Guarda il kit Arduino consigliatoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
📘 Vuoi imparare Arduino passo dopo passo?
Nei miei libri dedicati ad Arduino trovi spiegazioni progressive, schemi e progetti pratici pensati anche per chi parte da zero.
👉 Scopri i miei libri su ArduinoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Simulazione del circuito
Puoi utilizzare anche la simulazione Tinkercad per osservare il comportamento del contatore e verificare la logica prima del montaggio.
▶️ Apri la simulazione Tinkercad
Schema con display LCD I2C
Schema del contatore con modulo KY-032 e display LCD I2C.
Schema con display LCD 16×2
Configurazione del contatore con display LCD 16×2.
Collegamenti principali
| Componente | Arduino | Funzione |
|---|---|---|
| KY-032 OUT | D8 | Rilevamento ostacolo |
| KY-032 alimentazione | 3,3 V / GND | Alimentazione modulo |
| LCD I2C SDA | SDA | Dati I2C |
| LCD I2C SCL | SCL | Clock I2C |
| LCD | 5 V / GND | Alimentazione display |
Perché non basta contare ogni lettura?
Se Arduino incrementasse il contatore durante tutto il tempo in cui l’oggetto rimane davanti al sensore, lo stesso oggetto verrebbe contato centinaia o migliaia di volte. Dobbiamo invece riconoscere il cambiamento di stato: un nuovo oggetto deve produrre un solo incremento.
Libreria per il display I2C
Per il display è necessaria una libreria compatibile con il modulo I2C utilizzato. Il file disponibile con il progetto può essere importato dall’Arduino IDE tramite la funzione per aggiungere una libreria da file ZIP.
⬇️ Scarica NewLiquidCrystal 1.3.4
Codice Arduino commentato
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configurazione del display I2C
LiquidCrystal_I2C lcd(
0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE
);
// Uscita digitale del sensore KY-032
const int sensorePin = 8;
// Stato attuale e precedente del sensore
int statoSensore = HIGH;
int statoPrecedente = HIGH;
// Numero di oggetti rilevati
unsigned long conteggio = 0;
void setup() {
// Inizializza LCD 16x2
lcd.begin(16, 2);
// Avvia il Monitor Seriale
Serial.begin(9600);
// Imposta D8 come ingresso
pinMode(sensorePin, INPUT);
// Legge lo stato iniziale
statoSensore = digitalRead(sensorePin);
statoPrecedente = statoSensore;
lcd.setCursor(0, 0);
lcd.print("Num. Oggetti:");
lcd.setCursor(0, 1);
lcd.print(conteggio);
}
void loop() {
// Legge continuamente il KY-032
statoSensore = digitalRead(sensorePin);
// Il KY-032 utilizzato è active LOW:
// LOW = ostacolo rilevato.
// Incrementiamo soltanto nel passaggio HIGH -> LOW.
if (statoSensore == LOW && statoPrecedente == HIGH) {
conteggio++;
Serial.println(conteggio);
// Pulisce la seconda riga per evitare
// residui quando cambia il numero di cifre
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(conteggio);
// Breve filtro contro commutazioni troppo ravvicinate
delay(100);
}
// Memorizza lo stato per il ciclo successivo
statoPrecedente = statoSensore;
}
Come funziona il codice
1. Lettura del sensore
digitalRead(sensorePin) legge l’uscita digitale del KY-032 collegata al pin D8.
2. Rilevamento del nuovo oggetto
Il controllo statoSensore == LOW && statoPrecedente == HIGH riconosce il momento in cui il sensore passa dalla condizione libera alla presenza di un ostacolo.
3. Incremento del contatore
La variabile conteggio viene aumentata di uno per ogni nuovo passaggio e il valore viene inviato sia al Monitor Seriale sia al display LCD.
4. Memoria dello stato precedente
Alla fine di ogni ciclo Arduino salva la lettura corrente in statoPrecedente. In questo modo può distinguere un nuovo oggetto da uno che si trova ancora davanti al sensore.
Immagine dello sketch
Esempio del codice per il contatore di oggetti.
Regolare correttamente il KY-032
Prima di usare il contatore in modo stabile, posiziona il sensore alla distanza prevista e regola gradualmente i potenziometri. L’obiettivo è ottenere una commutazione netta quando passa l’oggetto, senza falsi rilevamenti quando il percorso è libero.
- prova con l’oggetto reale che dovrà essere contato;
- mantieni il sensore fermo e ben orientato;
- evita, quando possibile, luce infrarossa intensa direttamente sul ricevitore;
- controlla il LED di stato del modulo durante la regolazione;
- verifica il risultato anche dal Monitor Seriale.
Limiti del sistema
Un sensore riflettente come il KY-032 non crea una vera barriera tra trasmettitore e ricevitore posti sui lati opposti. Il rilevamento dipende dalla quantità di infrarosso che l’oggetto riesce a riflettere. Superfici molto scure, inclinate, lucide o poste troppo lontano possono quindi essere rilevate in modo diverso.
delay(100) limita volutamente eventi ravvicinati. Se gli oggetti passano rapidamente, bisogna ridurre o eliminare il delay e utilizzare un filtro temporale non bloccante con millis().Scarica lo sketch
Debug rapido
- controlla che OUT del KY-032 sia collegato a D8;
- verifica se il tuo modulo è active LOW oppure active HIGH;
- regola la sensibilità prima di modificare il codice;
- usa il Monitor Seriale per verificare il conteggio;
- se l’LCD resta vuoto, controlla indirizzo I2C, SDA, SCL e contrasto;
- se lo stesso oggetto viene contato più volte, aumenta il filtraggio o migliora il posizionamento del sensore;
- se alcuni oggetti non vengono rilevati, riduci la distanza e regola nuovamente il modulo.
Varianti del progetto
- aggiungere un pulsante per azzerare il conteggio;
- salvare il totale nella EEPROM;
- aggiungere un buzzer a ogni passaggio;
- attivare un relè al raggiungimento di una quantità prestabilita;
- mostrare conteggio totale e velocità di passaggio;
- usare due sensori per determinare la direzione;
- inviare il conteggio via Wi-Fi con ESP32.
Cosa devi ricordare
- Il KY-032 utilizza infrarossi riflessi per rilevare un ostacolo.
- L’uscita del sensore è collegata a D8.
- Il contatore deve reagire al cambio di stato, non alla semplice presenza dell’oggetto.
- Il valore può essere visualizzato sul Monitor Seriale e su LCD I2C.
- La regolazione del sensore è fondamentale per evitare conteggi errati.
Domande frequenti
Perché il contatore aumenta più volte con un solo oggetto?
Il segnale può commutare più volte oppure l’oggetto può muoversi nella zona limite di rilevamento. Migliora la regolazione e il posizionamento e, se necessario, aggiungi un filtro temporale.
Perché alcuni oggetti scuri non vengono rilevati bene?
Il KY-032 lavora con luce infrarossa riflessa. Materiali e colori diversi riflettono quantità differenti di IR, quindi la distanza utile può cambiare.
Posso contare oggetti senza display?
Sì. Il display non è indispensabile: puoi visualizzare il conteggio esclusivamente sul Monitor Seriale.
Posso sapere anche in quale direzione passa l’oggetto?
Sì, usando due sensori distanziati e controllando quale dei due viene attivato per primo.

