Go Down

Topic: Voir la valeur des entrées analogiques sur LCD (Read 2189 times) previous topic - next topic

xarolium

Bonjour,

Je souhaiterai faire un programmer qui m'indique sur un LCD 16x2 la valeur d'une entrée analogique multiplexer avec un 4051.
Le schema est le suivant


en fait j'arrive a afficher la valeur du premier potar mais je voudrai que lorsque j'en bouge un autre le LCD m'affiche le numéro du potar et ca valeur.
Voici ou en ai mon code qui fonctionne mais ai loin d'etre complet


/*
 
Le but du circuit est de lire la valeur d'un des huits potentiometre sur
l'afficheur LCD en passant par un multiplexage analogique des entrées



*/

// include the library code:
#include <LiquidCrystal.h>
#include <EEPROM.h>


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

// Initialsé le 4051 avec les pins de sorti
int AnalogIn = 0;  // valeur de la Pin  analogique d'entrée
byte AnalogInValue1 = 0; //  valeur du potar 1
byte AnalogInValue2 = 0; //  valeur du potar 2
int oldAnalogInValue = 0; // valeur lu a l'entrée de la Pin
int r0 = 0;      //value select pin at the 4051 (s0)
int r1 = 0;      //value select pin at the 4051 (s1)
int r2 = 0;      //value select pin at the 4051 (s2)
int row = 0;     // storeing the bin code
int count = 0;    // just a count
int  bin [] = {000, 1, 10, 11, 100, 101, 110, 111};//bin = binär, some times it is so easy
byte val1; // valeur enreg dans l'eeprom du potar 1
byte val2; // valeur enreg dans l'eeprom du potar 2

void setup() {
 
 // set le bon LCD
 lcd.begin(16, 2);
 // ecrire message sur LCD
 lcd.print("valeur Pot");
 
 // initialise les pins de sorti pour 4051
 pinMode(8, OUTPUT);    // s0
 pinMode(9, OUTPUT);    // s1
 pinMode(10, OUTPUT);    // s2
 
}

void loop() {
 
 // set the cursor to column 0, line 1
 
 
 //scanner les entrées du 4051
 for (count=0; count<=7; count++) {
   row = bin[count];      
   r0 = row & 0x01;
   r1 = (row>>1) & 0x01;
   r2 = (row>>2) & 0x01;
   digitalWrite(8, r0);
   digitalWrite(9, r1);
   digitalWrite(10, r2);
   delay (0);
 
   
 // enreg la valeur du potar 1 dans l'eeprom add 1  
   if (count == 0){
     AnalogInValue1 = analogRead (AnalogIn)/ 4;
     EEPROM.write (1, AnalogInValue1);
     val1 = EEPROM.read (1);
   }
 // enreg la valeur du potar 2 dans l'eeprom add 2
   if (count == 1){
     AnalogInValue2 = analogRead (AnalogIn)/ 4;
     EEPROM.write (2, AnalogInValue2);
     val2 = EEPROM.read (2);
   }
     // mettre le curseur en 2 ligne
    lcd.setCursor(0, 1);
    //print vlaeur du potar 1
    lcd.print(val1, DEC);
 }
}


merci pour votre aide
je sais que le code n'est pas très avancer mais comme je suis un Newbie j'ai encore du mal avec les automatismes de la programmation
:-? :-?

Korman

#1
Sep 24, 2010, 01:26 pm Last Edit: Sep 24, 2010, 01:29 pm by Korman Reason: 1
Bonjour,

quelques petites remarques:

Ecrire dans l'EEPROM chaque fois que loop() est appelé, est une très mauvaise idée. "'EEPROM est spécifié pour 100000 cycles d'écriture, après il a le droit de mourir en bon style. Avec ce que tu fais, plus d'EEPROM fonctionnant après 10 secondes. Plutôt il vaudrait utiliser un array pour tes valeurs.

Ton truc avec l'array bin est très douteux. If fait quelque chose, mais je croix que ce n'est pas ce que tu veux. A quoi bon? Dans ton array bin tu as les valeurs de 0 à 7 sur les indices 0 à 7. Pourquoi pas seulement:
Code: [Select]
r0 = count & 0x01;
  r1 = (count>>1) & 0x01;
  r2 = (count>>2) & 0x01;


Et enfin, si tu gardes les valeurs dans un array, tu peux afficher toutes les valeurs à ta discrétion, l'une après l'autre, toutes en même temps. Tous dépend de ce que tu veux achever.

Korman

B@tto

Je confirme, tu vas flinguer ton eeprom ... et dans ton code ça n'a aucune utilité !

Si tu veux afficher la valeur si un potar change, il suffit dans ta boucle d'enregistrer la tension de chaque potar à chaque cycle, et d'une boucle complète à l'autre tu compares la valeur à la précédente. Tu choisis un écart significatif, et si l'écart mesuré entre les deux valeurs est supérieur à ton écart significatif, alors le LCD affiche ce potar.
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

xarolium

Merci B@tto pour ton aide ,
J'ai réussi a faire ce petit programme qui fonctionne en émulation mais je voudrai savoir s'il était possible de simplifié avec un switch ou un Array.

/*
 

Le but du circuit est de lire la valeur d'un des huits potentiometre
l'afficheur LCD en passant par un multiplexage analogique des entrées

*/

// include the library code:
#include <LiquidCrystal.h>
#include <EEPROM.h>


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


int analogIn = 0;  // valeur de la Pin  analogique d'entrée

int valuepot1 = 0; //  valeur du potar 1
int valuepot2 = 0; //  valeur du potar 2
int oldvaluepot1 = 0;
int oldvaluepot2 = 0;
int valuepot3 = 0; //  valeur du potar 3
int valuepot4 = 0; //  valeur du potar 4
int oldvaluepot3 = 0;
int oldvaluepot4 = 0;
int valuepot5 = 0; //  valeur du potar 5
int valuepot6 = 0; //  valeur du potar 6
int oldvaluepot5 = 0;
int oldvaluepot6 = 0;
int valuepot7 = 0; //  valeur du potar 7
int valuepot8 = 0; //  valeur du potar 8
int oldvaluepot7 = 0;
int oldvaluepot8 = 0;

// Initialsé le 4051 avec les pins de sorti

int r0 = 0;      //value select pin at the 4051 (s0)
int r1 = 0;      //value select pin at the 4051 (s1)
int r2 = 0;      //value select pin at the 4051 (s2)
int row = 0;     // storeing the bin code
int count = 0;    // just a count
int  bin [] = {000, 1, 10, 11, 100, 101, 110, 111};//bin = binär, some times it is so easy

void setup() {
 
 // set up the LCD's number of rows and columns:
 lcd.begin(16, 2);
 
 
 
 // initialise les pins de sorti pour 4051
 pinMode(8, OUTPUT);    // s0
 pinMode(9, OUTPUT);    // s1
 pinMode(10, OUTPUT);    // s2
 
}

void loop() {
   
 //scanner les entrées du 4051
 for (count=0; count<=7; count++) {
   row = bin[count];      
   r0 = row & 0x01;
   r1 = (row>>1) & 0x01;
   r2 = (row>>2) & 0x01;
   digitalWrite(8, r0);
   digitalWrite(9, r1);
   digitalWrite(10, r2); //Serial.println(bin[count]);
   delay (0);
 
 
   
 // enreg la valeur du potar 1 dans une variable
   if (count==0){
     valuepot1 = analogRead (analogIn);
     if (valuepot1 != oldvaluepot1){
       valuepot1 = analogRead (analogIn);
       lcd.setCursor(0,0);
       lcd.print("Valeur Pot1");
       lcd.setCursor(0,1);
       lcd.print(valuepot1,DEC);
     }
   }
   oldvaluepot1 = (valuepot1);
   
   // enreg la valeur du potar 2 dans une variable
   if (count==4){
     valuepot2 = analogRead (analogIn);
     if (valuepot2 != oldvaluepot2){
       valuepot2 = analogRead (analogIn);
       lcd.setCursor(0,0);
       lcd.print("Valeur Pot2");
       lcd.setCursor(0,1);
       lcd.print(valuepot2,DEC);
     }
   }
   oldvaluepot2 = (valuepot2);
   
   // enreg la valeur du potar 3 dans une variable
   if (count==2){
     valuepot3 = analogRead (analogIn);
     if (valuepot3 != oldvaluepot3){
       valuepot3 = analogRead (analogIn);
       lcd.setCursor(0,0);
       lcd.print("Valeur Pot3");
       lcd.setCursor(0,1);
       lcd.print(valuepot3,DEC);
     }
   }
   oldvaluepot3 = (valuepot3);
   
   // enreg la valeur du potar 4 dans une variable
   if (count==6){
     valuepot4 = analogRead (analogIn);
     if (valuepot4 != oldvaluepot4){
       valuepot4 = analogRead (analogIn);
       lcd.setCursor(0,0);
       lcd.print("Valeur Pot4");
       lcd.setCursor(0,1);
       lcd.print(valuepot4,DEC);
     }
   }
   oldvaluepot4 = (valuepot4);
   
   // enreg la valeur du potar 5 dans une variable
   if (count==1){
     valuepot5 = analogRead (analogIn);
     if (valuepot5 != oldvaluepot5){
       valuepot5 = analogRead (analogIn);
       lcd.setCursor(0,0);
       lcd.print("Valeur Pot5");
       lcd.setCursor(0,1);
       lcd.print(valuepot5,DEC);
     }
   }
   oldvaluepot5 = (valuepot5);
   
   // enreg la valeur du potar 6 dans une variable
   if (count==5){
     valuepot6 = analogRead (analogIn);
     if (valuepot6 != oldvaluepot6){
       valuepot6 = analogRead (analogIn);
       lcd.setCursor(0,0);
       lcd.print("Valeur Pot6");
       lcd.setCursor(0,1);
       lcd.print(valuepot6,DEC);
     }
   }
   oldvaluepot6 = (valuepot6);
   
   // enreg la valeur du potar 7 dans une variable
   if (count==3){
     valuepot7 = analogRead (analogIn);
     if (valuepot7 != oldvaluepot7){
       valuepot7 = analogRead (analogIn);
       lcd.setCursor(0,0);
       lcd.print("Valeur Pot7");
       lcd.setCursor(0,1);
       lcd.print(valuepot7,DEC);
     }
   }
   oldvaluepot7 = (valuepot7);
   
   // enreg la valeur du potar 8 dans une variable
   if (count==7){
     valuepot8 = analogRead (analogIn);
     if (valuepot8 != oldvaluepot8){
       valuepot8 = analogRead (analogIn);
       lcd.setCursor(0,0);
       lcd.print("Valeur Pot8");
       lcd.setCursor(0,1);
       lcd.print(valuepot8,DEC);
     }
   }
   oldvaluepot8 = (valuepot8);
 }
}
     
   
 

karistouf

#4
Oct 03, 2010, 12:42 pm Last Edit: Oct 03, 2010, 12:43 pm by karistouf Reason: 1
passer par un tableau valeurpotard[8] et valeuroldpotard[8]
va te permettre d alleger ton code, plutot que de mettre plein de IF qui vont ralentir ton processeur ET peut etre generer des erreurs de ocdes ( parentheses et accolades sont responsables de la plus part des bugs)

Code: [Select]

for(int i=0;i<8;i++)
{
if(valeurpotard[i]!=valeuroldpotard[i])
{
//blablablabla

}
lcd.setCursor(0+(10*i),0);//affichage déclaé par rapport au numero de boucle
      lcd.print("Valeur Pot %d",i);
      lcd.setCursor(0+(10*i),1);
      lcd.print(valeurpotard[i],DEC);
}

Monstercrunch

Dis, le logiciel que tu utilises il émule quoi exactement ? est il possible de me dire où l'on peut se le procurer ?

A+

Hexa Emails

je me permets de répondre car j'ai utilisé ce logiciel en Sciences de l'Ingénieur: il s'agit de protéus isis ares: on l'a utilisé pour simuler des circuits électroniques/électrotechniques, il a une énorme bibliothèque de composants.
J'apprends tous les jours!

Go Up