Arduino et Sonde lambda. Bug Programmation.

Arduino et Sonde lambda. Bug Programmation.

Message non lude sindu29 » Lun 25 Mar 2013 13:55

Salut tout le monde, j'ai un bug dans mon programme.
Celui ci a pour but de récupérer la valeur de tension d'une sonde à oxygène : 0-5V et de retranscrire cette tension en valeur lambda air / essence. J'ai affecté des valeurs de tension à une valeur Lambda.

Voici les premières esquisses de mon code. En théorie il devrait m'afficher le message sur le port série de mon arduino UNO. Le probleme c'est qu'il affiche le message que pour les valeurs de tension inférieur a 45mV.
J'ai effectué des tests avec un potentiomètre afin d'avoir des valeurs de tension.



// These constants won't change. They're used to give names
// to the pins used:
const int analogInPin = A0; // Analog input pin that the potentiometer is attached to
const int analogOutPin = 9; // Analog output pin

int sensorValue = 0; // value read from the pot
int outputValue = 0; // value output to the PWM (analog out)

void setup()
{
// initialize serial communications at 9600 bps:
Serial.begin(9600);
}

void loop() {
// read the analog in value:
sensorValue = analogRead(analogInPin);
// map it to the range of the analog out:
outputValue = map(sensorValue, 0, 1023, 0, 1023);


// change the analog out value:

switch (1,11) // sélection du cas en fonction de la valeur de sortie
{
case 1:
if(945 < outputValue) // Si outputValue est supérieur a 945
Serial.print("Facteur Lambda = 0.8 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 2:
if(900 < outputValue < 945) // Si outputValue est entre : 900 et 945
Serial.print("Facteur Lambda = 0.85 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 3:
if(855 < outputValue < 900) // Si outputValue est entre : 855 et 900
Serial.print("Facteur Lambda = 0.9 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 4:
if(810 < outputValue < 855) // Si outputValue est entre : 810 et 855
Serial.print("Facteur Lambda = 0.93 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 5:
if(540 < outputValue < 810) // Si outputValue est entre : 540 et 810
Serial.print("Facteur Lambda = 0.97 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 6:
if(255 < outputValue < 540) // Si outputValue est entre : 255 et 540
Serial.print("Facteur Lambda = 0.98 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 7:
if(180 < outputValue < 225) // Si outputValue est entre : 180 et 225
Serial.print("Facteur Lambda = 1.0 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 8:
if(135 < outputValue < 180) // Si outputValue est entre : 135 et 180
Serial.print("Facteur Lambda = 1.02 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 9:
if(90 < outputValue < 135) // Si outputValue est entre : 90 et 135
Serial.print("Facteur Lambda = 1.04 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 10:
if(45 < outputValue < 90) // Si outputValue est entre : 45 et 90
Serial.print("Facteur Lambda = 1.15 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 11:
if(outputValue < 45) // Si outputValue inférieur à 45
Serial.print("Facteur Lambda = 1.25 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.
}

// wait 2 milliseconds before the next loop
// for the analog-to-digital converter to settle
// after the last reading:
delay(200);
}


Si vous avez des questions, des pistes, ou des solutions à me proposé, je suis preneur. Ce projet est à faire dans le cadre scolaire.
En ligne
sindu29
 
Messages: 4
Inscription: Lun 11 Fév 2013 14:35

Re: Arduino et Sonde lambda. Bug Programmation.

Message non lude phil » Lun 25 Mar 2013 16:45

bonjour,

je n'ai pas exactement compris ce que tu veux faire mais a mon avis il y a un problème de syntaxe dans ton switch/case
http://arduino.cc/en/Reference/SwitchCase

en effet normalement, il y a tout d'abord un switch(variable) puis des case avec les differentes valeurs possible.

De plus, je ne comprend pas bien ce que tu veux faire avec la ligne suivante :
Code: Tout sélectionner
outputValue = map(sensorValue, 0, 1023, 0, 1023);

Avec ça tu demandes de mapper entre 0 et 1023 une valeur qui varie entre 0 et 1023. Autant dire qu'il ne se passe rien...

A mon avis tu cherches à faire plutôt çà
Code: Tout sélectionner
// These constants won't change. They're used to give names
// to the pins used:
const int analogInPin = A0; // Analog input pin that the potentiometer is attached to
const int analogOutPin = 9; // Analog output pin

int sensorValue = 0; // value read from the pot
int outputValue = 0; // value output to the PWM (analog out)

void setup()
{
// initialize serial communications at 9600 bps:
Serial.begin(9600);
}

void loop() {
// read the analog in value:
sensorValue = analogRead(analogInPin);
// map it to the range of the analog out:
outputValue = map(sensorValue, 0, 1023, 11, 0); //quand sensorvalue vaut 0 outputvalue vaut 11, quand sensorvalue vaut 200 outputvalue vaut 2...


// change the analog out value:

switch (outputValue) // sélection du cas en fonction de la valeur de sortie
{
case 1:
Serial.print("Facteur Lambda = 0.8 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 2:
Serial.print("Facteur Lambda = 0.85 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 3:
Serial.print("Facteur Lambda = 0.9 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 4:
Serial.print("Facteur Lambda = 0.93 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 5:
Serial.print("Facteur Lambda = 0.97 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 6:
Serial.print("Facteur Lambda = 0.98 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 7:
Serial.print("Facteur Lambda = 1.0 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 8:
Serial.print("Facteur Lambda = 1.02 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 9:
Serial.print("Facteur Lambda = 1.04 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 10:
Serial.print("Facteur Lambda = 1.15 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

case 11:
Serial.print("Facteur Lambda = 1.25 car la tention vaut (mV): "); // Afficher le méssage suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.
}

// wait 2 milliseconds before the next loop
// for the analog-to-digital converter to settle
// after the last reading:
delay(200);
}


J'ai pas fait le cas ou outputValue vaut 0 mais je pense que tu pourras faire la modif toi meme ;)
Bon courage et bon bricolage
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: Arduino et Sonde lambda. Bug Programmation.

Message non lude sindu29 » Ven 29 Mar 2013 10:32

Salut,
j'ai essayé le programme que tu m'as donné. Il ne s'applique pas à ce que je veux faire.
Je m'explique, en effet, je veux affecter un message en fonction de la valeur OutputValue. Lorsque cette valeur est au dessus de 945, le message est dans la situation 'case 1'. Lorsque la valeur d'OutputValue est située entre 900 et 945, le message est le 'Case 2'... Je me demande si la fonction switch est la plus adaptée. Un conseil ? une idée ?

Merci de m'aider ^^
sindu29
 
Messages: 4
Inscription: Lun 11 Fév 2013 14:35

Re: Arduino et Sonde lambda. Bug Programmation.

Message non lude Bemolu » Sam 30 Mar 2013 10:23

sindu29 a écrit:Salut,
j'ai essayé le programme que tu m'as donné. Il ne s'applique pas à ce que je veux faire.
Je m'explique, en effet, je veux affecter un message en fonction de la valeur OutputValue. Lorsque cette valeur est au dessus de 945, le message est dans la situation 'case 1'. Lorsque la valeur d'OutputValue est située entre 900 et 945, le message est le 'Case 2'... Je me demande si la fonction switch est la plus adaptée. Un conseil ? une idée ?


Je pense que la proposition de Phil est la bonne, mais au lieu de
Code: Tout sélectionner
Serial.print("Facteur Lambda = 0.85 car la tention vaut (mV): "); // Afficher le message suivant.
Serial.println(outputValue); // Afficher la valeur de sortie.

Ecris plutôt
Code: Tout sélectionner
Serial.print("Facteur Lambda = 0.85 car la tention vaut (mV): "); // Afficher le message suivant.
Serial.println(sensorValue); // Afficher la valeur de sortie.
break;

A faire pour chaque valeur

A mon avis il faudra aussi changer le 'map'
Bemolu
 
Messages: 63
Inscription: Mer 8 Fév 2012 21:19

Re: Arduino et Sonde lambda. Bug Programmation.

Message non lude phil » Sam 30 Mar 2013 22:13

Oups je viens de me rendre compte que j'avais zappé les break; dans mon précédent code...

Voici une version plus "juste"

Code: Tout sélectionner
    // These constants won't change. They're used to give names
    // to the pins used:
    const int analogInPin = A0; // Analog input pin that the potentiometer is attached to
    const int analogOutPin = 9; // Analog output pin

    int sensorValue = 0; // value read from the pot
    int outputValue = 0; // value output to the PWM (analog out)

    void setup()
    {
    // initialize serial communications at 9600 bps:
    Serial.begin(9600);
    }

    void loop() {
    // read the analog in value:
    sensorValue = analogRead(analogInPin);
    // map it to the range of the analog out:
    outputValue = map(sensorValue, 0, 1023, 11, 0); //quand sensorvalue vaut 0 outputvalue vaut 11, quand sensorvalue vaut 200 outputvalue vaut 2...


    // change the analog out value:

    switch (outputValue) // sélection du cas en fonction de la valeur de sortie
    {
    case 1:
    Serial.print("Facteur Lambda = 0.8 car la tention vaut (mV): "); // Afficher le méssage suivant.
    Serial.println(outputValue); // Afficher la valeur de sortie.
    break;

    case 2:
    Serial.print("Facteur Lambda = 0.85 car la tention vaut (mV): "); // Afficher le méssage suivant.
    Serial.println(outputValue); // Afficher la valeur de sortie.
    break;

    case 3:
    Serial.print("Facteur Lambda = 0.9 car la tention vaut (mV): "); // Afficher le méssage suivant.
    Serial.println(outputValue); // Afficher la valeur de sortie.
    break;

    case 4:
    Serial.print("Facteur Lambda = 0.93 car la tention vaut (mV): "); // Afficher le méssage suivant.
    Serial.println(outputValue); // Afficher la valeur de sortie.
    break;

    case 5:
    Serial.print("Facteur Lambda = 0.97 car la tention vaut (mV): "); // Afficher le méssage suivant.
    Serial.println(outputValue); // Afficher la valeur de sortie.
    break;

    case 6:
    Serial.print("Facteur Lambda = 0.98 car la tention vaut (mV): "); // Afficher le méssage suivant.
    Serial.println(outputValue); // Afficher la valeur de sortie.
    break;

    case 7:
    Serial.print("Facteur Lambda = 1.0 car la tention vaut (mV): "); // Afficher le méssage suivant.
    Serial.println(outputValue); // Afficher la valeur de sortie.
    break;

    case 8:
    Serial.print("Facteur Lambda = 1.02 car la tention vaut (mV): "); // Afficher le méssage suivant.
    Serial.println(outputValue); // Afficher la valeur de sortie.
    break;

    case 9:
    Serial.print("Facteur Lambda = 1.04 car la tention vaut (mV): "); // Afficher le méssage suivant.
    Serial.println(outputValue); // Afficher la valeur de sortie.
    break;

    case 10:
    Serial.print("Facteur Lambda = 1.15 car la tention vaut (mV): "); // Afficher le méssage suivant.
    Serial.println(outputValue); // Afficher la valeur de sortie.
    break;

    case 11:
    Serial.print("Facteur Lambda = 1.25 car la tention vaut (mV): "); // Afficher le méssage suivant.
    Serial.println(outputValue); // Afficher la valeur de sortie.
    break;
    }

    // wait 2 milliseconds before the next loop
    // for the analog-to-digital converter to settle
    // after the last reading:
    delay(200);
    }


sinon si tu veux pas utiliser les switch case, tu peux faire ça :

Code: Tout sélectionner

    // These constants won't change. They're used to give names
    // to the pins used:
    const int analogInPin = A0; // Analog input pin that the potentiometer is attached to
    const int analogOutPin = 9; // Analog output pin

    int sensorValue = 0; // value read from the pot
    int outputValue = 0; // value output to the PWM (analog out)

    void setup()
    {
    // initialize serial communications at 9600 bps:
    Serial.begin(9600);
    }

    void loop() {
    // read the analog in value:
    sensorValue = analogRead(analogInPin);
    // map it to the range of the analog out:
    outputValue = sensorValue;

    if (OutputValue > 945) Serial.print("Facteur Lambda = 0.8");
    if (OutputValue > 900 && OutputValue <= 945) Serial.print("Facteur Lambda = 0.85");
    if (OutputValue > 855 && OutputValue <= 900) Serial.print("Facteur Lambda = 0.90");
    //...
    //...    reste des autres valeurs
    //...
    if (OutputValue > 45 && OutputValue <= 90) Serial.print("Facteur Lambda = 1.15");
    if (OutputValue <= 45e) Serial.print("Facteur Lambda = 1.25");

    Serial.print(" car la tention vaut (mV): ");
    Serial.println(outputValue);
}




Je te laisse compéter avec les valeurs qui te conviennes :-)
Pour info if (OutputValue > 45 && OutputValue <= 90) est la syntaxe correcte pour dire "si outputValue est compris entre 46 (strictement supérieure) et 90 inclus (inférieur ou égal). Dans ton code d'origine tu écrivais : "if(45 < outputValue < 90) " je ne pense pas que cette syntaxe fonctionne (même si ça compile... )

Petite question, est ce que les valeurs de ton lambda entre 0,85 et 0,9 ne t’intéresse pas ?
Le mieux dans ce cas serai peut être de calculer ton lambda directement dans ton code est de l'afficher non ?
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: Arduino et Sonde lambda. Bug Programmation.

Message non lude sindu29 » Jeu 4 Avr 2013 08:34

Salut !
J'ai testé tes 2 programmes.
Le premier fonctionne correctement après avoir changer les fonctions d'affichages de manière à afficher la sensorValue au lieu de la outputValue.
Cependant la configuration du second programme me parait mieux adapté , mais nous avons un problème pour le téléverser, le message d'erreur est :

programme_lambda.ino:29:24: error: exponent has no digits

Pour répondre à ta question, la précision de la valeur entre 0.85 et 0.9 ne nous intéresse pas vraiment, on essai dans un premier temps de faire fonctionner le programme en générale :)

Merci de ton aide ^^
sindu29
 
Messages: 4
Inscription: Lun 11 Fév 2013 14:35

Re: Arduino et Sonde lambda. Bug Programmation.

Message non lude phil » Jeu 4 Avr 2013 08:57

sindu29 a écrit:Salut !
programme_lambda.ino:29:24: error: exponent has no digits
Merci de ton aide ^^


En effet, j'ai fait une petite erreur, voila le code corrigé
Code: Tout sélectionner
        // These constants won't change. They're used to give names
        // to the pins used:
        const int analogInPin = A0; // Analog input pin that the potentiometer is attached to
        const int analogOutPin = 9; // Analog output pin

        int sensorValue = 0; // value read from the pot
        int outputValue = 0; // value output to the PWM (analog out)

        void setup()
        {
        // initialize serial communications at 9600 bps:
        Serial.begin(9600);
        }

        void loop() {
        // read the analog in value:
        sensorValue = analogRead(analogInPin);
        // map it to the range of the analog out:
        outputValue = sensorValue;

        if (outputValue > 945) Serial.print("Facteur Lambda = 0.8");
        if (outputValue > 900 && outputValue <= 945) Serial.print("Facteur Lambda = 0.85");
        if (outputValue > 855 && outputValue <= 900) Serial.print("Facteur Lambda = 0.90");
        //...
        //...    reste des autres valeurs
        //...
        if (outputValue > 45 && outputValue <= 90) Serial.print("Facteur Lambda = 1.15");
        if (outputValue <= 45) Serial.print("Facteur Lambda = 1.25");

        Serial.print(" car la tention vaut (mV): ");
        Serial.println(outputValue);
    }



En plus j'avais déclaré la variable outputValue et utilisé dans le code la variable OutputValue. Sorry !!!
Le code ci dessus en tout cas compile correctement.
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19


Retourner vers Logiciel Arduino

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron