Aller au contenu


Photo
- - - - -

Probleme code arduino


  • Veuillez vous connecter pour répondre
5 réponses à ce sujet

#1 dydyouaki

dydyouaki

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 792 messages
  • Gender:Male

Posté 05 août 2013 - 09:31

Salut ,

J'essaie de réaliser un Vu-mètre a l'aide d'une photo-résistance et 10 leds. Donc plus il y a de lumière plus les leds s'allument et moins il y a de lumière et moins les leds s'allument.

Maintenant j'ai une bonne partie du code , mais je n'arrive pas a programmer void loop. Je n'arrive pas a faire en sorte que quand le capteur détecte la lumiere il allume les leds petit a petit etque quand moins il y a de lumière les leds s'éteignent petit a petit.

Voila le code
int photocellPin = 0;     // the cell and 10K pulldown are connected to a0
int photocellReading;     // the analog reading from the sensor divider
const int ledCount = 10;  
int ledPins[] = { 
  2, 3, 4, 5, 6, 7,8,9,10,11 };  

int LEDbrightness;        // 
void setup(void) {
  // We'll send debugging information via the Serial monitor
  Serial.begin(9600);   
}
 
void loop(void) {
  photocellReading = analogRead(photocellPin);  
 
  Serial.print("Analog reading = ");
  Serial.println(photocellReading);     // the raw analog reading
 
  // LED gets brighter the darker it is at the sensor
  // that means we have to -invert- the reading from 0-1023 back to 1023-0
  photocellReading = 1023 - photocellReading;
  //now we have to map 0-1023 to 0-255 since thats the range analogWrite uses
  LEDbrightness = map(photocellReading, 0, 1023, 0, 255);
  analogWrite(ledCount , LEDbrightness);
 
  delay(100);
}

Merci a tous
Cordialement Dylan.

#2 ChristianR

ChristianR

    Membre passionné

  • Membres
  • PipPipPip
  • 474 messages
  • Gender:Male
  • Location:Isère (38)

Posté 05 août 2013 - 10:15

Tu as fait l'essentiel.

Au début tu rajoutes ça :
//Mettre les 10 pins des Leds en sorties (pins n°2 à 11 inclus)
for (int i=2; i <= 11; i++){
  pinMode(i, OUTPUT); //met cette broche en sortie 
} 

Ta variable photocellReading mesure analogiquement la lumière sur une échelle de 0 à 1023.
Il faut recaler cette mesure sur la plage 0-9 pour tes 10 leds :
nombre_LED = map(photocellReading, 0, 1023, 0, 9);
Ca te donne combien de leds allumer (0 à 9).

Puis il faut allumer le nombre de leds qui correspond dans une boucle

for (int i=0; i <= nombre_LED; i++){
  digitalWrite(i+2,HIGH);  //i+2 car les pins vont de 2 à 11 et pas de 0-9
} 

Penser à éteindre les LEDS pour ré actualiser l'affichage suivant
Et voir si on veut que la led0 soit éclairée ou pas dans l'obscurité
Christian

#3 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 05 août 2013 - 10:58

Un LM3915 ( ou 3914) 10 led, 3 résistances une photorésistance et le tour est joué sans même avoir besoin de sortir du code et ça prend moins de place qu'une arduino ;)

Après bon c'est sur que si c'est uniquement pour apprendre à utiliser la arduino rien à redire ^^ mais si c'est pour disposer d'un vu mètre à led sur une quelconque application vaut mieux utiliser le LM3915 ;) et plus ça permet de limiter le nombre de patte de ta arduino utilisé pour le vu mètre à une seule patte en faisant un analogwrite au niveau de l'entrée du LM3915.

Je te montre un des truc que j'ai fais avec cette puce :

Fichier joint  2013-08-05 12.04.19.jpg   969,77 Ko   21 téléchargement(s)
(il y a un vu mètre et d'autres truc sur cette carte )

Bref juste pour te dire que ça marche très bien comme ça aussi ;)

Bonne continuation pour la suite !

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#4 dydyouaki

dydyouaki

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 792 messages
  • Gender:Male

Posté 05 août 2013 - 11:10

Merci a vous !
Mike : Oui pour apprendre l'arduino ;)

Christian :

Je n'ai pas réussis. Tu mets :
//Mettre les 10 pins des Leds en sorties (pins n°2 à 11 inclus)
for (int i=2; i <= 11; i++){
  pinMode(i, OUTPUT); //met cette broche en sortie 
} 
dans loop , au début. Ou alors dans setup ?

Et pour :
nombre_LED = map(photocellReading, 0, 1023, 0, 9);
nombre_LED représente quoi dans mon code ? j'ai tout essayer , ledCount , ledPins , LEDbrightness. Et ca marche pas.

En tout cas merci.
Et j'ai fais un code plus long , mais plus simple pour moi. Mais il y a trop de sensibilité.

#define NUMREADINGS 15 // raise this number to increase data smoothing

int senseLimit = 15; // raise this number to decrease sensitivity (up to 1023 max)
int probePin = A0; // analog 5
int val = 0; // reading from probePin

int LED1 = 11;  // connections
int LED2 = 10;  // to
int LED3 = 9;   // LED
int LED4 = 8;   // bargraph
int LED5 = 7;   // anodes
int LED6 = 6;   // with
int LED7 = 5;   // resistors
int LED8 = 4;   // in
int LED9 = 3;   // series
int LED10 = 2;  // 

// variables for smoothing

int readings[NUMREADINGS];                // the readings from the analog input
int index = 0;                            // the index of the current reading
int total = 0;                            // the running total
int average = 0;                          // final average of the probe reading


void setup() {

  pinMode(2, OUTPUT);  // specify LED bargraph outputs
  pinMode(3, OUTPUT); 
  pinMode(4, OUTPUT); 
  pinMode(5, OUTPUT); 
  pinMode(6, OUTPUT); 
  pinMode(7, OUTPUT); 
  pinMode(8, OUTPUT); 
  pinMode(9, OUTPUT); 
  pinMode(10, OUTPUT); 
  pinMode(11, OUTPUT); 

  Serial.begin(9600);  // initiate serial connection for debugging/etc

  for (int i = 0; i < NUMREADINGS; i++)
    readings[i] = 0;                      // initialize all the readings to 0
}

void loop() {

  val = analogRead(probePin);  // take a reading from the probe

  if(val >= 1){                // if the reading isn't zero, proceed

    val = constrain(val, 1, senseLimit);  // turn any reading higher than the senseLimit value into the senseLimit value
    val = map(val, 1, senseLimit, 1, 1023);  // remap the constrained value within a 1 to 1023 range

    total -= readings[index];               // subtract the last reading
    readings[index] = val; // read from the sensor
    total += readings[index];               // add the reading to the total
    index = (index + 1);                    // advance to the next index

    if (index >= NUMREADINGS)               // if we're at the end of the array...
      index = 0;                            // ...wrap around to the beginning

    average = total / NUMREADINGS;          // calculate the average


    if (average > 10){                // if the average is over 50 ...
      digitalWrite(LED1, HIGH);   // light the first LED
    }
    else{                         // and if it's not ...
      digitalWrite(LED1, LOW);
      
    }


    if (average > 50){               // and so on ...
      digitalWrite(LED2, HIGH);
    }
    else{
      digitalWrite(LED2, LOW);
    
    }

    if (average > 90){
      digitalWrite(LED3, HIGH);
    }
    else{
      digitalWrite(LED3, LOW);
         
    }

    if (average > 140){
      digitalWrite(LED4, HIGH);
    }
    else{
      digitalWrite(LED4, LOW);
            
    }

    if (average > 200){
      digitalWrite(LED5, HIGH);
    }
    else{
      digitalWrite(LED5, LOW);
            
    }

    if (average > 250){
      digitalWrite(LED6, HIGH);
    }
    else{
      digitalWrite(LED6, LOW);
           
    }

    if (average > 300){
      digitalWrite(LED7, HIGH);
    }
    else{
      digitalWrite(LED7, LOW);
           
    }

    if (average > 340){
      digitalWrite(LED8, HIGH);
    }
    else{
      digitalWrite(LED8, LOW);
          
    }

    if (average > 400){
      digitalWrite(LED9, HIGH);
    }
    else{
      digitalWrite(LED9, LOW);
         
    }

    if (average > 500){
      digitalWrite(LED10, HIGH);
    }
    else{
      digitalWrite(LED10, LOW);
           
    }


    Serial.println(val); // use output to aid in calibrating
  }
}

J'attend ta réponse Christian.
Merci a tous
Cordialement Dylan.

#5 ChristianR

ChristianR

    Membre passionné

  • Membres
  • PipPipPip
  • 474 messages
  • Gender:Male
  • Location:Isère (38)

Posté 05 août 2013 - 11:33

L'activation des broches pinMode(i, OUTPUT); se fait bien dans le Setup.
La boucle for permet de ne pas copier/coller 10 lignes similaires , c'est pour alléger l'écriture du code.

nombre_LED est le nombre de leds à allumer, (à définir de type INT), il est calculé à partir de la mesure photocellReading.
La fonction map permet de redistribuer des valeurs selon une autre échelle
http://arduino.cc/en/Reference/Map

La succession de tests if/else pourrait être écrite avec un seul Switch case si on veut optimiser le code
http://arduino.cc/fr/Main/Switchcase
Christian

#6 dydyouaki

dydyouaki

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 792 messages
  • Gender:Male

Posté 05 août 2013 - 11:41

L'activation des broches pinMode(i, OUTPUT); se fait bien dans le Setup.
La boucle for permet de ne pas copier/coller 10 lignes similaires , c'est pour alléger l'écriture du code.

nombre_LED est le nombre de leds à allumer, (à définir de type INT), il est calculé à partir de la mesure photocellReading.
La fonction map permet de redistribuer des valeurs selon une autre échelle
http://arduino.cc/en/Reference/Map

La succession de tests if/else pourrait être écrite avec un seul Switch case si on veut optimiser le code
http://arduino.cc/fr/Main/Switchcase


Merci christian
Merci a tous
Cordialement Dylan.




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users