Problème code pour compte personne avec laser et afficheur 7 segments

Bonjour,

je suis débutant en arduino et j'ai fait un système avec un laser, une photorésistance, un composant 74hc595, un affichage 7 segments et une del. J'aimerais lorsque que l'on passe entre le laser et la photorésistance la del s'allume, le buzzer buzz et le compteur passe à 1 puis ensuite 2....à chaque fois que l'on passe devant.
J'ai commencé à écrire le programme, le système marche, la del s'allume, le buzzer bip.... saut l'afficheur 7 segments qui ne marque rien. Auriez-vous une idée de mon erreur ? ci joint mon code

J'ai relié mon afficheur à l'arduino comme dans le kit démarrage arduino, j'ai essayer avec le code qui va avec ( qui fait un décompte 9-8-7-6...jusqu'à 0 et recommence) et ça marche. Le problème viens donc bien de mon programme.

Bonne après-midi
Paulo

byte seven_seg_digits[10] = { B11111100,  // = 0
                             B01100000,  // = 1
                             B11011010,  // = 2
                             B11110010,  // = 3
                             B01100110,  // = 4
                             B10110110,  // = 5
                             B10111110,  // = 6
                             B11100000,  // = 7
                             B11111110,  // = 8
                             B11110110   // = 9
                            };

// connect to the ST_CP of 74HC595 (pin 12,latch pin)
int latchPin = 8;
// connect to the SH_CP of 74HC595 (pin 11, clock pin)
int clockPin = 12;
// connect to the DS of 74HC595 (pin 14)
int dataPin = 11;
int sensorPin=A0;
int sensor1Pin=A1;
int sensorValue=0; 
int piezoPin=13;

int unit = 0;
int mes = 0;
int capt = 9;
int etat = 0; 
int raz();


void setup(){ 
pinMode(sensorPin,INPUT);
pinMode(sensor1Pin,INPUT);
pinMode(24,OUTPUT);
pinMode(22,OUTPUT);
pinMode(piezoPin,OUTPUT);
digitalWrite(24,HIGH); 
digitalWrite(22,LOW); 
// Set latchPin, clockPin, dataPin as output
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
}

// display a number on the digital segment display
void sevenSegWrite(byte digit) {
 // set the latchPin to low potential, before sending data
 digitalWrite(latchPin, LOW);
    
 // the original data (bit pattern)
 shiftOut(dataPin, clockPin, LSBFIRST, seven_seg_digits[digit]);  

 // set the latchPin to high potential, after sending data
 digitalWrite(latchPin, HIGH);
}





void aff() {
switch (unit) {
 case 0 :
 {  B11111100;  // = 0  
 }
 break;
 case 1 :
 {   B01100000;  // = 1 
 }
 break;
 case 2 :
 { B11011010;  // = 2  
 }
 break; 
 case 3 :
 {    B11110010; // = 3
 }
 break;
 case 4 :
 {B01100110;  // = 4
 }
 break; 
 case 5 :
 {B10110110;  // = 5 
 }
 break;
 case 6 :
 {B10111110;  // = 6
 }
 break;
  case 7 :
 {B11100000;  // = 7 
 }
 break;
  case 8 :
 {B11111110;  // = 8
 }
 break;
  case 9 :
 {B11110110;  // = 9
}
 break; 
 default:
 raz(); // En cas de problème on force tout à 0
}
}

void loop()
{ sensorValue=analogRead(sensorPin);
sensorValue=analogRead(sensor1Pin);
if(sensorValue<=1000)
{
  {unit++;                        // On rajoute +1 au nombre de passage unit++ == unit=unit+1
 }                    
 digitalWrite(piezoPin,HIGH); 
{tone(9,3047,400); noTone(8); 
} digitalWrite(24,HIGH);

} else {
 {unit = 0;}
 digitalWrite(piezoPin,LOW);
digitalWrite(24,LOW);
} sensorValue=1000; 

}

laser_alarme___compteur.ino (2.51 KB)

Dans la boucle de comptage après unit++ il faut appeler la fonction qui gère l'affichage (elle est définie mais pas utilisée).

Merci pour votre réponse,
que faut-il donc mettre ?

paul.h

hello
void loop()
{ sensorValue=analogRead(sensorPin);
sensorValue=analogRead(sensor1Pin);
if(sensorValue<=1000)
{
{unit++; // On rajoute +1 au nombre de passage unit++ == unit=unit+1
aff();
}
digitalWrite(piezoPin,HIGH);

Bonjour, merci pour votre réponse mais je ne comprend pas, cela ne marche toujours pas
Il doit surement y avoir d'autres erreurs
Paul.h

void loop()
{
sensorValue=analogRead(sensorPin);
//}
sensorValue=analogRead(sensor1Pin);
if(sensorValue<=1000)
{
{unit++; // On rajoute +1 au nombre de passage unit++ == unit=unit+1
sevenSegWrite(byte unit)
}
digitalWrite(piezoPin,HIGH);

int capt = 9;
int etat = 0;
void raz(){};

break;
default:
raz(); // En cas de problème on force tout à 0
break;

Re

Je n'arrive pas à le compiler, il me met :

C:\Users\2016\Documents\01 Paul privé\Arduino\0101 a paul arduino\laser_alarme___compteur\laser_alarme___compteur.ino: In function 'void loop()':

laser_alarme___compteur:119: error: expected primary-expression before 'unit'

exit status 1
expected primary-expression before 'unit'

ci joint le code:

byte seven_seg_digits[10] = { B11111100,  // = 0
                             B01100000,  // = 1
                             B11011010,  // = 2
                             B11110010,  // = 3
                             B01100110,  // = 4
                             B10110110,  // = 5
                             B10111110,  // = 6
                             B11100000,  // = 7
                             B11111110,  // = 8
                             B11110110   // = 9
                            };

// connect to the ST_CP of 74HC595 (pin 12,latch pin)
int latchPin = 8;
// connect to the SH_CP of 74HC595 (pin 11, clock pin)
int clockPin = 12;
// connect to the DS of 74HC595 (pin 14)
int dataPin = 11;
int sensorPin=A0;
int sensor1Pin=A1;
int sensorValue=0; 
int piezoPin=13;

int unit = 0;
int mes = 0;
int capt = 9;
int etat = 0; 
void raz(){};


void setup(){ 
pinMode(sensorPin,INPUT);
pinMode(sensor1Pin,INPUT);
pinMode(24,OUTPUT);
pinMode(22,OUTPUT);
pinMode(piezoPin,OUTPUT);
digitalWrite(24,HIGH); 
digitalWrite(22,LOW); 
// Set latchPin, clockPin, dataPin as output
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
}

// display a number on the digital segment display
void sevenSegWrite(byte digit) {
 // set the latchPin to low potential, before sending data
 digitalWrite(latchPin, LOW);
    
 // the original data (bit pattern)
 shiftOut(dataPin, clockPin, LSBFIRST, seven_seg_digits[digit]);  

 // set the latchPin to high potential, after sending data
 digitalWrite(latchPin, HIGH);
}





void aff() {
switch (unit) {
 case 0 :
 {  B11111100;  // = 0  
 }
 break;
 case 1 :
 {   B01100000;  // = 1 
 }
 break;
 case 2 :
 { B11011010;  // = 2  
 }
 break; 
 case 3 :
 {    B11110010; // = 3
 }
 break;
 case 4 :
 {B01100110;  // = 4
 }
 break; 
 case 5 :
 {B10110110;  // = 5 
 }
 break;
 case 6 :
 {B10111110;  // = 6
 }
 break;
  case 7 :
 {B11100000;  // = 7 
 }
 break;
  case 8 :
 {B11111110;  // = 8
 }
 break;
  case 9 :
 {B11110110;  // = 9
}
break; 
 default:
 raz(); // En cas de problème on force tout à 0
 break;


}
}

void loop()
{ sensorValue=analogRead(sensorPin);
sensorValue=analogRead(sensor1Pin);
if(sensorValue<=1000)
{
  {unit++;
   sevenSegWrite(byte unit);  
   
 
 }                    
 digitalWrite(piezoPin,HIGH); 
{tone(9,3047,400); noTone(8); 
} digitalWrite(24,HIGH);

} else {
 {unit = 0;}
 digitalWrite(piezoPin,LOW);
digitalWrite(24,LOW);
} sensorValue=1000; 

}

vas lire ceci
et corrige tes posts

{unit++;
**sevenSegWrite( unit); **

Re :
excusez moi,

Maintenant il m'affiche 1 au début et quand je passe la main devant, il me met 8 et clignote très vite
Savez-vous pourquoi ?
Comment le faire commencer à 1 ?

Paul H

toute la fonction affich ne sert à rien

et tu peux essayer en rajoutant un delai

{unit++;
delay(200);
sevenSegWrite(unit);

et ici, il ne faut pas laisser le byte
{unit++;
delay(200);
sevenSegWrite(byte unit);

Bonsoir,

je viens d'essayer comme vous me l'avez dit, mais le capteur ne marche plus, le buzzer se met à buzzer et les chiffres défilent comme si l'on passait toujours devant.
Je remarque aussi un autre problème les chiffres ne recommencent pas une fois arriver à 10.
Seriez-vous comment remédier à ces problèmes ??

Je me suis pour la fonction affich inspirer de ce lien

http://www.wikidebrouillard.org/index.php?title=Compteur_de_passages&oldid=26465

le souci c'est que moi j'utilise un laser et une photorésistance

bonne soirée Paul H

pour aller plus loin il faut un schéma de ce que tu as fais.

toi, tu utilises un laser et un 74595. le lien que tu donnes n'utilise pas de 74595

il est probable que le probleme vienne de la façon dont tu as cablé la détection du passage

paulhenneb:
Merci pour votre réponse,
que faut-il donc mettre ?

Un petit peu de réflection personnelle ne ferait pas de mal ?

Bonjour,
ci-joint mon schéma

tu dis :

défilent comme si l'on passait toujours devant.

tu declares 2 catpeurs sur A0 et A1

puis tu lis A0 et aussitot A1

mais sur A1, tu n'as rien cablé. la valeur lue est aléatoire et elle ne vaut pas 1000 ou plus
donc ta condition if est toujours vérifiée et tu incrementes units à chaque tour de boucle.

On avance on avance.. mdr
En effet j'avais oublié d'enlever A1,
maintenant quand je passe la main devant il avance de 1, mais quand je la repasse une deuxième fois il recommence à 0
Savez-vous pourquoi ?

byte seven_seg_digits[10] = { B11111100,  // = 0
                              B01100000,  // = 1
                              B11011010,  // = 2
                              B11110010,  // = 3
                              B01100110,  // = 4
                              B10110110,  // = 5
                              B10111110,  // = 6
                              B11100000,  // = 7
                              B11111110,  // = 8
                              B11110110   // = 9
                             };
 
// connect to the ST_CP of 74HC595 (pin 12,latch pin)
int latchPin = 8;
// connect to the SH_CP of 74HC595 (pin 11, clock pin)
int clockPin = 12;
// connect to the DS of 74HC595 (pin 14)
int dataPin = 11;
int sensorPin=A0;
int sensorValue=0; 
int piezoPin=13;

int unit = 0;
int mes = 0;
int capt = 9;
int etat = 0; 
void raz(){};


void setup(){ 
pinMode(sensorPin,INPUT);
pinMode(24,OUTPUT);
pinMode(22,OUTPUT);
pinMode(piezoPin,OUTPUT);
digitalWrite(24,HIGH); 
digitalWrite(22,LOW); 
 // Set latchPin, clockPin, dataPin as output
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
 
// display a number on the digital segment display
void sevenSegWrite(byte digit) {
  // set the latchPin to low potential, before sending data
  digitalWrite(latchPin, LOW);
     
  // the original data (bit pattern)
  shiftOut(dataPin, clockPin, LSBFIRST, seven_seg_digits[digit]);  
 
  // set the latchPin to high potential, after sending data
  digitalWrite(latchPin, HIGH);
}





void aff() {
switch (unit) {
  case 0 :
  {  B11111100;  // = 0  
  }
  break;
  case 1 :
  {   B01100000;  // = 1 
  }
  break;
  case 2 :
  { B11011010;  // = 2  
  }
  break; 
  case 3 :
  {    B11110010; // = 3
  }
  break;
  case 4 :
  {B01100110;  // = 4
  }
  break; 
  case 5 :
  {B10110110;  // = 5 
  }
  break;
  case 6 :
  {B10111110;  // = 6
  }
  break;
   case 7 :
  {B11100000;  // = 7 
  }
  break;
   case 8 :
  {B11111110;  // = 8
  }
  break;
   case 9 :
  {B11110110;  // = 9
}
 break; 
  default:
  raz(); // En cas de problème on force tout à 0
  break;

 
}
}

void loop()
{ sensorValue=analogRead(sensorPin);
if(sensorValue<=1000)
{
   {
     sevenSegWrite(unit++); 
   delay(300);
    aff();
      
    
  
  }                    
  digitalWrite(piezoPin,HIGH); 
{tone(9,3047,400); noTone(8); 
} digitalWrite(24,HIGH);

} else {
  {unit = 0;}
  digitalWrite(piezoPin,LOW);
digitalWrite(24,LOW);
} sensorValue=1000; 

}

c'est la dernière fois que je t'aide, car je n'ai vraiment pas l'impression que tu sois motivé pour apprendre le C et la philosophie du système arduino.
tu te reposes largement sur l'aide du forum sans chercher à comprendre ce qui est sensé être ton code

byte seven_seg_digits[10] = { B11111100,  // = 0
                              B01100000,  // = 1
                              B11011010,  // = 2
                              B11110010,  // = 3
                              B01100110,  // = 4
                              B10110110,  // = 5
                              B10111110,  // = 6
                              B11100000,  // = 7
                              B11111110,  // = 8
                              B11110110   // = 9
                            };

// connect to the ST_CP of 74HC595 (pin 12,latch pin)
int latchPin = 8;
// connect to the SH_CP of 74HC595 (pin 11, clock pin)
int clockPin = 12;
// connect to the DS of 74HC595 (pin 14)
int dataPin = 11;
int sensorPin = A0;
int sensorValue = 0;
int piezoPin = 13;

int unit = 0;
int mes = 0;
int capt = 9;
int etat = 0;

void setup() {
  pinMode(sensorPin, INPUT);
  pinMode(24, OUTPUT);
  pinMode(22, OUTPUT);
  pinMode(piezoPin, OUTPUT);
  digitalWrite(24, HIGH);
  digitalWrite(22, LOW);
  // Set latchPin, clockPin, dataPin as output
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

// display a number on the digital segment display
void sevenSegWrite(byte digit) {
  // set the latchPin to low potential, before sending data
  digitalWrite(latchPin, LOW);

  // the original data (bit pattern)
  shiftOut(dataPin, clockPin, LSBFIRST, seven_seg_digits[digit]);

  // set the latchPin to high potential, after sending data
  digitalWrite(latchPin, HIGH);
}

void loop()
{ sensorValue = analogRead(sensorPin);
  if (sensorValue <= 1000)
  {
    delay(300);

    unit++;
    if (unit >= 10) {
      unit = 1;
    }
    sevenSegWrite(unit);

    digitalWrite(piezoPin, HIGH);
    tone(9, 3047, 400); delay(500); noTone(8);
    digitalWrite(24, HIGH);

  } else {

    digitalWrite(piezoPin, LOW);
    digitalWrite(24, LOW);
  }
}