Comment transmettre des infos par module radio 433mHz

Bonjour à tous.
Après pas mal de recherches, je n’ai toujours pas réussi à mener à bien mon projet, j’espère que certains pourront m’aider.
J’espère également avoir posté dans le bon endroit.

J’essaie de concevoir un système d’arrosage (comme c’est original) qui communique entre deux cartes UNO via un module radio 433 mHz.
Sur une carte j’ai branché l’émetteur radio, un DHT 11, une horloge RS3231 et capteur d’humidité pour le sol. J’ai réussi à faire fonctionner ces capteurs (le moniteur série m’affiche les bonnes données).
Ce que je n’arrive pas à faire, c’est d’envoyer ces valeurs sur mon autre carte UNO par ondes radio.
L’idée est donc au final d’afficher sur mon écran lcd les valeurs d’humidité du sol et del’air ainsi que la date et l’heure et la température ambiante (et pourquoi pas d’autres valeurs après).

Voici le code que j’ai pour le moment:

//LCD
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

//HORLOGE
#include <DS3231.h>
DS3231  rtc(SDA, SCL);
Time t;
bool adjust = false; // adjust clock mode yes/no
bool ahour, aminute, aday, amonth, ayear, rfin = false; // adjust hour, minute, day ... mode
int stareb1, stareb2 = 0; // buttons state
int heure, minut, zi, luna, an; // hour, minute, day, month, year values to be adjusted
const int buton1 = 8; // buton pin for setup/next/save
const int buton2 = 9; // buton pin for adjusting parameter/don't save

#include <Wire.h>

//TEMP & HUMIDITE AIR
#include <SimpleDHT.h>
int pinDHT11 = 13;
SimpleDHT11 dht11;
int err = SimpleDHTErrSuccess;

//HUMIDITE SOL
int potPin = A0 ; //broche d’entrée capteur humidité sol
int sol = 0 ;


void setup() {
  Serial.begin(9600);

  rtc.begin();
lcd.backlight();
  lcd.init(); // initialisation de l'afficheur
  lcd.print("Bonjour Sebastien") ;// titre de toutes sortes
  delay(1000);
}

void loop() {

  // Affichage sur le terminal de la température et de l'humidité de l'air
  Serial.println("=================================");
  // Lecture de la température et de l'humidité ------------------
  byte temperature = 0;
  byte humidity = 0;
  if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    // Si on n'arrive pas à lire les données.
    Serial.print("Read DHT11 failed, err="); Serial.println(err); delay(1000);
    return;
  }
  Serial.print("Température : "); Serial.print((int)temperature); Serial.println(" °C");
  Serial.print("Humidité Air: ");    Serial.print((int)humidity); Serial.println(" %");

  // Humidité Sol
  int sol = analogRead(potPin) ;
  sol = constrain (sol, 485, 1023) ;
  sol = map (sol, 485, 1023, 100, 0) ;
  Serial.print("Humidité Sol: ");    Serial.print((int)sol); Serial.println(" %");

  //Affichage Heure et Date sur le terminal
  Serial.print("Heure: ");  Serial.println(rtc.getTimeStr());
  Serial.print("Date: ");  Serial.println(rtc.getDateStr());

  // Ecran LCD --------------------------------------------------
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temperature: "); lcd.print((int)temperature); lcd.print("C");

  lcd.setCursor(0, 1);
  lcd.print("H.Air: ");    lcd.print((int)humidity);    lcd.print("%"); lcd.print(" H.Sol: ") ; lcd.print(sol) ; lcd.print("%") ;

  lcd.setCursor(0, 2);
  lcd.print("Heure:  ");  lcd.print(rtc.getTimeStr());

  lcd.setCursor(0, 3);
  lcd.print("Date: ");  lcd.print(rtc.getDateStr());

}

Après mes recherches, j’ai réussi via la bibliothèque Virtual Wire à envoyer un message comme “Bonjour” entre mes deux cartes UNO mais je n’arrive pas à envoyer les données transmises par les différents capteurs.

Je pense avoir compris devoir utiliser la fonction typedef struc mais je ne sais pas vraiment comment l’appliquer dans mon cas.

Vous l’aurez compris je n’ai que très peu de connaissances en code et je suis également très loin d’avoir assimilé sa logique.

Je remercie par avance ceux qui pourront m’aider à avancer.

Sebibi:
Bonjour à tous.
Après pas mal de recherches, je n’ai toujours pas réussi à mener à bien mon projet, j’espère que certains pourront m’aider.
J’espère également avoir posté dans le bon endroit.

J’essaie de concevoir un système d’arrosage (comme c’est original) qui communique entre deux cartes UNO via un module radio 433 mHz.

bonjour
1ere question , c’est quoi exactement ce … module radio ? :grin:

Bonjour Artouste,

Il s'agit d'un émetteur WL 102-341 et d'un récepteur WL 101-341.

Sebibi:
Bonjour Artouste,

Il s’agit d’un émetteur WL 102-341 et d’un récepteur WL 101-341.

OK
Ce couple E/R est déjà bien plus exploitable que “certaines bouses infames” 8)

Cà permet déjà de jouer par exemple avec virtualwire pour voir , c’est simple d’accés

point important quand meme , souder sur chaque PCB un “brin d’antenne” d’~ 17cm

Cà permet déjà de jouer par exemple avec virtualwire pour voir , c'est simple d'accés

J'ai l'impression qu'il arrive à transmettre "bonjour"
peut être avez vous un logiciel qui ressemble à ça:

void loop()
{
    const char *msg = "bonjour";
    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);
    delay(200);
}

si c'est le cas,on peut essayer de lui faire transmettre un entier de la façon suivante

float humidite   = 70.75;
char msg[80]; // surdimensionné
snprintf(msg, sizeof(msg),"%d", (int) humidite);
// et là, ça continue comme avant
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);
    delay(200);
}

LEs trois premieres lignes sont une tentative pour se rapprocher de votre code et transmettre l'humidité.... (au vu de cet essai, vous devriez rajouter 0.5 à l'humidite ... et sans doute aux temperatures avant de les convertir en entiers; mais c'est un détail cosmétique)

Bonjour,

Tu crées une structure avec tes valeurs à transmettre et tu transmets cette structure.
Par exemple:

  struct SMesures
  {
    byte temperature;
    byte humidity;
    byte sol;
    Time t;
  } mesures;

  mesures.temperature = temperature;
  mesures.humidity = humidity;
  mesures.sol = sol;
  mesures.t=rtc.getTime();

  vw_send((byte *)&mesures, sizeof mesures);

Du coté de la réception tu définis la même structure et tu reçois cette structure.

La solution de Kamill (transmettre les valeurs brutes) est meilleure que la "mienne " (convertir les champs en ASCII pour coller à un exemple)

a) pas de perte de précision lors de conversions.

b) les messages sont un peu plus courts (un float fait 32 bits; une temperature , disons -18.5, mangera 40 bits une fois convertie en ASCII.

Bonjour, tu peux utiliser des modules HC-12 serial port rf 433Mhz c est fiable la portée est valable je l utilise dans plusieurs réalisations c est idéal.

Merci à tous pour vos réponses !

CelticLord:
Je n’ai pas ce genre de module sous la main, j’essaie de faire marcher ceux que j’ai déjà :slight_smile:

Kamill, je me suis inspiré du code que tu as envoyé, et j’ai du coup quelques questions pour être sûr de bien comprendre.
Voci le code:

Emetteur

//Emetteur
#include <VirtualWire.h>

//HORLOGE
#include <DS3231.h>
DS3231  rtc(SDA, SCL);
Time t;
bool adjust = false; // adjust clock mode yes/no
bool ahour, aminute, aday, amonth, ayear, rfin = false; // adjust hour, minute, day ... mode
int stareb1, stareb2 = 0; // buttons state
int heure, minut, zi, luna, an; // hour, minute, day, month, year values to be adjusted
const int buton1 = 8; // buton pin for setup/next/save
const int buton2 = 9; // buton pin for adjusting parameter/don't save

#include <Wire.h>

//TEMP & HUMIDITE AIR
#include <SimpleDHT.h>
int pinDHT11 = 13;
SimpleDHT11 dht11;
int err = SimpleDHTErrSuccess;

//HUMIDITE SOL
int potPin = A0 ; //broche d’entrée capteur humidité sol
int sol = 0 ;

void setup() {
  Serial.begin(9600);
  vw_setup(2000);

  rtc.begin();

}

void loop() {

  // Affichage sur le terminal de la température et de l'humidité de l'air
  Serial.println("=================================");
  // Lecture de la température et de l'humidité ------------------
  byte temperature = 0;
  byte humidity = 0;
  if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    // Si on n'arrive pas à lire les données.
    Serial.print("Read DHT11 failed, err="); Serial.println(err); delay(1000);
    return;
  }
  Serial.print("Température : "); Serial.print((int)temperature); Serial.println(" °C");
  Serial.print("Humidité Air: ");    Serial.print((int)humidity); Serial.println(" %");

  // Humidité Sol
  int sol = analogRead(potPin) ;
  sol = constrain (sol, 485, 1023) ;
  sol = map (sol, 485, 1023, 100, 0) ;
  Serial.print("Humidité Sol: ");    Serial.print((int)sol); Serial.println(" %");

  //Affichage Heure et Date sur le terminal
  Serial.print("Heure: ");  Serial.println(rtc.getTimeStr());
  Serial.print("Date: ");  Serial.println(rtc.getDateStr());


  struct SMesures //Création de la structure "SMesures" ?
  {
    byte temperature; //Qui inclus la température de l'air
    byte humidity;  // Et l'humidité de l'air
    byte sol; // Et l'humidité du sol
    Time t; // et l'heure, Comment rajouter la date ?
  } mesures;  //Que signifie cette ligne ? Est-ce que mesures est une nouvelle variable créée à partir de la structure "SMesure"s ?

  mesures.temperature = temperature;
  mesures.humidity = humidity;
  mesures.sol = sol;
  mesures.t = rtc.getTime();

  vw_send((byte *)&mesures, sizeof mesures); //Envoie des valeurs mesurées vers le récepteur
}

Mes questions:

  • struct SMesures //Création de la structure “SMesures” ?
  • byte temperature; //Qui inclus la température de l’air
    byte humidity; // Et l’humidité de l’air
    byte sol; // Et l’humidité du sol
    Time t; // et l’heure, Comment rajouter la date ?
  • } mesures; //Que signifie cette ligne ? Est-ce que mesures est une nouvelle variable créée à partir de la structure" SMesures "?
  • Que signifient les lignes “mesures.temperature = temperature” et celles à la suite ?

Après vérification par le logicile, ce dernier ne détecte pas d’erreur mais comme je n’arrive pas à faire fonctionner le code du récepteur, je ne sais pas vraiment si celui de l’émetteur est bon.

Voici le code du récepteur:

//LCD
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

//Recepteur
#include <VirtualWire.h>

#include <DS3231.h>

//TEMP & HUMIDITE AIR
#include <SimpleDHT.h>
int pinDHT11 = 13;
SimpleDHT11 dht11;
int err = SimpleDHTErrSuccess;

struct SMesures //Création de la structure "SMesures" ?
{
  byte temperature; //Qui inclus la température de l'air
  byte humidity;  // Et l'humidité de l'air
  byte sol; // Et l'humidité du sol
  Time t; // et l'heure, Comment rajouter la date ?
} mesures;

#include <Wire.h>

void setup() {
  Serial.begin(9600);

  //LCD
  lcd.backlight();
  lcd.init(); // initialisation de l'afficheur
  lcd.print("Bonjour Sebastien") ;// titre de toutes sortes
  delay(1000);

  //Récepteur
  vw_setup(2000);
  vw_rx_start(); // On peut maintenant recevoir des messages


}

void loop() {
  mesures;


  vw_send((byte*) &mesures, sizeof(mesures)); // On envoie le message
  vw_wait_tx(); // On attend la fin de l'envoi

  // Ecran LCD --------------------------------------------------
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temperature: "); lcd.print((int)temperature); lcd.print("C");

  lcd.setCursor(0, 1);
  lcd.print("H.Air: ");    lcd.print((int)humidity);    lcd.print("%"); lcd.print(" H.Sol: ") ; lcd.print(sol) ; lcd.print("%") ;

  lcd.setCursor(0, 2);
  lcd.print("Heure:  ");  lcd.print(rtc.getTimeStr());

  lcd.setCursor(0, 3);
  lcd.print("Date: ");  lcd.print(rtc.getDateStr());


}

Les problèmes arrivent dans la dernière partie “LCD” où le logiciel ne reconnait pas “temperature”, dois-je remettre le même code que dans l’émetteur ?

Je remercie tous ceux qui pourront m’éclairer davantage.

conseils pour emission reception optimale

aller directement a 4’11’’ et arret sur image : lire

pourquoi envoyer l’heure ?

un exemple qui fonctionne chez moi : distance 10 metres, 2 murs parpaings, meme niveau
voir ici

et pourtant : mauvais émetteur h34a avec antenne fil rigide 17cm, alimenté directement par un adaptateur secteur réglé sur 9 volts (cad variant entre 9 et 12v), condo 100µf aux bornes alim du h34
récepteur : rbx6 avec une (mauvaise) antenne “spring helical” en 5 volts fourni par l’uno
je suis au stade de l’expérimentation et meme surpris d’avoir un résultat aussi correct
tu devrais essayer de baisser la vitesse de transmission
vw_setup(500); // Bits per sec vitesse transmission basse

concernant virtualwire :
This VirtualWire library has now been superceded by the RadioHead library

VirtualWire uses Timer1, which means some PWM pins which require Timer1 will not work. Other libraries using Timer1 will be incompatible with VirtualWire

la pin 10 est utilisée par défaut pour le ptt PushTotTalk ou enable présents sur certains modules émettteur

Sebibi:

  • Que signifient les lignes “mesures.temperature = temperature” et celles à la suite ?

Ca mets la valeur de température dans la structure pour envoi. J’ai fait comme ça pour ne pas trop modifier le programme, mais tu peux aussi ranger directement la température dans la structure lors de l’appel à dht11.read()

Sebibi:
Voici le code du récepteur: …

Il n’y a pas d’appel à la fonction réception.
Tu peux utiliser les valeurs reçues comme ceci:

//LCD
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

//Recepteur
#include <VirtualWire.h>

#include <DS3231.h>

DS3231  rtc(SDA, SCL);

//TEMP & HUMIDITE AIR
#include <SimpleDHT.h>
int pinDHT11 = 13;
SimpleDHT11 dht11;
int err = SimpleDHTErrSuccess;

struct SMesures //Création de la structure "SMesures" ?
{
  byte temperature; //Qui inclus la température de l'air
  byte humidity;  // Et l'humidité de l'air
  byte sol; // Et l'humidité du sol
  Time t; // et l'heure, Comment rajouter la date ?
} mesures;

#include <Wire.h>

void setup() {
  Serial.begin(9600);

  //LCD
  lcd.backlight();
  lcd.init(); // initialisation de l'afficheur
  lcd.print("Bonjour Sebastien") ;// titre de toutes sortes
  delay(1000);

  //Récepteur
  vw_setup(2000);
  vw_rx_start(); // On peut maintenant recevoir des messages


}

void loop() {
  byte taille = sizeof mesures;
  if (vw_get_message((byte *) &mesures, &taille))
  {
    // Ecran LCD --------------------------------------------------
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temperature: "); lcd.print(mesures.temperature); lcd.print("C");

    lcd.setCursor(0, 1);
    lcd.print("H.Air: ");    lcd.print(mesures.humidity);    lcd.print("%"); lcd.print(" H.Sol: ") ; lcd.print(mesures.sol) ; lcd.print("%") ;

    lcd.setCursor(0, 2);
    lcd.print("Heure:  ");  lcd.print(mesures.t.hour); lcd.print(':'); lcd.print(mesures.t.min); lcd.print(':'); lcd.print(mesures.t.sec);

    lcd.setCursor(0, 3);
    lcd.print("Date: ");  lcd.print(mesures.t.date); lcd.print('/'); lcd.print(mesures.t.mon); lcd.print('/'); lcd.print(mesures.t.year);
  }

}

Bonjour,

Quel plaisir de se réveiller et de voir que l'aide est venue pendant la nuit :slight_smile:

Elektrax, je te remercie pour tes réponses mais elles me semblent un peu compliquées (je suis vraiment pas à l'aise avec la programmation).

Kamill, ta solution marche au poil de cul ! Merci beaucoup !!

Je vais maintenant essayer de rajouter le système d'arrosage, je reviendrai le poster lorsqu'il sera terminé.

Encore merci à tout le monde.

pourquoi envoyer l'heure ?

Comme les Hommes Reels ne font jamais de bugs, soudent parfaitement du materiel ideal, il ne peut jamais se produire de panne. Ce phenomène est suffisamment exceptionnel pour que, avant de chercher à depanner par agitation tous azimuths de logiciels et de materiel, on ait besoin de comprendre pourquoi; une des façons de procéder est d'enregister ce que l'on a tenté de mesurer, et de comparer avec un équipement fonctionnel.
La température et l'humidité ont une telle variabilité temporelle qu'il est sain de les dater.

Normalement, la date est stockée sur 32 bits (nombre de secondes depuis la création du monde -1/1/1970 ou d'arduino, suivant les bibliothéques....)
La structure préconisée par Kamil mange 7 octets, soit 56 bits;
si (du fait d'une redondance) on doit transmettre 200 bits, la modif préconisée par electrax, de ralentir la vitesse de transmission (rend la liaison plus fiable; sain sur la durée) , est viable -mange 400 millisecondes - : echantillonnerdes températures -et des humidités- à 1 fois par seconde est très rapide .