Je souhaiterais réaliser une action à prioris toute simple, à savoir : allumer pendant un bref instant une Led reliée à une carte arduino (qui est également reliée à un récepteur) lorsque j'appuie sur un interrupteur relié à une seconde carte arduino (qui est également reliée à un emmeteur, donc).
J'ai trouvé des tutos avec virtualwire grâce auxquels j'ai réussi à envoyer un message ("hello world"), donc je n'ai pas de problèmes au niveau de la connectique : c'est le programme qui me pose soucis car mon but n'est plus d'envoyer un texte en boucle mais une commande lorsque j'en prend la décision.
Merci de vous intéresser à mon problème et merci pour vos éventuelles réponses !
Je suis désolé mais c'est pas bien clair tout ça ... Déjà un schéma très simple de ton montage permettrait de mieux comprendre le sujet. Ensuite je ne vois pas de quel côté tu bloques : tu n'arrives pas à envoyer une commande à la demande ou bien c'est la réception de cette commande qui te pose problème ?
J'ai fait un tutoriel sur VirtualWire disponible ici :
Dans les commentaires tu as les grandes lignes permettant de mettre en place un système de commandes à distance.
Côté émeteur il te suffit d'émettre le message au moment voulu (et non en boucle) pour que le côté récepteur reçois et interprète la commande.
B@tto:
Oki. Alors dejà est-ce que tes ports série physiques sont dispos ? Apparemment oui vu ton schéma. Parce que ça sera plus simple dans ce cas !
Si tu as en tête de lui faire utiliser Serial je t'arrête tout de suite, c'est la pire solution possible en RF "low cost" (ou du moins la plus casse tête, pas de protocole, pas de vérification d'erreur, ...).
J'ai testé mais ça ne fonctionne pas, je dois me planter quelque part...
Côté transmetteur, j'ai ça :
#include <VirtualWire.h>
void setup()
{
vw_setup(2000);
vw_set_tx_pin(3);
}
void loop()
{
const char *msg = "test"; // C'est le message à envoyer.
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // On attend que le message complet soit envoyé.
delay(5000);
}
Et côté récepteur, j'ai d'abord essayé ça (et ça n'a rien donné à part une faible et brève lumière lors du chargement du programme) :
Comme ça n'a rien donné, j'ai essayé ça pour voir s'il recevait quelque chose ou non :
#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
void setup()
{
Serial.begin(9600); // On initialise "le serial monitor", j'ai laissé 9600 bauds ici car c'est la valeur par défaut mais vous pouvez la modifier. Attention à bien mettre la même valeur dans votre Serial Monitor et dans votre programme.
vw_setup(2000); // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
vw_set_rx_pin(3); // C'est sur cette broche que l'on reliera les broches DATA du récepteur, vous pouvez changez de broche si vous le désirez.
vw_rx_start(); // On démarre le récepteur.
pinMode(12, OUTPUT);
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
{
if(strcmp("test", (char*)buf)==0)
digitalWrite(12, HIGH);
delay(2000);
digitalWrite(12, LOW);
delay(1000);
}
else
digitalWrite(12, HIGH);
delay(2000);
digitalWrite(12, LOW);
delay(1000);
}
Résultat : la led s'allume 3 fois normallement au début, puis ne s'allume plus sauf une fois de temps à autre (toutes les 1 à 3 min je dirais).
C'est bizarre non ?
B@tto:
Oki. Alors dejà est-ce que tes ports série physiques sont dispos ? Apparemment oui vu ton schéma. Parce que ça sera plus simple dans ce cas !
Si tu as en tête de lui faire utiliser Serial je t'arrête tout de suite, c'est la pire solution possible en RF "low cost" (ou du moins la plus casse tête, pas de protocole, pas de vérification d'erreur, ...).
[/quote]
Pourquoi donc ? Pas de problème de reception avec un buffer
"Il manque des accolades au niveau du if !" => Maintenant, elles sont là... mais ça ne fonctionne toujours pas. Tu as une autres idée d'où ça pourrait venir ? J'ai testé plein de choses différentes mais rien ne fonctionne.
J'ai pas tout lu, mais il faut faire attention avec virtualwire, il ne faut pas envoyer de chaines plus grande que 27 caractères. Si non, rien n'est envoyé
vohu:
J'ai pas tout lu, mais il faut faire attention avec virtualwire, il ne faut pas envoyer de chaines plus grande que 27 caractères. Si non, rien n'est envoyé
avec la solution donnée juste au dessus, tu peux envoyer autant que tu veux.
chaque commande est recue et traitée une par une a condition d'en envoyer une par une aussi.
style
a-1
delay(1000)
b-0
etc...
sketch_oct19a.cpp: In function 'void loop()':
sketch_oct19a:24: error: incompatible types in assignment of 'int' to 'char [30]'
sketch_oct19a:30: error: incompatible types in assignment of 'uint8_t [30]' to 'char [30]'
ça deviens du chinois pour moi, je ne comprend plus rien... Quelqu'un pourrais m'expliquer le code histoire afin que je ne copie de façon bête et méchante, sans rien comprendre ?
En tout cas, merci beaucoup pour votre aide !
B@tto:
Pourquoi donc ? Pas de problème de reception avec un buffer
Pas de vérification hardware = vérification à faire en software (CRC + entête)
Obligation de faire son propre protocole, on envoi pas des octets comme ça sans formatage ...
Problème sur le long terme à cause de la précision des timings nécessaire à une communication série
(à un moment ou à un autre l'horloge en réception va perdre la synchro avec le signal. Un ou plusieurs octets vont être corrompu et si il n'y as pas de vérification / protocole défini les problèmes vont commencer)
ecolomatique:
J'ai testé et j'obtiens ça :
sketch_oct19a.cpp: In function 'void loop()':
sketch_oct19a:24: error: incompatible types in assignment of 'int' to 'char [30]'
sketch_oct19a:30: error: incompatible types in assignment of 'uint8_t [30]' to 'char [30]'
ça deviens du chinois pour moi, je ne comprend plus rien... Quelqu'un pourrais m'expliquer le code histoire afin que je ne copie de façon bête et méchante, sans rien comprendre ?
Tu tente de transformer un int en char[30], pas bon !
Utilise sprintf() pour transformer le nombre en chaine de caractères :
int var = 10;
char buf[30];
ssprintf(buf, "%d", var);
Pour la seconde erreur tu tente (surement) d'assigner un tableau dans un autre via = ?
Si oui ce n'est pas la bonne solution, utilise strcpy().
J'essaye mais ça ne marche pas, je ne suis pas sur de placer tout au bonne endroit...
J'ai toujours le même message d'erreur... J'imagine que mon programme doit être du grand n'importe quoi, je vous montre à quoi il ressemble pour l'instant :
#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
int var = 10;
char buf[30];
void setup()
{
Serial.begin(9600); // On initialise "le serial monitor", j'ai laissé 9600 bauds ici car c'est la valeur par défaut mais vous pouvez la modifier. Attention à bien mettre la même valeur dans votre Serial Monitor et dans votre programme.
vw_setup(2000); // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
vw_set_rx_pin(3); // C'est sur cette broche que l'on reliera les broches DATA du récepteur, vous pouvez changez de broche si vous le désirez.
vw_rx_start(); // On démarre le récepteur.
pinMode(12, OUTPUT);
}
if (vw_get_message(buf, &buflen))
{
digitalWrite(12,HIGH);
for (int i = 0; i < buflen; i++)
msg=0;
}
int i;
// Un message est reçu.
char vBuff[10] = "";
for (int i = 0; i < buflen; i++){
msg = buf;
}
strcat(vBuff, msg);