Chiffres sur deux lignes

Forum spécifique au shield Deuligne

Chiffres sur deux lignes

Message non lude FloVot » Sam 14 Juil 2012 15:34

Bonjour, je voudrai afficher des chiffres sur le Deuligne sur les deux lignes, j'ai vu que c'étais possible grâce à des caractères personnalisés comme ceci :
Image
Mais étant novice en programmation je ne sait pas du tout comment mi prendre. J'ai trouvé ce code :
Code: Tout sélectionner
/*
A set of custom made large numbers for a 16x2 LCD using the
LiquidCrystal librabry. Works with displays compatible with the
Hitachi HD44780 driver.

The Cuicuit:
  LCD RS pin to D12
  LCD Enable pin to D11
  LCD D4 pin to D5
  LCD D5 pin to D4
  LCD D6 pin to D3
  LCD D7 pin to D2
  LCD Vee tied to a pot to control brightness
  LCD Vss and R/W tied to ground
  LCD Vcc to +5V
  LCD pin 15 tied to pushbutton for control of backlight
 
This code has the custum numbers counting from 0 to 9 on
the left hand side of the LCD with a 1 sec delay between
numbers. On the right is a counter tracking the number of
times the program has looped.
 
Made by Michael Pilcher
2/9/2010
*/

// include the library
#include <LiquidCrystal.h>

// initialize the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// the 8 arrays that form each segment of the custom numbers
byte LT[8] =
{
  B00111,
  B01111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte UB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
byte RT[8] =
{
  B11100,
  B11110,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte LL[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B01111,
  B00111
};
byte LB[8] =
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};
byte LR[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11110,
  B11100
};
byte MB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111
};
byte block[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};

// loop counter
int count = 0;
 
void setup()
{
  // assignes each segment a write number
  lcd.createChar(0,LT);
  lcd.createChar(1,UB);
  lcd.createChar(2,RT);
  lcd.createChar(3,LL);
  lcd.createChar(4,LB);
  lcd.createChar(5,LR);
  lcd.createChar(6,MB);
  lcd.createChar(7,block);
 
  // sets the LCD's rows and colums:
  lcd.begin(16, 2);
       
}

void custom0()
{ // uses segments to build the number 0
  lcd.setCursor(0,0); // set cursor to column 0, line 0 (first row)
  lcd.write(0);  // call each segment to create
  lcd.write(1);  // top half of the number
  lcd.write(2);
  lcd.setCursor(0, 1); // set cursor to colum 0, line 1 (second row)
  lcd.write(3);  // call each segment to create
  lcd.write(4);  // bottom half of the number
  lcd.write(5);
}

void custom1()
{
  lcd.setCursor(0,0);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(0,1);
  lcd.write(4);
  lcd.write(7);
  lcd.write(4);
}

void custom2()
{
  lcd.setCursor(0,0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(0, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(4);
}

void custom3()
{
  lcd.setCursor(0,0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(0, 1);
  lcd.write(4);
  lcd.write(4);
  lcd.write(5);
}

void custom4()
{
  lcd.setCursor(0,0);
  lcd.write(3);
  lcd.write(4);
  lcd.write(7);
  lcd.setCursor(2, 1);
  lcd.write(7);
}

void custom5()
{
  lcd.setCursor(0,0);
  lcd.write(3);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(0, 1);
  lcd.write(4);
  lcd.write(4);
  lcd.write(5);
}

void custom6()
{
  lcd.setCursor(0,0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(0, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(5);
}

void custom7()
{
  lcd.setCursor(0,0);
  lcd.write(1);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(2, 1);
  lcd.write(7);
}

void custom8()
{
  lcd.setCursor(0,0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(0, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(5);
}

void custom9()
{
  lcd.setCursor(0,0);
  lcd.write(0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(2, 1);
  lcd.write(7);
}

void clearnumber()
{ // clears the area the custom number is displayed in
 lcd.setCursor(0,0);
 lcd.print("   ");
 lcd.setCursor(0,1);
 lcd.print("   ");
}

void loop()
{
  lcd.setCursor(5,0);  // puts cursor at columb 5, line 0
  lcd.print("Loop Count:");  // displays the words on LCD
  lcd.setCursor(9,1);  // sets cursor to column 9, line 1
  lcd.print(count);  // displays loop count on LCD
  clearnumber();  // clears the custom number
  custom0();    // displays custom 0 on the LCD
  delay(1000);  // delay 1 second
  clearnumber();
  custom1();
  delay(1000);
  clearnumber();
  custom2();
  delay(1000);
  clearnumber();
  custom3();
  delay(1000);
  clearnumber();
  custom4();
  delay(1000);
  clearnumber();
  custom5();
  delay(1000);
  clearnumber();
  custom6();
  delay(1000);
  clearnumber();
  custom7();
  delay(1000);
  clearnumber();
  custom8();
  delay(1000);
  clearnumber();
  custom9();
  delay(1000);
  count++;  // adds 1 to the loop count
}

mais si j'ai bien compris la boucle c'est pas un capteur qui détermine le chiffre à afficher mais le programme et moi je voudrai un programme qui puisse grâce aux données d'un capteur m'afficher mon nombre ( qui sera composé de deux chiffres ) sur l'écran.
J'espère avoir été clair et vous remercie d'avance de vos réponse.
FloVot
 
Messages: 12
Inscription: Sam 14 Juil 2012 15:20

Re: Chiffres sur deux lignes

Message non lude SesechXP » Sam 14 Juil 2012 16:28

Salut,

Pourquoi vouloir créer des caractères ? L'écran du Deuligne intègre un jeu de caractères, dont les chiffres de 0 à 9... Si ce n'est déjà fait je t'invite à regarder les exemples d'utilisation du Deuligne qui devraient t'éclairer.

++
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Chiffres sur deux lignes

Message non lude FloVot » Sam 14 Juil 2012 16:33

Oui, je sait mais moi je veut les afficher sur deux lignes pour qu'ils soit plus grands car je veut les voir de loin.
FloVot
 
Messages: 12
Inscription: Sam 14 Juil 2012 15:20

Re: Chiffres sur deux lignes

Message non lude SesechXP » Sam 14 Juil 2012 16:43

Autant pour moi, je n'avais pas compris ça :oops:

Avant de se lancer dans l'affichage de la valeur d'un capteur, procédons par étapes. L'exemple que tu as trouvé me semble être une bonne base de travail pour comprendre comment ça fonctionne.

Il faut déjà commencer par l'adapter au Deuligne qui fonctionne différemment du shield utilisé dans l'exemple. Tu peux commencer par suivre ce tuto pour afficher les caractères de ton exemple. Quand tu arriveras à afficher 01234567 tu pourras intégrer un capteur.
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Chiffres sur deux lignes

Message non lude FloVot » Sam 14 Juil 2012 16:55

La création je pense avoir compris c'est l'affectation de tel chiffre à tel symbole sur deux lignes et trois colones que je ne comprend pas car j'ai pour un caractère plusieurs symboles.
Merci de vos réponses.
FloVot
 
Messages: 12
Inscription: Sam 14 Juil 2012 15:20

Re: Chiffres sur deux lignes

Message non lude SesechXP » Sam 14 Juil 2012 17:02

Dans l'exemple que tu donnes, l'affichage des chiffres se fait en appelant les fonctions custom0 à custom9.
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Chiffres sur deux lignes

Message non lude FloVot » Sam 14 Juil 2012 17:10

Cet partie je ne l'es pas comprise j'ai juste compris la partie setup mais la partie loop et j'ai pas trouvé à quoi sert la commande Custom
FloVot
 
Messages: 12
Inscription: Sam 14 Juil 2012 15:20

Re: Chiffres sur deux lignes

Message non lude FloVot » Sam 14 Juil 2012 17:15

Si en fait je pense que ça sert à faire revenir un motif. Mais grâce à cette fonction il me faudrait testé ma valeur pour savoir quel nombre c'est et donc quel motif faire apparaître sauf que j'ai deux chiffres et je sait pas comment les séparer. Si je dit bon pourriez vous m'aider à séparer les dizaine des unités ? Merci
FloVot
 
Messages: 12
Inscription: Sam 14 Juil 2012 15:20

Re: Chiffres sur deux lignes

Message non lude SesechXP » Sam 14 Juil 2012 18:14

Tout à fait, les fonctions custom0 à custom9 recréent respectivement les chiffres 0 à 9.

Pour séparer les dizaines des unités, il faut utiliser les opérateurs de division (/) et modulo (%) :
Code: Tout sélectionner
byte valeur = 25;
byte unites = valeur % 10;
byte dizaines = valeur / 10;
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Chiffres sur deux lignes

Message non lude FloVot » Sam 14 Juil 2012 19:54

Merci, je pense avoir finaliser mon code bien que je pense qu'il soit peu optimiser. Je vous demande ce que vous en penser :
Code: Tout sélectionner
#include "Wire.h"
#include <Deuligne.h>
Deuligne lcd;
int time;
int time2;
int unite;
int dizaine;
byte haut[8] = {
   B11111,
   B11111,
   B00000,
   B00000,
   B00000,
   B00000,
   B00000,
   B00000
};
byte bas[8] = {
   B00000,
   B00000,
   B00000,
   B00000,
   B00000,
   B00000,
   B11111,
   B11111
};
byte hautbas[8] = {
   B11111,
   B11111,
   B00000,
   B00000,
   B00000,
   B00000,
   B11111,
   B11111
};
byte plein[8] = {
   B11111,
   B11111,
   B11111,
   B11111,
   B11111,
   B11111,
   B11111,
   B11111
};
byte vide[8] = {
   B00000,
   B00000,
   B00000,
   B00000,
   B00000,
   B00000,
   B00000,
   B00000
};
void setup(){
pinMode(A1, INPUT);
Wire.begin();
lcd.init();
 
  lcd.createChar(0,haut);
  lcd.createChar(1,bas);
  lcd.createChar(2,hautbas);
  lcd.createChar(3,plein);
  lcd.createChar(4,vide);
  lcd.backLight(true);
}
void loop(){
 
  while(analogRead (A1)>100){}   
time = millis();                 
 
  while(analogRead (A1)<100){}     
 
  while(analogRead (A1)>100){}     
 
while(analogRead (A1)<100){}     

  while(analogRead (A1)>100){}     

time2 = millis();

  while(analogRead (A1)<100){}

while(analogRead (A1)>100){}

  while(analogRead (A1)<100){}

time2 -= time;
time = 6000/time2;
unite = time;
dizaine = time % 10;
while(unite>9){
 unite -= 10;}
 
 lcd.clear();
 if (dizaine==1){
 lcd.setCursor(0,0);
lcd.write(0);
lcd.write(3);
lcd.write(4);
lcd.setCursor(0,1);
lcd.write(1);
lcd.write(3);
lcd.write(1);
 }
  if (dizaine==2){
 lcd.setCursor(0,0);
lcd.write(2);
lcd.write(2);
lcd.write(3);
lcd.setCursor(0,1);
lcd.write(3);
lcd.write(1);
lcd.write(1);
 }
  if (dizaine==3){
 lcd.setCursor(0,0);
lcd.write(0);
lcd.write(2);
lcd.write(3);
lcd.setCursor(0,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
 }
  if (dizaine==4){
 lcd.setCursor(0,0);
lcd.write(3);
lcd.write(1);
lcd.write(3);
lcd.setCursor(0,1);
lcd.write(4);
lcd.write(4);
lcd.write(3);
 }
 if (dizaine==5){
 lcd.setCursor(0,0);
lcd.write(3);
lcd.write(2);
lcd.write(2);
lcd.setCursor(0,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
 }
  if (dizaine==6){
 lcd.setCursor(0,0);
lcd.write(3);
lcd.write(2);
lcd.write(2);
lcd.setCursor(0,1);
lcd.write(3);
lcd.write(1);
lcd.write(3);
 }
  if (dizaine==7){
 lcd.setCursor(0,0);
lcd.write(0);
lcd.write(0);
lcd.write(3);
lcd.setCursor(0,1);
lcd.write(4);
lcd.write(4);
lcd.write(3);
 }
  if (dizaine==8){
 lcd.setCursor(0,0);
lcd.write(3);
lcd.write(2);
lcd.write(3);
lcd.setCursor(0,1);
lcd.write(3);
lcd.write(1);
lcd.write(3);
 }
  if (dizaine==9){
 lcd.setCursor(0,0);
lcd.write(3);
lcd.write(2);
lcd.write(3);
lcd.setCursor(0,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
 }
 if (unite==0){
   lcd.setCursor(4,0);
lcd.write(3);
lcd.write(0);
lcd.write(3);
lcd.setCursor(4,1);
lcd.write(3);
lcd.write(1);
lcd.write(3);
 }
  if (unite==1){
   lcd.setCursor(4,0);
lcd.write(0);
lcd.write(3);
lcd.write(4);
lcd.setCursor(0,1);
lcd.write(1);
lcd.write(3);
lcd.write(1);
 }
  if (unite==2){
   lcd.setCursor(4,0);
lcd.write(2);
lcd.write(2);
lcd.write(3);
lcd.setCursor(4,1);
lcd.write(3);
lcd.write(1);
lcd.write(1);
 }
  if (unite==3){
   lcd.setCursor(4,0);
lcd.write(0);
lcd.write(2);
lcd.write(3);
lcd.setCursor(4,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
 }
  if (unite==4){
   lcd.setCursor(4,0);
lcd.write(3);
lcd.write(1);
lcd.write(3);
lcd.setCursor(4,1);
lcd.write(4);
lcd.write(4);
lcd.write(3);
 }
  if (unite==5){
   lcd.setCursor(4,0);
lcd.write(3);
lcd.write(2);
lcd.write(2);
lcd.setCursor(4,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
 }
  if (unite==6){
   lcd.setCursor(4,0);
lcd.write(3);
lcd.write(2);
lcd.write(2);
lcd.setCursor(4,1);
lcd.write(3);
lcd.write(1);
lcd.write(3);
 }
  if (unite==7){
   lcd.setCursor(4,0);
lcd.write(0);
lcd.write(0);
lcd.write(3);
lcd.setCursor(4,1);
lcd.write(4);
lcd.write(4);
lcd.write(3);
 }
  if (unite==8){
   lcd.setCursor(4,0);
lcd.write(3);
lcd.write(2);
lcd.write(3);
lcd.setCursor(4,1);
lcd.write(3);
lcd.write(1);
lcd.write(3);
 }
  if (unite==9){
   lcd.setCursor(4,0);
lcd.write(3);
lcd.write(2);
lcd.write(3);
lcd.setCursor(4,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
 }
 
}

Merci ! Je n'est pas peu le tester car je n'est pas reçu encore mon écran qui devrait arriver lundi ou mardi.
FloVot
 
Messages: 12
Inscription: Sam 14 Juil 2012 15:20

Re: Chiffres sur deux lignes

Message non lude SesechXP » Dim 15 Juil 2012 08:38

Peux-tu expliquer ce que fait ce code ? Je comprends bien ce que fait chaque ligne mais pas le principe global...

Sans se préoccuper de savoir si ce code fonctionne ou pas, deux points me sautent aux yeux :
- l'enchaînement des lectures de l'entrée analogique A1 pourrait être factorisé. Avec des boucles (for, while, etc) et des structures conditionnelles (if, else).
- tu aurais du conserver les fonctions custom0, custom1, etc de ton exemple. ça t'aurait notamment évité de les dupliquer pour les dizaines et les unités.
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Chiffres sur deux lignes

Message non lude FloVot » Dim 15 Juil 2012 08:58

Bonjour, ce code fait pour un compte cadence, je fait de l'aviron et j'ai besoin de savoir le nombres de coups que je fait par min. Donc ce code calcule le temps entre deux passages et me donne la fréquence sur 1 min. J'ai besoin d'utiliser while car avec if le programme ne se "bloque" jusqu'à ce que la condition soit résolut et leurs nombres provient du nombre de passage par coups.
FloVot
 
Messages: 12
Inscription: Sam 14 Juil 2012 15:20

Re: Chiffres sur deux lignes

Message non lude Cassiope34 » Dim 15 Juil 2012 10:01

Projet très sympa FloVot !

Comment captes-tu les coups d'avirons ?

@+
Cassiope34
 
Messages: 102
Inscription: Lun 16 Avr 2012 14:35

Re: Chiffres sur deux lignes

Message non lude FloVot » Dim 15 Juil 2012 10:11

J'ai un capteur( qui doit être une bobine ) et un aiment placé sous la coulisse (siège sur raye) a chaque passage une impulsion. Savais-vous si on vois bien l'écran au soleil .
FloVot
 
Messages: 12
Inscription: Sam 14 Juil 2012 15:20

Re: Chiffres sur deux lignes

Message non lude Cassiope34 » Dim 15 Juil 2012 10:16

Quasiment tous les LCD ont le contraste réglable.
Cassiope34
 
Messages: 102
Inscription: Lun 16 Avr 2012 14:35

Re: Chiffres sur deux lignes

Message non lude FloVot » Jeu 19 Juil 2012 09:04

Bonjour, et merci car j'ai reçu mon écran mardi et que l'affichage sur deux lignes marche. Mais par contre sur USB tout marche bien. Mais dès que je passe sur l'alimentation externe (bloc de 4 pile 1,5V ) j'ai l'impression que ça bloque une lecture de la boucle. J'ai pensé que c'était a cause de la faible tension mais l'USB délivre que 5V. Donc je vous demande votre avis. (Après niveau ampère je sait pas)

PS si quelqu’un veut mon code pour l'affichage il suffit de demander.
FloVot
 
Messages: 12
Inscription: Sam 14 Juil 2012 15:20

Re: Chiffres sur deux lignes

Message non lude Lionel » Jeu 19 Juil 2012 09:13

Bonjour,

oui le code est bienvenu.

Pour le bloc 4 piles c'est un peu court pour l'arduino par la prise d'alim,
il y a un régulateur placé en entrée, il pompe un peu de courant

Si ce sont des rechargeables, elles font 1,2V par baton soit 4.8V au total, c'est trop peu.

Pour un montage embarqué, prenez des blocs 6 piles et economisez l'énergie en n'affichant que lorsque vous en avez besoin.
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Chiffres sur deux lignes

Message non lude FloVot » Jeu 19 Juil 2012 09:28

Merci, je pense que je vais utiliser un pile 9V.

Pour le code le voici :

Code: Tout sélectionner
#include "Wire.h"                                // inclution des bibliothèque
#include <Deuligne.h>     
int unite;
int dizaine;
Deuligne lcd;                                    // Déclaration du LCD
  byte haut[8] =     {   B11111,   B11111,   B00000,   B00000,   B00000,   B00000,   B00000,   B00000};
  byte bas[8] =      {   B00000,   B00000,   B00000,   B00000,   B00000,   B00000,   B11111,   B11111};       // Création des motifs pour former les
  byte hautbas[8] =  {   B11111,   B11111,   B00000,   B00000,   B00000,   B00000,   B11111,   B11111};       // numéros sur 2 lignes et 3 colones
  byte plein[8] =    {   B11111,   B11111,   B11111,   B11111,   B11111,   B11111,   B11111,   B11111};
  byte vide[8] =     {   B00000,   B00000,   B00000,   B00000,   B00000,   B00000,   B00000,   B00000};
void setup(){
  Wire.begin();                                  // Initialisation de la bilbliothèque
  lcd.init();                                    // initialisation du LCD
  lcd.createChar(0,haut);     
  lcd.createChar(1,bas);
  lcd.createChar(2,hautbas);                     // Attribution d'un numéro par motifs
  lcd.createChar(3,plein);
  lcd.createChar(4,vide);
  lcd.backLight(true);                           // Rétroéclérage activer
}
void loop(){
 
  // Partie du code a compléter, moi j'utiliser un capteur et je calculer le temps entre deux impultions
  // J'ai choisie de fonctionner comme ca mais on peut faire plus simple je pense avec des void custom
 
 
while(unite>9){                                  // Tant que "unite" est plus grand que 9 soustraire 10 : donne ainsi que le chiffre des unités
unite -= 10;}
dizaine = (dizaine - unite)/10;                  // opération donnant le chiffre des dizaines
 lcd.clear();                                    // nettoyer l'écran
if (dizaine==1){                                 // Si le chiffre des dizaines est 1 alors :
lcd.setCursor(1,0);                              // Placer le curseur a la position "1,0"
lcd.write(0);                                    // Ecrire le motif 0 puis 3 puis 4
lcd.write(3);
lcd.write(4);
lcd.setCursor(1,1);                              // Placer le curseur sur la 2nd ligne
lcd.write(1);                                    // Ecrire le motif 1 puis 3 puis 1
lcd.write(3);
lcd.write(1);
 }
  if (dizaine==2){                               // Même chose si c'est 2
 lcd.setCursor(1,0);
lcd.write(2);
lcd.write(2);
lcd.write(3);
lcd.setCursor(1,1);
lcd.write(3);
lcd.write(1);
lcd.write(1);
 }
  if (dizaine==3){                               // Même chose si c'est 3
 lcd.setCursor(1,0);
lcd.write(0);
lcd.write(2);
lcd.write(3);
lcd.setCursor(1,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
 }
  if (dizaine==4){                               // Même chose si c'est 4
 lcd.setCursor(1,0);
lcd.write(3);
lcd.write(1);
lcd.write(3);
lcd.setCursor(1,1);
lcd.write(4);
lcd.write(4);
lcd.write(3);
 }
 if (dizaine==5){                               // Même chose si c'est 5
 lcd.setCursor(1,0);
lcd.write(3);
lcd.write(2);
lcd.write(2);
lcd.setCursor(1,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
 }
  if (dizaine==6){                               // Même chose si c'est 6
 lcd.setCursor(1,0);
lcd.write(3);
lcd.write(2);
lcd.write(2);
lcd.setCursor(1,1);
lcd.write(3);
lcd.write(1);
lcd.write(3);
 }
  if (dizaine==7){                               // Même chose si c'est 7
 lcd.setCursor(1,0);
lcd.write(0);
lcd.write(0);
lcd.write(3);
lcd.setCursor(1,1);
lcd.write(4);
lcd.write(4);
lcd.write(3);
 }
  if (dizaine==8){                               // Même chose si c'est 8
 lcd.setCursor(1,0);
lcd.write(3);
lcd.write(2);
lcd.write(3);
lcd.setCursor(1,1);
lcd.write(3);
lcd.write(1);
lcd.write(3);
 }
  if (dizaine==9){                               // Même chose si c'est 9
 lcd.setCursor(1,0);
lcd.write(3);
lcd.write(2);
lcd.write(3);
lcd.setCursor(1,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
 }
 if (unite==0){                                 // Même chose avec les unités
   lcd.setCursor(5,0);
lcd.write(3);
lcd.write(0);
lcd.write(3);
lcd.setCursor(5,1);
lcd.write(3);
lcd.write(1);
lcd.write(3);
 }
  if (unite==1){
   lcd.setCursor(5,0);
lcd.write(0);
lcd.write(3);
lcd.write(4);
lcd.setCursor(5,1);
lcd.write(1);
lcd.write(3);
lcd.write(1);
 }
  if (unite==2){
   lcd.setCursor(5,0);
lcd.write(2);
lcd.write(2);
lcd.write(3);
lcd.setCursor(5,1);
lcd.write(3);
lcd.write(1);
lcd.write(1);
 }
  if (unite==3){
   lcd.setCursor(5,0);
lcd.write(0);
lcd.write(2);
lcd.write(3);
lcd.setCursor(5,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
 }
  if (unite==4){
   lcd.setCursor(5,0);
lcd.write(3);
lcd.write(1);
lcd.write(3);
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(3);
 }
  if (unite==5){
   lcd.setCursor(5,0);
lcd.write(3);
lcd.write(2);
lcd.write(2);
lcd.setCursor(5,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
 }
  if (unite==6){
   lcd.setCursor(5,0);
lcd.write(3);
lcd.write(2);
lcd.write(2);
lcd.setCursor(5,1);
lcd.write(3);
lcd.write(1);
lcd.write(3);
 }
  if (unite==7){
   lcd.setCursor(5,0);
lcd.write(0);
lcd.write(0);
lcd.write(3);
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(3);
 }
  if (unite==8){
   lcd.setCursor(5,0);
lcd.write(3);
lcd.write(2);
lcd.write(3);
lcd.setCursor(5,1);
lcd.write(3);
lcd.write(1);
lcd.write(3);
 }
  if (unite==9){
   lcd.setCursor(5,0);
lcd.write(3);
lcd.write(2);
lcd.write(3);
lcd.setCursor(5,1);
lcd.write(1);
lcd.write(1);
lcd.write(3);
  } }
FloVot
 
Messages: 12
Inscription: Sam 14 Juil 2012 15:20

Re: Chiffres sur deux lignes

Message non lude SesechXP » Jeu 19 Juil 2012 10:00

Salut,

Pour éviter la duplication de code et tous les if de la fonction loop, il aurait été judicieux de réfléchir à une fonction d'affichage qui prend en paramètre le chiffre à afficher et sa position sur l'écran.

Un petit exemple en partant du bout de code de ton premier message :

- Définition des segments :
Code: Tout sélectionner
byte LT[8] = { B00111, B01111, B11111, B11111, B11111, B11111, B11111, B11111 };
byte UB[8] = { B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000 };
byte RT[8] = { B11100, B11110, B11111, B11111, B11111, B11111, B11111, B11111 };
byte LL[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B01111, B00111 };
byte LB[8] = { B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111 };
byte LR[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11110, B11100 };
byte MB[8] = { B11111, B11111, B11111, B00000, B00000, B00000, B11111, B11111 };
byte block[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 };

- Création d'une structure représentant chaque chiffre :
Code: Tout sélectionner
struct number
{
    uint8_t l0c0;    // Line 0, column 0.
    uint8_t l0c1;    // Line 0, column 1.
    uint8_t l0c2;    // Line 0, column 2.
    uint8_t l1c0;    // Line 1, column 0.
    uint8_t l1c1;    // Line 1, column 1.
    uint8_t l1c2;    // Line 1, column 2.
};

- Définition des chiffres, un chiffre étant représenté par 6 segments (les valeurs correspondent aux emplacements mémoire du LCD) :
Code: Tout sélectionner
struct number numbers[10] =
{
    { 0, 1, 2, 3, 4, 5 },    // 0.
    { 1, 2, 8, 4, 7, 4 },    // 1.
    { 6, 6, 2, 3, 4, 4 },    // 2.
    { 6, 6, 2, 4, 4, 5 },    // 3.
    { 3, 4, 7, 8, 8, 7 },    // 4.
    { 3, 6, 6, 4, 4, 5 },    // 5.
    { 0, 6, 6, 3, 4, 5 },    // 6.
    { 1, 1, 2, 8, 8, 7 },    // 7.
    { 0, 6, 2, 3, 4, 5 },    // 8.
    { 0, 6, 2, 4, 4, 5 }     // 9.
};

- Implémentation d'une fonction d'affichage :
Code: Tout sélectionner
void printNumber(byte digit, byte column)
{
    lcd.setCursor(column, 0);
    lcd.write((numbers[digit].l0c0 != 8) ? numbers[digit].l0c0 : ' ');
    lcd.write((numbers[digit].l0c1 != 8) ? numbers[digit].l0c1 : ' ');
    lcd.write((numbers[digit].l0c2 != 8) ? numbers[digit].l0c2 : ' ');
    lcd.setCursor(column, 1);
    lcd.write((numbers[digit].l1c0 != 8) ? numbers[digit].l1c0 : ' ');
    lcd.write((numbers[digit].l1c1 != 8) ? numbers[digit].l1c1 : ' ');
    lcd.write((numbers[digit].l1c2 != 8) ? numbers[digit].l1c2 : ' ');
}

- Exploitation de tout ça :
Code: Tout sélectionner
void setup(){
  Wire.begin();
 
  lcd.init();
  lcd.backLight(true);
   
  lcd.createChar(0, LT);
  lcd.createChar(1, UB);
  lcd.createChar(2, RT);
  lcd.createChar(3, LL);
  lcd.createChar(4, LB);
  lcd.createChar(5, LR);
  lcd.createChar(6, MB);
  lcd.createChar(7, block);
}

void loop(){
    for (byte i = 0; i < 100; i++)
    {
        printNumber(i / 10, 0);
        printNumber(i % 10, 3);
        delay(1000);
    }
}

Sketch complet :
Code: Tout sélectionner
#include <Wire.h>
#include <Deuligne.h>

Deuligne lcd;

struct number
{
    uint8_t l0c0;    // Line 0, column 0.
    uint8_t l0c1;    // Line 0, column 1.
    uint8_t l0c2;    // Line 0, column 2.
    uint8_t l1c0;    // Line 1, column 0.
    uint8_t l1c1;    // Line 1, column 1.
    uint8_t l1c2;    // Line 1, column 2.
};

// the 8 arrays that form each segment of the custom numbers
byte LT[8] = { B00111, B01111, B11111, B11111, B11111, B11111, B11111, B11111 };
byte UB[8] = { B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000 };
byte RT[8] = { B11100, B11110, B11111, B11111, B11111, B11111, B11111, B11111 };
byte LL[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B01111, B00111 };
byte LB[8] = { B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111 };
byte LR[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11110, B11100 };
byte MB[8] = { B11111, B11111, B11111, B00000, B00000, B00000, B11111, B11111 };
byte block[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 };

struct number numbers[10] =
{
    { 0, 1, 2, 3, 4, 5 },    // 0.
    { 1, 2, 8, 4, 7, 4 },    // 1.
    { 6, 6, 2, 3, 4, 4 },    // 2.
    { 6, 6, 2, 4, 4, 5 },    // 3.
    { 3, 4, 7, 8, 8, 7 },    // 4.
    { 3, 6, 6, 4, 4, 5 },    // 5.
    { 0, 6, 6, 3, 4, 5 },    // 6.
    { 1, 1, 2, 8, 8, 7 },    // 7.
    { 0, 6, 2, 3, 4, 5 },    // 8.
    { 0, 6, 2, 4, 4, 5 }     // 9.
};

void setup(){
  Wire.begin();
 
  lcd.init();
  lcd.backLight(true);
   
  lcd.createChar(0, LT);
  lcd.createChar(1, UB);
  lcd.createChar(2, RT);
  lcd.createChar(3, LL);
  lcd.createChar(4, LB);
  lcd.createChar(5, LR);
  lcd.createChar(6, MB);
  lcd.createChar(7, block);
}

void loop(){
    for (byte i = 0; i < 100; i++)
    {
        printNumber(i / 10, 0);
        printNumber(i % 10, 3);
        delay(1000);
    }
}

void printNumber(byte digit, byte column)
{
    lcd.setCursor(column, 0);
    lcd.write((numbers[digit].l0c0 != 8) ? numbers[digit].l0c0 : ' ');
    lcd.write((numbers[digit].l0c1 != 8) ? numbers[digit].l0c1 : ' ');
    lcd.write((numbers[digit].l0c2 != 8) ? numbers[digit].l0c2 : ' ');
    lcd.setCursor(column, 1);
    lcd.write((numbers[digit].l1c0 != 8) ? numbers[digit].l1c0 : ' ');
    lcd.write((numbers[digit].l1c1 != 8) ? numbers[digit].l1c1 : ' ');
    lcd.write((numbers[digit].l1c2 != 8) ? numbers[digit].l1c2 : ' ');
}


BigDigits.ino
(2.33 Kio) Téléchargé 193 fois
Dernière édition par SesechXP le Jeu 19 Juil 2012 10:33, édité 2 fois.
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Chiffres sur deux lignes

Message non lude Lionel » Jeu 19 Juil 2012 10:10

Aaaaah comme j'aime ces coopérations fructueuses !!!
c'est nickel merci !!
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Suivante

Retourner vers Deuligne

Qui est en ligne

Utilisateurs parcourant ce forum: Majestic-12 [Bot] et 1 invité