Compteur Facebook ESP8266 LedMatrix

Bonjour à tous,

Ca fait un petit moment que je travaille sur un compteur de like pour la structure dans laquelle je travaille.
J’ai des bases en développement mais clairement je ne suis pas assez bon pour développer mon code entierement.
C’est pourquoi j’ai récupéré un code (merci d’ailleurs à cette personne) qui utilise le même matériel que le mien.

Cependant, bien que le code ne renvoie pas d’erreur à la vérification et se téléverse correctement, le programme se bloque à l’éxecution et fige sur le message d’accueil “Bonjour”. :sob:

Si vous auriez l’extrême bonté de me faire profiter de vos sciences, je vous en serais reconnaissant. :kissing:

Voici le code :

#include <ESP8266WiFi.h> 
#include <WiFiClientSecure.h> 
#include <SPI.h>
#include "LedMatrix.h"
#include <ArduinoJson.h> 
// Wifi 
const char* ssid = "SSID"; 
const char* password = "PASSWORD";


// Afficheur LED max7219
#define NUMBER_OF_DEVICES 4
#define CS_PIN D3
#define CHAR_WIDTH 7
LedMatrix ledMatrix = LedMatrix(NUMBER_OF_DEVICES, CS_PIN);

unsigned long display_delay = 10000; //time between api requests (10 seconds)
unsigned long display_due_time;

// Facebook 
const char* host = "graph.facebook.com"; 
const String url = "/v3.2/URLPAGEFB?fields=fan_count&access_token=TOKENFB"; 
const int httpsPort = 443; 
const char* fingerprint = "lefingerprintSSL"; 


void setup() { 
 Serial.begin(115200); 
 // Wifi 
 WiFi.begin(ssid, password); 
 Serial.println(); 
 Serial.print("Connecting ");
 scrollValueAndStop("Connection en cours"); 
 while (WiFi.status() != WL_CONNECTED) { 
   delay(500); 
   Serial.print("."); 
    
 } 
 Serial.println(); 
 Serial.print("Connected, IP address: ");
  
 Serial.println(WiFi.localIP()); 
 // Initialisation  
 ledMatrix.init();
  ledMatrix.setRotation(true);
  ledMatrix.setCharWidth(CHAR_WIDTH);
  scrollValueAndStop("Connected"); 
  scrollValueAndStop("Bonjour");
} 

void scrollValueTilPassed(String value){
  int lengthToScroll = (value.length() * CHAR_WIDTH) + (NUMBER_OF_DEVICES * 8);
  ledMatrix.setText(value);
  for (int i = 0; i < lengthToScroll; i ++){
    ledMatrix.clear();
    ledMatrix.scrollTextLeft();
    ledMatrix.drawText();
    ledMatrix.commit();
    delay(50);
  }
}

void displayNextData(){
String wifistatus = "WIFI OK"; 

 WiFiClientSecure client; 
 if (!client.connect(host, httpsPort)) { 
   String wifistatus = "WIFI FAIL"; 
   Serial.println("connection failed"); 
   return; 
 } 
 if (client.verify(fingerprint, host)) { 
   Serial.println("certificate matches"); 
 } else { 
   Serial.println("certificate doesn't match"); 
 } 
 client.print(String("GET ") + url + " HTTP/1.1\r\n" + 
              "Host: " + host + "\r\n" + 
              "User-Agent: BuildFailureDetectorESP8266\r\n" + 
              "Connection: close\r\n\r\n"); 
 Serial.println("request sent"); 
 while (client.connected()) { 
   String line = client.readStringUntil('\n'); 
   if (line == "\r") { 
     Serial.println("headers received"); 
     break; 
   } 
 } 
 // Recup du JSON 
 String line = client.readStringUntil('\n'); 
 DynamicJsonBuffer jsonBuffer; 
 JsonObject& root = jsonBuffer.parseObject(line); 
 int fancount = root[String("fan_count")]; 
 if (fancount > 0) { 
   Serial.print("Fans: "); 
   Serial.println(fancount); 
   scrollValueAndStop(formatData(fancount));
 } else { 
   scrollValueAndStop("Erreur Json");
 } 
 delay(70000); 
} 
void scrollValueAndStop(String value){
  int lengthToScroll = value.length() * CHAR_WIDTH + 1;
  ledMatrix.setText(value);
  for (int i = 0; i < lengthToScroll; i ++){
    ledMatrix.clear();
    ledMatrix.scrollTextLeft();
    ledMatrix.drawText();
    ledMatrix.commit();
    delay(50);
  }
}

String formatData(int data){
  int beforeDecimal;
  int afterDecimal;
  if(data < 10000) {
    return String(data);
  }
  if(data < 1000000) {
    return String(data/1000) + "K";
  } else {
    return String(data/1000000) + "M";
  }
}

void loop() {
  
  if (millis() > display_due_time)  {
    displayNextData();
    display_due_time = millis() + display_delay;
  }

}

Tu n’en dis pas assez.
Quel matériel utilises-tu ? Un ESP8266 ? Alimenté comment ?
Combien de matrices de leds ? Branchées comment et sur quelle pin ?
Que se passe-t-il pour le mot CONNECTED? Est-ce qu’il défile sur les matrices ? Et le mot BONJOUR ?

Sinon, dans ton code, je pense qu’il faudrait mettre un else au début de cette ligne

  if(data < 1000000) {

Bonjour et merci pour la réponse.

J'utilise un ESP8266 (LOlin v3 Nodemcu) alimenté par USB
J'ai 4 matrices LED soudées comme suit :

VCC 3V
GND G
DIN D7
CS D3
CLK D5

Le mot "Connected" défile bien et laisse place au "Bonjour" qui défile et s'arrête quand la dernière lettre atteint la première matrice.

Je vais essayer avec le "else".

Edit : Ca n'a rien changé, ça se stoppe toujours sur le "Bonjour"
Sachant que à part "Connected" et "Bonjour", rien d'autre ne s'affiche avant.

Je ne disais pas qu'ajouter le else allait arranger le problème, mais qu'il provoquerait un problème plus tard alors autant le mettre maintenant...

Essaye

unsigned long display_due_time = 0;

Essaye
Code: [Select]
unsigned long display_due_time = 0;

Pas de changement. :confused:

Qu'est ce qui est écrit sur la console série de l'IDE arduino ?

Qu'est ce qui est écrit sur la console série de l'IDE arduino ?

Connecting
Connected, IP address: 192.168.0.16
connection failed
connection failed
connection failed

On dirait que ça vient de là, non?

// Facebook 
const char* host = "graph.facebook.com"; 
const String url = "/v3.2/URL?fields=fan_count&access_token=TOKEN"; 
const int httpsPort = 443; 
const char* fingerprint = "lefingerprintSSL";

J'ai bien remplacé dans mon code TOKEN et URL par les miens mais je n'ai ni changé "graph.facebook.com"
ni le port ni le fingerprintSSL

L'erreur vient de ça

if (!client.connect(host, httpsPort)) { 
   String wifistatus = "WIFI FAIL"; 
   Serial.println("connection failed"); 
   return; 
 }

Donc soit le host soit le port soit les deux sont incorrects.
As-tu cherché d'autres codes similaires ?

Oui ça fait un petit moment que je cherche des codes pour ce compteur et celui qui colle à ma config c'est celui là.
Et oui il me semble que c'est le bon host httpsPort.

En tout cas merci de m'avoir aidé à cibler le problème, je vais gratter et je reviendrais dès que ça aura progressé.

Bon courage

Merci

Essaye d'ajouter

client.setInsecure();

Après la ligne

WiFiClientSecure client;

Il y a un projet dont tu peux t'inspirer : Compteur Facebook en temps réel - Réalisations et Projets Finis - Arduino Forum

L'affichage est fait sur un afficheur TM1637 à 7 segments mais cela ne fait pas une grosse différence.

Bonjour et bon dimanche !

On progresse et je vous remercie !

J'ai rajouté la ligne de lesept et maintenant dans la console serial il s'affiche ceci :

Connected, IP address: 192.168.0.16
certificate matches
request sent
headers received

Mais sur ma matrice le message "erreur Json" apparaît.

J'ai déjà vu cette réalisation hbachetti et elle est bien cool mais il utilise une page internet en php et j'aimerais que tout soit contenu dans le code de l'esp8266.

En testant la requête pour facebook, ça me renvoie ça :

{
   "error": {
      "message": "(#100) Tried accessing nonexisting field (fan_count) on node type (Application)",
      "type": "OAuthException",
      "code": 100,
      "fbtrace_id": "AZ8i8rufivK-qcPd6vf704N"
   }
}

Ca y est, ça marche, la dernière erreur venait de l'adresse URL pour la requete facebook, j'ai changé le token et l'adresse de la page et ça fonctionne, j'ai aussi renseigné que c'était en version 3.3 de l'api.

En tout cas, ça fonctionne, merci pour votre aide !

Super !

Bonjour, j'essaye depuis quelques temps de faire la même manipulation que vous (récupérer les likes en mettant le code dans l'ESP et afficher sur un MAX)... mais je coince aussi. Pourriez-vous partager votre code final ?
Je ne suis pas très sûr non plus de mes Token et OD d'accès à Facebook car c'est moins simple de tester que ceux-ci renvoient bien quelque chose qu'avec une API You Tube (que j'ai réussi à faire fonctionner).
Merci à vous.