Bonjour,
Pour en finir j'ai utilisé string.length() pour faire mes texte défilants et ça marche impeccable.
Maintenant le problème que j'ai, c'est qu'apparemment ma RAM arrive à saturation avec les longues chaines de caractères que je souhaite faire défiler, car certaines ne s'affichent pas entièrement, selon leur longueur ...
Mon code :
#include <SPI.h>
#include "Wire.h"
#include <Deuligne.h>
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // Attribution d'une MAC
IPAddress server(xx, xx, xx, xx); // Connexion au serveur distant
Deuligne lcd; // Préparation LCD
EthernetClient client; // Préparation Ethernet mode Client
void setup()
{
Wire.begin(); // Départ Wire
lcd.init(); // initialisation LCD
// Obtention d'une adresse IP par DHCP
if (!Ethernet.begin(mac)){textDefilantLCD("Probleme de connexion au serveur distant.", 200, 0); for(;;);} // Si erreur
}
void loop()
{
// Préparation des variables
String str;
String var1 = "500";
String var2 = "2";
String var3 = "Actuellement indisponible.";
String var4 = "Actuellement indisponible.";
String var5 = "Actuellement indisponible.";
String init = "0";
char c;
// Si connexion réussie, on bosse
if (client.connect(server, 80))
{
client.println("GET http://urlsitedistant.com/fichieralire.xml HTTP/1.1"); // Requête GET vers le serveur distant
client.println("Host: localhost");
client.println("Accept: */*"); // */
client.println();
client.println();
}
// Sinon on stoppe et erreur
else
{
textDefilantLCD("Probleme de recuperation des donnees distantes.", 500, 0); // Si erreur lors de la connexion
return; // Quitte loop()
}
// Boucle infinie
for(;;)
{
// Si des données sont disponible sur l'objet EthernetClient
if(client.available())
{
c = client.read(); // Lecture d'un octet
// Si fin de ligne atteinte
if(c == '\n')
{
// Variable de l'init
if(str.startsWith("<init>"))
{
str.replace("<init>", "");
str.replace("</init>", "");
init = str;
}
// Variable 1
if(str.startsWith("<var1>"))
{
str.replace("<var1>", "");
str.replace("</var1>", "");
var1 = str;
}
// Variable 2
if(str.startsWith("<var2>"))
{
str.replace("<var2>", "");
str.replace("</var2>", "");
var2 = str;
}
// Variable 3
if(str.startsWith("<var3>"))
{
str.replace("<var3>", "");
str.replace("</var3>", "");
var3, str;
}
// Variable 4
if(str.startsWith("<var4>"))
{
str.replace("<var4>", "");
str.replace("</var4>", "");
var4, str;
}
// Variable 5
if(str.startsWith("<var5>"))
{
str.replace("<var5>", "");
str.replace("</var5>", "");
var5, str;
}
if(str.startsWith("end")){break;} // Sort de la boucle infini
str = ""; // Vidage de la ligne
}
else str += c; // Concaténation de l'octet reçu dans la chaîne de char
}
if(!client.connected()){break;}
}
client.stop();
lcd.clear();
MessageDefilant("Message 0", init, var1.toInt(), var2.toInt());
MessageDefilant("Message 1", var3, var1.toInt(), var2.toInt());
MessageDefilant("Message 2", var4, var1.toInt(), var2.toInt());
MessageDefilant("Message 3", var5, var1.toInt(), var2.toInt());
}
// Fonction de conversion StringToChar
char* StringToChar(String s)
{
unsigned int bufSize = s.length() + 1; //String length + null terminator
char* ret = new char[bufSize];
s.toCharArray(ret, bufSize);
return ret;
}
// Fonction de texte défilant
void textDefilantLCD(String message, int delai, int ligne)
{
// Ajouter une boucle infinie avec delay() dans le but de faire une continuité du texte défilant
for (int i=16; i>0; i--)
{
lcd.clear();
lcd.setCursor(i,ligne);
lcd.print(message.substring(0, 16));
delay(delai);
}
for (int i=0; i <= message.length(); i++)
{
lcd.clear();
lcd.setCursor(0,ligne);
lcd.print(message.substring(i, i+16));
delay(delai);
}
}
// Fonction de messages defilants
void MessageDefilant(String titre, String message, int delai, int passages)
{
String message2 = " ";
message2 += message;
message2 += " ";
lcd.clear();
lcd.setCursor(0,0);
lcd.print(titre);
for(int j = 1; j <= passages; j++)
{
for (int i=0; i <= message2.length(); i++)
{
lcd.setCursor(0,1);
lcd.print(message2.substring(i, i+16));
delay(delai);
}
}
}
Mon fichier distant :
<init>1</init>\n
<var1>200</var1>\n
<var2>1</var2>\n
<var3>Message 1</var3>\n
<var4>Message 2</var4>
<var5>Message 3</var5>\n
end
A ce moment, 2 solutions que j'envisage :
- Utiliser la librairie FLASH qui stockera ces longues phrases dans la flash memory. Mais cette librairie fait des erreurs à la compilation sous IDE 1.0.6, malgré les manipulations expliquées ici : http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.LibrairieFlashProgramme . Si j'utilise l'IDE 0023, c'est le reste de mon code qui créé des erreurs ...
(Ne pouvant pas copier mon code car je dépasse le nombre de caractère autorisé du post-forum, je vous montre uniquement les variables changées)
...
#include <Flash.h>
...
FLASH_STRING(var3, str);
...
FLASH_STRING(var4, str);
...
FLASH_STRING(var5, str);
Et les erreurs :
sketch_oct04a.ino: In function 'void loop()':
sketch_oct04a:102: error: initializer fails to determine size of 'var3_flash'
sketch_oct04a:110: error: initializer fails to determine size of 'var4_flash'
sketch_oct04a:118: error: initializer fails to determine size of 'var5_flash'
- Avec une carte SD : Faire un code qui mettra mes longues chaines de caractères dans un fichier propre à chacune, que je relis un par un pour faire les défilements de cette façon :
- Récupération, traitement des données et créations des 3 fichiers sur la carte SD (toutes les heures).
- Création variable, récupération chaine de caractère 1 dans fichier 1, Affichage sur LCD, destruction variable.
- Création variable, récupération chaine de caractère 2 dans fichier 2, Affichage sur LCD, destruction variable.
etc ... etc ...
Mais j'aimerais avoir l'avis des connaisseurs avant de me casser la tête à essayer cette dernière solution (et éviter d'acheter une carte SD aussi
) si je ne trompe pas complètement ...
Merci à vous ! Bonne soirée
.