Variable texte

Bonjour à tous,

Je suis débutant sur Arduino. mon premier test est de faire un détecteur de luminosité avec un affichage d'une phase.

mais dans mon code l'utilisation d'un tableau ne fonctionne pas bien.

// déclaration des broches utilisées
const char led = 2;                                   // Une LED pour indiquer s'il fait jour
const char capteur = 0;                               // Broche A0 sur laquelle va être connecté le pont diviseur de tension

// Variable
float tension = 0;                                    // variable qui va enregistrer la tension lue en sortie du capteur
float seuilObscurite = 2.5;                           // valeur en V, seuil qui détermine le niveau auquel l'obscurité est présente
char EtatLedText[] = 
    "Led allumée"
    "Led éteint";
int EtatLedBit = 0;

void setup()
  {
      // définition des broches utilisées
      pinMode(led, OUTPUT);
  
      Serial.begin(9600);                             // la voie série pour monitorer
  }

void loop()
  {
      tension = (analogRead(capteur) * 5.0) / 1024;  // conversion de cette valeur en tension
  
      if(tension >= seuilObscurite)
        {
            digitalWrite(led, LOW);                 // On allume la LED
            EtatLedBit = 1;
        }
      else
        {
            digitalWrite(led, HIGH);                // On éteint la LED
            EtatLedBit = 2;
        }

      // envoie vers l'ordinateur, via la liaison série, la valeur de la tension lue
      Serial.print("Tension = ");
      Serial.print(tension);
      Serial.println(" V");
      // envoie vers l'ordinateur, via la liaison série, la valeur de la tension lue
      Serial.print(" -> ");
      Serial.print("Led = ");
      Serial.print(EtatLedBit);
      Serial.print(" ");
      Serial.println(EtatLedText[EtatLedBit]);


      delay(5000);  // délai pour ne prendre des mesures que toutes 5 secondes
  }

voici le message que je voulais afficher

char EtatLedText[] = 
    "Led allumée"
    "Led éteint";
EtatLedBit = 2;
Serial.println(EtatLedText[EtatLedBit])

mais j'ai une lettre (d pour le "2" et e pour le "1" a la place de la correspondance du la phase

EtatLedBit = 2;
Serial.print(EtatLedBit);

je tourne en rond depuis hier soir... :confused: :confused: :confused:

merci de votre aide

mauvaise section, déjà une erreur ;)

Bonjour,

Dans ton programme tu déclares une chaine de caractères simple. Pour déclarer un tableau de chaines, la syntaxe est la suivante:

char * EtatLedText[] = 
{
   "Led allumée",
   "Led éteint"
};

essayez cela - j'ai mis des commentaires, mais regardez les références pour:

  • comment déclarer un tableau
  • les indices des tableaux commencent à 0
  • n'oubliez pas que l'ASCII de base n'a pas d'accents
  • d'un point de vue cohérence, vaut mieux utiliser byte pour les PINs que char car vous ne représentez pas un caractère

  • je me suis permis de modifier un peu le code pour ne pas travailler avec des nombres flottants qui prennent plus de place en mémoire et rester à faire des maths en nombre entiers (au lieu de convertir la tension en Volts autant conserver le nombre entier que vous lisez et comparer avec 512 pour avoir par exemple 2.5V). vous avez des pertes de précisions avec les nombres flottants et les calculs sont bcp plus lents. Je ne convertis donc qu'à l'affichage.

// déclaration des broches utilisées
const byte ledPin = 2;                                   // Une LED pour indiquer s'il fait jour
const byte capteurPin = 0;                               // Broche A0 sur laquelle va être connecté le pont diviseur de tension

// Variable
int tension = 0;          // variable qui va enregistrer la tension lue en sortie du capteur
int seuilObscurite = 512; // valeur entre 0 et 1023, seuil qui détermine le niveau auquel l'obscurité est présente
const char * EtatLedText[] = {"Led allumee", "Led eteinte"}; // les index de tableau commencent à 0. pas d'accents
int EtatLedBit = 0;

void setup()
{
  // définition des broches utilisées
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);                             // la voie série pour monitorer
}

void loop()
{
  tension = analogRead(capteurPin) ;  // conversion de cette valeur en tension

  if (tension >= seuilObscurite)
  {
    digitalWrite(ledPin, HIGH);     // On allume la LED
    EtatLedBit = 0;                 // index dans le tableau
  }
  else
  {
    digitalWrite(ledPin, LOW);      // On éteint la LED
    EtatLedBit = 1;                 // index dans le tableau
  }

  // envoie vers l'ordinateur, via la liaison série, la valeur de la tension lue
  Serial.print("Tension = ");
  Serial.print(((float) tension * 5.0) / 1023.0, 2); // on calcule en volts, imprimé avec 2 chiffres de précision
  Serial.println(" V");
  Serial.print(" -> ");
  Serial.print("Led = ");
  Serial.print(EtatLedBit);
  Serial.print(" -> ");
  Serial.println(EtatLedText[EtatLedBit]);

  delay(5000);  // délai pour ne prendre des mesures que toutes 5 secondes
}

Merci de vos réponse

[u]@infobarquee :[/u]

mauvaise section, déjà une erreur ;)

ok, je previen l'administrateur pour deplacer. merci

[u]@kamill :[/u] merci :confused: , je suis passé trop vite sur la section tableau, on dirait...

[u]@J-M-L :[/u] Merci de vos modifications,

  • je me suis permis de modifier un peu le code pour ne pas travailler avec des nombres flottants qui prennent plus de place en mémoire et rester à faire des maths en nombre entiers (au lieu de convertir la tension en Volts autant conserver le nombre entier que vous lisez et comparer avec 512 pour avoir par exemple 2.5V). vous avez des pertes de précisions avec les nombres flottants et les calculs sont bcp plus lents. Je ne convertis donc qu'à l'affichage.

J’avoue, que limiter les calculs serais mieux.

  • les indices des tableaux commencent à 0

j'ai eu se doute, mais comme je n'avais que "e" ou "d", je ne suis allé plus loin.

  • n'oubliez pas que l'ASCII de base n'a pas d'accents

Je suis d'accord, mais mon souci n’étant pas là, je l'avais laissé. :-[

Vous aviez aussi inversé HIGH et LOW pour allumer ou éteindre les LEDs