afficheur 7 segment

bonjour à tous , j'ai un afficheur 7 segment et j'aimerai pouvoir entrer des chiffres dans le moniteur série et qu'il les affiche. Pour le moment je n'ai fait que avec " 0 " et les chiffres plus grand que " 9 " (ils sont impossibles sur un seul afficheur). Le problème et que quand j'entre la valeur " 0 " , il affiche l'erreur. pouvez vous m'aider ? Voici mon code:

int haut=2;
int bas=5;
int point=9;
int milieu=8;
int haut_gauche=7;
int bas_gauche=6;
int haut_droit=3;
int bas_droit=4;

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  char carlu=Serial.read();
 if (carlu==0 ){
   zero();
   }
  if (carlu>9){
    erreur();
  }
}



void zero() {
 digitalWrite(bas, HIGH);
 digitalWrite(haut, HIGH); 
 digitalWrite(bas_droit, HIGH); 
 digitalWrite(bas_gauche, HIGH); 
 digitalWrite(haut_gauche, HIGH); 
 digitalWrite(haut_droit, HIGH); 
 digitalWrite(point, HIGH); 

}

void un() {
 digitalWrite(haut_droit, HIGH);
 digitalWrite(bas_droit, HIGH);
 digitalWrite(point, HIGH);
}

void deux() {
 digitalWrite(haut, HIGH);
 digitalWrite(haut_droit, HIGH);
 digitalWrite(milieu, HIGH);
 digitalWrite(bas_gauche, HIGH);
 digitalWrite(bas, HIGH);
 digitalWrite(point, HIGH);
}

void trois() {
  digitalWrite(haut, HIGH);
  digitalWrite(haut_droit, HIGH);
  digitalWrite(milieu, HIGH);
  digitalWrite(bas_droit, HIGH);
  digitalWrite(bas, HIGH);
  digitalWrite(point, HIGH);
}

void quatre() {
   digitalWrite(haut_gauche, HIGH);
   digitalWrite(haut_droit, HIGH);
   digitalWrite(milieu, HIGH);
   digitalWrite(bas_droit, HIGH);
   digitalWrite(point, HIGH);
}

void cinq() {
  digitalWrite(haut, HIGH);
  digitalWrite(haut_gauche, HIGH);
  digitalWrite(milieu, HIGH);
  digitalWrite(bas_droit, HIGH);
  digitalWrite(bas, HIGH);
  digitalWrite(point, HIGH);
}

void six() {
  digitalWrite(haut, HIGH);
  digitalWrite(haut_gauche, HIGH);
  digitalWrite(milieu, HIGH);
  digitalWrite(bas_gauche, HIGH);
  digitalWrite(bas_droit, HIGH);
  digitalWrite(bas, HIGH);
  digitalWrite(point, HIGH);
}

void sept() {
  digitalWrite(haut, HIGH);
  digitalWrite(haut_droit, HIGH);
  digitalWrite(bas_droit, HIGH);
  digitalWrite(point, HIGH);
}

void huit() {
  digitalWrite(haut, HIGH);
  digitalWrite(haut_droit, HIGH);
  digitalWrite(haut_gauche, HIGH);
  digitalWrite(milieu, HIGH);
  digitalWrite(bas_droit, HIGH);
  digitalWrite(bas_gauche, HIGH);
  digitalWrite(bas, HIGH);
  digitalWrite(point, HIGH);
}

void neuf() {
  digitalWrite(haut, HIGH);
  digitalWrite(haut_gauche, HIGH);
  digitalWrite(haut_droit, HIGH);
  digitalWrite(milieu, HIGH);
  digitalWrite(bas_droit, HIGH);
  digitalWrite(bas, HIGH);
  digitalWrite(point, HIGH);
}

void erreur() {
  digitalWrite(haut_droit, HIGH);
  digitalWrite(haut_gauche, HIGH);
}

void off() {
  digitalWrite(point, HIGH);
  delay(1000);
  digitalWrite(point, LOW);
  delay(1000);
}

merci d'avance :)

Il y a peut être un caractère 'fin de ligne' invisible après le 0 rentré au clavier ?

Pour savoir si ce que vous dites est le cas, j'ai rajouté ceci dans mon code pour savoir ce qu'il reçoit:

 Serial.print(carlu);

et quand j'entre quelque chose ou rien du tout, une sorte de y apparait tout le temps dans le moniteur série.

Bonjour

Peut-être que cela vient de là : char carlu=Serial.read();

carlu contient le code ASCII du caractère lu par Serial.Read()

Il faut faire une conversion pour afficher les chiffres : carlu : caractere 48 : 0 49 : 1 ... 57 : 9

if ( carlu == 48 ) { zero() ; }

fait une recherche google table ASCII tu auras la table complète

Le code de fin de ligne (10) est à éliminer (10 en ASCII est la touche "Entrée").

Le plus simple est d'utiliser un switch() pour éviter de mettre des if() en cascade.

int Entree = 0;   // Entree d'un octet sur Serial

void setup()
{
  Serial.begin(9600);
  }
void loop()
{
  if (Serial.available() > 0) {
    Entree = Serial.read();
    //Serial.println(Entree);
    switch (Entree)
    {
    case 48:   //0 en ASCII
      Serial.println("zero");
      break;
    case 49:   //1 en ASCII
      Serial.println("un");
      break;
    case 50:   //2 en ASCII
      Serial.println("deux");
      break;
    case 51:   //3 en ASCII
      Serial.println("trois");
      break;
    case 52:   //4 en ASCII
      Serial.println("quatre");
      break;
    case 53:   //5 en ASCII
      Serial.println("cinq");
      break;
    case 54:   //6 en ASCII
      Serial.println("six");
      break;
    case 55:   //7 en ASCII
      Serial.println("sept");
      break;
    case 56:   //8 en ASCII
      Serial.println("huit");
      break;
    case 57:   //9 en ASCII
      Serial.println("neuf");
      break;
   case 101:   //E en ASCII
      Serial.print ("E");
      break;
   }
  }
}

Bonsoir

void loop() {
  char carlu=Serial.read();
 if (carlu==0 ){
   zero();
   }
  if (carlu>9){
    erreur();
  }
}

c'est pas bon ! c'est plutôt if(carlu=="0") //zero avec les ""

Sur un programme en python j'avais fait la même erreur ! :D

Chabot380

merci a tous pour vos conseils qui m'ont beaucoup aidé :) pour finir j'ai fait ceci:

int haut=2;
int bas=5;
int point=9;
int milieu=8;
int haut_gauche=7;
int bas_gauche=6;
int haut_droit=3;
int bas_droit=4;
char carLu;

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  Serial.begin(9600);
}
void loop() {  
  
}

void eteint(){
  digitalWrite(bas, LOW);
  digitalWrite(bas_gauche, LOW);
  digitalWrite(bas_droit, LOW);
  digitalWrite(milieu, LOW);
  digitalWrite(haut_gauche, LOW);
  digitalWrite(haut_droit, LOW);
  digitalWrite(haut, LOW);
  digitalWrite(point, LOW);
  
}

void allumeAfficheur(int i){
  // led bas
  if(i==48 || i==50 || i==51 || i==53 || i==54 || i==56 || i==57 || i==0){
    digitalWrite(bas, HIGH);
  }
  //led bas_gauche
  if(i==0 || i==48|| i== 50 || i==54 || i==56){
    digitalWrite(bas_gauche, HIGH);
  }
  //led bas_droit
  if(i==48 || i==49 || i==51 || i==52 || i==53 || i==54 || i==55 || i==56 || i==57){
    digitalWrite(bas_droit, HIGH);
  }
  //led milieu
  if(i==0 || i==50 || i==51 || i==52 || i==53 || i==54 || i==56 || i==57){
    digitalWrite(milieu, HIGH);
  }
  // led haut_gauche
  if(i==0 || i==48 || i==52 || i==53 || i==54 || i==56 || i==57){
    digitalWrite(haut_gauche, HIGH);
  }
  //led haut_droit
  if(i==48 || i==49 || i==50 || i==51 || i==52 || i==55 || i==56 || i==57){
    digitalWrite(haut_droit, HIGH);
  }
  //led haut
  if(i==0 || i==48 || i==50 || i==51 || i==53 || i==54 || i==55 || i==56 || i==57){
    digitalWrite(haut, HIGH);
  }
  digitalWrite(point, HIGH);
}

void veille(){
  digitalWrite(point, HIGH);
  delay(1000);
  digitalWrite(point, LOW);
  delay(1000);
}

Merci Christian pour ton idée de switch peut être partique :) Cepandant il me manque un élément: j'aimerai que quand j'entre une valeur dans le moniteur série il l'affiche (jusque là ok) jusque quand j'entre un autre chiffre et ainsi de suite. J'ai essayé plusieurs chose différentes, mais je ne parvient jamais a obtenir ce que je veut. Des suggestion ? Une autre question: Pour mettre un deuxième afficheur, il me manque des pin sur mon arduino uno. Des solutions ? (appart acheter un arduino mega).

Salut,

Quand je vois la flopée de if() du dernier code je me dit que vous vous cassez la tête pour rien :wink:

Essayez ça :

// Brochage des segments
const byte SEG_A = 2;
const byte SEG_B = 3;
const byte SEG_C = 4;
const byte SEG_D = 5;
const byte SEG_E = 6;
const byte SEG_F = 7;
const byte SEG_G = 8;
const byte SEG_DP = 9;

// Tableau magique chiffre -> digits
const byte digits[10] = {
  B00000011,
  B10011111,
  B00100101,
  B00001101,
  B10011001,
  B01001001,
  B01000001,
  B00011111,
  B00000001,
  B00011001,
};

// Setup
void setup() {

  // Initialisation des segments
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);
  pinMode(SEG_DP, OUTPUT);
  eteint7Seg();

  // Initialisation du port série
  Serial.begin(9600);
}

// Loop
void loop() {  
  
  // Si char disponible
  if(Serial.available() > 0) {
  
    // Lecture du char
    char c = Serial.read();
	
	// Si code ASCII entre '0' et '9' inclut
    if(c >= '0' && c <= '9') {
	
	  // Affiche le chiffre
          afficheChiffre(c - '0');
    } else {
	
	  // Erreur
	  eteint7Seg();
	}
  }
}

void eteint7Seg() {
  digitalWrite(SEG_A, LOW);
  digitalWrite(SEG_B, LOW);
  digitalWrite(SEG_C, LOW);
  digitalWrite(SEG_D, LOW);
  digitalWrite(SEG_E, LOW);
  digitalWrite(SEG_F, LOW);
  digitalWrite(SEG_G, LOW);
  digitalWrite(SEG_DP, LOW);
}

void afficheChiffre(byte i) {
  i %= 10;
  digitalWrite(SEG_A, digits[i] & 1);
  digitalWrite(SEG_B, digits[i] & 2);
  digitalWrite(SEG_C, digits[i] & 4);
  digitalWrite(SEG_D, digits[i] & 8);
  digitalWrite(SEG_E, digits[i] & 16);
  digitalWrite(SEG_F, digits[i] & 32);
  digitalWrite(SEG_G, digits[i] & 64);
  digitalWrite(SEG_DP, digits[i] & 128);
}