433mhz recepteur problème

Bonjour à tous,
Cela fais maintenant quelques temps que je potasse avec mes deux récepteurs que j'ai acheté.
Je voudrais télécommander des prises chacon mais pour cela, j'ai besoin de trouvé le "code" que cette télécommande envoie.

Chez moi, la librairie RcSwitch ne fonctionne pas.
J'ai trouvé un membre du forum que j'ai déjà contacté ( et que je remercie au passage pour son aide et temps ) qui a eu le même soucis :
http://forum.arduino.cc/index.php?topic=168124.0
Avec le code de Artouse, j'obtiens aussi quelque chose du genre :

-- passe tempo --> SECTEURS PARCOURUS = 180
952;160;464;48;968;16;980;16;988;8;1968;52;956;40;1536;32;2036;580;496;20;140;172;80;84;248;80;56;260;120;72;948;48;936;56;944;64;708;104;36;140;932;72;956;48;712;44;1036;120;156;16;1844;68;416;28;504;44;700;144;56;232;584;96;44;8;12;128

Mais pas d'arrêt quand j'appuie sur ma télécommande.
J'ai ensuite essayé de prendre la librairie homeEasy, que je n'arrive pas à installer. Et virtualWire ne fonctionne qu'une fois sur deux et encore ...
Voici un post que j'ai créé il y a une bonne semaine sur le site du zéro en demandant des explications.(ici :http://www.siteduzero.com/forum/sujet/reception-en-433mhz-composant-grille-arduino). Soit dit en passant, j'ai assez bien détaillé le problème là bas :).
Visiblement d'autres personnes ont le même ennuis et n'arrive pas à régler le problème.
Je commence à me résoudre de soit, abandonner soit de d'acheter un matériel donc je suis sur du fonctionnement avec rcSwitch.

Donc, je demande soit à ceux qui ont le même problème de se manifester et pourquoi pas, ceux qui ont trouvé une solution ( parce que j'ai fouillé le net durant des heures mais peines perdue ... ) de pouvoir m'aiguiller.

Merci à tous,

VirtualWire ne fait pas de "séparation", il reçoit tout ce qui passe donc normal en 433 d'avoir un peu tout et n'importe quoi.

Si tu veux t'en sortir : idéalement avoir un oscillo (même quelques minutes) tu branches et tu vois la tronche du signal. Normalement tu verras un temps mort avant la commande proprement dite. Si tu n'as pas moyen de visualiser ton signal essaye ceci :

// je pars du principe que le l'entrée série du récepteur est branchée au pin 12

#include <VirtualWire.h>

uint8_t buf[VW_MAX_MESSAGE_LEN]; 
uint8_t buflen = VW_MAX_MESSAGE_LEN;

void setup() {

Serial.begin(9600);  
    vw_setup(2000); // vitesse à faire évoluer si ça ne convient pas

}

void loop() {

if(PulseIn(12,LOW)>=50) { // 50 à faire évoluer si ça ne marche pas, détection du "temps mort" 

if (vw_wait_rx_max(200)) 
    {
        if (vw_get_message(buf, &buflen))
        {
            Serial.print("RX : ");
            for (byte i = 0; i < buflen; i++) 
                Serial.print(buf[i]);
            Serial.println("");
        }
    }

}
}

Bonjour
J'ai essayé ceci et sa marche.
les émetteurs Chacon ont deux sortes de code la télécommande a un code "court", les interrupteurs un code long. Regarde sur le blog de idleman.
A+

[quote]
[color=#7E7E7E]/*[/color]
[color=#7E7E7E] * Code pour construction d'un recepteur "maison", recois un signal et ouvre ou ferme un port exterieur (relié par exemple a un relais)[/color]
[color=#7E7E7E] * Fréquence : 433.92 mhz[/color]
[color=#7E7E7E] * Protocole : home easy [/color]
[color=#7E7E7E] * Licence : CC -by -sa[/color]
[color=#7E7E7E] * Matériel associé : Atmega 328 (+résonateur associé) + récepteur RF AM 433.92 mhz + relais + led d'etat[/color]
[color=#7E7E7E] * Auteur : Valentin CARRUESCO  aka idleman (idleman@idleman.fr - http://blog.idleman.fr)[/color]
[color=#7E7E7E] * [/color]
[color=#7E7E7E] * Basé sur le travail de :[/color]
[color=#7E7E7E] * Barnaby Gray 12/2008[/color]
[color=#7E7E7E] * Peter Mead   09/2009[/color]
[color=#7E7E7E] */[/color]
 
 

[color=#CC6600]int[/color] recepteurPin = 2;
[color=#CC6600]int[/color] relaiPin = 10;
[color=#CC6600]int[/color] ledPin = 13;
[color=#CC6600]String[/color] stringOne;

struct config_t
{
  [color=#CC6600]long[/color] sender;
  [color=#CC6600]int[/color] receptor;
} signal;

struct signal_t
{
  [color=#CC6600]long[/color] sender;
  [color=#CC6600]int[/color] receptor;
  [color=#CC6600]boolean[/color] isSignal;
  [color=#CC6600]boolean[/color] state;
} receivedSignal;


[color=#CC6600]void[/color] [color=#CC6600][b]setup[/b][/color]()
{	[color=#CC6600]pinMode[/color](recepteurPin, [color=#006699]INPUT[/color]);
        [color=#CC6600]pinMode[/color](relaiPin, [color=#006699]OUTPUT[/color]);
        [color=#CC6600]pinMode[/color](ledPin, [color=#006699]OUTPUT[/color]);
	[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]begin[/color](9600);
        [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"start"[/color]);
        [color=#CC6600]digitalWrite[/color](ledPin,[color=#006699]HIGH[/color]);
}


[color=#CC6600]void[/color] [color=#CC6600][b]loop[/b][/color]()
{
  
       [color=#7E7E7E]//Ecoute des signaux[/color]
       listenSignal();
       
       [color=#7E7E7E]//Si un signal au protocol home easy est reçu...[/color]
       [color=#CC6600]if[/color](receivedSignal.isSignal){
                     
                    [color=#7E7E7E]//On ferme ou on ouvre le relais en fonction du bit d'etat (on/off) du signal[/color]
                    [color=#CC6600]if[/color](receivedSignal.state)
        	        {	
                        [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"Etat : on, fermeture du relais"[/color]);
                        [color=#CC6600]digitalWrite[/color](relaiPin,[color=#006699]HIGH[/color]);
                        [color=#CC6600]digitalWrite[/color](ledPin,[color=#006699]HIGH[/color]);
        	        }
        	        [color=#CC6600]else[/color]
        	        {
                        [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"Etat : off, ouverture du relais"[/color]);	
                        [color=#CC6600]digitalWrite[/color](relaiPin,[color=#006699]LOW[/color]);
                        [color=#CC6600]digitalWrite[/color](ledPin,[color=#006699]LOW[/color]);
        	        }
        
  stringOne =  [color=#CC6600]String[/color](receivedSignal.sender, [color=#006699]HEX[/color]);   
  
   
        [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"sender = "[/color]);
        [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color](stringOne);
        [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"recepteur = "[/color]);
        [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color](receivedSignal.receptor);
                             }[color=#CC6600]else[/color]{
              [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"Signal inconnu"[/color]);	
                             }
}

[color=#CC6600]void[/color] listenSignal(){
        receivedSignal.sender = 0;
        receivedSignal.receptor = 0;
        receivedSignal.isSignal = [color=#CC6600]false[/color];
            
        [color=#CC6600]int[/color] i = 0;
	[color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] t = 0;

	[color=#CC6600]byte[/color] prevBit = 0;
	[color=#CC6600]byte[/color] [color=#CC6600]bit[/color] = 0; 
        bool flag = [color=#CC6600]false[/color];
        [color=#CC6600]byte[/color] test = 0;
	[color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] sender = 0;
	bool group = [color=#CC6600]false[/color];
	bool on = [color=#CC6600]false[/color];
	[color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] recipient = 0;

	[color=#7E7E7E]// latch 1[/color]
	[color=#CC6600]while[/color]((t < 9200 || t > 11350))
	{	t = [color=#CC6600]pulseIn[/color](recepteurPin, [color=#006699]LOW[/color], 1000000);  
	}
       
      
	[color=#7E7E7E]// latch 2[/color]
	[color=#CC6600]while[/color](t < 2550 || t > 2800)
	{t = [color=#CC6600]pulseIn[/color](recepteurPin, [color=#006699]LOW[/color], 1000000);
          [color=#CC6600]if[/color] (t > 1000 && t < 1400){
            flag = [color=#CC6600]true[/color];[color=#7E7E7E]// telecommande[/color]
            [color=#CC6600]break[/color];
          }
	}

        
   [color=#CC6600]if[/color] (flag == [color=#CC6600]false[/color]){
	[color=#7E7E7E]// data[/color]
	[color=#CC6600]while[/color](i < 64)
	{
		t = [color=#CC6600]pulseIn[/color](recepteurPin, [color=#006699]LOW[/color], 1000000);
		[color=#CC6600]if[/color](t > 200 && t < 365)
		{	[color=#CC6600]bit[/color] = 0;
		}
		[color=#CC6600]else[/color] [color=#CC6600]if[/color](t > 1000 && t < 1400)
		{	[color=#CC6600]bit[/color] = 1;
		}
		[color=#CC6600]else[/color]
		{	i = 0;
			[color=#CC6600]break[/color];
                  [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"bit mort"[/color]+t);
		}

		[color=#CC6600]if[/color](i % 2 == 1)
		{
			[color=#CC6600]if[/color]((prevBit ^ [color=#CC6600]bit[/color]) == 0)
			{	[color=#7E7E7E]// must be either 01 or 10, cannot be 00 or 11[/color]
				i = 0;
				[color=#CC6600]break[/color];
			}

			[color=#CC6600]if[/color](i < 53)
			{	[color=#7E7E7E]// first 26 data bits[/color]
				sender <<= 1;
				sender |= prevBit;
			}	
			[color=#CC6600]else[/color] [color=#CC6600]if[/color](i == 53)
			{	[color=#7E7E7E]// 26th data bit[/color]
				group = prevBit;
			}
			[color=#CC6600]else[/color] [color=#CC6600]if[/color](i == 55)
			{	[color=#7E7E7E]// 27th data bit[/color]
				on = prevBit;
			}
			[color=#CC6600]else[/color]
			{	[color=#7E7E7E]// last 4 data bits[/color]
				recipient <<= 1;
				recipient |= prevBit;
			}
		}

		prevBit = [color=#CC6600]bit[/color];
		++i;
	}

  }
  [color=#7E7E7E]// Telecommande[/color]
  [color=#CC6600]else[/color] { 
      sender = 1; 
        [color=#CC6600]while[/color] ( i < 23)
        {
                  t = [color=#CC6600]pulseIn[/color](recepteurPin, [color=#006699]LOW[/color], 1000000);
                  [color=#CC6600]if[/color](t > 200 && t < 400)
                  {       [color=#CC6600]bit[/color] = 0;
                  }
                  [color=#CC6600]else[/color] [color=#CC6600]if[/color] (t > 1000 && t < 1400)
                  {       [color=#CC6600]bit[/color] = 1;
                  }
                  [color=#CC6600]else[/color]
                  {i = 0;
                  [color=#CC6600]break[/color];
                  }
                  [color=#CC6600]if[/color] (i<7)
                  {       sender <<= 1;
                          sender |= [color=#CC6600]bit[/color];
                  }
                  [color=#CC6600]else[/color] [color=#CC6600]if[/color](i < 15)
                  {       recipient <<=1;
                          recipient |= [color=#CC6600]bit[/color];
                  } 
                  [color=#CC6600]else[/color] [color=#CC6600]if[/color] (i <22)
                  {       test <<=1;
                          test |= [color=#CC6600]bit[/color];
                  }
                ++i;
        }
  [color=#CC6600]if[/color]([color=#CC6600]bit[/color] == 1){
    on = [color=#CC6600]false[/color];
  }
  [color=#CC6600]else[/color]{
    on = [color=#CC6600]true[/color];
  }
 
  
  }
  
  [color=#7E7E7E]//interpret message[/color]
  [color=#CC6600]if[/color] (i > 0)
  {
      receivedSignal.sender = sender;
      receivedSignal.receptor = recipient;
      receivedSignal.isSignal = [color=#CC6600]true[/color];
      [color=#CC6600]if[/color] (on)
      {receivedSignal.state = [color=#CC6600]true[/color];
      }
      [color=#CC6600]else[/color] {
        receivedSignal.state = [color=#CC6600]false[/color];
      }
  }
} 


[/quote]

Bonjour ceci doit être un peu plus lisible

/*
 * Code pour construction d'un récepteur "maison", reçoit un signal et ouvre ou ferme un port extérieur (relié par exemple a un relais)
 * Fréquence : 433.92 mhz
 * Protocole : home easy 
 * Licence : CC -by -sa
 * Matériel associé : Atmega 328 (+résonateur associé) + récepteur RF AM 433.92 mhz + relais + led d'etat
 * Auteur : Valentin CARRUESCO  aka idleman (idleman@idleman.fr - http://blog.idleman.fr)
 * 
 * Basé sur le travail de :
 * Barnaby Gray 12/2008
 * Peter Mead   09/2009
 */
 
 

int recepteurPin = 2;
int relaiPin = 10;
int ledPin = 13;
String stringOne;

struct config_t
{
  long sender;
  int receptor;
} signal;

struct signal_t
{
  long sender;
  int receptor;
  boolean isSignal;
  boolean state;
} receivedSignal;


void setup()
{	pinMode(recepteurPin, INPUT);
        pinMode(relaiPin, OUTPUT);
        pinMode(ledPin, OUTPUT);
	Serial.begin(9600);
        Serial.println("start");
        digitalWrite(ledPin,HIGH);
}


void loop()
{
  
       //Ecoute des signaux
       listenSignal();
       
       //Si un signal au protocol home easy est reçu...
       if(receivedSignal.isSignal){
                     
                    //On ferme ou on ouvre le relais en fonction du bit d'etat (on/off) du signal
                    if(receivedSignal.state)
        	        {	
                        Serial.println("Etat : on, fermeture du relais");
                        digitalWrite(relaiPin,HIGH);
                        digitalWrite(ledPin,HIGH);
        	        }
        	        else
        	        {
                        Serial.println("Etat : off, ouverture du relais");	
                        digitalWrite(relaiPin,LOW);
                        digitalWrite(ledPin,LOW);
        	        }
        
  stringOne =  String(receivedSignal.sender, HEX);   
  
   
        Serial.print("sender = ");
        Serial.println(stringOne);
        Serial.print("recepteur = ");
        Serial.println(receivedSignal.receptor);
                             }else{
              Serial.println("Signal inconnu");	
                             }
}

void listenSignal(){
        receivedSignal.sender = 0;
        receivedSignal.receptor = 0;
        receivedSignal.isSignal = false;
            
        int i = 0;
	unsigned long t = 0;

	byte prevBit = 0;
	byte bit = 0; 
        bool flag = false;
        byte test = 0;
	unsigned long sender = 0;
	bool group = false;
	bool on = false;
	unsigned int recipient = 0;

	// latch 1
	while((t < 9200 || t > 11350))
	{	t = pulseIn(recepteurPin, LOW, 1000000);  
	}
       
      
	// latch 2
	while(t < 2550 || t > 2800)
	{t = pulseIn(recepteurPin, LOW, 1000000);
          if (t > 1000 && t < 1400){
            flag = true;// telecommande
            break;
          }
	}

        
   if (flag == false){
	// data
	while(i < 64)
	{
		t = pulseIn(recepteurPin, LOW, 1000000);
		if(t > 200 && t < 365)
		{	bit = 0;
		}
		else if(t > 1000 && t < 1400)
		{	bit = 1;
		}
		else
		{	i = 0;
			break;
                  Serial.println("bit mort"+t);
		}

		if(i % 2 == 1)
		{
			if((prevBit ^ bit) == 0)
			{	// must be either 01 or 10, cannot be 00 or 11
				i = 0;
				break;
			}

			if(i < 53)
			{	// first 26 data bits
				sender <<= 1;
				sender |= prevBit;
			}	
			else if(i == 53)
			{	// 26th data bit
				group = prevBit;
			}
			else if(i == 55)
			{	// 27th data bit
				on = prevBit;
			}
			else
			{	// last 4 data bits
				recipient <<= 1;
				recipient |= prevBit;
			}
		}

		prevBit = bit;
		++i;
	}

  }
  // Telecommande
  else { 
      sender = 1; 
        while ( i < 23)
        {
                  t = pulseIn(recepteurPin, LOW, 1000000);
                  if(t > 200 && t < 400)
                  {       bit = 0;
                  }
                  else if (t > 1000 && t < 1400)
                  {       bit = 1;
                  }
                  else
                  {i = 0;
                  break;
                  }
                  if (i<7)
                  {       sender <<= 1;
                          sender |= bit;
                  }
                  else if(i < 15)
                  {       recipient <<=1;
                          recipient |= bit;
                  } 
                  else if (i <22)
                  {       test <<=1;
                          test |= bit;
                  }
                ++i;
        }
  if(bit == 1){
    on = false;
  }
  else{
    on = true;
  }
 
  
  }
  
  //interpret message
  if (i > 0)
  {
      receivedSignal.sender = sender;
      receivedSignal.receptor = recipient;
      receivedSignal.isSignal = true;
      if (on)
      {receivedSignal.state = true;
      }
      else {
        receivedSignal.state = false;
      }
  }
}

Salut b@tto,
Ton code ne fonctionne pas. le pulseIn() est inconnu chez moi.
J'ai regardez dans la librairie de virtualWire et je ne trouve pas cette fonction.
Je l'ai par contre trouvée dans le langage arduino.
voici l'erreur :

error: 'PulseIn' was not declared in this scope

Ive123, ton code fonctionne bien, j'ai la récupération de ma télécommande :D. Première fois que cela m'arrive.
Je décortique le code :wink:

EDIT : le PulseIn, c'est simplement parce qu'il s'écrivait pulseIn ;).
J'ai essayé de modifié les valeurs mais je n'ai rien dans la console

Salut,
Je comprend entièrement le code à un point près :

  • C'est la fonction pulseIn(), si on doit mesure le temps d'un niveau haut, pourquoi mettre pusleIn(pin,high,1000000) ?
    Personnellement, j'aurais tendance à dire que plus le temps d'action du pulse est court, plus le temps de mesure sera bon ? et donc mettre
    pusleIn(pin,high,0) mais le programme ne fonctionne dès lors pas.

Ma compréhension du truc : Si j'ai un signal de 300µs en HIGH, et que je le reçois pile maintenant au temps t_0=0
alors la fonction pulseIn(pin, HIGH, 1000000) ne le détectera pas car elle commencera sa mesure à t+ = t_0+1000000µs+ temps de détecter LOW
Tandis que si je fais pulseIn(pin ,HIGH, 0), pulseIn commence directe et j'aurais théoriquement t+ =<300µs
Si vous me comprenez ? J'ai vraiment du mal à comprendre cette fonction ( surtout l’intérêt de commencer 1s en retard ^^ )

Merci à tous pour votre aide qui ma sérieusement aidée =)

Bonjour,
Le 3° argument de pulseIn est un timeout "délai d'attente maxi".
Il permet d'attendre l'arrivée du signal qui déclenche le début de la mesure

"the number of microseconds to wait for the pulse to start"

Si tu mets 0, le signal (front montant ou autre) doit arriver à l'exécution de pulseIn, ....ça revient à viser la µs!!!
Attention un timeout long bloque ton programme pendant ce temps, donc à voir.

Haaaa ok :p.
Je l'avais mal traduit.
Ma traduction : le nombre de microseconde qu'il faut attendre avant de démarre le pulse
Mais effectivement, c'est le nombre de microsecondes à attendre pour que le pulse démarre.

Ils devraient ajouté un petit "maximum" dans la phrase :p. Je trouve que cela prête à confusion ( pour quelqu'un qui parle pas anglais hein :wink: )

Merci à toi !

Après pulseIn() c'est trois ligne de codes donc bon, pas difficile de l'étoffer en "manuel"