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.

Publicités
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 !

  4. 22/12/2016 à 11:15

    Bonjour,

    J’ai réalisé une sonde de température wifi autonome,

    boitier PLA compris(76mmx23mmx22mm).
    Elle fonctionne avec mon site fr.thermover.ovh

    gratuitement mais compatible OTA, on peut soit la mettre

    à jour, soit télécharger Espeasy et la rendre en quelques

    secondes compatible avec
    Domoticz HTTP Domoticz MQTT
    Nodo Telnet
    ThingSpeak
    OpenHAB MQTT
    PiDome MQTT
    EmonCMS Generic
    HTTP FHEM HTTP.

    Si cela vous intéresse d’en parler..

    Cordialement.
    mstockage@gmail.com
    Thierry

  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 :