Décomposition de nombre décimal pour afficheur 7 segment.

Bonjour,

Voila je viens de me lancer dans un petit projet de thermomètre sur arduino
avec un affichage 7 segments.

La partie mesures fonctionnent parfaitement et me retourne une valeur
type : 22.36 en décimal.
(Une simple thermistance 10kOhm monter en pont diviseur de tensions avec une autre résistance de 10kOhm)

Je me suis donc mis a faire un petite afficheur 7 segment maison avec cette disposition:
-88.88

J'ai donc commencer avec un seul 7 segment : 8
Je suis partie très simple : Un fils - Un trait
(Oui sa fait 30 fils en tous...) Bon je suis sur une Arduino Mega
mais si vous avez un tuto ou autre pour que je simplifie la chose je prend. :slight_smile:

Bref la n'est pas le problèmes car pour le moment j'ai 8 fils (7 + 1 GND)
Et je peu afficher des chiffres de 0 à 9

int affichage[11][7] = { //port de sortie de 22 à 28)
  {26,28,22,23,24,25},
  {22,25},
  {26,22,27,23,24},
  {26,22,25,27,24},
  {28,22,27,25},
  {26,28,27,25,24},
  {28,27,25,23,24,26},
  {22,25,26},
  {22,23,24,25,26,27,28},
  {28,26,22,27,25,24},
  {22,23,24,25,26,27,28}//all
};
int number = 0;

void setup() {
  for(int i = 22; i<29; i++){
    pinMode(i, OUTPUT);
  }
}

void loop() {
  for(int i = 0; i < 7; i++){
    digitalWrite(affichage[number][i], HIGH);
  }
  if(number == 9){
    number = 0;
  }else{
    number++;
  }
  delay(1000);
  for(int i = 0; i < 7; i++){
    digitalWrite(affichage[10][i], LOW);
  }
}

Bien maintenant je doit donc décomposer ma valeur reçus du capteur
et la décomposer en 10/1 : 1/1 : 1/10 : 1/100

Pour ainsi afficher le bon nombre sur le bon afficheur.
C'est la que je bloque.

Comment faire ?

Je ne suis pas super alèse avec le langage arduino
(Je début avec) Et ne sachant jamais si c'est du C ou C++
(J'ai des base en C et un peu en C++ mais je maîtrise plus le PHP, javascripte, java, on va dire que je cherche toujours la syntaxe)

Si vous avez un autre solution je prend aussi :wink:

Si ton nombre est 12,34 (12.34)

Les dizaines tu les as avec ((int)nombre)/10 (12/10=1 quand on est en entiers)
Les unités avec (int)nombre%10 (le % signifie le reste de la division ... Par 10 en l'occurrence 12%10=2)
Les dixièmes int(10xnombre)% 10 (123%10=3)
Les centièmes int(100xnombre)%10 (1234%10=4)

J'avais zappé le modulo !
Merci :slight_smile:
Je tien au courant.

bonjour,
pour simplifier tes connexions, jète un oeil ICI
après tu pourras afficher la temp sans te prendre la tete en utilisant certaines lib.

slt

j'ai ça si ça peux te servir

void setup() {
  
Serial.begin(9600);

const int nbd = 7;                // nombre de digit
char aff[nbd+1];                 // tableau qui contiendra le nombre sous forme de string 
unsigned long nombre=9876543;   // nombre à distribuer aux digit
sprintf (aff, "%ld", nombre ); // converti le nombre en string
int sl=strlen(aff);           // nombre de digit à utiliser

for (int i=1; i<=nbd; i++)  {  // passe en revue les digit de gauche à droite
    int nd=i;           // nd le numéro de digit à écrire 
    int val=0;         // val= valeur à afficher au digit si le digit n'est pas utilisé afficher 0
    if (i>nbd-sl) val =  aff[i-nbd-1+sl]-48;   // valeur à afficher au digit code ascci (-48 pour 0 à 9)  
    
    Serial.print("digit "); Serial.print(nd); Serial.print(" = ");  Serial.println(val);  // affichage du résultat dans le moniteur série
  }
  
}

void loop(){
 


  }

Je regarde tous sa :slight_smile:
Encore merci de votre aide !

Une solution possible est encore plus simple est d'utiliser le codage bas niveau des micro contrôleur est d'écrire directement dans le registre PORTX