Bonjour, ![]()
J'ai un petit souci avec mon capteur. Il s'agit d'un capteur qui a deux fonction :
1 : Toutes les minutes il envoi la température et l'humidité grâce à un module NRF24
2 : Il est relié à un capteur infrarouge, qui envoi également un signal par le module NRF24 en cas de détection
Le tout est géré par un arduino pro mini 3.3V 8MHz, sur batterie. Pour optimiser la consommation, l'ATMEGA ne se reveille que pour la prise de la mesure et l'envoie (timer) ainsi que par une interruption externe en provenance du capture infrarouge.
Tout marche impec', SAUF ]
:
Quand je met Mirf.powerdown() pour éteindre le module NRF24 entre deux mesures, cela me délenche systématiquement l'interruption externe (le pin semble faire LOW->HIGH->LOW). Le plus étrange c'est que cela se produit même si j'insère un detachInterrupt() ?? J'ai testé en mettant différent delay() pour voir a quelle moment ca merdouille, et c'est bien au moment ou Mirf.powerdown() est appelé. Plus aucun probleme si je laisse le module NRF24 allumer.
Je sèche un peu là... C'est à s'arracher les cheveux ! =(
#include <dht.h>
#include <SPI.h>
#include <Mirf.h>
#include <MirfHardwareSpiDriver.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
// Watchdog Interrupt Service est exécité lors d'un timeout du WDT
ISR (WDT_vect)
{
wdt_disable(); //désactive le watchdog
}
// paramètre : 0=16ms, 1=32ms, 2=64ms, 3=128ms, 4=250ms, 5=500ms, 6=1 sec,7=2 sec, 8=4 sec, 9=8 sec
void setup_watchdog(int ii) {
byte bb;
int ww;
if (ii > 9 ) ii=9;
bb=ii & 7;
if (ii > 7) bb|= (1<<5);
bb|= (1<<WDCE);
ww=bb;
// Clear the reset flag
MCUSR &= ~(1<<WDRF);
// start timed sequence
WDTCSR |= (1<<WDCE) | (1<<WDE);
// set new watchdog timeout value
WDTCSR = bb;
WDTCSR |= _BV(WDIE);
}
#define DHTPIN 4
#define PIRPIN 3
dht DHT;
float humid;
int humid100;
float temp;
int temp100;
unsigned long time=0;
unsigned long timePIR=0;
void enterSleep(void) {
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()
{
//Serial.begin(9600);
Mirf.cePin = 8;
Mirf.csnPin = 10;
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"base1");
Mirf.payload = 32;
Mirf.config();
pinMode(PIRPIN, INPUT);
//Serial.println("Beginning ... ");
}
void loop()
{
detachInterrupt(1);
DHT.read22(DHTPIN); //changer ici le modele de capteur
humid = DHT.humidity,1;
temp = DHT.temperature,1;
humid100=humid*100;
temp100=temp*100;
/*Serial.print("Humid: ");
Serial.println(humid100);
Serial.print("Temp :");
Serial.println(temp100);*/
Mirf.setTADDR((byte *)"serv1");
delay(500);
envoiData(3,temp100);
envoiData(4,humid100);
//ICI CA POSE PROBLEME
Mirf.powerDown();
delay(5000); //Meme avec ce delay
attachInterrupt(1, pir, CHANGE);
for (int i=0; i < 8; i++){ //Veille pour 8x8 secondes
enterSleep();
}
}
void envoiData(int id_capt, int valeur)
{
char packet1[8]; //n° du capteur
sprintf(packet1,"%i",id_capt);
char packet2[5];
if(valeur < 0) //pour le signe
{
sprintf(packet2,"1");
valeur = valeur * (-1);
}else{
sprintf(packet2,"0");
}
char packet3[9];
sprintf(packet3,"%i",valeur);
char packet[32];
sprintf(packet,"%s-%s-%s!",packet1,packet2,packet3);
Mirf.send((byte *)&packet);
while(Mirf.isSending()){
}
delay(10);
//Serial.println("Finished sending");
}
void pir()
{
Mirf.setTADDR((byte *)"serv1");
if(digitalRead(PIRPIN)){
envoiData(5,100);
}
else{
envoiData(5,200);
}
}