[LowPower] Ma pro mini ne veut pas dormir :D !

Bonjour à tous.

J'ai un soucis avec mon montage composé d'un arduino pro mini en 3.3V , d'un nrf24l01+ et d'un DS18B20. Je me suis fortement inspiré de ce que j'ai lu sur un blog riton.duino (il me semble que son auteur est sur ce forum :wink: ).

Pour "endormir" mon arduino, j'utilise également la biblio LowPower comme sur le blog .

J'ai programmé un cycle de 10min : la pro mini relève la température , l'envoie via le nrf24l01+ , attend une confirmation de l'arduino récepteur , et s'endort pendant 10min une fois l'accusé de reception reçu.

Dans la version du code que je vous mets en copie , cela marche nickel quand mon pro mini émetteur est relié/alimenté via un ftdi232 . Parcontre quand je passe le montage en autonome , càd alimenté par une LiPo 3.7V , le pro mini ne veut pas s'endormir .

La tension de la LiPo passe par un régulateur 3.3 type VDO pour alimenter la pro mini directement sur VCC . Je n'ai pas encore enlevé le régulateur ni la LED d'alimentation .

J'ai aussi une version du code où je me passe de la liaison série pour le monitoring et là même branché avec le fdti232 la pro mini ne veut pas resté endormi .

Mon premier diagnostic c'est qu'il y a sans doute un conflit/problème dans mon code entre la liaison série et LowPower . Et également un soucis entre l'alimentation via la LiPo et LowPower (pour mon montage) ...

Voici le code :

/**
   Exemple de code pour la bibliothèque Mirf – Client d'envoi de variable
*/
#include <SPI.h>      // Pour la communication via le port SPI
#include <Mirf.h>     // Pour la gestion de la communication
#include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // Pour la communication SPI
#include <OneWire.h>
#include <Wire.h>
#include "Timer.h"
#include <avr/wdt.h>
#include <avr/power.h>
#include <LowPower.h>
#include <avr/sleep.h>

OneWire  dsA(3);
byte addrA[8];

float temp1; float last_temp1 = 0;
float voltage = 0;
int tps  = 0;
boolean CONV_OK = false;
boolean LIAISON = false; // active la liaison série
boolean ACCUSE_RECEPTION = true;
boolean ACQUISITION = true;
boolean VEILLE = false;
int AdR = 888;

int j =0;
//typedef struct { int temperature ; int tension ; int temps;} StructureDATAS;

void setup() {
  if (LIAISON == false) {
    Serial.begin(115200);
  }

  pinMode(13, OUTPUT);
  // Résolution des sondes //1F 0,5 // 3F 0,25 // 5F 0,125 // 7F 0,0625
  dsA.reset();    dsA.write(0xCC);  dsA.write(0x4E);  dsA.write(0x00);   dsA.write(0x00);  dsA.write(0x7F);


  Mirf.cePin = 8; // Broche CE sur D9
  Mirf.csnPin = 7; // Broche CSN sur D10
  Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
  Mirf.init(); // Initialise la bibliothèque

  Mirf.channel = 1; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
  Mirf.payload = sizeof(float); // Taille d'un message (maximum 32 octets)
  Mirf.configRegister(RF_SETUP, 0x26);
  Mirf.config(); // Sauvegarde la configuration dans le module radio

  Mirf.setTADDR((byte *) "nrf02"); // Adresse de transmission
  Mirf.setRADDR((byte *) "nrf01"); // Adresse de réception

  if (LIAISON == false) {
    Serial.println("Go !");
  }
}

void loop() {

  // Lit un nombre depuis le port série
  //StructureDATAS donnees;

  if (VEILLE == false) {

    if (ACQUISITION == true) {


      digitalWrite(13, HIGH);
      voltage = (1023 * 1.1) / analogReadReference();
      SondeTemp(dsA);
      LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF);  LowPower.powerDown(SLEEP_250MS, ADC_OFF, BOD_OFF); // mise en veille pdt la conversion de température
      delay(10);
      ConversionTemp(dsA);
      //Mirf.powerUpTx();



      //  donnees[2] = int(tps*100);

      // int test =  int(temp1*100);

      if (LIAISON == false) {
        Serial.print(temp1);
        Serial.print(" ");
        Serial.print(voltage);
        Serial.println(" ");
        //Serial.println(donnees[2]);
      }
      delay(10);
      ACQUISITION = false;
    }

    if ( ACQUISITION == false)
    {

      int donnees[2];

      donnees[0] = int(temp1 * 100);
      donnees[1] = int(voltage * 100);
      // Serial.println(test);
      //delay(10);
      Mirf.send((byte *) &donnees);
      // Mirf.send((byte *) &test);// On envoie le message
      while (Mirf.isSending()); // On attend la fin de l'envoi
     if(LIAISON == false){  Serial.println("Envoi OK"); delay(10);}

      if (Mirf.dataReady()) {
        Mirf.getData((byte *) &AdR); // Réception du paquet
     if(LIAISON == false){    Serial.println(AdR); delay(10);}
      }

      if (!Mirf.dataReady()) {
        delay(10);
        // Réception du paquet
       if(LIAISON == false){  Serial.println("Attente AdR"); delay(10);}/*****/
      }


      if (AdR == 999) {
        ACCUSE_RECEPTION = true;
        ACQUISITION = true;
        if(LIAISON == false){ Serial.println("Reception OK*");}
        delay(50);
        AdR = 0;
        VEILLE = true;
      }


    }
  }// Fin de boucle HORS VEILLE
  if (VEILLE == true)
  {
if(LIAISON == false){    Serial.println("mise en veille");delay(20);}
    digitalWrite(13, LOW);
    j++;
    Serial.println(j);
    delay(10);
    //Mirf.powerDown();
   lowPowerSleep(600);// mise en veille en sec
   // tps = tps + 5;
   VEILLE = false;
if(LIAISON == false){    Serial.println("Reveil");delay(20);}
  }

}




void SondeTemp(OneWire dstest)
{
  dstest.reset();      dstest.write(0xCC);
  dstest.write(0x4E);  dstest.write(0x00);     dstest.write(0x7F);         //3F
  //3F
  // début de la conversion
  dstest.reset();    dstest.write(0xCC);  dstest.write(0x44, 0);

}


void ConversionTemp(OneWire dstest)
{

  //Lecture et calcul => Temp°
  dstest.reset();   dstest.write(0xCC);   dstest.write(0xBE);

  byte dataA[12];

  for (int j = 0; j < 9; j++)
  {
    dataA[j] = dstest.read();
  }


  int16_t rawA = (dataA[1] << 8) | dataA[0]; // même resolution sur les sondes
  // rawA = rawA & ~1;//3

  temp1 = (float)rawA / 16.0;



  if (abs(last_temp1 - temp1) > 0.3) {
    dsA.reset();
    dsA.write(0xCC);
    dsA.write(0x4E);
    dsA.write(0x00);
    dsA.write(0x00);
    dsA.write(0x3F);/*lcd.setCursor(0,3);lcd.print("*");}else{lcd.setCursor(0,3);lcd.print(" ");*/
  }
  last_temp1 = temp1 ;


}



unsigned int analogReadReference(void)
{
  /* Elimine toutes charges résiduelles */
  ADMUX = 0x4F;
  delayMicroseconds(5);
  /* Sélectionne la référence interne à 1.1 volts comme point de mesure, avec comme limite haute VCC */
  ADMUX = 0x4E;
  delayMicroseconds(200);
  /* Active le convertisseur analogique -> numérique */
  ADCSRA |= (1 << ADEN);
  /* Lance une conversion analogique -> numérique */
  ADCSRA |= (1 << ADSC);
  /* Attend la fin de la conversion */
  while (ADCSRA & (1 << ADSC));
  /* Récupère le résultat de la conversion */
  return ADCL | (ADCH << 8);

}


void lowPowerSleep(int secondes)
{
  //int secondes = minutes*60;
  int sleeps = secondes * 1;
  for (int i = 0; i < sleeps; i++)
  {
    Serial.println(i);
    delay(10);//Serial.println(i);
    LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);
  }
}

Si qqun a une piste ...

Merci

Bon j'ai testé juste une mise en veille avec extinction/allumage de la led 13 . Ca marche nickel avec la LiPo.

J'ai ajouté un incrément mouchard et ca m'a permis de me rendre compte qu'en fait ma pro mini reboot et donc ne va pas jusqu'à sa mise en veille ..je n'ai pas le soucis avec le ftdi232 car le 3.3v doit être top ...or sur mon montage je n'ai pas mis les bonnes valeurs de condo préconisées pour le VDO (HT7333) car je ne les ai pas en ma possesion.
Il faut des 10uF et j'ai seulement des 1uF ..

Est ce que c'est la cause ? Je ne sais pas . J'ai commandé un assortimment de condo .

En attendant je triche/bricole : j'ai rajouté une mise en veille en début de loop donc ca "fonctionne" ...

Sinon, chante lui une berceuse... Parfois ça marche

Essaie un code simple comme sur le blog.
Pour faire un essai, tu peux éventuellement alimenter la PRO MINI directement sur la LIPO, mais SANS LE NRF24L01 BIEN ENTENDU.

@+

Salut!

C'est ce que j'ai dit dans mon précédent message.

J'attends mes nouveaux condos . En attendant mon code bricolé me donne ce que je recherche.