Go Down

Topic: Compteur Facebook en temps réel (Read 341 times) previous topic - next topic

achappard

Bonjour à tous,

Je suis tout heureux de vous présenter mon tout premier projet Arduino. C'est une compteur de likes Facebook en temps réel pour l'espace de coworking où je travaille comme développeur web à Lyon : Ecoworking.

Voici le rendu final :



L'idée de départ avait été d'utiliser un arduino nano et un carte esp8266 (ESP-01). Mais je n'ai jamais réussi à faire communiquer l'ESP-01 avec l'arduino. Je me suis donc rabattu sous les précieux conseils de @hbachetti vers une carte ESP8266 NodeMcu WiFi Development Board.

Voici le lien du forum où les aspects techniques ont été discutés.

Côté affichage, j'utilise un afficheur 6 digit 7segments TM1637 ainsi qu'une led bleue.

Fonctionnement :

  • L'ESP est connecté au réseau Wifi de l'espace de coworking.
  • Toutes les 30 secondes, j'interroge une page web qui me renvoie le nombre de likes Facebook de la page Ecoworking. J'aurais pu éventuellement interroger directement l'api Facebook pour avoir ce résultat mais cette dernière change régulièrement. Donc si il y a un changement du côté de l'API de facebook,   il faudra seulement changer le code de la page web et non le programme embarqué dans l'ESP.
  • A chaque changement du nombre de likes, je fais clignoter une led située sur le bouton de manchette du logo pouce en l'air de Facebook.
  • Enfin, si lors du changement, il y a une augmentation du nombre de likes, je fais flotter quelques instants un petit drapeau de remerciement relié à un servo-moteur.



Alimentation :
  • La carte ESP-12E est alimentée grâce à cable USB relié à un transformateur.
  • Le TM1637 est alimenté directement depuis la carte en 3,3V. La Led aussi.
  • Le servo lui demande une alimentation plus élevée (6 Volts) J'ai donc rajouter un boitier de 4 piles 1,5V qui alimente juste celui-ci.



Montage :
Le montage est simple :

Sur ce dernier, je n'ai pas trouvé dans Fritzing le battery holder 4x1.5V mais dans le montage final, j'ai bien 4 piles. On peut voir que la masse de la batterie de piles est reliée à la masse de l'ESP-12E. J'ai aussi une résistance de 220 Ohm pour protéger la led.

Code
Page web :
Afin de pouvoir récupérer le nombre de like, il faut créer une application facebook et utiliser le SDK de facebook. Pour ma part, j'utilise PHP tout les jours donc je me suis tourné vers le SDK Facebook PHP

Code php de la page web hébergée : cette dernière renvoie un simple json :
Code: [Select]

<?php
require_once __DIR__ '/vendor/autoload.php';
$total_like get_total();

header('Content-type: application/json');
$data = [ 'fan_count' => $total_like];
echo 
json_encode($data);
die();

function 
get_total(  ) {
$fb = new \Facebook\Facebook([
'app_id' => 'renseignez_ici_l_id_de_votre_app',
'app_secret' => 'renseignez_ici_la_cle_secrte_de_votre_app',
'default_graph_version' => 'v3.2',
]);

try {
$response $fb->get('/ecoworking.fr?fields=fan_count'$fb->getApp()->getAccessToken());
$decodedBody $response->getDecodedBody();
return $decodedBody['fan_count'];
} catch(\Facebook\Exceptions\FacebookResponseException $e) {
print_r($e);
// When Graph returns an error
return 0;
exit;
} catch(\Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
print_r($e);
return 0;
exit;
}
}


Cette page web est donc hébergée sur la toile, disons pour l'exemple sur une adresse de type http://mon-compteur-facebook-pour-ecoworking.com

Code du programme de la carte
Code: [Select]

#include <Servo.h>
#include <Arduino_JSON.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include "TM1637_6D.h"

const char* ssid = "ssid_du_ reseau_wifi_du_coworking";
const char* password = "mot_de_passe_wifi_du_reseau";
const String ecoworking_get_fans_count_url  = "http://mon-compteur-facebook-pour-ecoworking.com";
unsigned int display_count = 0;

//Définition des pins pour la led facebook
#define FB D4

//Définition des pins pour l'afficheur TM1637
#define CLK D3
#define DIO D2

//Servo
#define PIN_SERVO  D5

// Déclaration de l'afficheur
TM1637_6D tm1637_6D(CLK, DIO);

//Servo
Servo monServo;


void setup () {
  pinMode(FB, OUTPUT);
  digitalWrite(FB, LOW);

  tm1637_6D.init();
  tm1637_6D.set(BRIGHTEST);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
  tm1637_6D.displayError();

  // Servo
  monServo.attach(PIN_SERVO);
  monServo.write(0);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
  }
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
    unsigned int current_fan_count = retrieve_fb_fan_count();
    tm1637_6D.displayInteger(current_fan_count, false);

    if (current_fan_count != display_count) {
      blink_led();
      if ( current_fan_count > display_count && display_count != 0 ) {
        show_flag();
      }
      display_count = current_fan_count;
    }
  }
  delay(30000);    //Send a request every 30 seconds

}

void show_flag() {
  int wait_time = 500;
  int angle_min = 65;
  int angle_max = 135;

  for (int i = 0; i < 3; i++) {
    monServo.write(angle_max);
    delay(wait_time);
    monServo.write(angle_min);
    delay(wait_time);
  }

  monServo.write(angle_max);
  delay(wait_time);
  monServo.write(0);
}

void blink_led() {
  for (int i = 0; i < 10; i++) {
    digitalWrite(FB, HIGH);
    delay(40);
    digitalWrite(FB, LOW);
    delay(40);
  }
}


int retrieve_fb_fan_count() {
  HTTPClient http;  //Declare an object of class HTTPClient

  http.begin(ecoworking_get_fans_count_url);  //Specify request destination
  int httpCode = http.GET();                                                                  //Send the request

  if (httpCode > 0) { //Check the returning code
    String payload = http.getString();          //Get the request response payload
    JSONVar myObject = JSON.parse(payload);     // Convert to json
    if (JSON.typeof(myObject) == "undefined") {
      return 0; // erreur
    }
    if (myObject.hasOwnProperty("fan_count")) {
      return (int) myObject["fan_count"];
    }
  }
  http.end();   //Close connection
  return 0;
}


Et voici la vidéo !

J-M-L

jolie réalisation - merci pour le partage !
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Zlika

Oui en effet.

Indispensable pour les accrocs des 'likes'.
Tu vas faire des envieux.  :)
Si ça coince, forcez. Si ça casse, ça devait probablement être réparé, de toute façon.

Go Up