Bonjour à tous,
Cela fait maintenant plusieurs mois que j'essaye en vain de réaliser mon projet.
Je souhaiterai créer un thermomètre avec le module DHT22, envoyer les données (Température et humidité) à intervalle régulier à mon Raspberry Pi via les modules NRF24L01, puis mettre en sommeil le tout pendant un temps défini (15 mn) avant un nouveau relevé de température.
J'ai donc commencé par lire la température avec le DHT22, réussi !
J'ai ensuite réussi à faire fonctionner la liaison entre mon arduino et mon raspberry Pi en python et à enregistrer l'info dans ma base de donnée.
Puis j'ai testé la mise en sommeil du bousin avec watchdog, ce qui semblait fonctionner. Je n'ai par contre pas pu tester l'économie d'énergie correspondante.
Je devais ensuite tester de faire fonctionner le DHT22, le module NRF24L01 sans l'arduino uno, mais seulement avec la puce atmega afin d'économiser de l'énergie.
Le problème qui s'est déjà produit une première fois, c'est qu'en déconnectant les modules DHT22/NRF24L01 afin d'intégrer le bootloader à ma deuxième puce Atmega, je n'ai pas réussi.
J'ai remonter le tout comme avant, mais je n'arrive plus à faire fonctionner la liaison Uno/Rasp.
En effet, mon script uno édite dans le moniteur, la configuration du module NRF24L01 et celle-ci n'est plus comme avant tout est à zéro :
Localisation du fichier dans le Raspberry :/home/pi/rf24libs/RF24/examples_linux/pingpair_dyn2.py/
STATUS = 0x00 RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=0 TX_FULL=0
RX_ADDR_P0-1 = 0xfafafafa7a 0x0000000000
RX_ADDR_P2-5 = 0x00 0x00 0x00 0x00
TX_ADDR = 0x0000000000
RX_PW_P0-6 = 0x00 0x00 0x00 0x00 0x00 0x00
EN_AA = 0x00
EN_RXADDR = 0x00
RF_CH = 0x00
RF_SETUP = 0x00
CONFIG = 0x00
DYNPD/FEATURE = 0x00 0x00
Data Rate = 1MBPS
Model = nRF24L01
CRC Length = Disabled
PA Power = PA_MIN
Alors que je devrais de mémoire avoir comme sur le Rasp :
pi@raspberrypi:~/rf24libs/RF24/examples_linux $ sudo python pingpair_dyn2.py
pyRF24/examples/pingpair_dyn/
================ SPI Configuration ================
CSN Pin = CE0 (PI Hardware Driven)
CE Pin = Custom GPIO25
Clock Speed = 8 Mhz
================ NRF Configuration ================
STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xf0f0f0f0d2 0xf0f0f0f0e1
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xf0f0f0f0d2
RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x02
RF_CH = 0x4c
RF_SETUP = 0x21
CONFIG = 0x0e
DYNPD/FEATURE = 0x3f 0x04
Data Rate = 250KBPS
Model = nRF24L01+
CRC Length = 16 bits
PA Power = PA_MIN
************ Role Setup ***********
Voici mon code Arduino :
// Import des librairies
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <printf.h>
#include "DHT.h"
#include <avr/sleep.h>
#include <avr/wdt.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
float txbuffer[3] = {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;
// Interruption du watchdog
ISR (WDT_vect)
{
wdt_disable(); // Désactiver watchdog
} // Fin de WDT_vect
// On définit les variables relatives au DHT22 dont celle que l'on va envoyer
DHT dht(3, DHT22); // On definit la sonde sur le pin 3
char numeroDetecteur [] = "AA"; // On definit l'identifiant du thermomètre
char send_payload[16]= ""; // La variable envoyée aura une longueur maximum de 16 bytes
char floatBuf1[10];
char floatBuf2[10];
// On définit les variables relatives au module radio
RF24 radio(9,10); // Configurer la radio nRF24L01 sur le bus SPI plus les broches 9 et 10
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; // Adresses de tuyau radio pour les 2 nœuds à communiquer.
int payload_size; // On définit la taille de l'envoi comme une valeur numérique
const int max_payload_size = 32;
char receive_payload[max_payload_size+1]; // +1 pour laisser de la place à un caractère NULL final
// Script de lecture de la température et d'envoi / réception par le module radio
void DHT22_NRF24L01 ()
{
// lecture de la sonde
float h = dht.readHumidity();
float t = dht.readTemperature();
// Convertion float en string
dtostrf(h, 6, 2, floatBuf1);
dtostrf(t, 6, 2, floatBuf2);
/* 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 ;
sprintf(send_payload, "%s%s%s", numeroDetecteur, floatBuf2, floatBuf1); // Ecriture du buffer en string
payload_size = strlen(send_payload); // Compte la longueur de la variable envoyée
radio.powerUp(); //alimente le module nrf24l01+
radio.stopListening(); // D'abord, arrêtez d'écouter pour pouvoir parler.
// Prenez le temps et envoyez-le. Cela bloquera jusqu'à complète
//Serial.print(F("Longueur envoyée : "));
//Serial.println(payload_size);
radio.write( send_payload, payload_size );
radio.powerDown(); //arrêt de l’alimentation du module nrf24l01+
//communication avec le port serie de l'arduino.
//Serial.print("Temp. de : ");
//Serial.print(t);
//Serial.print("°C et Hum. de : ");
//Serial.println(h);
//Serial.print("%\t ");
Serial.println(send_payload);
delay(100); // 20 secondes
}
void mywatchdogenable ()
{
// Désactiver ADC
//ADCSRA = 0;
// Effacer divers drapeaux "reset"
MCUSR = 0;
// Autoriser les modifications, désactiver la réinitialisation
WDTCSR = bit (WDCE) | bit (WDE);
// Régler le mode d'interruption et un intervalle
WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // Régler WDIE, et 8 secondes de retard
wdt_reset(); // pat the dog
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
noInterrupts (); // Séquence temporisée suit
sleep_enable();
// Désactiver l'activation de la désactivation dans le logiciel
MCUCR = bit (BODS) | bit (BODSE);
MCUCR = bit (BODS);
interrupts (); // Garantit la prochaine instruction exécutée
sleep_cpu ();
sleep_disable();
}
void setup ()
{
dht.begin(); // On initie la sonde
Serial.begin(9600); // On init la com serie de l'arduino
Serial.println(F("Localisation du fichier dans le Raspberry :/home/pi/rf24libs/RF24/examples_linux/pingpair_dyn2.py/"));
// Setup et configurer le module radio
radio.begin();
radio.setDataRate (RF24_250KBPS);
radio.setPALevel (RF24_PA_MIN);
printf_begin();
radio.enableDynamicPayloads(); // Activer les charges utiles dynamiques
radio.setRetries(5,15); // En option, augmenter le délai entre les tentatives et # de tentatives
// Cette simple esquisse ouvre deux tuyaux pour que ces deux nœuds puissent communiquer d'avant en arrière.
radio.openWritingPipe(pipes[0]); // Ouvrez 'notre' tuyau pour écrire
//radio.openReadingPipe(1,pipes[1]); // Ouvrez l'autre tuyau pour la lecture, en position #1 (on peut avoir jusqu'à 5 tuyaux ouverts pour la lecture)
//radio.startListening();// Commence à écouter
radio.printDetails(); // Afficher la configuration de l'unité RF pour le débogage
//DHT22_NRF24L01 ();
}
void loop ()
{
DHT22_NRF24L01 ();
for (int i=0; i < 10; i++) //mise en veille pendant ~~ 5mn secondes (35)
mywatchdogenable();
}
J'ai testé différent module NRF24L01, tester les câbles avec un multimètre.
Je ne comprends pas d'où vient le problème et je suis assez perdu.
Je ne sais pas d'où vient le problème et j'en suis à vouloir abandonné le projet car je passe mon temps à revenir sur quelque chose qui fonctionnait avant, sans comprendre pourquoi ça plante.
Est ce les modules, la bibliothèque, le code,... ???
Si l'un de vous pouvait m'aider à comprendre et refaire fonctionner le tout, j'en serai très heureux !
Merci à tous de m'avoir lu.
Jérémy