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.
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]
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
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 )