Serveur arduino uno et 0

Bonjour !

J'ai un petit soucis pour un de mes serveurs arduinos :
L'arduino recupère différentes valeurs depuis des capteurs, les met sous forme de trames (string) et les envoie à un ordinateur client.

Le problème est que si une des valeurs contient un 0 (par exemple 20°C), la trame envoyée sera : valeur|2 au lieu de valeur|20|autrechose|caracteredefin.

En fait, la trame s'arrête à 0...

Au niveau du programme, rien de très particulier : je récupère la valeur avec un int, que je passe en string avec String(variableInt, DEC) et je fais ensuite des += pour créer mon string final que j'envoie avec Client.print().

Si quelqu'un avait une idée de pourquoi ça fait ça et comment le régler...

Merci d'avance pour votre aide !

Est-ce que ton code ne vérifierait pas des fins de string avec le caractère zéro '0' au lieu du caractère nul (le nombre zéro) ?

Je ne sais pas exactement comment vérifier, alors je te met un bout de codes :

String lireCapteur() {
  trame=NULL;
  recupdht();
  trame += valdht;
  trame+="|";
   trame+="$";
   return trame;
}

void recupdht() {
  int humidite = dht.readHumidity();
  int temperature = dht.readTemperature();
  if (isnan(humidite) || (isnan(temperature)) || (humidite==0)) {
    valdht = "e|e";
  }
  else {
    String transitoire = String(humidite, DEC);
    transitoire += "|";
    transitoire += String(temperature, DEC);
    valdht = transitoire;
  }
}

Ce n'est qu'une partie, mais c'est ça l'idée...

nan n'est pas possible avec des int...

Du coup, ça n'est pas ton idée ?

Est-ce que je peux mettre autre chose pour faire avancer ?

bonjour,
déjà pourquoi mettre

int humidite

si après tu mets

    String transitoire = String(humidite, DEC);

regardes déjà la sortie de ta variable "transitoire"

infobarquee:
bonjour,
déjà pourquoi mettre

int humidite

si après tu mets

    String transitoire = String(humidite, DEC);

Je ne vois pas très bien ce que tu veux dire...
La fonction me renvoit un flottant que je change en entier directement...
(puis il est plus facile de (tester des valeurs avec un int qu'avec un string)

infobarquee:
regardes déjà la sortie de ta variable "transitoire"

Après vérification, en mettant humidite a 20, transitoire retourne "20|25" et la trame "2" (donc arrêt au 0...).

peut-on voir le code complet, client et serveur ?

Je ne vois pas très bien ce que tu veux dire...
La fonction me renvoit un flottant que je change en entier directement...
(puis il est plus facile de (tester des valeurs avec un int qu'avec un string)

simplement, tu demande un int et après tu demande un DEC, donc........

Après vérification, en mettant humidite a 20, transitoire retourne "20|25" et la trame "2" (donc arrêt au 0...).

donc tu as bien la bonne valeur.
mais la trame, c'est de quel coté?

+1 pour le code des 2 cotés.

Pour ce qui est du client, il s'agit d'un serveur qui envoie simplement un caractère ou un autre, je peux vous fournir le code de mon client de test en php, mais c'est sûr que l'erreur vient pas de lui : ça a été testé avec d'autres clients codés en python/php et pas tous par moi...

Pour ce qui est du code complet :

#include <SPI.h> 
#include <Ethernet.h>


#include <DHT.h>

#include <Wire.h> 


#define DHTPIN 2     
#define DHTTYPE DHT22  


DHT dht(DHTPIN, DHTTYPE);


byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x9E, 0xAC };
IPAddress ip(192,168,15,64);


EthernetServer server(4998); 
EthernetClient client;


String valdht;
String vallum;
String valtemp;
String reponse;
char cmd;
String trame;


float voltLuminosite = 0;
int luminositeFinale = 0; 
const float ordonneeALOrigine = 44.86;
const float coeffDirecteur = 1.153;


void getLuminosite(); 

int port=72; 

byte octet1 = 0; 
byte demiOctet = 0; 
int TemperatureFinale = 0; 
const float celsius = 0.0625; 

void getTemperature(); 

void analyTrame(EthernetClient client, char cmd, String reponse);

void recupdht();

void setup() {

  dht.begin();
  Ethernet.begin(mac, ip);
  server.begin();
  Wire.begin(); 
  
}

void loop () {
  client = server.available();
  if (client) {
   analyTrame(client, cmd, reponse);
 }
}
 
void analyTrame(EthernetClient client, char cmd, String reponse) {
     while(client.connected()) {
      if (client.available()) {
                    cmd=NULL;
                    reponse=NULL;
        while (cmd!='

PS : pour le DEC, je dois avouer que je ne me suis pas interessé à son interet, j'ai trouvé la fonction sur le site d'arduino ainsi écrite, j'ai fait plusieurs tests avec des variables de types différents et j'ai vu que ça fonctionnait, je suis pas allé chercher plus loin :blush:) {
         cmd = client.read();
         reponse += cmd;
       }
       if (reponse.length()==2) {
         reponse=reponse.substring(0,1);
         if (reponse=="m") {
           trame = lireCapteur();
           client.print(trame);
         }
         else {
           //erreur
         }
       }
       else {
         //erreur
       }
     }
 }
}

String lireCapteur() {
 trame=NULL;
 recupdht();
 trame += valdht;
 trame+="|";
 getTemperature();
 trame += valtemp;
 trame+="|";
 getLuminosite();
  trame+=vallum;
  trame+="$";
  return trame;
}
 
void recupdht() {
 int humidite = dht.readHumidity();
 int temperature = dht.readTemperature();
 if (isnan(humidite) || (isnan(temperature)) || (humidite==0)) {
   valdht = "e|e";
 }
 else {
   String transitoire = String(humidite, DEC);
   transitoire += "|";
   transitoire += String(temperature, DEC);
   valdht = transitoire;
   Serial.println(transitoire);
 }
}

void getLuminosite () {
 voltLuminosite=analogRead(A0);
 if(voltLuminosite==1023) {
    vallum = "e";
 }
 else {
   luminositeFinale=(voltLuminosite-ordonneeALOrigine)/coeffDirecteur; //operation pour passer de volt a lux
 vallum = String(luminositeFinale, DEC);
 }
}

void getTemperature() {
 Wire.requestFrom(port,2);
 int detecterreur = Wire.available();
 if (detecterreur == 2) {
   octet1 = Wire.read();
   demiOctet = Wire.read();
   TemperatureFinale = ((octet1 << 8) | demiOctet) >> 4;
   TemperatureFinale = TemperatureFinale*celsius;
   valtemp =  String(TemperatureFinale, DEC);
 }
 else {
   valtemp = "e";
 }
}


PS : pour le DEC, je dois avouer que je ne me suis pas interessé à son interet, j'ai trouvé la fonction sur le site d'arduino ainsi écrite, j'ai fait plusieurs tests avec des variables de types différents et j'ai vu que ça fonctionnait, je suis pas allé chercher plus loin :blush:

donc tu as 2 capteurs de temp?
le dht22 et un autre en wire si j'ai bien compris.

ca serait pas ca ton soucis?

          reponse=reponse.substring(0,1);

si reponse = 20
substring(0,1) ====>2
substring(0,2) ====>20
substring(1,2) ====>0

pour plus de compréhension
abcdef.substring(0,2) : ab
abcdef.substring(1,2) : b
abcdef.substring(3,6) : def

par contre ton code est des plus crapouette, sans être méchant.

infobarquee:
donc tu as 2 capteurs de temp?
le dht22 et un autre en wire si j'ai bien compris.

J'en ai 3 pour être précis : le dht22, le wire et un capteur TEMT6000.

infobarquee:
ca serait pas ca ton soucis?

          reponse=reponse.substring(0,1);

si reponse = 20
substring(0,1) ====>2
substring(0,2) ====>20
substring(1,2) ====>0

pour plus de compréhension
abcdef.substring(0,2) : ab
abcdef.substring(1,2) : b
abcdef.substring(3,6) : def

Cette partie là est pour récupéré un morceau de la trame : je reçois un caractère et un $.
Par exemple E$.
Du coup substring me permet de récupérer le E et de le comparer avec les cas possibles de connexion de client...

infobarquee:
par contre ton code est des plus crapouette, sans être méchant.

Je suis étudiant et c'est la première fois que je fais un code aussi complexe pour être franc... Mais je le prends pas mal, je me doutais que j'allais avoir des remarques là dessus ^^"

Je me permet de faire un up car j'ai toujours le même problème...

Le code a été refait entiérement : je n'envoie plu un string mais un int (j'ai aussi testé avec un char).

Le résultat est encore et toujours le même : la trame se coupe a 0.

Avec quelques tests :

client.print(0) ou ("0") ou ('0') font pareil.
client.print(0|) ou ("0.") ou tout autre 0 + un caractère fonctionne parfaitement (y compris 00).

Or mon problème est de faire une trame a|0|...

Merci d'avance...

Personne n'a d'idée ? :confused:

Salut,

Du coup il semble que le problème viennent de l0 ou al0. Peut-être mal interprété par le compilateur ...

Teste g0 et ag0 par exemple

J'ai du mal a expliquer le problème...

en gros :

int i = 0;
client.print(i);

donnera rien et si je fais d'autres client.print après (sans deconnecter le client), rien ne passe

String i = "0.";
client.print(i);

Renvera 0.

Le bloquage se fait uniquement quand j'envoie un 0 seul.

Le problème est que je veux récupérer des valeurs de capteurs qui peuvent être à 0...

Le code donnerait ça pour l'envoi :

client.print(debut);
client.print(valeur1);
client.print(|);
client.print(valeur2);
...

Chaque valeur est séparée par un |
Et si valeur 1 est égale à 0, le client ne recoit que "debut".
Si valeur1 est égale à 20, le client recoit "debut20|valeur2".

Surprenant.
Print envoie des chaînes de caractères, quoiqu'on lui passe en paramètre. Donc un 0 est envoyé comme le caractère 0 code ASCII 0x30. Il ne peut pas être confondu avec un terminateur de chaîne qui est 0.

Je serais tenté de dire que l'erreur est quelque part dans le code de réception et non pas dans l'émission.

Déjà pensé...
Les 2 clients (a savoir un serveur python et un serveur php) ont le même problème...

La reception est basé sur un while(caractere!=$)
(la caractere de fin étant un $).