Sleep mode de la carte Akeru ?

Forum de support et d'échange sur la carte Akeru (carte compatible Arduino développée par Snootlab et intégrant la technologie Sigfox) et du shield Akene pour Arduino (shield pour Arduino développée par Snootlab et intégrant la technologie Sigfox)

Sleep mode de la carte Akeru ?

Message non lude starsrock69 » Jeu 30 Juin 2016 22:25

onjour,

je suis novice, et je commence un projet balance/Temp/Hygro connecté pour voir comment se débrouille tout ce petit monde.
J'ai également rajouté une carte Akeru SnootLab.
Mes tests sont concluants.

Mon programme globalement fait ce que je lui demande, sauf que ...

... pour un souci de meilleure autonomie, je me suis dis que j'allais endormir mon UNO 8s
(avec la commande SLEEP_MODE_PWR_DOWN), puis au réveil que j'allais envoyer mes DATA avec Akeru... Et bien non !!

J'ai l'impression que le shield n'est plus dispo. Est ce possible? Est ce que le UNO avec l'instruction pour faire "dodo" perd tous ces périphériques?

J'ai cherché quelques jours déjà, mais rien trouvé.

Merci de m'apporter vos idées et votre aide.
starsrock69
 
Messages: 3
Inscription: Jeu 30 Juin 2016 22:22

Re: Sleep mode de la carte Akeru ?

Message non lude starsrock69 » Jeu 30 Juin 2016 23:06

Désolé, je le suis trompé dans mon code.
J'utilise l'instruction: "LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF) ;
starsrock69
 
Messages: 3
Inscription: Jeu 30 Juin 2016 22:22

Re: Sleep mode de la carte Akeru ?

Message non lude Laetitia » Ven 1 Juil 2016 09:49

Bonjour,

Pouvez-vous détailler ce qui ne fonctionne pas ? Ce qui vous fait dire que le shield n'est "plus dispo" ?
Pouvez-vous poster le code complet utilisé ? Je devine que vous utilisez la librairie Low-Power de RocketScream, et elle ne comporte pas d'élément "bloquant" au réveil de l'Arduino.

En revanche la librairie Akeru n'est pas faite pour envoyer des messages toutes les 8 secondes (à moins que vous l'ayez modifiée...) : le quota autorisé est de 140 messages par jour, soit une moyenne d'un message toutes les 10 minutes. Voir ce post et la FAQ.
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: Sleep mode de la carte Akeru ?

Message non lude starsrock69 » Ven 1 Juil 2016 16:21

Bonjour,

en fait ce qui me fait dire que la partie Akeru ne fonctionne pas, c'est qu'elle affiche "Modem not Ready".
J'ai déjà isolé la partie que j'essaie désepérement de faire tourner (la dernière - après les //~~~~~~~~~~~~).

Si je met qu'une simple tempo de 12 min, c'est tout bon. D'ailleurs même si cette tempo est plus courte, mon prog tourne,
et je crois même que le modem ne me dit pas qu'il n'est pas "ready".

C'est vraiment depuis que j'essaie de mettre en veille l'ensemble (Arduino - Akeru) que les données ne sont plus envoyées, avec
l'instruction "LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);"
J'ai fait une boucle for, pour mettre en veille 90 x 8s -> 12 min
Arduino à l'air de tourner, il passe mon prog récupère temp + hygro...

Merci !!!


Voici mon code :

Code: Tout sélectionner
#include <LowPower.h>
#include <Akeru.h>
#include <SoftwareSerial.h>

#include "HX711.h"
// HX711.DOUT  - pin #A1
// HX711.PD_SCK - pin #A0
HX711 scale(A1, A0);   


#include <DHT22.h>
#include <stdio.h>
// Only used for sprintf
// Data wire is plugged into port 7 on the Arduino
// Connect a 4.7K resistor between VCC and the data pin (strong pullup)
#define DHT22_PIN 7
// Setup a DHT22 instance
DHT22 myDHT22(DHT22_PIN);


void setup() {

// Init modem --------------------------------------------------------------------------
  Akeru.begin();


// Capteur Temp / Hygro ----------------------------------------------------------------
  Serial.begin(9600);
  Serial.println("HX711 Demo");
  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());             // print a raw reading from the ADC
  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));   // print the average of 20 readings from the ADC
  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));       // print the average of 5 readings from the ADC minus the tare weight (not set yet)
  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);    // print the average of 5 readings from the ADC minus tare weight (not set) divided
                                            // by the SCALE parameter (not set yet) 
  scale.set_scale(212.f);                   // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();                             // reset the scale to 0
  Serial.println("After setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());             // print a raw reading from the ADC
  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));   // print the average of 20 readings from the ADC
  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));       // print the average of 5 readings from the ADC minus the tare weight, set with tare()
  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);    // print the average of 5 readings from the ADC minus tare weight, divided
                                            // by the SCALE parameter set with set_scale
  Serial.println("Readings:");

//Format de variable à transmettre -----------------------------------------------------

}

    typedef struct
{
  float temp;
  int hygro;
  int poids;
}
Payload;





void loop()
{

  delay(1000);
  Serial.begin(9600);
  delay(1000);
  Serial.println("Init Serial");
 
  int poids;
  Serial.print("one reading:\t");
  Serial.print(scale.get_units(), 1);
  poids = (scale.get_units(), 1);   //possible de rajouter x10 apres scale.get_units()
  Serial.print("\t| average:\t");
  Serial.println(scale.get_units(10), 1);

  scale.power_down();              // put the ADC in sleep mode
  delay(5000);
  scale.power_up();
// -------------------------------------------------------------------------------------------
  DHT22_ERROR_t errorCode;
  // The sensor can only be read from every 1-2s, and requires a minimum
  // 2s warm-up after power-on.
  delay(2000);
 
  Serial.println();
  Serial.print("Requesting data...");
  errorCode = myDHT22.readData();
  switch(errorCode)
  {
    case DHT_ERROR_NONE:
      Serial.print("Got Data ");
      Serial.println();
      Serial.print(myDHT22.getTemperatureC());
      Serial.print("C ");
      Serial.print(myDHT22.getHumidity());
      Serial.println("%");
   // Alternately, with integer formatting which is clumsier but more compact to store and
   // can be compared reliably for equality:
   //   
      char buf[128];
      sprintf(buf, "Integer-only reading: Temperature %hi.%01hi C, Humidity %i.%01i %% RH",
                   myDHT22.getTemperatureCInt()/10, abs(myDHT22.getTemperatureCInt()%10),
                   myDHT22.getHumidityInt()/10, myDHT22.getHumidityInt()%10);
      Serial.println(buf);
      break;
    case DHT_ERROR_CHECKSUM:
      Serial.print("check sum error ");
      Serial.print(myDHT22.getTemperatureC());
     
      Serial.print("C ");
      Serial.print(myDHT22.getHumidity());
      Serial.println("%");
      break;
    case DHT_BUS_HUNG:
      Serial.println("BUS Hung ");
      break;
    case DHT_ERROR_NOT_PRESENT:
      Serial.println("Not Present ");
      break;
    case DHT_ERROR_ACK_TOO_LONG:
      Serial.println("ACK time out ");
      break;
    case DHT_ERROR_SYNC_TIMEOUT:
      Serial.println("Sync Timeout ");
      break;
    case DHT_ERROR_DATA_TIMEOUT:
      Serial.println("Data Timeout ");
      break;
    case DHT_ERROR_TOOQUICK:
      Serial.println("Polled to quick ");
      break;
  }

 Payload p;

p.temp = myDHT22.getTemperatureC();
p.hygro = myDHT22.getHumidity();
p.poids = (scale.get_units());

 
  Akeru.begin();
  delay(5000);
  Serial.println("Akeru init");
 
  Serial.print("Temperature  = "); Serial.println(p.temp);
  Serial.print("Humidite  = "); Serial.println(p.hygro);
  Serial.print("Poids = "); Serial.println(p.poids);


  // Send in the mighty cloud!
  bool msgSent = Akeru.send(&p, sizeof(p));
 
  // Akeru.send() returns 0 if message failed.
  // This is caused by either a network error
  // or the unavailability of the modem
  // (call to isReady() prior to sending returned 0)
 
  if (!msgSent)
  {
    Serial.println("Modem not ready");
  }
  else
  {
    Serial.println("Sent");
  }

// Wait for 10 minutes.
// Note that delay(600000) will block the Arduino (bug in delay()?)
//  for (int second = 0; second < 720; second++)   // 12 min = 720
//  {
//  delay(1000);
//  }

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for (int second = 0; second < 90; second++)  //90 -> 12 min
{
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
delay(1000);
}
starsrock69
 
Messages: 3
Inscription: Jeu 30 Juin 2016 22:22

Re: Sleep mode de la carte Akeru ?

Message non lude Florian » Mer 13 Juil 2016 10:07

Bonjour,

Quand l'Arduino sort d'un état de veille elle ne perd pas ses "périphériques", elle reprend les instructions du programme qu'elle a en mémoire. Donc si ce programme utilise des modules complémentaires et qu'ils sont encore correctement reliés à l'Arduino, tout fonctionnera normalement comme si la carte n'avait pas été en veille.

Concernant l'envoi des données, la librairie Akeru/Akene est rédigée pour n'envoyer qu'un seul message par 10 minutes. Donc comme Laetitia vous l'a dit 140 messages par jour.
Il est donc normal que votre programme tourne correctement avec l'envoi de message lorsque la veille de la carte est supérieure à 10 minutes (12 dans votre cas). Si la mise en veille dure moins de 10 minutes le modem ne sera pas capable d'envoyer un nouveau message et vous répondra d'après votre programme "Modem not ready".

En résumé, l'Akeru/Akene ne peut envoyer qu'un message toutes les 10 minutes (sauf modification de votre part dans la librairie), il est donc inutile de mettre la carte en veille moins de 10 minutes car il sera incapable d'envoyer un nouveau message.
Florian
 
Messages: 75
Inscription: Mer 24 Juil 2013 17:36

Re: Sleep mode de la carte Akeru ?

Message non lude Christophe » Dim 23 Oct 2016 16:32

Bonjour,
Je rencontre le même problème de "modem not ready" sur un retour de veille ... du coup cette discussion est très intéressante !
J'utilise le mode veille suivant:
- fonction "set_sleep_mode(SLEEP_MODE_PWR_DOWN)"
- dans les librairies:
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>

Je ne suis pas sûr d'être exactement dans le même cas car le je ne cherche pas à envoyer des messages plus fréquemment que 10 min, mais ce que je comprends en vous lisant est que, puisque le processeur est mis en mode "sleep" la vision du temps courant dans la fonction Akene.isReady()) est faussée: dans l'état "sleep" le temps s'arrête ;-) du coup tout se passe comme si on essayait d'envoyer le nouveau message immédiatement après le précédent et la sécurité fonctionne très bien !!!

Donc cette sécurité, qui est très bien pour le prise en main du modem lors des premiers essais, est en fait incompatible avec les optimisations de puissance consommée que l'on peut faire avec le mode sleep , ce qui est vraiment dommage pour des objets potentiellement dans la nature avec un petit panneau solaire .
Ceci dit , je ne vois pas comment améliorer cette librairie , à partir du moment où le temps s'arrête, la vérification des 10 min est impossible à faire dans le librairie.
Dans mon cas je provoque un réveil toutes les 10 minutes gâce au watchdog réglé à 8 sec) et le compteur qui va bien pour évaluer les 10 minutes , la modification de la librairie règle le problème (testé) et je ne risque pas de dépasser mon quota de message vu que tout est supervisé par mon watchdog
Voilà en tout cas merci , pour avoir fait le déclic dans mon esprit
Cordialement
Christophe
Christophe
 
Messages: 3
Inscription: Jeu 25 Aoû 2016 21:24


Retourner vers Akeru et Akene

Qui est en ligne

Utilisateurs parcourant ce forum: Yahoo [Bot] et 1 invité