Compteur de vitesse engagé

Salut à tous,
Je travaille actuellement (à heures perdues) sur un petit compteur de vitesse engagé pour voiture,
étant novice en programmation C++, je viens chercher 2-3 conseils.
J'ai déjà écrit une petite ébauche de programme que voici :

/*
  COMPTEUR DE VITESSE ENGAGE
  

  modified 25 May 2015
  by B***** D******
*/


int premiere = 14;
int seconde = 15;
int troisieme = 16;
int quatrieme = 17;
int cinquieme = 18;

void setup() {
  // Déclaration des entrées/sorties
 
  pinMode(7, OUTPUT); //led segment A
  pinMode(6, OUTPUT); //led segment B
  pinMode(5, OUTPUT); //led segment C
  pinMode(4, OUTPUT); //led segment D
  pinMode(3, OUTPUT); //led segment E
  pinMode(2, OUTPUT); //led segment F
  pinMode(1, OUTPUT); //led segment G
  pinMode(premiere, INPUT); //1ere
  pinMode(seconde, INPUT); //2eme
  pinMode(troisieme, INPUT); //3eme
  pinMode(quatrieme, INPUT); //4eme
  pinMode(cinquieme, INPUT); //5eme
  
  // La vitesse engagé est affiché sur un 7 segments
  
}

void loop() { 
  if(premiere, HIGH);           //1ere
  else(6,5, HIGH);
  
  if(seconde, HIGH);            //2eme
  else(7,6,4,3,1, HIGH);
  
  if(troisieme, HIGH);          //3eme
  else(7,6,5,4,1, HIGH);
  
  if(quatrieme, HIGH);         //4eme
  else(6,5,2,1, HIGH);
  
  if(cinquieme, HIGH);        //5eme
  else(7,2,1,5,4, HIGH);
   
  if(premiere,seconde,troisieme,quatrieme,cinquieme, LOW); //point mort
  else(7,6,5,4,3,2, HIGH);
  

  
}

évidemment, ce programme ne fonctionne pas, enfin quand je simule la première (par exemple) avec un pont entre mon entrée 14 et le +3.3V, les sorties qui devraient s'activer ne s'activent pas (test avec une led).
Je travaille avec un arduino uno si ca peux aider.

Merci !

bonjour,
normal.

if = si
else = sinon
pas de ; juste après le if, sinon, ca arrête la condition sans rien faire

  if(premiere == HIGH)           //1ere
  digitalWrite(6, HIGH);

ok merci, ca devrait m'aider pas mal !

Voila mon code V2 :

/*
  COMPTEUR DE VITESSE ENGAGEE
  

  modified 25 May 2015
  by B***** D******
*/


int premiere = 14;
int seconde = 15;
int troisieme = 16;
int quatrieme = 17;
int cinquieme = 18;

void setup() {
  // Déclaration des entrées/sorties
 
  pinMode(7, OUTPUT); //led segment A
  pinMode(6, OUTPUT); //led segment B
  pinMode(5, OUTPUT); //led segment C
  pinMode(4, OUTPUT); //led segment D
  pinMode(3, OUTPUT); //led segment E
  pinMode(2, OUTPUT); //led segment F
  pinMode(1, OUTPUT); //led segment G
  pinMode(premiere, INPUT); //1ere
  pinMode(seconde, INPUT); //2eme
  pinMode(troisieme, INPUT); //3eme
  pinMode(quatrieme, INPUT); //4eme
  pinMode(cinquieme, INPUT); //5eme
  
  // La vitesse engagée est affiché sur un 7 segments
  
}

void loop() { 
  if(premiere == HIGH)           //1ere
  digitalWrite(6, HIGH),
  digitalWrite(5, HIGH);
  
  if(seconde == HIGH)            //2eme
  digitalWrite(7, HIGH),
  digitalWrite(6, HIGH),
  digitalWrite(4, HIGH),
  digitalWrite(3, HIGH),
  digitalWrite(1, HIGH);
  
  if(troisieme == HIGH)          //3eme
  digitalWrite(7, HIGH),
  digitalWrite(6, HIGH),
  digitalWrite(5, HIGH),
  digitalWrite(4, HIGH),
  digitalWrite(1, HIGH);
  
  if(quatrieme == HIGH)         //4eme
  digitalWrite(6, HIGH),
  digitalWrite(5, HIGH),
  digitalWrite(2, HIGH),
  digitalWrite(1, HIGH);
  
  if(cinquieme == HIGH)        //5eme
  digitalWrite(7, HIGH),
  digitalWrite(2, HIGH),
  digitalWrite(1, HIGH),
  digitalWrite(5, HIGH),
  digitalWrite(4, HIGH);
   
  if(premiere,seconde,troisieme,quatrieme,cinquieme == LOW) //point mort
  digitalWrite(7, HIGH),
  digitalWrite(6, HIGH),
  digitalWrite(5, HIGH),
  digitalWrite(4, HIGH),
  digitalWrite(3, HIGH),
  digitalWrite(2, HIGH);

  
}

Mes essais avec mes ponts et mes leds ne fonctionnent toujours pas, d'autre suggestions d'améliorations ?

tu n'as pas regardé les exemples dans l'ide :wink:
ils sont où les digitalRead des boutons (premiere, etc...)

je vais y jeter un œil merci !

et comment je fais pour mettre plusieurs arguments dans un digitalRead :

digitalRead(premiere,seconde,troisieme,quatrieme,cinquieme == LOW),

si je met (première,seconde,...,...,...) ça ne l'accepte pas

il faudrait voir a regarder les exemples dans l'ide :wink:

if(digitalRead(premiere) == HIGH)           //1ere

j'en ai regardé certains mais pas les bons visiblement :slight_smile:
Merci à toi !

Après une petite pause, je me remet sur mon projet :
-Voici la MAJ de mon programme :

/*
  COMPTEUR DE VITESSE ENGAGEE
  

  modified 5 June 2015
  by B***** D******
*/

/*
int premiere = 14;
int seconde = 15;
int troisieme = 16;
int quatrieme = 17;
int cinquieme = 18;
*/
void setup() {
  // Déclaration des entrées/sorties
  
  pinMode(7, OUTPUT); //led segment A
  pinMode(6, OUTPUT); //led segment B
  pinMode(5, OUTPUT); //led segment C
  pinMode(4, OUTPUT); //led segment D
  pinMode(3, OUTPUT); //led segment E
  pinMode(2, OUTPUT); //led segment F
  pinMode(1, OUTPUT); //led segment G
  pinMode(14, INPUT); //1ere
  pinMode(15, INPUT); //2eme
  pinMode(16, INPUT); //3eme
  pinMode(17, INPUT); //4eme
  pinMode(18, INPUT); //5eme
  
  // La vitesse engagée est affiché sur un 7 segments
  
}

void loop() { 
  digitalRead(14 == HIGH),           //1ere
  digitalWrite(6, HIGH),
  digitalWrite(5, HIGH);
  
  digitalRead(15 == HIGH),            //2eme
  digitalWrite(7, HIGH),
  digitalWrite(6, HIGH),
  digitalWrite(4, HIGH),
  digitalWrite(3, HIGH),
  digitalWrite(1, HIGH);
  
  digitalRead(16 == HIGH),          //3eme
  digitalWrite(7, HIGH),
  digitalWrite(6, HIGH),
  digitalWrite(5, HIGH),
  digitalWrite(4, HIGH),
  digitalWrite(1, HIGH);
  
  digitalRead(17 == HIGH),         //4eme
  digitalWrite(6, HIGH),
  digitalWrite(5, HIGH),
  digitalWrite(2, HIGH),
  digitalWrite(1, HIGH);
  
  digitalRead(18 == HIGH),        //5eme
  digitalWrite(7, HIGH),
  digitalWrite(2, HIGH),
  digitalWrite(1, HIGH),
  digitalWrite(5, HIGH),
  digitalWrite(4, HIGH);
  
  if(digitalRead(14),(15),(16),(17),(18) == LOW)
  digitalWrite(7,HIGH),
  digitalWrite(6,HIGH),
  digitalWrite(5,HIGH),
  digitalWrite(4,HIGH),
  digitalWrite(3,HIGH),
  digitalWrite(2,HIGH);
    
}

Donc :

  • Quand je fais les tests avec mes ponts et mes LED, les sorties de 0 à 7 s'activent toutes (alors que j'ai déclaré uniquement les sorties de 1 à 7). Je peux simuler la 1ere, 2eme, 3eme... toute les sorties reste activent.
    Ce qui m’amène à me poser une question : Est-ce que mes adressages sont bon ?

  • Au passage, j'ai mis en PJ le schéma de mon câblage quand je fais des tests, est-ce que le soucis vient de la ??

Au passage, j'ai inhibé les "int" qui n’ont rien a faire la étant donné que l'on associe une valeur à un bit (si j'ai tout compris) et non une entrée/sortie.

tu n'as rien lu des réponses déjà faites :slight_smile:
ca ne veut rien dire ce que tu mets

 digitalRead(14 == HIGH),           //1ere
  digitalWrite(6, HIGH),
  digitalWrite(5, HIGH);

ce n'est pas une condition

là, oui

if (digitalRead(14 == HIGH)){          //1ere
  digitalWrite(6, HIGH);
  digitalWrite(5, HIGH);
// sont ou les autres lignes pour dire ce que doivent faire les leds pour chaque cas
}


// a la fin mets ca directement suivant ton cablage, sinon mets en LOW ce qui serait plus approprie

else{
  digitalWrite(7,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(2,HIGH);
}

Modification faite :

/*
  COMPTEUR DE VITESSE ENGAGEE
  

  modified 5 June 2015
  by B***** D******
*/

/*
int premiere = 14;
int seconde = 15;
int troisieme = 16;
int quatrieme = 17;
int cinquieme = 18;
*/
void setup() {
  // Déclaration des entrées/sorties
  
  pinMode(7, OUTPUT); //led segment A
  pinMode(6, OUTPUT); //led segment B
  pinMode(5, OUTPUT); //led segment C
  pinMode(4, OUTPUT); //led segment D
  pinMode(3, OUTPUT); //led segment E
  pinMode(2, OUTPUT); //led segment F
  pinMode(1, OUTPUT); //led segment G
  pinMode(8, INPUT); //1ere
  pinMode(9, INPUT); //2eme
  pinMode(10, INPUT); //3eme
  pinMode(11, INPUT); //4eme
  pinMode(12, INPUT); //5eme
  
  // La vitesse engagée est affiché sur un 7 segments
  
}

void loop() { 
  if (digitalRead(8 == HIGH)){           //1ere
  digitalWrite(6, HIGH);
  digitalWrite(5, HIGH);
}  
  if (digitalRead(9 == HIGH)){            //2eme
  digitalWrite(7, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(1, HIGH);
}  
  if (digitalRead(10 == HIGH)){          //3eme
  digitalWrite(7, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(1, HIGH);
}
  if (digitalRead(11 == HIGH)){         //4eme
  digitalWrite(6, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(1, HIGH);
}  
  if (digitalRead(12 == HIGH)){        //5eme
  digitalWrite(7, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(1, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(4, HIGH);
}  
  else{
  digitalWrite(7,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(2,HIGH);    
}
}

Seulement voila, je me pose des questions sur l'état de mon arduino : J'ai fais des tests avec ce programme pour comprendre un peu mieux le digitalRead (il s'agit d'un programme dispo en exemple dans l'IDE Arduino) :

/*
  DigitalReadSerial
 Reads a digital input on pin 2, prints the result to the serial monitor

 This example code is in the public domain.
 */

// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton = 2;

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  pinMode(pushButton, INPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input pin:
  int buttonState = digitalRead(pushButton);
  // print out the state of the button:
  Serial.println(buttonState);
  delay(1);        // delay in between reads for stability
}

Si j'ai tout compris, l'état de l'entrée 2 s'affiche dans le moniteur série selon l'état du BP associé à cette entrée, mais lorsque je regarde les donnés défilées, je m'aperçois que l'état varie (0 ou 1) sans que je touche au BP câblé sur l'entrée 2 (aucune autre intervention extérieure sur l'Arduino).
J'ai ensuite secoué un peu mon Arduino et je m'aperçoit que l'état change à une plus grande fréquence.
Est-ce que mon Arduino est endommagé voir foutu ?

Au passage, toujours même résultat avec mon prog, dsl, je doit être débile mais j'ai regardé beaucoup d'exemples et je pense avoir suivi les conseils à la lettre.

Encore merci pour l'aide déja fournie.

Si j'ai tout compris, l'état de l'entrée 2 s'affiche dans le moniteur série selon l'état du BP associé à cette entrée, mais lorsque je regarde les donnés défilées, je m'aperçois que l'état varie (0 ou 1) sans que je touche au BP câblé sur l'entrée 2 (aucune autre intervention extérieure sur l'Arduino).
J'ai ensuite secoué un peu mon Arduino et je m'aperçoit que l'état change à une plus grande fréquence.
Est-ce que mon Arduino est endommagé voir foutu ?

ca s'appelle des rebonds
solution

 pinMode(8, INPUT); //1ere
  pinMode(9, INPUT_PULLUP); //2eme
  pinMode(10, INPUT_PULLUP); //3eme
  pinMode(11, INPUT_PULLUP); //4eme
  pinMode(12, INPUT_PULLUP); //5eme

alors, on va réfléchir 2s
tes leds sont OFF au départ
si tu appuie sur un des boutons 1ere vitesse, tu dois activer quelle led?
on va dire la 1 et les autres doivent être à off
pour la deuxième
quelle led activée? quelles leds off?
etc...
à toi d'en déduire le code

OK j'explique :

  • Premier temps : je démarre la voiture (donc au point mort), donc on se retrouve dans ce cas :
if (digitalRead(8),(9),(10),(11),(12) == LOW){   // point mort
  digitalWrite(7,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(2,HIGH);    
}

Aucun des 5 capteurs de vitesse n'est attaqué (capteur que je mettrai en place pour capter les vitesses engagés) , on est au point mort : Les segments A, B, C, D, E, F de mon 7 segment sont allumés pour afficher un "0"

  • Deuxième temps : passage de la première vitesse, on est dans ce cas :
  if (digitalRead(8 == HIGH)){           //1ere
  digitalWrite(6, HIGH);
  digitalWrite(5, HIGH);
}

Le capteur de la première vitesse est attaqué donc l'entrée 8 est active, les segments B et C de mon afficheur 7 segments sont allumés pour afficher un "1"

  • Troisième temps : passage de la deuxième vitesse, on est dans ce cas :
 if (digitalRead(9 == HIGH)){            //2eme
  digitalWrite(7, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(1, HIGH);
}

Le capteur de la deuxième vitesse est attaqué donc l'entrée 9 est active, les segments A, B, G, E, D de mon afficheur 7 segments sont allumés pour afficher un "2"

Tout ça jusqu'en cinquième vitesse. Il est aussi possible de rétrograder, voir même sauter des vitesses, (conduite classique, enfin presque^^); bref il faut que lorsqu'une vitesse est engagé, le chiffre correspondant à cette vitesse doit être affiché sur mon afficheur 7 segments.

Est-ce que j'ai été assez clair ? sinon, n'hésite pas à me reposer des questions sur le fonctionnement.

(Quand je parle de LED, il s'agit simplement d'un branchement que je fais pour simuler des segments de mon afficheur, pour voir l'état d'une sortie).
Je vais faire les petites modifs que tu m'a indiqué !

Merci !

un truc serait plus simple niveau codage
switch case

int vitesse;


void loop(){
if (digitalRead(8),(9),(10),(11),(12) == LOW) vitesse = 0;
if (digitalRead(8 == HIGH)) vitesse = 1;
if (digitalRead(9 == HIGH)) vitesse = 2;
if (digitalRead(10 == HIGH)) vitesse = 3;
etc...

   switch (vitesse){
      //eteindre
    case 0:
      actionDigital(0,0,0,0,0,0);
      break ;

    case 1:
      actionDigital(0,0,0,0,1,1);
      break ;
etc....

}

void actionDigital(byte un,byte deux,byte trois,byte quatre,byte cin,byte six)
{
  digitalWrite(2, un);
  digitalWrite(7, deux);
  digitalWrite(6, trois);
  digitalWrite(5, quatre);
  digitalWrite(4, cinq);
  digitalWrite(3, six);

}

Pour la première partie, j'ai compris.
Ensuite : à quoi correspondent les "chiffres" dans les actionDigital des case :

case 0:
      actionDigital(0,0,0,0,0,0);
      break ;

j'ai compris qu'ensuite tu met les "chiffres" dans des bytes,
Ensuite tu reporte ces bytes dans les digitalWrite, jusque la OK.

digitalWrite(2, un);

Et si je comprend bien, ces bytes sont "associé" à des sortie (ici le byte "un" est associé à la sortie "2".
Je n'ai donc pas compris ce qu'il y'a dans ces bytes.

Pour ma part, je pensais que le plus simple était d'associer les segments de l'afficheur 7 segments à des sorties de l'Arduino.
C'est ce que tu a fais ici ?

actionDigital(0,0,0,0,0,0);
chaque chiffre correspond à une pin, donc un segment pour toi
là, tout est à zéro donc rien d'affiché

ca evite d'avoir des lignes en trop qui ne servent à rien :wink:
à toi de mettre à 1 ou 0 pour chaque cas

j'ai pas le datasheet sous les yeux, mais en admettant que tu veuilles allumer le digit du milieu horizontal, il suffit (au pif) de mettre dans le case
actionDigital(0,0,0,1,0,0);

OK, dans ce cas la, il faut rajouter un byte alors, c'est un 7 segments et non un 6 segment :wink:
Je vais essayer de mettre tout ça en forme et je poste le prog quand j'ai finis
Merci bcp !

erreur de ma part, tu as raison :wink:
mais le principal est que tu ais compris le principe