Bonsoir
Je cherche à écrire une fonction qui va lire sur un site Internet des citations, ainsi que leurs auteurs. Ça fonctionne sur un ESP32.
Lorsque j’écris tout dans la loop, ça marche bien. Voici le code et ce qu’il fournit.
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "Lesept";
const char* password = "xxxx";
void setup () {
Serial.begin (115200);
//connect to WiFi
int wifiCounter = 0;
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (++wifiCounter > 30) ESP.restart(); // restart after 15 s
}
Serial.println(" CONNECTED");
}
void Accents (int &c) {
if (c >= 224 && c <= 230) c = 97;
else if (c == 231) c = 99;
else if (c >= 232 && c <= 235) c = 101;
else if (c >= 236 && c <= 239) c = 105;
else if (c == 241) c = 110;
else if (c >= 242 && c <= 246) c = 111;
else if (c >= 249 && c <= 252) c = 117;
}
void loop()
{
WiFiClient *pStream;
HTTPClient http;
http.begin("https://dicocitations.lemonde.fr/citations-jour.php");
if (http.GET() == HTTP_CODE_OK)
{
pStream = http.getStreamPtr();
while (pStream->find("color=\"black\"><b>"))
{
Serial.println();
int c = pStream->read();
char Citation[256] = {0};
int nCit = 0;
Citation[nCit] = c & 0xFF;
while (c != 60 && nCit < 256) {
c = pStream->read();
Accents (c);
Citation[++nCit] = c & 0xFF;
}
Citation[nCit] = '\0';
Serial.println (Citation);
// Search the author's name
if (pStream->find("citation d"))
{
int c = pStream->read(); // Shift one character
c = pStream->read();
if (c == 32) c = pStream->read();
char Author[50] = {0};
int nAut = 0;
Author[nAut] = c & 0xFF;
while (c != 60 && nAut < 50) { // 50 is the max length for author's name
c = pStream->read();
Accents (c);
Author[++nAut] = c & 0xFF;
}
Author[nAut] = '\0';
Serial.println (Author);
}
}
}
else Serial.println("Unable to connect to server!");
http.end();
delay(10000);
}
Il s’etait fait aimer par elle comme il savait se faire aimer. Il avait cueilli sans peine son ame legere de poupee.
MaupassantLes couvertures des livres sont des portes qui donnent, non sur des textes arides comme on le croit souvent, mais sur de fabuleux univers.
Anne Liger-Belair dite GuduleNous sommes toujours censes regarder vers le futur. Mais en vieillissant, il est beaucoup plus facile de regarder en arriere et de regretter amerement les erreurs du passe.
Mary Higgins ClarkLa liberte n’est pas de faire ce qu’on veut, mais ce qu’on a le droit de faire.
Victor CousinDans le combat humain pour l’elevation de l’esprit, il ne suffit pas de monter le plafond, il faut aussi empecher le plancher de s’effondrer.
Bernard WerberUn pessimiste voit la difficulte dans chaque opportunite, un optimiste voit l’opportunite dans chaque difficulte.
ChurchillC’etait un specialiste de l’immobilier. Il avait connu des tas de maisons: maisons de correction, maisons d’arret, maisons centrales.
Blaise CendrarsA tous les repas pris en commun, nous invitons la liberte a s’asseoir. La place demeure vide mais le couvert est mis.
Rene CharJe ne sais pas tres bien ce que je cherche. Mais je sais ce dont je ne veux pas.
Jules RomainsEn politique, la verite est un luxe inutile.
Philippe AlexandreLes utilisateurs de Facebook ne sont que des hommes-sandwichs qui travaillent gratuitement. Ce serait stupide de ne pas les utiliser.
Joel DickerDe tous les vices, la sagesse est encore le plus agreable.
Edouard HerriotLa fantaisie n’est pas l’oppose de l’intelligence. La fantaisie est l’intelligence appliquee a etablir des rapports d’analogie, d’implication significative, de symbolisme.
Cesare PaveseOpera : Piece representant la vie dans un autre monde, dont les habitants n’ont pas de discours mais des chansons, pas de mouvements mais des gestes, pas de postures mais des attitudes.
Ambrose BierceDes femmes sont des maitresses; d’autres, des amantes; d’autres des amies. Les maitresses se remplacent; les amantes, rarement; les amies, jamais.
Remy de Gourmont
Comme il renvoie plusieurs couples {citation, auteur}, je voudrais en afficher une seule choisie au hasard, et ceci à la demande. Donc je veux mettre les citations dans un tableau de citations et les auteurs dans un tableau d’auteurs (ou un tableau de structures {citation, auteur}).
Enfin, il faut que tout ça soit dans une fonction pour être intégré dans un programme plus grand.
Le problème est de définir dans la loop mes deux tableaux:
char Citation[maxNbCitations][sizeCitation] = {0};
char Author[maxNbCitations][sizeAuthor] = {0};
avec plus haut
#define sizeCitation 256
#define sizeAuthor 50
#define maxNbCitations 20
et de remplir ces tableaux dans une fonction
int getCitations (char * Citation, char * Author)
qui me renvoie le nombre de citations lues sur le site (max 20).
J’ai déjà du mal avec les arguments passés par référence, mais avec les tableaux je suis perdu !!!
Voici mon code : il plante, probablement un dépassement de taille de tableau (les messages d’erreur de l’ESP32 sont parfois abscons) : quelqu’un peut me dire ce que j’ai mal codé ?
#include <WiFi.h>
#include <HTTPClient.h>
#define sizeCitation 256
#define sizeAuthor 50
#define maxNbCitations 20
const char* ssid = "Lesept";
const char* password = "xxx";
void setup () {
Serial.begin (115200);
//connect to WiFi
int wifiCounter = 0;
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (++wifiCounter > 30) ESP.restart(); // restart after 15 s
}
Serial.println(" CONNECTED");
}
void Accents (int &c) {
if (c >= 224 && c <= 230) c = 97;
else if (c == 231) c = 99;
else if (c >= 232 && c <= 235) c = 101;
else if (c >= 236 && c <= 239) c = 105;
else if (c == 241) c = 110;
else if (c >= 242 && c <= 246) c = 111;
else if (c >= 249 && c <= 252) c = 117;
}
int getCitations (char * Citation, char * Author) {
int nCit = 0;
WiFiClient *pStream;
HTTPClient http;
http.begin("https://dicocitations.lemonde.fr/citations-jour.php");
if (http.GET() == HTTP_CODE_OK)
{
pStream = http.getStreamPtr();
while (pStream->find("color=\"black\"><b>") && nCit < maxNbCitations)
{
Serial.println();
int c = pStream->read();
int nChar = 0;
*(Citation + nChar + nCit * sizeCitation) = c & 0xFF;
while (c != 60 && nChar < sizeCitation) {
c = pStream->read();
if (c > 223) Accents (c);
Serial.print((char)(c & 0xFF));
*(Citation + (++nChar) + nCit * sizeCitation) = c & 0xFF;
}
*(Citation + nChar + nCit * sizeCitation) = '\0';
// Search the author's name
if (pStream->find("citation d"))
{
int c = pStream->read(); // Shift one character
c = pStream->read();
if (c == 32) c = pStream->read();
int nAut = 0;
*(Author + nAut + nCit * sizeAuthor) = c & 0xFF;
while (c != 60 && nAut < sizeAuthor) {
c = pStream->read();
if (c > 223) Accents (c);
Serial.print((char)(c & 0xFF));
*(Author + (++nAut) + nCit * sizeAuthor) = c & 0xFF;
}
*(Author + nAut + nCit * sizeAuthor) = '\0';
}
Serial.println ();
// Serial.printf ("%d : %s - %s\n", nCit, Author, Citation);
nCit++;
}
}
else Serial.println("Unable to connect to server!");
http.end();
return nCit;
}
void loop() {
char Citation[maxNbCitations][sizeCitation] = {0};
char Author[maxNbCitations][sizeAuthor] = {0};
int nCit = getCitations (*Citation, *Author);
for (int i = 0; i < nCit; i++) {
Serial.println (Citation[i]);
Serial.println (Author[i]);
}
delay(10000);
}
Merci
Désolé, c’est peu commenté : je peux ajouter des commentaires pour expliquer si nécessaire…