comment donner une phrase reponse au resultat d'un capteur

Bonjour,

je suis en T°STI2D (SIN) et pour mon projet de fin d'année, parmi mes differentes problematiques. je dois donner le pourcentage de batterie restant. j'ai rechercher un peu sur internet et j'ai compris qu'il fallait utiliser un pont diviseur de tension afin dabaisser la tension de la batterie de 12V à ``5V. mais le probléme est que lorsque je fait la compilation,j'ai beau changer la tension sa reste bloquer sur 100% :frowning:

unsigned int mesure;
float tension;
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
{
  mesure = analogRead(0);
  tension = mesure * 5.0 / 1023 ;
  Serial.print(tension);
  delay(500);

}
if (4.10<tension<4.21)
{
  Serial.println ("90%");
}
else if (3.97<tension<4.10)
{
  Serial.println ("80%");
}
else if (3.92<tension<3.97)
{
  Serial.println ("70%");
}
else if (3.87<tension<3.92)
{
  Serial.println ("60%");
}
else if (3.83<tension<3.87)
{
  Serial.println ("50%");
}
else if (3.79<tension<3.83)
{
  Serial.println ("40%");
}
else if (3.75<tension<3.79)
{
  Serial.println ("30%");
}
else if (3.10<tension<3.75)
{
  Serial.println ("20%");
}
else 
{
Serial.print ("batterie faible");
}
}

Merci d'avance

Ce genre de test if (4.10 < tension < 4.21)ne fait pas ce que vous croyez... d'ailleurs si vous activez les warnings le compilateur devrait vous dire

</sub> <sub>[color=orange].../sketch_feb11a.ino:18:12: warning: comparisons like 'X<=Y<=Z' do not have their mathematical meaning [-Wparentheses]   if (4.10 < tension < 4.21)[/color]</sub> <sub>

il faut séparer le test en 2 parties, (4.10 < tension) [b][color=red]&&[/color][/b] (tension < 4.21)

l'opérateur && est le ET logique.

Le rapport avec le titre du sujet ?

jfs:
Le rapport avec le titre du sujet ?

ben il voulait afficher du texte en fonction de la valeur analogique lue... :slight_smile:

plutot que d'utiliser des if à la suite, une chose plus simple pour afficher le pourcentage :
fonction map

mesure = analogRead(0);
  tension = mesure * 5.0 / 1023 ;
pourcent = map(tension,0,4.21,0,100);
Serial.print(pourcent);
Serial.println("%");

Bonjour a tous,
J'ai essayé la première méthode de J-M-L, je ne sais pas pourquoi mais sa m'affiche une erreur a chaque ligne " expected identifier before '(' token "
merci d'avance

unsigned int mesure;
float tension;
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
{
  mesure = analogRead(0);
  tension = mesure * 5.0 / 1023 ;
  Serial.print(tension);
  delay(500);

}
if (4.10<tension)&&(tension<4.21)
{
  Serial.println ("90%");
}
else if (3.97<tension)&&(tension<4.10)
{
  Serial.println ("80%");
}
else if (3.92<tension)&&(tension<3.97)
{
  Serial.println ("70%");
}
else if (3.87<tension)&&(tension<3.92)
{
  Serial.println ("60%");
}
else if (3.83<tension)&&(tension<3.87)
{
  Serial.println ("50%");
}
else if (3.79<tension)&&(tension<3.83)
{
  Serial.println ("40%");
}
else if (3.75<tension)&&(tension<3.79)
{
  Serial.println ("30%");
}
else if (3.10<tension)&&(tension<3.74)
{
  Serial.println ("20%");
}
else 
{
Serial.print ("batterie faible");
}
}

et pour la deuxième méthode de infobarquee qui est beaucoup plus simple ( je te remercie ^^). J'ai deux questions.
La première,peut tu m'explique brièvement ce que signifie la partie que tu m'as passé stp
et la deuxième pourquoi sa m'affiche 125% lorsque je met sur 5 v
Cordialement

Syntaxe : il manque une paire de parenthèses dans tes tests :

if ( (4.10<tension)&&(tension<4.21) )

Syntaxe:Les parenthèses internes ne servent à rien

if ( 4.10<tension && tension<4.21  )

Sémantique : certaines valeurs passeront à travers tous les tests (si tension vaut exactement 4.10, par exemple). Ecrire :

if ( 4.10<=tension && tension<4.21  )
...
else if ( 3.97<=tension && tension<4.10 )
...

Noter le "inférieur ou égal" à la place du "inférieur strict"

merci beaucoup

j'ai une autre question je dois faire sonner un buzzer et faire clignoter une LED lorsque la batterie sera faible .Lorsque la batterie est faible cela fonctionne très mais lorsque le pourcentage de batterie augment le buzzer sonne toujours et la LED ne s’éteint pas pouvez vous m'aidez svp :slight_smile:

unsigned int mesure;
float tension;
const int Buzzer = 10; //declaration constante de broche
int i = 0, j = 0, k = 0; // variables de boucle


void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(Buzzer, OUTPUT);
 pinMode(8, OUTPUT); 
}



void loop() {
  // put your main code here, to run repeatedly:
{
  mesure = analogRead(0);
  tension = mesure * 5.0 / 1023 ;
  delay(500);

}
if ((5.00>=tension)&&(tension>4.21))
{
  Serial.println ("100%");
  digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
  
  }
else if ((4.10<tension)&&(tension<=4.21))
{
  Serial.println ("90%");
  digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
}
else if ((3.97<tension)&&(tension<=4.10))
{
  Serial.println("80%");
  digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
}
else if ((3.92<tension)&&(tension<=3.97))
{
  Serial.println ("70%");
   digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
}
else if ((3.87<tension)&&(tension<=3.92))
{
  Serial.println ("60%");
 digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
}
else if ((3.83<tension)&&(tension<=3.87))
{
  Serial.println ("50%");
  digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
}
else if ((3.79<tension)&&(tension<=3.83))
{
  Serial.println ("40%");
  digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
}
else if ((3.75<tension)&&(tension<=3.79))
{
  Serial.println ("30%");
  digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
}
else if ((3.10<tension)&&(tension<=3.75))
{
  Serial.println ("20%");
   digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
}
else if((3.10>tension))
{
Serial.println ("batterie faible");
digitalWrite(8, HIGH);   // allume la LED
  delay(1000);              // ne fait rien pendant 1 seconde
  digitalWrite(13, LOW);    // éteint la LED
  delay(1000);  

    for (i = 500; i < 1000; i++) {
      tone(Buzzer, i);
      delay(1);
    } // fin boucle for

    for (i = 1000; i > 500; i--) {
      tone(Buzzer, i);
      delay(1);
    } // fin boucle for   
  }
  }

Indentez le code et virez les accolades inutiles - c’est trop penible à lire

Bonjour,

else if ((4.10<tension)&&(tension<=4.21))

Le test est dans le mauvais sens, de plus la deuxième condition ne sert à rien car si le premier est vrai, le deuxième le sera forcément.

Dans un cas comme ça il n'y a pas besoin de deux conditions par test, il suffit de bien analyser le problème.

  if (tension > 4.80)
  {
    Serial.println ("100%");
  }
  else if (tension > 4.21)
  {
    Serial.println ("90%");
  }
  else if (tension > 4.10)
  {
    Serial.println ("80%");
  }
  else if (tension > 3.97)
  {
    Serial.println ("70%");
  }
  else if (tension > 3.92)
  {
    Serial.println ("60%");
  }
  else if (tension > 3.87)
  {
    Serial.println ("50%");
  }
  else if (tension > 3.83)
  {
    Serial.println ("40%");
  }
  else if (tension > 3.79)
  {
    Serial.println ("30%");
  }
  else if (tension > 3.74)
  {
    Serial.println ("20%");
  }
  else
  {
    Serial.print ("batterie faible");
  }

Bonjour,merci pour vos réponses je tâcherai d’y faire attention ^^
Mais cela ne répond pas à ma question (qui consisté à arrêter le buzzer et la led lorsque la batterie n’est plus faible )
J-M-L je ne vois pas de quel accolades inutile vous parlez :-(,sachant que si je les enlève les
« if » et « else if » ne fonctionne plus.
Cordialement.

par exemple celles du début de la loop mais c’est l’indentation qui pêche...

Faites comme dit Kamill ce sera 100 fois plus lisible

c'est vrai que c'est beaucoup mieux comme sa, je vous remercie ^^
j'ai réussi a éteindre la led lorsque la batterie n'est plus faible, mais rien a faire pour le buzzer, il sonne toujours même quand la batterie est a 100%. :frowning:
Merci d'avance.

Postez le nouveau code (indenté)

voici le code en question

unsigned int mesure;
float tension;
const int Buzzer = 10; //declaration constante de broche
int i = 0, j = 0, k = 0; // variables de boucle


void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(Buzzer, OUTPUT);
 pinMode(13, OUTPUT); 
}



void loop() {
  // put your main code here, to run repeatedly:

  mesure = analogRead(0);
  tension = mesure * 5.0 / 1023 ;
  delay(500);

  Serial.print (tension);
    Serial.print ("   ");


if (tension >4.21)
  {
    Serial.println ("100%");
    digitalWrite(8, LOW);    // éteint la LED
(i=0);
  
  }
  else if (tension > 4.10)
  {
    Serial.println ("90%");
    digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
  
  }
  else if (tension > 3.97)
  {
    Serial.println ("80%");
    digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
  
  }
  else if (tension > 3.92)
  {
    Serial.println ("70%");
    digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
  
  }
  else if (tension > 3.87)
  {
    Serial.println ("60%");
    digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
  
  }
  else if (tension > 3.83)
  {
    Serial.println ("50%");
    digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
  
  }
  else if (tension > 3.79)
  {
    Serial.println ("40%");
    digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
  
  }
  else if (tension > 3.75)
  {
    Serial.println ("30%");
    digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
  
  }
  else if (tension > 3.10)
  {
    Serial.println ("20%");
    digitalWrite(13, LOW);    // éteint la LED
  digitalWrite(Buzzer, LOW);
  
  }
  else
  {
    Serial.println ("batterie faible");
    digitalWrite(13, HIGH);   // allume la LED
  delay(500);              // ne fait rien pendant 1 seconde
  digitalWrite(13, LOW);    // éteint la LED
  delay(500);  

    for (i = 500; i < 1000; i++) {
      tone(Buzzer, i);
      delay(1);
    } // fin boucle for

    for (i = 1000; i > 500; i--) {
      tone(Buzzer, i);
      delay(1);
    }
  }
  }

Merci

A la place de digitalWrite(Buzzer, LOW);
il faut mettre noTone(Buzzer);pour arrêter le buzzer.

MERCI BEAUCOUP !!!!!