Accueil > NodeMCU > NodeMCU : Infrarouge

NodeMCU : Infrarouge

Toujours avec la platine de test, je me suis penché sur l’utilisation de la librairie IRremoteESP8266 afin de pouvoir décoder quelques télécommandes TV et de pouvoir envoyer un code Infrarouge via un serveur Web.

Les étapes du programme :
– Initialisation du WiFi en mode client et en point d’accès.
– Affichage de l’adresse IP du client et du point d’accès sur l’écran OLED SSD1306.
– Attente de réception d’un code Infrarouge et affichage minimal de celui-ci (type encodage, nombre de bits, code).
– Serveur Web pour émettre un code Infrarouge.
Quand le NodeMCU démarre au bout d’un moment on voit apparaître les informations suivantes :

Si on utilise une télécommande TV Infrarouge, le NodeMCU le détecte et si le protocole est reconnu, l’écran OLED affiche les informations suivantes :
A partir de la page Web en entrant l’adresse IP du NodeMCU, on peut émettre le code :
Tout les types de protocole ne sont pas représentés sur la page Web, j’y ai mis l’essentiel :
Le code sera le suivant :
/*
 * Programme de gestion infrarouge
 * Réception IR avec affichage des informations sur OLED SSD1306
 * Emission IR à partir d’une page WEB
 *
 * Matériel :
 *        NODEMCU V1.0 DEV Kit
 *        OLED SSD1306
 *        1 récepteur IR 38 KHz
 *        1 LED IR
 */
 // Ajout librairie gestion OLED, I2C, Infrarouge,WIFI et WEB
#include <Wire.h>
#include « SSD1306.h »
#include <ESP8266WiFi.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRsend.h>
#include <IRutils.h>
#include <ESP8266WebServer.h>
// Déclaration de l’afficheur OLED via I2C
// D1 -> SDA
// D2 -> SCL
SSD1306  display(0x3c, D1, D2);
// Déclaration WIFI
const char* ssid     = « wifi_ssid »;
const char* password = « mot_de_passe »;
const char* ssid_apmode = « Fabrice »;
const char* password_apmode = «  »;
// Déclaration Infrarouge
#define RECV_PIN 14 // démodulateur IR GPIO pin 14 –> D5
IRsend irsend(12);  // LED IR GPIO pin 12 –> D6
#define CAPTURE_BUFFER_SIZE 1024
#define TIMEOUT 50U // 50 ms sans signaux pour considérer que la réception du code est complète
#define MIN_UNKNOWN_SIZE 12 // on peut augmenter cette valeur si on reçoit des faux signaux de type unknown
IRrecv irrecv(RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, true);
decode_results results;
// Création d’une instance serveur
ESP8266WebServer server(80); // port d’écoute 80
// Création de la page HTML
static const char *indexhtml = « <html>\n »
« <form action=\ »/sendIR\ » method=\ »POST\ »>\n »
    « Encodage &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp: <input type=\ »radio\ » name=\ »encodage\ » value=\ »JVC\ »> JVC\n »
    « <input type=\ »radio\ » name=\ »encodage\ » value=\ »LG\ »> LG\n »
    « <input type=\ »radio\ » name=\ »encodage\ » value=\ »NEC\ »> NEC\n »
    « <input type=\ »radio\ » name=\ »encodage\ » value=\ »RC5\ »> RC5\n »
    « <input type=\ »radio\ » name=\ »encodage\ » value=\ »RC6\ »> RC6\n »
    « <input type=\ »radio\ » name=\ »encodage\ » value=\ »SAMSUNG\ »> SAMSUNG\n »
    « <input type=\ »radio\ » name=\ »encodage\ » value=\ »SONY\ »> SONY</br>\n »
    « Nombre de bits : <input type=\ »number\ » name=\ »nbr_bits\ » placeholder=\ »Nombre de bits\ »></br>\n »
    « Code hexa &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp: <input type=\ »text\ » name=\ »code\ » placeholder=\ »0x\ »></br>\n »
    « <input type=\ »submit\ » value=\ »Envoyer\ »>\n »
« </form>\n »
« <p>\n »
« </html>\n »;
void handleRoot()
{
  server.send(200, « text/html », indexhtml);
}
void handlesendIR()
{
  if ( ! server.hasArg(« encodage ») || ! server.hasArg(« nbr_bits ») || ! server.hasArg(« code »)
      || server.arg(« encodage ») == NULL || server.arg(« nbr_bits ») == NULL || server.arg(« code ») == NULL)
  {
    server.send(400, « text/plain », « 400: Requete invalide »);
    return;
  }
  int16_t bits = strtol(server.arg(« nbr_bits »).c_str(), NULL, 0); // transforme le string en nombre
  int64_t code = strtol(server.arg(« code »).c_str(), NULL, 0); // transforme le string en nombre
  irrecv.disableIRIn();  // arrête la réception IR
  if (server.arg(« encodage ») == « JVC ») {irsend.sendJVC(code, bits);}
  if (server.arg(« encodage ») == « LG ») {irsend.sendLG(code, bits);}
  if (server.arg(« encodage ») == « NEC ») {irsend.sendNEC(code, bits);}
  if (server.arg(« encodage ») == « SAMSUNG ») {irsend.sendSAMSUNG(code, bits);}
  if (server.arg(« encodage ») == « RC5 ») {irsend.sendRC5(code, bits);}
  if (server.arg(« encodage ») == « RC6 ») {irsend.sendRC6(code, bits);}
  if (server.arg(« encodage ») == « SONY ») {irsend.sendSony(code, bits);}
  server.send(200, « text/plain », « Envoi code Infrarouge »);
  display.clear();
  display.drawString(15, 0, « Emission Infrarouge »);
  display.drawString(0, 10, « Encodage : »);
  display.drawString(55, 10, server.arg(« encodage »));
  display.drawString(0, 20, « Bits : »);
  display.drawString(55, 20, server.arg(« nbr_bits »));
  display.drawString(0, 30, « Code : »);
  display.drawString(55, 30, server.arg(« code »));
  display.display();
  irrecv.enableIRIn();  // démarre la réception IR
}
void handleNotFound()
{
  server.send(404, « text/plain », « Not Found »);
}
void setup()
{
  int x = 0;
  char adr_ip[20];
  char adr_ip_apmode[20];
  IPAddress ip;
  String ipStr;
  Serial.begin(115200);
  display.init(); // initialise l’afficheur
  display.flipScreenVertically(); // inverse l’affichage
  display.setFont(ArialMT_Plain_10);
  WiFi.begin(ssid, password);
  display.clear(); // efface l’affichage
  display.drawString(10, 0, « Connexion WIFI en cours »);
  display.display(); // affichage
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    display.drawString(x, 10, « . »);
    display.display();
    x = x+5;
  }
  ip = WiFi.localIP();
  ipStr = String(ip[0]) + ‘.’ + String(ip[1]) + ‘.’ + String(ip[2]) + ‘.’ + String(ip[3]);
  ipStr.toCharArray(adr_ip, 20);
  WiFi.softAP(ssid_apmode, password_apmode, 10);
  ip = WiFi.softAPIP();
  ipStr = String(ip[0]) + ‘.’ + String(ip[1]) + ‘.’ + String(ip[2]) + ‘.’ + String(ip[3]);
  ipStr.toCharArray(adr_ip_apmode, 20);
  display.clear(); // efface l’affichage
  display.drawString(20, 0, « WIFI connecté »);
  display.drawString(0, 10, « IP mode Station : »);
  display.drawString(40, 20, (adr_ip));
  display.drawString(0, 30, « IP mode AP : »);
  display.drawString(40, 40, (adr_ip_apmode));
  display.display();
  server.on(« / », handleRoot);
  server.on(« /sendIR », handlesendIR);
  server.onNotFound(handleNotFound);
  server.begin(); // démarre le serveur HTTP
  irrecv.setUnknownThreshold(MIN_UNKNOWN_SIZE);
  irrecv.enableIRIn();  // démarre la réception IR
  irsend.begin();
}
void loop()
{
  server.handleClient();
  // Teste si un code IR a été reçu
  if (irrecv.decode(&results))
  {
    display.clear();
    if (results.overflow)
      Serial.printf(« Attention : le code Infrarouge est trop grand pour le buffer (>= %d). « 
                    « Editer et augmenter CAPTURE_BUFFER_SIZE.\n », CAPTURE_BUFFER_SIZE);
    // affiche le type d’encodage et le code
    Serial.print(resultToHumanReadableBasic(&results));
    yield();
    display.drawString(15, 0, « Réception Infrarouge »);
    display.drawString(0, 10, resultToHumanReadableBasic(&results));
    display.display();
    // affiche les informations brutes
    Serial.println(resultToTimingInfo(&results));
    yield();
    // affiche les informations en tant que code source
    Serial.println(resultToSourceCode(&results));
    Serial.println(«  »);  // Blank line between entries
    yield();
  }
}
Publicités
Catégories :NodeMCU Étiquettes : , , ,
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :