Débugué un programme de récuperation de données de sondes

Bonjour, j’ai un programme pour récupérer les données de la sonde pH d’un de mes camarades et les renvoyer mais a la réception la valeur n’est pas la bonne sur le moniteur série.
Voici mon code partie émetteur

#include <VirtualWire.h> // inclusion de la librairie VirtualWire
#define SensorPin 0          //pH meter Analog output to Arduino Analog Input 0
unsigned long int avgValue;  //Store the average value of the sensor feedback
float phValue ;
int buf[10],temp;

 
void setup() // Fonction setup()
{
    Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
    Serial.println("Emetteur"); // Petit message de bienvenue
    pinMode (A0, INPUT);
    vw_setup(2000);     // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
    Serial.print("");
    pinMode(13,OUTPUT);  
    Serial.begin(9600);  
    Serial.println("Ready");    //Test the serial monitor
}
 
void loop() // Fonction loop()
{
   
    phValue=analogRead(A0);
    Serial.print(phValue);
    Serial.print(" "); // On signale le début de l'envoi
    vw_send((uint8_t *)&phValue, sizeof phValue ); // On envoie le message 
    vw_wait_tx(); // On attend la fin de l'envoi
    Serial.println(""); // On signal la fin de l'envoi
    delay(1000); // Et on attend 1s pour pas flooder
    
  for(int i=0;i<10;i++)       //Get 10 sample value from the sensor for smooth the value
  { 
    buf[i]=analogRead(SensorPin);
    delay(10);
  }
  for(int i=0;i<9;i++)        //sort the analog from small to large
  {
    for(int j=i+1;j<10;j++)
    {
      if(buf[i]>buf[j])
      {
        temp=buf[i];
        buf[i]=buf[j];
        buf[j]=temp;
      }
    }
  }
  avgValue=0;
  for(int i=2;i<8;i++)                      //take the average value of 6 center sample
    avgValue+=buf[i];
  float phValue=(float)avgValue*5.0/1024/6; //convert the analog into millivolt
  phValue=3.5*phValue;                      //convert the millivolt into pH value
  Serial.print("    pH:");  
  Serial.print(phValue,2);
  Serial.println(" ");
  digitalWrite(13, HIGH);       
  delay(800);
  digitalWrite(13, LOW); 
}

et la partie recepteur

#include <VirtualWire.h> // inclusion de la librairie VirtualWire
 
void setup() // Fonction setup()
{
    Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
    Serial.println("Recepteur"); // Petit message de bienvenue
 
    vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
    vw_rx_start();  // Activation de la partie réception de la librairie VirtualWire
}

float phValue;
void loop() // Fonction loop()
{
    if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
    {
        uint8_t lg=sizeof phValue;
        if (vw_get_message((uint8_t *)&phValue, &lg)) // On copie le message, qu'il soit corrompu ou non
        {
            Serial.print("RX : ");
            Serial.println(phValue);
        }
    }
}

Bonjour,

phValue est envoyé avant d’être calculé. Il faut l’envoyer après le calcul
A quoi sert ce phValue=analogRead(A0); au début de la loop ?

Je ne vois pas ou est l'envoi avant le calcul sur le programme, peux tu me le montrer ? Le AnalogRead A0 il sert a recueillir les données reçus en A0 non ? Parce je récupère les données d'une sonde et je les envois

Qu'est ce que tu veux envoyer: la valeur lue en A0 ou le ph ?

Tu as phValue qui est à la fois la valeur de A0 et le ph.

   phValue=analogRead(A0);
 ...
 float phValue=(float)avgValue*5.0/1024/6; //convert the analog into millivolt
 phValue=3.5*phValue;                      //convert the millivolt into pH value

De plus tu as deux fois la variable phValue (en global et en local)

bonjour,

kamill:
Bonjour,

phValue est envoyé avant d'être calculé. Il faut l'envoyer après le calcul
A quoi sert ce phValue=analogRead(A0); au début de la loop ?

BigBen19:
Je ne vois pas ou est l'envoi avant le calcul sur le programme, peux tu me le montrer ? Le AnalogRead A0 il sert a recueillir les données reçus en A0 non ? Parce je récupère les données d'une sonde et je les envois

c'est bien toi qui a coder le programme?

void loop() // Fonction loop()
{
   
    phValue=analogRead(A0);
    Serial.print(phValue);
    Serial.print(" "); // On signale le début de l'envoi
    vw_send((uint8_t *)&phValue, sizeof phValue ); // On envoie le message
    vw_wait_tx(); // On attend la fin de l'envoi

et après tu calcul la valeur en dessous, donc ca part avant le calcul

kamill:
Qu'est ce que tu veux envoyer: la valeur lue en A0 ou le ph ?

Tu as phValue qui est à la fois la valeur de A0 et le ph.

   phValue=analogRead(A0);

...
float phValue=(float)avgValue5.0/1024/6; //convert the analog into millivolt
phValue=3.5
phValue;                      //convert the millivolt into pH value



De plus tu as deux fois la variable phValue (en global et en local)

Justement je veux envoyer le pH qui vient de l'entrée A0, je devrais enlever la quelle valeur donc ?

  • tu supprimes le phValue global
  • tu supprimes la ligne phValue=analogRead(A0);
  • tu mets la transmission après le calcul de phValue