Go Down

Topic: [Résolu] LDR - Afficheur 7 segments - Bouton - Moteur pas à pas (Read 1 time) previous topic - next topic

Uzuma

Bonsoir,

J'utilise actuellement deux photorésistances dont je fais la différence des valeurs que j'affiche ensuite sur un double afficheur sept segments afin qu'un utilisateur puisse décider d'agir ou non via deux boutons. Mon seul soucis c'est de pouvoir faire interagir mon afficheur avec l'action sur un des boutons. Quand j'appui sur un bouton pour faire déplacer le moteur et avec lui les LDRs, l'afficheur doit m'afficher les valeurs simultanément, en même temps que j'appui sur le bouton.
Mais le code que j'ai écris ne répond pas à mes attentes. Je ne sais pas si l'Arduino à lui tout seul peut me permettre de faire ça ou si c'est le code que j'ai mal écris.

Code: [Select]


// Variables pour la commutation des transistors
byte digit3 = 27; // Afficheur UD
byte digit4 = 28;
byte digit5 = 29;

byte sevenSegmentPins_UD[] = {40,41,42,43,44,45,46}; // Broches à utiliser par les afficheurs UD

// Tableau d'affichage
byte sevenSegment[11][7] =
{
  //a b c d e f g
  { 0,0,0,0,0,0,1 },  // = 0
  { 1,0,0,1,1,1,1 },  // = 1
  { 0,0,1,0,0,1,0 },  // = 2
  { 0,0,0,0,1,1,0 },  // = 3
  { 1,0,0,1,1,0,0 },  // = 4
  { 0,1,0,0,1,0,0 },  // = 5
  { 0,1,0,0,0,0,0 },  // = 6
  { 0,0,0,1,1,1,1 },  // = 7
  { 0,0,0,0,0,0,0 },  // = 8
  { 0,0,0,1,1,0,0 },  // = 9
  { 1,1,1,1,1,1,0 }   // = -
};

// Définition des broches du moteur 1 : Axe hoizontal
int motor1_pin1 = 4;
int motor1_pin2 = 5;
int motor1_pin3 = 6;
int motor1_pin4 = 7;

// Définition des broches des photorésistances
int LDR_Up = A2; // Haut
int LDR_Down = A3; // bas

// Déclaration des variables devant recevoir les valeurs des LDRs
int Val_LDR_Up = 0;
int Val_LDR_Down = 0;

// Variable pour stocker le résultat de la différence entre U et D
int dif_UD = 0;

// Déclaration des variables de temps
long temps;
int PAUSE = 500;
int A, B, C, D, E, F, G, H, I, J, Ent_UD, Mod_UD;
const int K = 11;

// Déclaration des variables d'étape
int Etape_H = 0;

// Variable de stockage d'état des boutons
int buttonState = 0;
int buttonState_UD1 = 0;
int buttonState_UD2 = 0;

// Les boutons de déplacement
int boutonPin_UD1 = 52;
int boutonPin_UD2 = 53;

void setup ()
{
  Serial.begin(9600);
 
  // Configuration en entrée des broches destinées aux ldrs
  pinMode(LDR_Up, INPUT);
  pinMode(LDR_Down, INPUT);
 
  // Configuration en sortie des pins moteur H
  pinMode(motor1_pin1, OUTPUT);
  pinMode(motor1_pin2, OUTPUT);
  pinMode(motor1_pin3, OUTPUT);
  pinMode(motor1_pin4, OUTPUT);
 
  // Mise à l'état haut des variables de stockage d'état
  buttonState_UD1 = HIGH; Bouton relaché
  buttonState_UD2 = HIGH;
 
 
  // Initialisation des boutons de déplacement
  pinMode(boutonPin_UD1, INPUT);
  pinMode(boutonPin_UD2, INPUT);
 
  // Configuration en sortie des broches destinées aux afficheurs
  for(int i=0; i<7; i++)
  {
    pinMode(sevenSegmentPins_UD[i], OUTPUT);
  }

  // Configuration en sortie des broches destinées aux transistors
   pinMode(digit3, OUTPUT); //pin 27
   pinMode(digit4, OUTPUT); //pin 28
   pinMode(digit5, OUTPUT); //pin 29



// Fonction d'affichage UD
void segmentWrite_UD(byte digit)
{
  byte pin = 40;
  for (byte i=0; i<7; ++i)
  {
    digitalWrite(pin, sevenSegment[digit][i]);
      ++pin;
  }
}

void loop()
{
    modeManuel();
}

void modeManuel()
{
  Val_LDR_Up = analogRead(LDR_Up);
  Val_LDR_Down = analogRead(LDR_Down);

  dif_UD = (Val_LDR_Up -  Val_LDR_Down);
 
  AffichageUD(dif_UD);
 
  buttonState_UD1 = digitalRead(boutonPin_UD1);
  buttonState_UD2 = digitalRead(boutonPin_UD2);
 
  while(buttonState_UD1 == LOW) // tant que le bouton UD1 est appuyé ...
  {   
    Val_LDR_Up = analogRead(LDR_Up);
    Val_LDR_Down = analogRead(LDR_Down);
    dif_UD = (Val_LDR_Up -  Val_LDR_Down);
   
    AffichageUD(dif_UD);
    Bouge_H(1);
   
    buttonState_UD1 = digitalRead(boutonPin_UD1); // Vérifie l'état du bouton UD1
  }
 
 
    while(buttonState_UD2 == LOW) // tant que le bouton UD2 est appuyé ...
  {   
    Val_LDR_Left = analogRead(LDR_Left);  // lit la valeur des ldrs
    Val_LDR_Right = analogRead(LDR_Right);
    Val_LDR_Up = analogRead(LDR_Up);
    Val_LDR_Down = analogRead(LDR_Down);
    dif_UD = (Val_LDR_Up -  Val_LDR_Down);
   
    AffichageUD(dif_UD);
    Bouge_H(-1);
   
    buttonState_UD2 = digitalRead(boutonPin_UD2); // Vérifie l'état du bouton UD2
  }
}


void Bouge_H(long Pas){

  if(Pas>0){
    for(int y=0;y<Pas;y++){
      Etape_H++;
      if(Etape_H>4) Etape_H=1;
      FaireUnPasH();
    }
  }

  if(Pas<0){
    for(int x=0;x<(-Pas);x++){
      Etape_H--;
      if(Etape_H<1) Etape_H=4;
      FaireUnPasH();
    }
  }
}

void AffichageUD(int dif_UD)
{
  if(dif_UD <100)
  {
  F = dif_UD/10;
  Ent_UD = int (F);
  Mod_UD = 0;
  }
 
  if(dif_UD>=100)
  {
    G = dif_UD/10;
    H = int(B);
    I = C%10;
    Ent_UD = int(I);
    J = C/10;
    Mod_UD = int(J);
  }
 
  int t2 = 50;
 
  while(t2>0)
  {
  t2 = t2 - 10;
  digitalWrite(digit5, HIGH);
  segmentWrite_UD(Ent_UD);         
  digitalWrite(digit4, LOW);
  digitalWrite(digit3, LOW);
  delay(10);
  digitalWrite(digit4, HIGH);
  segmentWrite_UD(Mod_UD);         
  digitalWrite(digit3, LOW);
  digitalWrite(digit5, LOW);
  delay(10);
  }
}// Fin de void AffichageUD


void FaireUnPasH(){

  switch(Etape_H) {

  case 1:
    digitalWrite(4,HIGH);
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);   
    digitalWrite(7,LOW);
    break;

  case 2:
    digitalWrite(4,LOW);
    digitalWrite(5,HIGH);
    digitalWrite(6,LOW);   
    digitalWrite(7,LOW);
    break;

  case 3:
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    digitalWrite(6,HIGH);   
    digitalWrite(7,LOW);
    break;

  case 4:
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);   
    digitalWrite(7,HIGH);
    break;

  }
  delay(PAUSE);
}// Fin de void FaireUnPasH


john_lenfr

Je pense qu'il faut que tu détailles plus ce que tu veux car ce n'est pas très clair, pour moi en tout cas.
Peut être une photo de l'installation nous aiderait à mieux comprendre?

Uzuma

#2
Apr 23, 2014, 05:41 pm Last Edit: Apr 23, 2014, 06:00 pm by Uzuma Reason: 1
- J'ai deux photorésistances que j'ai monté parallèlement sur un panneau.
- Ce panneau est actionné par un moteur pas à pas lorsque l'on appui sur un bouton.
- Je recueille les valeurs renvoyées par les deux photorésistances et ensuite je fais la différence que je stock dans une variable "dif_UD".
- J'affiche ensuite le résultat de cette différence sur un double afficheur.
- Maintenant que l'utilisateur a prit connaissance de cette différence il peut décider d'agir en appuyant sur un des deux boutons pour positionner le panneau correctement.

- Lorsque l'utilisateur va appuyé sur un bouton pour positionner le panneau correctement (en fonction de l'affichage) il est tout à fait évident que la différence "dif_UD" va varier aussi. C'est donc cela mon problème, j'aimerais que l'action sur le bouton (qui fait déplacer le panneau) et l'affichage de la différence "dif_UD" soit simultanée.

Par exemple sur une alimentation stabilisée, la valeur de la tension de sortie est affichée sur des afficheurs 7 segments et lorsque l'utilisateur décide d'augmenter cette tension, les afficheurs nous affiches en temps réel (simultanément) les nouveaux niveaux de tension en même temps que nous faisons varier le potentiomètre.

S'il vous plaît (pour ne pas dire aidez-moi svp), j'ai vraiment besoin de votre savoir faire en la matière. Merci de le mettre à contribution.

M_bot

Salut,

apparemment les gens ont pas envie de mettre leur savoir faire à contribution.  :smiley-mr-green:

Uzuma

Je ne sais pas si j'explique mal mais je pense avoir été assez explicite.

B83s

Salut,

A ce que j'ai pu lire dans ton programme ... l'affichage devrait suivre quand tu appuies et que le moteur bouge d'un pas ...

Cependant tu as introduit une pause de 500 ms dans ta fonction faire un pas ... C'est peut être trop long ? (Si ton moteur as 200 pas par tour, il faut 100 s pour lui faire faire un tour ...)

Uzuma

#6
Apr 23, 2014, 11:15 pm Last Edit: Apr 26, 2014, 01:30 am by Uzuma Reason: 1

Salut,
A ce que j'ai pu lire dans ton programme ... l'affichage devrait suivre quand tu appuies et que le moteur bouge d'un pas ...


Oui exactement, une action simultanée. J'ai carrément viré le "delay(PAUSE)" après avoir essayé "delay(100) et constaté une amélioration. Problème résolu. Merci pour ton aide. +1

Go Up