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 :
<?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
#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 !