Accueil > Arduino, Matériel > Sonde de température et transmission RF avec des modules nrf24l01+

Sonde de température et transmission RF avec des modules nrf24l01+

Aujourd’hui je viens de tester l’envoi de la température et d’humidité via un module nrf24l01 à partir de ma sonde. Les tests ont été effectués au niveau réception à partir d’un Arduino Uno.

Pour les caractéristiques du module nrf24l01+, je vous conseille de lire un de mes articles suivant : https://itechnofrance.wordpress.com/2013/05/24/utilisation-du-module-nrf24l01-avec-larduino/

La différence est que je vais utiliser la librairie RF24, téléchargeable ici : https://github.com/maniacbug/RF24

L’intérêt de cette librairie est qu’elle est également disponible pour le Raspberry PI.

Le programme de ma sonde sera le suivant :

#include <DHT22.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <SPI.h>
#include <RF24.h>

#define DHT22_PIN 2 //communication avec le capteur DHT22
#define DHT22_POWER 5 //alimentation du capteur DHT22

RF24 radio(8,7); //création instance radio (pin ce,csn)
DHT22 dht22(DHT22_PIN); //création instance dht

ISR (WDT_vect)
{
  wdt_disable(); //désactive le watchdog
}

void mywatchdogenable()
{
  MCUSR = 0;
  WDTCSR = _BV (WDCE) | _BV (WDE);
  WDTCSR = _BV (WDIE) | _BV (WDP3) | _BV (WDP0); //délai de 8 secondes
  wdt_reset();
  ADCSRA = 0; //désactive ADC
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  MCUCR = _BV (BODS) | _BV (BODSE);
  MCUCR = _BV (BODS);
  sleep_cpu();
  sleep_disable();
}

void setup()
{
  pinMode(DHT22_POWER, OUTPUT);
  radio.begin();
  radio.setPALevel(RF24_PA_MAX); //puissance maximum
  radio.setChannel(0x20); //canal 32
  radio.setDataRate(RF24_1MBPS);
  radio.openWritingPipe(0xF0F0F0F0F0LL);
  radio.enableDynamicPayloads();
  radio.setAutoAck(1);
  radio.setRetries(15,15);
  Serial.begin(9600);
}

void loop ()
{
  digitalWrite(DHT22_POWER, HIGH); //alimente le capteur DHT22
  radio.powerUp(); //alimente le module nrf24l01+
  delay(5000); //attente 5 secondes avant d’effectuer une mesure du capteur DHT22
  DHT22_ERROR_t errorCode;
  errorCode = dht22.readData();
  if (errorCode == DHT_ERROR_NONE)
  {
    int txbuffer[2] = {0, 0};
    int temperature = dht22.getTemperatureCInt();
    int humidite = dht22.getHumidityInt();
    txbuffer[0] = temperature;
    txbuffer[1] = humidite;
    radio.write(&txbuffer, sizeof(txbuffer));
    delay(500);
  }
  digitalWrite(DHT22_POWER, LOW); //arrêt de l’alimentation du DTH22
  radio.powerDown(); //arrêt de l’alimentation du module nrf24l01+
  for (int i=0; i < 8; i++) //mise en veille pendant 64 secondes
    mywatchdogenable();
}

Pour mes tests j’effectue une mesure toutes les 64 secondes environ (pendant ce temps l’Arduino pro mini 8 MHz passe en veille). Bien sûr quand elle sera opérationnelle, j’effectuerai une mesure toutes les 30 minutes environ.

La partie réception sur la carte Arduino Uno est la suivante :

#include <SPI.h>
#include <RF24.h>

RF24 radio(8,7); //création instance radio (pin ce,csn)

void setup()
{
  radio.begin();
  radio.setPALevel(RF24_PA_MAX); //puissance maximum
  radio.setChannel(0x20); //canal 32
  radio.setDataRate(RF24_1MBPS);
  radio.openReadingPipe(1, 0xF0F0F0F0F0LL);
  radio.enableDynamicPayloads();
  radio.setAutoAck(1);
  radio.setRetries(15,15);
  radio.powerUp();
  radio.startListening();
  Serial.begin(9600);
}

void loop ()
{
  if (radio.available())
  {
    int rxbuffer[2] = {0, 0};
    bool done = false;
    while (!done)
    {
      done = radio.read(&rxbuffer, sizeof(rxbuffer));
      float temperature = (float)rxbuffer[0] / 10;
      Serial.print("Temperature = ");
      Serial.println(temperature);
      float humidite = (float)rxbuffer[1] / 10;
      Serial.print("Humidite = ");
      Serial.println(humidite);
    }
  }
}

Le résultat est le suivant :

image

Maintenant je vais travailler pour la partie réception sur le Raspberry PI. Donc à venir une nouvel article.

Catégories :Arduino, Matériel Étiquettes : , , ,
  1. 04/05/2014 à 22:21

    J’attends ton prochain tuto concernant la communication avec le raspberry parce que de mon côté je sèche à faire dialoguer mon arduino avec mon pi

    • 12/05/2014 à 19:24

      Cela va arriver

      • 13/05/2014 à 19:24

        Parfait. J’ai fais un double post par erreur; après avoir du me connecter, retrouver le mdp, je pensais que le 1er message avait été supprimé par ce changement de page.

  2. 12/05/2014 à 02:07

    Merci, Pour le raspberry pi ça serai avec Raspbian ? C’est un peu le bordel quand on veux faire une connection Arduino/Rpi, donc une suite pourrait être vraiment intéressante !

  3. 12/05/2014 à 02:10

    Merci, pour le raspberry pi ça serai sous raspbian ? C’est un peu le bordel à partir du moment ou on veux connecter l’arduino et le raspberry pi, donc un suite serai vraiment intéressante !

  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :