Go Down

Topic: Arduino, Domotique, Pleins de questions : Un Appel à toute la communauté (Read 2818 times) previous topic - next topic

Sleashe

Hello à tous,

Je monopolise un peu le truc, j'espère que personne ne m'en voudra mais je lance pleins de questions qui me tournent dans la tête depuis quelques mois sur un projet que j'aimerai lancer.

Voilà, je tripatouille un peu l'arduino mais rien de bien concret depuis quelques temps. Passioné par la domotique (encore un me direz vous) je cherche à créer un système très simple de gestion de capteurs, sensors dans la maison (Pour l'instant pas de contrôle des lumières etc, mais juste des detecteurs de temperature, lumières allumées, detecteurs de présence, et j'en passe)

J'ai pas mal réfléchit à la question et je pense procéder de la façon suivante :

1- Je pense mettre une sorte de centrale, une carte arduino Uno qui permet de collecter et de présenter sous forme de page web les infos collectées des sensors.
2- Je cherche a créer des sensors "cheap", de sorte à faire un système de "j'achete une petit sensors, je le plug avec ma central, y'en a pour moins de 20€ et ca marche dessuite"
3- De ce fait la communication entre les sensors et la centrale se ferait ou moyen de module radios de chez sparkfun.

Conclusion : "le Centrale" : Cazrte ARduino Uno + Emetteur et Recepteur RF (SparkFun)
"les Sensors" : Carte Arduino Nano + Emetteur et/ou Recepteur RF (SparkFun) + Sensor (Température par exemple)

Les soucis qui se posent :
Faire communiquer X modules sur un même bande de fréquence pose des problèmes de collision sur le support, de données éronnées etc... De ce fait il faut mettre en place un protocole de communication.

Pourquoi par radio fréquence et pas Wifi, xBee ou encore bluetooth me direz vous ? Le coût des composants, mes amis, le coût....

1- Le premier auquel j'ai réfléchit est un protocole de Time Slots Division. Chaque sensor se voit allouer un intervalle de temps sur lequel il peut communiquer. Problèmes, les sensors doivent être equipés d'emméteurs RF et de récépteurs RF puisque qu'il faut en permanence synchroniser les horloges des sensors avec la base.
2- Seconde idée, mettre en place un système de maitre esclave, ou la base demande periodiquement aux sensors s'ils ont quelques chose à dire, si c'est le cas l'information est transmise. Les sensors ne débute donc pas la communication. Cette solution pose les mêmes problèmes que précédemment.

Le problème général des solutions est l'activité permanente des sensors, qui sont solicités soit pour répondre au central maître (j'ai un truc à dire ou non je boude) ou pour synchroniser son horloge. Or si mes sensors sont alimentés par une source externe, genre piles, j'ai peur que ce soit trop gourmant.

J'en appel à vous tous afin d'avoir l'avis de spécialistes, que vous me disiez si mes réfléxions sont  pertinentes ou tordues, si c'est n'importe quoi ou irréalisable (ce que je ne pense pas mais on sais jamais). Et surtout si vous avez eu a faire à ce genre de problématiques dans vos projets persos.

Dans tout les cas, je vous remercie tous grandement par avance, pour les réponses que vous pourrez m'apporter et pour ce forum, qui est une mine d'or et sans lequel je serai encore bloqué à essayer d'allumer une led :D

Sleashe


-Standby

Woow, une carte arduino c'est overkill encore une fois de plus tu a plein de petit AVR qui font parfaitement l'affaire et qui vont te permettre de bien économiser ! Un ATmega 328p-pu c'est 3 dollars piéce.
The Mind is like a parachute it works best when opened.

Sleashe

Hello,

Merci pour ta réponse, mais étant un peu novice dans tout ses truc... C'est quoi un AVR ? et comment je l'utilise ?

skywodd

Bonjour,

Voila de quoi apporter de l'eau à ton moulin :
- nRF24L01+ (gestion auto des collisions / perte de paquet)
- ATmega328p et Arduino "breadboard"


Merci pour ta réponse, mais étant un peu novice dans tout ses truc... C'est quoi un AVR ? et comment je l'utilise ?

AVR c'est un type de microcontrôleurs conçu et fabriqué par ATMEL, micro utilisaient dans les cartes arduino justement (série ATmega328p pour la UNO).
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

sherif

bon soir à tous,
En faite Mon prog. permet d'enregistrer des codes IR infrarouges du (tv,DVD..)dans un tableau (tabIR)-->phase apprentissage.
A partir d'une page HTML on va envoyer des requêtes tell que(l'adresse de la case du tableau qui contient la code IR)
   Exemple: ("?03")-->[1][3] est la case du tableau
   La case contient la code IR( exemple codeIR :on/off=FE4378)

Au niveau de "la carte arduino avec sa shield ethernet" est connecter via un câble RG45 avec un routeur.
Si la requête est reçu (exemple =("?03")) on va accéder a la case [1][3] du (tabIR) et envoyer la codeIR.

-->!!!Le problème c'est que les 2 processus (la phase apprentissage et page HTML ) ne s'exécute pas les deux,seulement l'un des deux!!!!!!
*Si en désactive ""irrecv.enableIRIn();"" -->la page HTML s'exécute
*Si non la phase apprentissage est s'exécute facilement


Je vous remercie de votre avis et aide,
Cordialement,
voici mon code;





sherif


voila mon code;




//-- librairies utilisées pour le module Ethernet------------------
#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>
#include <Client.h>

//-- librairies utilisées pour la décodage des trames infrarouge-----------
#include <IRremote.h>

// --- Déclaration  tableau tabIR ---
#define TVCOL 0//colone de la télévision dans le tableau tabIR
#define DVDCOL 1//colone du DVD dans le tableau tabIR
#define RECCOL 2//colone du récepteur dans le tableau tabIR
#define COMMANDEOPTION 6//la taille de la colone du tabIR;



// --- Déclaration des variables globales  pour le module Ethernet ---

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0xEE, 0xA4 }; //physical mac address
byte ip[] = { 192, 168, 2, 11 }; // ip in lan
byte gateway[] = { 192, 168, 2, 10 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

String readString;

  decode_results tabIR[3][COMMANDEOPTION];//tableau des code IR (tabIR).
  int commandeOptionIndex = 0;
  int materielleIndex = 0;// materielle:TV,DVD,RECEPTEUR

// --- Déclaration des pin  ---

int RECV_PIN = 11;
int BUTTON_PIN = 2;
int STATUS_PIN = 8;

  //  -----------------------
IRrecv irrecv(RECV_PIN);//Création d'un objet IRrecv
decode_results results;//stocke les résultats de détecteur IR
IRsend irsend;
           
//-------- Storage for the recorded code--------------

int codeType =-9; // The type of code
unsigned long codeValue; // The code value if not raw
unsigned int rawCodes[RAWBUF]; // The durations if raw
int codeLen; // The length of the code
int toggle = 0; // The RC5/6 toggle state
// Stores the code for later playback
// Most of this code is just logging



//**************** FONCTION SETUP = Code d'initialisation *****
void setup()
{
  //start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
 
  Serial.begin(9600);  // Initialisation de la liaison série 
  irrecv.enableIRIn(); //// Re-enable receiver(Réactiver le récepteur)

  Serial.println("server code test 1.0"); // so I can keep track of what is loaded
  pinMode(BUTTON_PIN, INPUT);
  pinMode(STATUS_PIN, OUTPUT);

}


//-------- fon. tab--------------/

void storeCode(decode_results *results, decode_results tabIR[][COMMANDEOPTION]) {
 
  codeType = results->decode_type;
  int count = results->rawlen;//!!!!!!taille d resultat
  int i = 0;
 

//-------------codeType:est la protocole IR-----------
    if (codeType == NEC) {
      Serial.print("Received NEC: ");
      if (results->value == REPEAT) {
        // Don't record a NEC repeat value as that's useless.
        Serial.println("repeat; ignoring1.");
        return;
      }
    }
    else if (codeType == SONY) {
      Serial.print("Received SONY: ");
    }
    else if (codeType == RC5) {
      Serial.print("Received RC5: ");
    }
    else if (codeType == RC6) {
      Serial.print("Received RC6: ");
    }
    else {
      Serial.print("Unexpected codeType ");
      Serial.print(codeType, DEC);
      Serial.println("");
    }
    Serial.println(results->value, HEX);
   

 
 
   //-----------enregistrement des codes dand tabIR--------------
    tabIR[materielleIndex][commandeOptionIndex] = *results;
    if (commandeOptionIndex<6){
      commandeOptionIndex++;
    }else{
      commandeOptionIndex = 0;
      if(materielleIndex < 3)
        materielleIndex++;
    }//----------------fin enregistrement ------------------
   

}

 
  //--------------Affichage tabIR ----------------
void afficher(decode_results tabIR[3][COMMANDEOPTION]){
  Serial.println("Affichage du tableau des CODES OPTIONS:");
  int i = 0;
  int j = 0;
  for (i = 0; i<3 ; i++){
    switch(i){
     case 0 :
       Serial.println("Affichage du tableau des CODES OPTIONS TV:");
       break;
     case 1:
      Serial.println("Affichage du tableau des CODES OPTIONS DVD:");
      break;
     case 2:
      Serial.println("Affichage du tableau des CODES OPTIONS RECEPTEUR");
      break;
    }
    for (j = 0; j<COMMANDEOPTION ; j++){
      results=tabIR[j];
       Serial.println(results.value, HEX);
   
    }
   
  }
 
}

   

//----------------fon. send code ------------------
void sendCode(int repeat){
 
  if (codeType == NEC) {
    if (repeat) {
      irsend.sendNEC(REPEAT, codeLen);
      Serial.println("Sent NEC repeat");
    }
    else {
      irsend.sendNEC(codeValue, codeLen);
      Serial.print("Sent NEC ");
      Serial.println(codeValue, HEX);//codeValue est la code IR
    }
  }
  else if (codeType == SONY) {
    irsend.sendSony(codeValue, codeLen);
    Serial.print("Sent Sony ");
    Serial.println(codeValue, HEX);
  }
  else if (codeType == RC5 || codeType == RC6) {
    if (!repeat) {
      // Flip the toggle bit for a new button press
      toggle = 1 - toggle;
    }
    // Put the toggle bit into the code to send
    codeValue = codeValue & ~(1 << (codeLen - 1));
    codeValue = codeValue | (toggle << (codeLen - 1));
    if (codeType == RC5) {
      Serial.print("Sent RC5 ");
      Serial.println(codeValue, HEX);
      irsend.sendRC5(codeValue, codeLen);
    }
    else {
      irsend.sendRC6(codeValue, codeLen);
      Serial.print("Sent RC6 ");
      Serial.println(codeValue, HEX);
    }
  }
}



//--------------fon affichage page HTML---  +  traitement du msg pr l'envoie  --------------
void afficheHTML(){
     //en passe à la 2ème processus:             
   EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
          //Serial.print(c);
        }

        //if HTTP request has ended
        if (c == '\n') {

          ///////////////partie client
          Serial.println(readString); //print to serial monitor for debuging

          client.println("HTTP/1.1 200 OK"); //send new page
          client.println("Content-Type: text/html");
          client.println();

          client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
          client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
          client.println("<link rel='stylesheet' type='text/css' href='http://chriscosma.co.cc/a.css' />");
          client.println("<TITLE>Home Automation</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY>");
          client.println("<H1>Home Automation</H1>");
          client.println("<hr />");
          client.println("<br />");
     

           client.println("<a href=\"/?00\"\">Turn On TV</a>");
           client.println("<a href=\"/?01\"\">Turn Off TV</a>");
           client.println("<a href=\"/?02\"\">volume up TV</a>"); 
           client.println("<a href=\"/?03\"\">volume dwon TV</a>");
   
   
          client.println("</BODY>");
          client.println("</HTML>");

          delay(1);
          //stopping client
          client.stop();

   
          if(readString.indexOf("?03")>0)
          {
              results= tabIR[0][3];
              codeLen=results.bits;
              codeValue=results.value;
              sendCode(true);             
          }
          //clearing string for next read
          readString="";
          }
        }
      }
  }
  }
 


//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension
void loop() {
 
 
 
   afficheHTML();
 

  //"if" la condition est vérifier (bouton=1)--> réception des codesIR + enregistrement des codesIR dans tabIR + affichage la tabIR
  int buttonState = digitalRead(BUTTON_PIN);
 
if (buttonState) {

   if (irrecv.decode(&results)) {
        digitalWrite(STATUS_PIN,HIGH );
        irrecv.resume();
        storeCode(&results, tabIR);
        afficher( tabIR);
       
   digitalWrite(STATUS_PIN,LOW );
   delay(50); // Wait a bit between retransmissions
      }

  }
}

Go Up