Contare con foto interrupter

Ho recuperato da una stampante un foto interruttore ir come questo. e l'ho collegato ad Arduino seguendo questo schema:

Voglio scrivere uno sketch per contare tutte le volte che il fascio IR viene interrotto, ma il problema è che lo voglio contare solo una volta. Invece nel mio sketch la variabile "conta" viene continuamente aumentata. Mi date un aiutino?

int conta=0;
int sensorPin = A0;  
int ledPin = 13;      
int sensorValue = 0;  

void setup() {
  // declare the ledPin as an OUTPUT:
  pinMode(ledPin, OUTPUT);  
  Serial.begin(9600);
}

void loop() {

  sensorValue = analogRead(sensorPin);    

//Serial.println(sensorValue);
if (sensorValue>1010)
{
  conta++;
  Serial.println(conta);
  
}
delay(500);
}

Ho provato lo sketch, è un po' meglio ma la variabile aumenta ancora quando è interrotto...

Stampa i valori di stato e sensorvalue. Magari quando il sensore è interrotto ci sono delle fluttuazioni di valori. Cioè quando interrotto non sempre supera 1010 (magari anche da interrotto arriva 1005 o 1009)

L'ho interrotto con un cartoncino, i valori rimangono abbastanza stabili.

Numero: 1   Sensore: 1001
Numero: 2   Sensore: 1018
Numero: 3   Sensore: 1020
Numero: 4   Sensore: 1020
Numero: 5   Sensore: 1020
Numero: 6   Sensore: 1020
Numero: 7   Sensore: 1020
Numero: 8   Sensore: 1018
Numero: 9   Sensore: 1019
Numero: 10   Sensore: 1020
Numero: 11   Sensore: 1020
Numero: 12   Sensore: 1020
Numero: 13   Sensore: 1020
Numero: 14   Sensore: 1020
Numero: 15   Sensore: 1019
Numero: 16   Sensore: 1020
Numero: 17   Sensore: 1018
Numero: 18   Sensore: 1020
Numero: 19   Sensore: 1020
Numero: 20   Sensore: 1020
Numero: 21   Sensore: 1019
Numero: 22   Sensore: 1020
Numero: 23   Sensore: 1020
Numero: 24   Sensore: 1019
Numero: 25   Sensore: 1018

E la variabile continua ad incrementare...

Nella prima versione ho messo male le graffe:

void loop() 
{
  sensorValue = analogRead(sensorPin);    
  if (sensorValue>1010)
  { if(stato==0)
    {  stato=1;
        conta++;
        Serial.println(conta);
    }
  }      // avevo dimenticato questa
  else
  { stato=0;
  }
  delay(500);
}

Ok, grazie funziona!

Ecco lo sketch corretto e perfettamente funzionante!

int conta=0;
int sensorPin = A0;  
int ledPin = 13;      
int sensorValue = 0;  
int stato;

void setup() {

  pinMode(ledPin, OUTPUT);  
  Serial.begin(9600);
}

void loop() 
{
  sensorValue = analogRead(sensorPin);    
  if (sensorValue>1000)
  {
    digitalWrite(ledPin,HIGH);
    if(stato==0)
    {  
      stato=1;
      conta++;
      Serial.print("Numero: ");
      Serial.print(conta);
      Serial.print("   Sensore: ");
      Serial.println(sensorValue);
     
    }
  }
  else
  { 
    stato=0;

  }
  delay(50);

  digitalWrite(ledPin,LOW);
}

Visto che quando è interrotto genera una tensione molto alta (lo dimostrano le letture di analogRead che sono tutte sopra a 1000, considerando che 1023 è il valore massimo diciamo che sei quasi a fondo scala) perché allora nn collegarlo ad un pin digitale direttamente? La lettura sarebbe molto più veloce.

leo72: Visto che quando è interrotto genera una tensione molto alta (lo dimostrano le letture di analogRead che sono tutte sopra a 1000, considerando che 1023 è il valore massimo diciamo che sei quasi a fondo scala) perché allora nn collegarlo ad un pin digitale direttamente? La lettura sarebbe molto più veloce.

Beh, in effetti è meglio un pin digitale...

A questo punto lo puoi collegare ad un interrupt (pin 2 o pin 3 di Arduino UNO) e gestire il tutto in automatico. Puoi decidere se far scattare il conteggio sul fronte di salita, di discesa o sul segnale alto o basso. Se scegli il fronte di discesa il conteggio afferra dopo che il segnale scende ovvero l'oggetto passa. Se staziona in mezzo non viene conteggiato finché non è rimosso.

Per la gestione di contatori con interrupt e per il codice ti rimando ai centinaia di topic che trattano questo argomento nel forum.

PaoloP: A questo punto lo puoi collegare ad un interrupt (pin 2 o pin 3 di Arduino UNO) e gestire il tutto in automatico. Puoi decidere se far scattare il conteggio sul fronte di salita, di discesa o sul segnale alto o basso. Se scegli il fronte di discesa il conteggio afferra dopo che il segnale scende ovvero l'oggetto passa. Se staziona in mezzo non viene conteggiato finché non è rimosso.

Per la gestione di contatori con interrupt e per il codice ti rimando ai centinaia di topic che trattano questo argomento nel forum.

Ok, ma i valori oscillano tra 800 e 1023 bit sul pin analogico, con la stessa tensione che arriva sul pin analogico quando il valore è 800, il segnale viene riconosciuto come LOW sul pin digitale?

alex27riva:

PaoloP: A questo punto lo puoi collegare ad un interrupt (pin 2 o pin 3 di Arduino UNO) e gestire il tutto in automatico. Puoi decidere se far scattare il conteggio sul fronte di salita, di discesa o sul segnale alto o basso. Se scegli il fronte di discesa il conteggio afferra dopo che il segnale scende ovvero l'oggetto passa. Se staziona in mezzo non viene conteggiato finché non è rimosso.

Per la gestione di contatori con interrupt e per il codice ti rimando ai centinaia di topic che trattano questo argomento nel forum.

Ok, ma i valori oscillano tra 800 e 1023 bit sul pin analogico, con la stessa tensione che arriva sul pin analogico quando il valore è 800, il segnale viene riconosciuto come LOW sul pin digitale?

Mi sembra che è 1 da 5V a 3V ma non sono sicuro. Guarda nella home->reference, su digitalRead() mi sembra che c'e' scritto