ils disent qu'il faut utiliser la "-Bibliothèque: VirtualWire"
j'ai essayé pas mal de sketch de bas pour tester mais d'office ça plante!
dernier sktech testé issue des exemples la bibliothèque :
// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@open.com.au)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup");
// Initialise the IO and ISR
// vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");
for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println("");
digitalWrite(13, false);
}
}
voici les messages d'erreur
Arduino : 1.8.12 (Windows 8.1), Carte : "Arduino Uno"
c:\Temp\ccYyTQ3b.ltrans0.ltrans.o: In function `loop':
c:\Temp\arduino_modified_sketch_456517/receiver.pde:30: undefined reference to `vw_get_message'
collect2.exe: error: ld returned 1 exit status
exit status 1
Erreur de compilation pour la carte Arduino Uno
Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.
:o
J'ai laisse le programme l'installer par l'option importation de bibliothèque
Donc son nom d'origine..
Avant de l'installer j'avais une erreur comme quoi la bibliothèque Virtualwire etait absente , après plus de soucis de nom de bibliothèque
Ce qui est bizarre, c'est que le compilateur ne dit rien (enfin, si notre ami ne nous cache rien ) pour inclure le .h, ni lorsqu'il rencontre les appels de fonctions de cette lib.
Par contre, le linker ne trouve pas le code de la fonction.
Donc :
soit le .h et le(s) .cpp de la bibliothèque sont incohérents,
On voit que tu n'as pas activé les "messages détaillés de compilation" (option de l'IDE Arduino).
Réessaye avec.
Par ailleurs, je vois que le linker déplore l'absence d'une seule des 3 fonctions vw_machin_truc.
Moi j'irais voir dans les fichiers .cpp de la bibliothèque si la fonction manquante existe ou pas.
Si elle n'y est pas, ça valide mon hypothèse 1 : les fichiers de la lib sont incohérents (pas la même version peut-être).
Si elle y est (avec la bonne signature), alors je sais plus.
J-M-L:
allez voir dans vos librairies le nom du répertoire et ce qu''il y a dedans. est-ce que ça correspond à celle qu'on peut télécharger ici: VirtualWire: VirtualWire library for Arduino and other boards (vaut mieux d'ailleurs passer sur RH_ASK)
Bonsoir a tous!!
Merci J-M-L! effectivement ca venais de ma bibliotheque!!
et téléchargeant la tienne , plus d'erreurs!
erci! et + 1 karma!!! heu.. au fait, ca sert à quoi ?
Bonne nouvelle ! oui il y a plusieurs librairies qui trainent, certains ont fait des copies et des modifications vaut mieux toujours retourner à la source
Bien que VirtualWire fonctionne encore, Radiohead (même si un peu plus lourd) est plus performant au global. Son usage reste très simple, voilà un petit sketch d'émission:
#include <RH_ASK.h>
RH_ASK rf_driver;
const char *msg = "Ceci est un test";
void setup()
{
rf_driver.init();
}
void loop()
{
rf_driver.send((uint8_t *)msg, strlen(msg)+1); // +1 pour envoyer le caractère '\0' de fin
rf_driver.waitPacketSent();
delay(2000);
}
La portée du "Amplitude Shift Keying (ASK)" est très influencée par l'environnent (ce type de transmission radio est très sensible au bruit et aux interférences d'autres ondes radio), la puissance de votre module, la qualité de son alimentation, l'antenne et bien sûr le débit choisi.
Avec une antenne correctement dimensionnée (normalement 69.24 cm mais on peut passer en quart d'onde à 17.3 cm) et une bonne alimentation stable, j'ai eu jusqu'à 40 voire 50m de portée dans mon jardin (en "ligne de vue", pas d'obstacles majeurs, pas d'arbres ni de feuilles et en environnement peu bruité d'un point de vue électro-magnétique).
Ok merci.
Avec un kit de ce type, J'ai une portée de 70 m avec la maison entre le jardin et la grange ou se situe le récepteur, en soudant un fil de 17 cm comme antenne et un autre identique côté masse pour faire un doublet.
L'émetteur est alimenté en 12 V, ça compte aussi pour la puissance.
Cela portait beaucoup moins avant. Je ne sait pas si c'est aussi ASK comme modulation ?
OK - je ne sais pas quelle modulation est utilisé sur ces kits. Notez qu'en France les "Puissances Apparentes Rayonnées" (PAR) admises diffèrent suivant les bandes et sous-bandes. Les PAR sont limitées à 10 mW dans la bande 433 MHz. Ensuite la police des ondes peut débarquer ou vos voisins se plaindre ...
Oui c'est bien de rappeler la réglementation. Je pense être dans les clous, c'est juste de l'optimisation. J'ai aussi fait un doublet côté réception. Utile quand on n'a pas de plan de masse pour faire le contrepoids d'une quart d'onde. On peut aussi régler au mieux la fréquence avec le condensateur réglable. Avec une impulsion tout les 3 jours, en période d'arrosage, pas de risque de gêne dans ma cambrousse.
Bonsoir a tous,
Ca y est, les modules fonctionnement avec virtualWire.
Ca fonctionne.
Je l'ai intégré en l'adaptant a mon programme coté emission pas de soucis.
Mon problème c'est côté récepteur..
Voici une partie du sketch de test
vw_wait_rx(); // On attend de recevoir un message
if (vw_get_message((byte *) &message, &taille_message)) // On copie le message, qu'il soit corrompu ou non
{
derniere_reception=millis();
premier_message=false;
lcd.clear();
lcd.print("Mes -");
lcd.print(message.Controle1); lcd.print("-"); lcd.print(" - ");lcd.print( message.tempo);
lcd.setCursor(0, 1);
if (message.Controle1 == 22) // on decode les messages
{
lcd.print("Lever :");
};
if (message.Controle1 == 127)
{
lcd.print("Heure :");
};
if (message.Controle1 == 225)
{
lcd.print("Coucher:");
};
lcd.print(message. heure) ;
lcd.print(":");
lcd.print(message. minutes) ;
lcd.print(":");
lcd.print(message.secondes);
lcd.setCursor(0, 2);
lcd.print("Bat/PV ");
lcd.print(message. tension_batt);
lcd.print(" / ");
lcd.print(message. tension_pv);
lcd.setCursor(0, 3);
lcd.print("code Alarme: ");
lcd.print(message. alarme);
delay(1000);
}
Mon problème c'est que tout est bloqué par vw_wait_rx()
Comment puis-je faire autrement ?
Car j'aimerais pouvoir faire d'autres opérations
Merci
Il y’a la fonction vw_wait_rx_max(unsigned long milliseconds) qui va être bloquante juste pendant le temps passé en paramètre et qui retourne true si un message est en attente
Sinon sans bloquer du tout il y a aussi
vw_have_message()
Sinon regardez le code de Radiohead que j’ai mis au dessus c’est assez trivial aussi, cet appel est non bloquant if (rf_driver.recv(message, &buflen))