[RESOLU] Librairie SerialLcd / SoftwareSerial

Bonjour à tous,

je rencontre un probleme lorsque j’insere ces librairies SerialLcd et SoftwareSerial dans le code.
Il doit y avoir un conflit mais lequel …
Lorsque j’ajoute ces librairies ma page web ne s’affiche plus …

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <MemoryFree.h>
// Solaire
#include <OneWire.h> // librairie pour capteur OneWire
// #include <Flash.h>
#include <SerialLCD.h>
#include <SoftwareSerial.h>
// Fin Solaire
// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ   40

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 35); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80
File webFile;
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer


// Solaire

//---- code des instructions du capteur
const int modeLecture=0xBE;
const int lancerMesure=0x44;


// --- constantes des broches ---

const int broche_OneWire=2; //declaration constante de broche 
const int broche_rel01=3;
const int broche_rel02=5;
SerialLCD slcd(6,7);
// --- Déclaration des variables globales --- 


 byte adrCaptPiscine[8] = {
  0x28, 0xE5, 0x9D, 0xA2, 0x04, 0x0, 0x0, 0xB7}; // adresse sonde Piscine old
byte adrCaptPac[8] = {
  0x28, 0x29, 0x79, 0x7B, 0x02, 0x0, 0x0, 0xD3}; // adresse sonde Pac
byte adrCaptBulle[8] = {
  0x28, 0x7B, 0x65, 0x8B, 0x03, 0x0, 0x0, 0x14}; // adresse sonde Pac Bulle
byte data[12]; // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire
// byte adresse[8]; // Tableau de 8 octets pour stockage du code d'adresse 64 bits du composant One Wire
// byte adresse2[8]; // Tableau de 8 octets pour stockage du code d'adresse 64 bits du composant One Wire

float ma_tempetf=0.0; 
String chaineRecue=""; // déclare un string vide global
int comptChar=0; // variable de comptage des caractères reçus 
float tempPiscine=0.0;
float tempPac=0.0;
float tempBulle=0.0;
char tampon[2] = {'\0'};
int test = 0;

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
OneWire  capteur(broche_OneWire);  // crée un objet One Wire sur la broche voulue



// Fin Solaire


void setup()
{
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    
    // Solaire
 // slcd.begin();
    pinMode(broche_rel01, OUTPUT); //met la broche en sortie
  pinMode(broche_rel02, OUTPUT); //met la broche en sortie
    // Fin Solaire
    
    Serial.begin(9600);       // for debugging
    
    // initialize SD card
    Serial.println(F("Initializing SD card..."));
    if (!SD.begin(4)) {
        Serial.println(F("ERROR - SD card initialization failed!"));
        return;    // init failed
    }
    Serial.println(F("SUCCESS - SD card initialized."));
    // check for index.htm file
    if (!SD.exists("index.htm")) {
        Serial.println(F("ERROR - Can't find index.htm file!"));
        return;  // can't find index file
    }
    Serial.println(F("SUCCESS - Found index.htm file."));
    
    
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
}

void loop()
{
  
  // Solaire
  
  Serial.println(F("**** temperature Piscine **** "));
  tempPiscine = capteurMesureTemp(adrCaptPiscine); // appel de la fonction de mesure - renvoie une valeur float
  Serial.println(tempPiscine);
  Serial.println(F("**** temperature Pac **** "));
  tempPac = capteurMesureTemp(adrCaptPac);
  Serial.println(tempPac);
  Serial.println(F("**** temperature Bulle **** "));
  tempBulle = capteurMesureTemp(adrCaptBulle);
  Serial.println(tempBulle);
  
  if (tempBulle > 30) 
  { 
    Serial.println(F("Temperature Bulle sup a 30 degres")); 
    digitalWrite(broche_rel01,HIGH);
    digitalWrite(broche_rel02,LOW);
    test = 0;
  } // met la broche au niveau haut (5V) – allume la LED
  else { 
    test++;
  }
  if (test > 2)
  {
    Serial.println(F("Temperature Bulle inf a 30 degres"));
    digitalWrite(broche_rel02,HIGH);
    digitalWrite(broche_rel01,LOW); 
  } 
  
 
  
  // Fin Solaire
    EthernetClient client = server.available();  // try to get client
if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // buffer first part of HTTP request in HTTP_req array (string)
                // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
                if (req_index < (REQ_BUF_SZ - 1)) {
                    HTTP_req[req_index] = c;          // save HTTP request character
                    req_index++;
                }
                // print HTTP request character to serial monitor
                Serial.print(c);
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {
                    // open requested web page file
                    if (StrContains(HTTP_req, "GET / ")
                                 || StrContains(HTTP_req, "GET /index.htm")) {
                        client.println(F("HTTP/1.1 200 OK"));
                        client.println(F("Content-Type: text/html"));
                        client.println(F("Connnection: close"));
                        client.println();
                        webFile = SD.open("index.htm");        // open web page file
                    }
                    else if (StrContains(HTTP_req, "ajax_switch")) {
                        GetSwitchState(client);
                    }
                    else if (StrContains(HTTP_req, "GET /pic.jpg")) {
                        webFile = SD.open("pic.jpg");
                        if (webFile) {
                            client.println(F("HTTP/1.1 200 OK"));
                            client.println();
                        }
                    }
                    else if (StrContains(HTTP_req, "GET /pic2.jpg")) {
                        webFile = SD.open("pic2.jpg");
                        if (webFile) {
                            client.println(F("HTTP/1.1 200 OK"));
                            client.println();
                        }
                    }
                    if (webFile) {
                        while(webFile.available()) {
                            client.write(webFile.read()); // send web page to client
                        }
                        webFile.close();
                    }
                    // reset buffer index and all buffer elements to 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
    
    
    
    Serial.print(F("freeMemory()="));
   Serial.println(freeMemory());
 // slcd.clear() ;
 // slcd.setCursor(0, 0);
  // print the number of seconds since reset:
  
// dtostrf(tempPiscine, 5, 2, tampon);
//  slcd.print(tampon);
    delay(1000);
}
//-------------- fonction de mesure de la température --------------- 

float capteurMesureTemp(byte adressecapteur[8]) { //fonction qui renvoie résultat float et ne reçoit rien

  //-------- variable locale de la fonction ---------- 
  int tempet=0; // variable pour resultat brute  de la mesure
  float tempetf=0.0; // variable pour resultat à virgule de la mesure


  // XXXXXXXXXXXXXXXXXXXXXX Lancement d'une mesure et lecture du résultat XXXXXXXXXXXXXXXXXXXXXXX 

  // Serial.println("**** Acquisition d'une mesure de la temperature **** "); 

  // avant chaque nouvelle instruction, il faut : 
  //    * initialiser le bus 1-wire
  //    * sélectionner le capteur détecté
  //    * envoyer l'instruction 

  //--------- lancer une mesure --------
  capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
  capteur.select(adressecapteur); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
  capteur.write(lancerMesure,1); // lance la mesure et alimente le capteur par la broche de donnée

  //-------- pause d'une seconde ----- 
  delay(1000);     // au moins 750 ms
  // il faudrait mettre une instruction capteur.depower ici, mais le reset va le faire


  //---------- passer en mode LECTURE ------------- 
  capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
  capteur.select(adressecapteur); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
  capteur.write(modeLecture,1); // passe en mode lecture de la RAM du capteur

  // ----------- lire les 9 octets de la RAM (appelé Scratchpad) ----

  for ( int i = 0; i < 9; i++) {           // 9 octets de RAM stockés dans 9 octets
    data[i] = capteur.read();             // lecture de l'octet de rang i stocké dans tableau data
  }


  //----- caclul de la température mesurée (enfin!) ---------

  data[1]=data[1] & B10000111; // met à 0 les bits de signes inutiles
  tempet=data[1]; // bits de poids fort
  tempet=tempet<<8; 
  tempet=tempet+data[0]; // bits de poids faible

  // --- en mode 12 bits, la résolution est de 0.0625°C - cf datasheet DS18B20
  tempetf=float(tempet)*6.25;
  tempetf=tempetf/100.0;



  return tempetf;




}

// send the state of the switch to the web browser
void GetSwitchState(EthernetClient cl)
{
    
    
    cl.print(F("<p>Température Piscine: "));
    cl.println(tempPiscine);
    cl.println(F("</p>"));
   cl.print(F("<p>Température Pompe à Chaleur / Solaire: "));
    cl.println(tempPac);
    cl.println(F("</p>")); 
   cl.print(F("<p>Température Bulles : "));
    cl.println(tempBulle);
    cl.println(F("</p>")); 
   
   if (digitalRead(3) == 1) {
   cl.println(F("Chauffage solaire en marche "));
    
   } else {
     cl.println(F("Chauffage solaire à l'arret "));
   
   }
}

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
    
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}

Salut, je suppose que la tes lib sont en commentaire car elles te pausaient des problèmes?

Aucune erreur de la par du compilo???

Si c'est le cas tu est bon pour te taper les deux lib jusqu’à trouver une fonction nommé pareil ^^'

A mon avis regarde les write ou rewrite ou clear, des noms de fonctions générique utilisable en série ou en serveur web ou en lcd

Good luck ! si tu à d'autre symptômes rapporte nous les, on continuera l'investigation :stuck_out_tongue:

Skizo !

Bonjour,

Vu la tête du code je pencherai pour un problème de mémoire RAM insuffisante.
-> Arduino Playground - AvailableMemory

Comment ca mon code a une sale tete =(
freemem m’indique
sans les libs 298
avec les libs 230

ce n’est pas suffisant ?

si j’ajoute l’initialisation de l’écran je me retrouve avec -3578 …

je vais donc regarder du coté du code des libs mais la cela va etre plus difficile pour moi …

Bon je crois que tu as encore raison Skywodd !
J'ai mis quelques print(F( dans le code et cela fonctionne déjà mieux :slight_smile:

par contre lorsque j'essaie de manipuler la valeur pour l'affichage de la température sur l'ecran LCD avec ce code
dtostrf(tempPiscine, 5, 2, tampon);

cela me met le bordel ... du style -2360 puis 0 ... dans la valeur tempPiscine ...

PITP2:
Bon je crois que tu as encore raison Skywodd !
J'ai mis quelques print(F( dans le code et cela fonctionne déjà mieux :slight_smile:

Quand ya des string les problèmes de mémoire ne sont pas bien loin.

PITP2:
par contre lorsque j'essaie de manipuler la valeur pour l'affichage de la température sur l'ecran LCD avec ce code
dtostrf(tempPiscine, 5, 2, tampon);

cela me met le bordel ... du style -2360 puis 0 ... dans la valeur tempPiscine ...

Fait voir le code ?
Ça sent le truc foireux dans l'appel de fonction :wink:

Euh bah tout le code est plus haut :~

PITP2:
Euh bah tout le code est plus haut :~

Ben je doit être aveugle parce que dans ton code justement je ne vois pas de dtostrf() :~

Arf en effet je l'avais retiré du code ..... désolé
Il est remis dans la première partie du code

Ceci dit dès que je remets le slcd.begin plus rien ne fonctionne ... je dois avoir encore un probleme de mémoire sauf que je n'arrive pas à optimiser plus le code pour en récupérer

ce slcd.begin en prends bcp semble t il car avec freemem j'obtiens 562

T'aurais un lien vers cette librairie "SerialLCD" ?
J'ai comme une idée du problème mais je préférerai avoir le code de la lib sous les yeux pour en être sûr :wink:

Et hop voila le lien
http://www.seeedstudio.com/wiki/File:SerialLCD_for_Arduino1.0_20120307.zip

PITP2:
Et hop voila le lien
http://www.seeedstudio.com/wiki/File:SerialLCD_for_Arduino1.0_20120307.zip

C'est bien ce que je pensait.

En interne c'est déjà du softwareSerial, du coup deux instances de softwareSerial ça doit pas lui plaire.
Il me semble qu'il y a une remarque à ce sujet dans la doc justement (mais faudrait déjà retrouver la doc sur le site arduino.cc).

Je veux bien la chercher mais je ne sais pas de quelle doc tu veux parler ....

j'ai trouvé ce lien
http://www.seeedstudio.com/wiki/index.php?title=Grove_-_Serial_LCD_V1.0

Je parlai de cette doc là :

Le passage en question :

The library has the following known limitations:

If using multiple software serial ports, only one can receive data at a time.

Et la fonction qui va bien :

ok donc en utilisant la fonction mySerial.listen()
cela devrait fonctionner c'est ca ?

En gros faut appeler machin.listen() pour réactivé le port série que tu veut utiliser.
Va falloir faire quelques modif dans la lib si c'est pas dedans :wink:

yep je vais regarder cela ... mais de but en blanc il semble qu'il faut initialiser le port à une vitesse ... alors que l'instruction de base slcd.begin n'en a pas à mons que le parametre soit dans la librairie mais comment intepreter ce qui est contenu dans le .h ca c'est une autre histoire lol

j'ai regardé ton tuto ou tu gères plusieurs ports séries

je retrouve des choses similaires dans mon code et dans la gestion du lcd
pour moi SerialLCD slcd(7,8);
slcd.begin(); initialisent une nouvelle liaison série en lien avec en lien la librairie softwareserial

mon code plantait lorsque je mettais slcd.begin car j'avais indiqué les pins 6,7 au lieu de 7,8 ....

maintenant le problème vient bien du dtostrf()

lorsque le prog se lance j'ai sur l'afficheur -1920.06 puis 0.00 ce qui semble indiquer que le problème ne vient pas de la gestion des multiples liaisons séries ?
et ensuite le prog plante ....

freemem indique 549

Trouvé en adaptant ce code :slight_smile:

char ascii[32];
float temp = 3.14;
int temp1 = (temp - (int)temp) * 100;
sprintf(ascii,"The Value is: %0d.%d", (int)temp, temp1);

Merci pour votre aide