ÉmetRécep 2.4Ghz Temp / Hum DHT22 ÉmetRécep 2.4Ghz Temp / Hum DHT22
Menu

Émetteur Récepteur 2.4Ghz Température Humidité DHT22

19 février 2015 - Arduino, Domotique, Raspberry Pi
Émetteur Récepteur 2.4Ghz Température Humidité DHT22

Pour commencer le schéma du montage :

Atmega_DHT22_bb

 

Le montage a pour but de transmettre son numéro (pour avoir plusieurs émetteur sur un récepteur), la température, l’humidité et la tension des piles.

Le tout est basé sur un Atmega328P c’est en fait un Arduino avec rien autour sauf un quartz de 16Mhz et deux petits condensateurs de 22PF.

Le tout est alimenté par un bloc de 4 pile typeLR06 pour un total de 6V (4 X 1.5V) avec un régulateur de 3.3V.

Le capteur de température et humidité est un DHT22. Il est alimenté par l’Atmega328 pour économiser le jus.

Pour l’émetteur c’est un module émetteur/récepteur en 2.4Ghz NRF24L01+ 2.4GHz.

J’ai installé aussi un pont diviseur pour récupérer la tension du bloc piles et ne pas dépasser les 3.3V de l’alimentation de l’Atmega328P.

Je vous joins le code de l’émetteur :
#include "DHT.h"
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <SPI.h>
#include <RF24.h>

#define DHTPIN 2 // entrée capteur dht22
#define DHTTYPE DHT22
#define DHT22_POWER 3 //alimentation du capteur DHT22

#define PIN_PILE 1 // entrée analogique

DHT dht(DHTPIN, DHTTYPE);

//variables radio
RF24 radio(8,7); //création instance radio (pin ce,csn)
float txbuffer[4] = {1, 0, 0, 0}; // l'indice 0 du tableau représente le N° du themometre ici le 1
//variable température
float temperature;
float humidite;
//variables tension
const float coeff_division = 2.0; // constante pont diviseur
float real_bat = 0;
unsigned int raw_bat;

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()
{
dht.begin();

pinMode(DHT22_POWER, OUTPUT);

pinMode(PIN_PILE,INPUT);

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);
}

void loop ()
{
digitalWrite(DHT22_POWER, HIGH); //alimente le capteur DHT22
delay(1000);
temperature = dht.readTemperature();
humidite = dht.readHumidity();
delay(100);
digitalWrite(DHT22_POWER, LOW); //alimente le capteur DHT22
txbuffer[1] = temperature;
txbuffer[2] = humidite;

/* Mesure de la tension brute */
raw_bat = analogRead(PIN_PILE);
/* Calcul de la tension réel */
real_bat = ((raw_bat * (3.3 / 1024)) * coeff_division);
txbuffer[3] = real_bat ;

radio.powerUp(); //alimente le module nrf24l01+
delay(1000);
radio.write(&txbuffer, sizeof(txbuffer));
delay(1000);
radio.powerDown(); //arrêt de l’alimentation du module nrf24l01+

for (int i=0; i < 35; i++) //mise en veille pendant ~~ 5mn secondes
mywatchdogenable();
}
Et le récepteur :
#include <SPI.h>
#include <RF24.h>
#include "nRF24L01.h"

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

float rxbuffer[4] = {0, 0, 0, 0};
bool done = false;
float temperature;
float humidite;
int capteur;
float tension;

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())
{
done = false;
while (!done)
{
done = radio.read(&rxbuffer, sizeof(rxbuffer));
capteur = (int)rxbuffer[0];
Serial.print("Pièce = ");
switch (capteur){
case 1:
Serial.println("Chambre 1");
break;
case 2:
Serial.println("Chambre 2");
break;
//case 3 : ....
default:
Serial.println("Erreur réception !");
}

temperature = rxbuffer[1];
Serial.print("Temperature = ");
Serial.println(temperature, 1);
humidite = rxbuffer[2];
Serial.print("Humidite = ");
Serial.println(humidite, 1);
humidite = rxbuffer[3];
Serial.print("Tension pile = ");
Serial.println(humidite);
}
}
}
Le résultat :

Pièce = Chambre 1
Température = 20.7°
Humidité = 48.1%
Tension pile = 5.57v

Pièce = Chambre 1
Température = 20.6°
Humidité = 48.1%
Tension pile = 5.56v

Et voilà je suis dispo pour les questions

  • lee

    Hi,

    Je suis sur le même projet que toi. J’ai vu sur un forum que tu cherchais la solution pour émettre ta température via un 2.4ghz vers un arduino en ethernet.

    Je suis sur le même projet sauf que j’utilise un 433mhz et un module ENC28J60 avec la librairie EthernetUIP

    Comme toi tout fonctionne de indépendamment mais si je lie les deux, ca bloque. As-tu une solution ?

    n’hésite pas a prendre contact avec moi par mail si ca te dis on pourrais partager nos infos 😉

    Lee

    • michelgard

      Bonjour,
      Pour l’instant la partie émission de la température avec un Atmega328 et un émetteur 2.4GHz fonctionne avec le code de l’article.
      Et je reçois le tout sur un Arduino Uno avec un récepteur 2.4GHz avec une visualisation des données par le port série.
      Il me reste le branchement avec une carte Ethernet mais pour l’instant j’ai été retardé par le boulot et la non réception de la carte car la poste avait perdu mon colis …
      Dès que j’aurai avancé sur le sujet je ferai un petit article.
      Bonne suite.
      Michel