Go Down

Topic: Mon 1er projet Arduino Uno R3 + ethernet shield + telecommande 433Mhz (Read 1 time) previous topic - next topic

azebest

Bonjour,

Voici mon 1er projet Arduino commande de prises electriques par Internet.
Le but est d'allumer ou d'éteindre plusieurs prises électriques (5 dans mon cas, mais on peut aller jusqu'à 8.) sur lesquelles sont branchées des lampes afin de simuler à distance la présence de personnes dans une maison. Ca peut servir aussi à la commande de radiateurs électriques ou autres !


Il se divise en 2 parties :

- une partie codage, envoi des signaux via la télécommande 433Mhz
- une partie interface Web, récupérer l'information à chaque appui d'un bouton sur une page html.

Partie Télécommande / codage :

J'ai utilisé le boitier emetteur que j'avais déjà..




La télécommande 433Mhz peut piloter 4x2 = 8 prises électriques 220V via un recepteur par prise.

Le circuit intégré dans le télécommande est un HS2262A-R4, il a fallu que je décode la doc technique en chinois pour savoir où récupérer les informations du codage pour l'émission 433Mhz.
(vous trouverez la doc sur le net)



Bref, ce qu'il nous faut c'est simuler l'appui sur un bouton ON et OFF pour chaque prises (ça fait 16 commandes différentes!)

En fait le CI fait ceci sur 4 bits A1, A2, A3 et A8

Telecommande CI = HS2262A-R4
Pin out du CI
pin2 = A1 = fil jaune
pin3 = A2 = fil blanc
pin4 = A3 = fil bleu
pin 10 = A8 = fil violet
pin 18 = VCC = fil orange
pin 9 = GND = fil noir
base transistor cde du VCC = fil vert

J'ai donc soudé des fils en direct sur le CI pour aller vers la carte UNO R3.






Ensuite, j'ai récupéré les infos binaires pour chaque appui sur les 16 combinaisons possibles.

J'en ai déduit un tableau et j'ai fait le programme en fonction de ça.

Partie Internet / Interface html :

j'ai pompé à droite à gauche des infos sur : comment afficher des boutons sur une page html et traiter l'information à chaque appui sur le bouton.

Voici la programme ARDUINO :

***************************************************************************

/* controle ON OFF de 5 boitiers receivers via internet, puis remote control 433Mhz ALL on ALL off
dans cet exemple, 5 recepteurs seront utilisés et seront tous allumés ou tous éteints en même temps

Telecommande CI = HS2262A-R4
Pin out du CI
pin2 = A1 = fil jaune
pin3 = A2 = fil blanc
pin4 = A3 = fil bleu
pin 10 = A8 = fil violet
pin 18 = VCC = fil orange
pin 9 = GND = fil noir
base transistor cde du VCC = fil vert
codage simple sur 4 bits (A1,A2,A3,A8)

*/

#include <Ethernet.h> // inclut la librairie Ethernet pour la carte Ethernet Shield
#include <SPI.h>

String inString = String(20); // Tampon de réception des caractères
byte etat1=1;

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x2E, 0x67 }; // Adresse MAC à adapter en fonction de votre shield
byte ip[] = { 192, 168, 0, xx }; // Adresse locale à adapter en fonction de votre réseau

EthernetServer server(yyyy); // choississez un port libre adresse 192.168.0.x:yyyy pour avoir accès à la page. attention il faut aussi parametrer la box afin de rediriger les ports,....

#define jaune 2 // fil jaune connecté à D2
#define blanc 3 // fil blanc connecté à D3
#define bleu  4 // fil bleu connecté à D4
#define violet 5 // fil violet connecté à D5
#define vert 6 // fil vert connecté à D6


void setup()
{
 Ethernet.begin(mac, ip);
 server.begin();
 
 pinMode(jaune, OUTPUT); // le fil jaune (Digital 2) est déclaré en sortie
 pinMode(blanc, OUTPUT);
 pinMode(bleu, OUTPUT);
 pinMode(violet, OUTPUT);
 pinMode(vert, OUTPUT);
   
 digitalWrite(jaune, LOW);  // config de base toutes les entrées à 0
 digitalWrite(blanc, LOW);  
 digitalWrite(bleu, LOW);
 digitalWrite(violet, LOW);  
 digitalWrite(vert, HIGH);  // emetteur OFF, il faut mettre un niveau 1 pour mettre hors tension l'emetteur
}

void loop()
{

 EthernetClient client = server.available();
 
 if (client) {

   boolean current_line_is_blank = true;
   while (client.connected()) {
   
     if (client.available()) {
     
       char c = client.read();
       if (inString.length() < 20) {
           inString.concat(c);
        }
       if (c == '\n' && current_line_is_blank)
         {
          if(inString.indexOf("B1")>0){ // Le bouton 1 a été actionné, ne me demandez pas comment ça marche je ne connais pas
           
           allON(); //appelle la fonction "allON" : envoi de 5 codes pour allumer 5 recepteurs   (j'avais seulement 5 recepteurs mais on peut en mettre 8.)        
         }
           
          if(inString.indexOf("B2")>0){ // Le bouton 2 a été actionné, idem
           
           allOFF(); // appelle la fonction "allOFF" : envoi de 5 codes pour éteindre 5 recepteurs            
         }
       // Envoi d'un en-tête http standard
         client.println("HTTP/1.1 200 OK");
         client.println("Content-Type: text/html");
         client.println();
         
       // Affichage de la page html

           client.println("<html><body><h1>Home Light Control by Internet Copyright Azebest</h1><font size= 4><form method=GET>"); // Titre et début méthode GET
 
           client.print("<br><input type=submit name=B1 value=Lights_ON>"); // Affiche le Bouton "Lights_ON"
           
                       
           client.print("<br><input type=submit name=B2 value=Lights_OFF>"); // Affiche le Bouton "Lights_OFF"
                     
                       
           client.println("</form></body></html>"); // Fin de la méthode GET
 
         break;
       }
       if (c == '\n') {
         // Debut d'une nouvelle ligne
         current_line_is_blank = true;
       } else if (c != '\r') {
         // Caractère reçu sur la ligne courante
         current_line_is_blank = false;
       }
     }
   }
   // Donne le temps au navigateur de traiter les données
   delay(1);
   inString = "";
   client.stop();
 }
}
void emetoff() //fonction emetoff permet de laisser un peu de temps (250ms) à l'emetteur d'emettre le signal et revient sur OFF
     {
       delay(250);
       digitalWrite(jaune, LOW);  
       digitalWrite(blanc, LOW);  
       digitalWrite(bleu, LOW);
       digitalWrite(violet, LOW);  
       digitalWrite(vert, HIGH);  // emetteur OFF
     }      

void allON() // chaque sequence envoi un code qui sera reçu par le recepteur en question
{
     // switch on receiver 1
     digitalWrite(jaune, HIGH);  
     digitalWrite(blanc, HIGH);  
     digitalWrite(bleu, HIGH);
     digitalWrite(violet, HIGH);  
     digitalWrite(vert, LOW);  // emetteur ON
       {
       emetoff();
       }
       // switch on receiver 2
     digitalWrite(jaune, LOW);  
     digitalWrite(blanc, HIGH);  
     digitalWrite(bleu, HIGH);
     digitalWrite(violet, HIGH);  
     digitalWrite(vert, LOW);  // emetteur ON
       {
       emetoff();
       }
       // switch on receiver 3
     digitalWrite(jaune, HIGH);  
     digitalWrite(blanc, LOW);  
     digitalWrite(bleu, HIGH);
     digitalWrite(violet, HIGH);  
     digitalWrite(vert, LOW);  // emetteur ON
       {
       emetoff();
       }
       // switch on receiver 4
     digitalWrite(jaune, LOW);  
     digitalWrite(blanc, LOW);  
     digitalWrite(bleu, HIGH);
     digitalWrite(violet, HIGH);  
     digitalWrite(vert, LOW);  // emetteur ON
       {
       emetoff();
       }
       // switch on receiver 5
     digitalWrite(jaune, HIGH);  
     digitalWrite(blanc, HIGH);  
     digitalWrite(bleu, LOW);
     digitalWrite(violet, HIGH);  
     digitalWrite(vert, LOW);  // emetteur ON
       {
       emetoff();
       }
}

void allOFF()
{
      // switch off receiver 1    
     digitalWrite(jaune, HIGH);  
     digitalWrite(blanc, HIGH);  
     digitalWrite(bleu, HIGH);
     digitalWrite(violet, LOW);  
     digitalWrite(vert, LOW);  // emetteur ON
       {
       emetoff();
       }
       // switch off receiver 2
     digitalWrite(jaune, LOW);  
     digitalWrite(blanc, HIGH);  
     digitalWrite(bleu, HIGH);
     digitalWrite(violet, LOW);  
     digitalWrite(vert, LOW);  // emetteur ON
       {
       emetoff();
       }
       // switch off receiver 3
     digitalWrite(jaune, HIGH);  
     digitalWrite(blanc, LOW);  
     digitalWrite(bleu, HIGH);
     digitalWrite(violet, LOW);  
     digitalWrite(vert, LOW);  // emetteur ON
       {
       emetoff();
       }
       // switch off receiver 4
     digitalWrite(jaune, LOW);  
     digitalWrite(blanc, LOW);  
     digitalWrite(bleu, HIGH);
     digitalWrite(violet, LOW);  
     digitalWrite(vert, LOW);  // emetteur ON
       {
       emetoff();
       }
       // switch off receiver 5
     digitalWrite(jaune, HIGH);  
     digitalWrite(blanc, HIGH);  
     digitalWrite(bleu, LOW);
     digitalWrite(violet, LOW);  
     digitalWrite(vert, LOW);  // emetteur ON
       {
       emetoff();
       }
       
}    
 

azebest

Notamment le bouquin Arduino Applications Avancées de DUNOD m'a bien aidé ! Merci !
Voici ce que j'obtiens sur ma page internet
il faut rentrer l'adresse dans la navigateur : 192.168.0.xx:yyyy (correspondant à votre adresse et port box)



azebest

pour avoir accès à votre box via internet depuis partout dans le monde il faut rentrer votre addresse IP fixe directement dans le navigateur suivi des 2 petits points et le port utilisé et autorisé par votre box ":yyyy"

Artouste


...
Le circuit intégré dans le télécommande est un HS2262A-R4, il a fallu que je décode la doc technique en chinois pour savoir où récupérer les informations du codage pour l'émission 433Mhz.
...  
 

bonjour
compte tenu du circuit
tu aurais pu, plus simplement  (moins de gestion de pins ) utiliser la lib Rcswitch en recuperant simplement l'emmeteur RF de ta telco.  :smiley-mr-green:

Mais le principal , c'est ta demarche de resolution de ton probleme , c'est que  tu a fais,   comme ça fonctionne bien et comme tu le souhaite
et tu a bien raison de partager ton plaisir.

azebest

Oui Artouste j y ai bien pensé mais je ne maîtrise pas encore la lib rcswitch et comment cabler pour attaquer l émetteur RF de ka télécommande
Mais si tu as des informations la dessus je suis preneur. ..
Merci

Artouste


Oui Artouste j y ai bien pensé mais je ne maîtrise pas encore la lib rcswitch et comment cabler pour attaquer l émetteur RF de ka télécommande
Mais si tu as des informations la dessus je suis preneur. ..
Merci

fait des photos recto/verso plus precises de cette zone


de toutes façons la mise en forme par le CI est issue de DOUT de ton CI (pin17)

azebest

Oui c po faux ! Mais je n ai pas de récepteur 433Mhz pour le connecter à la carte Uno pour ensuite récupérer les informations et les decoder
et pas eu le temps de me pencher sur le RC Switch mais oui je suis d'accord comme ça j utiliserai qu'une sortie !

Artouste


Oui c po faux ! Mais je n ai pas de récepteur 433Mhz pour le connecter à la carte Uno pour ensuite récupérer les informations et les decoder
et pas eu le temps de me pencher sur le RC Switch mais oui je suis d'accord comme ça j utiliserai qu'une sortie !

Mais si , mais si  :smiley-mr-green:
il y en a evidemment un dans chaque prise  8)
et parfaitement connectable sur arduino

bienvenu dans le monde de la bidouille (hack)  :smiley-mr-green:

mais savoure déjà ce que tu a fait par toi meme , tu verra plus tard si tu souhaite faire autrement.

un des avantages de ta solution est de ne pas se preoccuper en soft du code d'association E/R 

azebest

oui car j'ai envie de dire, ça marche à la perfection comme ça !!!!
c'est juste que j'utilise 5 sorties pour faire le codage, mais peu importe car je ne me sers pas des autres....  XD XD XD

par contre je voudrais faire la même chose avec la télécommande de mes volets roulants Bubendoorf : voici la télécommande en question.
elle est programmable pour un volet unique et également en restant appuyé dessus 2s sur les 2 boutons en même temps on peut piloter tous les volets.

si vous avez des infos sur ce genre de télécommande je suis preneur....




merci !

azebest


Artouste


personne n'a jamais décodé cette télécommande ?

il semble que ce soit un protocole proprietaire (et sur du 868 pas du 433) et que personne ne soit attelé a le "comprendre".

C'est peut etre et meme surement possible de "trouver" , mais cela demande de l'envie, du temps et un peu de moyens technique.

sur ce forum , nous etions quelques un à s'etre attaqué au protocole blyss
pour te donner une idée de la methode et si tu a le courage
lis ça (attention 20 pages)
http://forum.arduino.cc/index.php/topic,109892.0.html

resumé sur le blog de skywodd
http://skyduino.wordpress.com/2012/07/17/hack-partie-1-reverse-engineering-des-interrupteurs-domotique-blyss/

et synthese sur le wiki de barbudor
https://barbudor.wiki.zoho.com/Syst%C3%A8me-domotique-Blyss-de-Castorama.html



autant en ce qui me concerne , cela ne m'a pas perturbé juste pour le fun d'investir qq 10zaines d'euro en materiel blyss,
mais il est sur que je n'irais pas acheter un volet roulant "juste pour voir"  :smiley-mr-green:

azebest

ok donc j'abandonne et je vais prendre une télécommande dont je vais simuler l'appui sur les boutons, ça sera plus simple...

Go Up