p2p-pingpong-clickbutton

Dependencies:   PingPong-P2P-ClickButtonToWork-SX1272 Lora_SX1272_Coragem

Revision:
2:4eef0eca4d26
Parent:
1:9f961d34dd8d
Child:
3:cbe3f441353e
diff -r 9f961d34dd8d -r 4eef0eca4d26 main.cpp
--- a/main.cpp	Sun Nov 05 17:02:22 2017 +0000
+++ b/main.cpp	Tue Feb 06 10:04:55 2018 +0000
@@ -19,89 +19,27 @@
  *****************************************************************************
  * last update: Sep. 29th, 2017 by C. Pham
  * last update: oct 30th , 2017 by C.Dupaty
- * ADAPTATION FOR NUCLEO STM32, TESTED ON NUCLEO-L073RZ
+ * ADAPTATION FOR NUCLEO STM32, TESTED ON NUCLEO-L073RZ WITH 
+ * SX1272MB2xAS SHIELD
+ * DRAGINO SHIELD V95 WITH GPS  http://wiki.dragino.com/index.php?title=Lora/GPS_Shield 
+ *      For DRAGINO move LORA_CLK LORA_DI LORA_DO straps to the right (arduino 11 12 13)
  * ALL CONFIGURATIONS FOR ARDUINO HAVE BEEN REMOVED
  * WORK ONLY IN EUROPE
  * please visit http://cpham.perso.univ-pau.fr/LORA/LoRaDevices.html
- * for ARDUINO version
- */
+ * for original version for ARDUINO 
+*/
+  
 #include "mbed.h"
- 
-// Include the SX1272
 #include "SX1272.h"
-
-// IMPORTANT
-///////////////////////////////////////////////////////////////////////////////////////////////////////////
-// please uncomment only 1 choice
-//
-#define ETSI_EUROPE_REGULATION
-//#define FCC_US_REGULATION
-//#define SENEGAL_REGULATION
-/////////////////////////////////////////////////////////////////////////////////////////////////////////// 
-
-// IMPORTANT
-///////////////////////////////////////////////////////////////////////////////////////////////////////////
-// please uncomment only 1 choice
 #define BAND868
-//#define BAND900
-//#define BAND433
-///////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-#ifdef ETSI_EUROPE_REGULATION
 #define MAX_DBM 14
-// previous way for setting output power
-// char powerLevel='M';
-#elif defined SENEGAL_REGULATION
-#define MAX_DBM 10
-// previous way for setting output power
-// 'H' is actually 6dBm, so better to use the new way to set output power
-// char powerLevel='H';
-#elif defined FCC_US_REGULATION
-#define MAX_DBM 14
-#endif
 
-#ifdef BAND868
-#ifdef SENEGAL_REGULATION
-const uint32_t DEFAULT_CHANNEL=CH_04_868;
-#else
-const uint32_t DEFAULT_CHANNEL=CH_10_868;
-#endif
-#elif defined BAND900
-const uint32_t DEFAULT_CHANNEL=CH_05_900;
-#elif defined BAND433
-const uint32_t DEFAULT_CHANNEL=CH_00_433;
-#endif
-
-// IMPORTANT
-///////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
-// uncomment if your radio is an HopeRF RFM92W, HopeRF RFM95W, Modtronix inAir9B, NiceRF1276
-// or you known from the circuit diagram that output use the PABOOST line instead of the RFO line
-//#define PABOOST
-/////////////////////////////////////////////////////////////////////////////////////////////////////////// 
+const uint32_t DEFAULT_CHANNEL=CH_10_868;  // for BAND868
 
-///////////////////////////////////////////////////////////////////
-// COMMENT OR UNCOMMENT TO CHANGE FEATURES. 
-// ONLY IF YOU KNOW WHAT YOU ARE DOING!!! OTHERWISE LEAVE AS IT IS
-//#define WITH_EEPROM             //  tous uncomment a l origine sauf WITH_ACK
+//#define WITH_EEPROM            //  TO DO ON STM32
 #define WITH_APPKEY
-#define FLOAT_TEMP
 #define NEW_DATA_FIELD
-//#define LOW_POWER
-//#define LOW_POWER_HIBERNATE
-//#define WITH_ACK
-///////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////
-// ADD HERE OTHER PLATFORMS THAT DO NOT SUPPORT EEPROM NOR LOW POWER
-#if defined ARDUINO_SAM_DUE || defined __SAMD21G18A__ || defined TARGET_NUCLEO_L073RZ
-#undef WITH_EEPROM
-#endif
-
-#if defined ARDUINO_SAM_DUE || defined TARGET_NUCLEO_L073RZ
-#undef LOW_POWER
-#endif
-///////////////////////////////////////////////////////////////////
+#define WITH_ACK
 
 ///////////////////////////////////////////////////////////////////
 // CHANGE HERE THE LORA MODE, NODE ADDRESS 
@@ -122,8 +60,9 @@
 ///////////////////////////////////////////////////////////////////
 
 ///////////////////////////////////////////////////////////////////
-// CHANGE HERE THE TIME IN MINUTES BETWEEN 2 READING & TRANSMISSION
-unsigned int idlePeriodInMin = 2;
+// CHANGE HERE THE TIME IN SECONDS BETWEEN 2 READING & TRANSMISSION
+#define minTime 120 // 2 minutes
+#define maxTime 600 // 10 minutes
 ///////////////////////////////////////////////////////////////////
 
 #ifdef WITH_APPKEY
@@ -134,21 +73,6 @@
 ///////////////////////////////////////////////////////////////////
 #endif
 
-// we wrapped Serial.println to support the Arduino Zero or M0
-#if defined __SAMD21G18A__ && not defined ARDUINO_SAMD_FEATHER_M0
-#define PRINTLN                   SerialUSB.println("")              
-#define PRINT_CSTSTR(fmt,param)   SerialUSB.print(F(param))
-#define PRINT_STR(fmt,param)      SerialUSB.print(param)
-#define PRINT_VALUE(fmt,param)    SerialUSB.print(param)
-#define FLUSHOUTPUT               SerialUSB.flush();
-#else
-#define PRINTLN                   Serial.println("")
-#define PRINT_CSTSTR(fmt,param)   Serial.print(F(param))
-#define PRINT_STR(fmt,param)      Serial.print(param)
-#define PRINT_VALUE(fmt,param)    Serial.print(param)
-#define FLUSHOUTPUT               Serial.flush();
-#endif
-
 #ifdef WITH_EEPROM
 #include <EEPROM.h>
 #endif
@@ -159,54 +83,6 @@
 #define NB_RETRIES 2
 #endif
 
-#if defined ARDUINO_AVR_PRO || defined ARDUINO_AVR_MINI || defined ARDUINO_SAM_DUE || defined __MK20DX256__  || defined __MKL26Z64__ || defined __MK64FX512__ || defined __MK66FX1M0__ || defined __SAMD21G18A__ || TARGET_NUCLEO_L073RZ
-  // if you have a Pro Mini running at 5V, then change here
-  // these boards work in 3.3V
-  // Nexus board from Ideetron is a Mini
-  // __MK66FX1M0__ is for Teensy36
-  // __MK64FX512__  is for Teensy35
-  // __MK20DX256__ is for Teensy31/32
-  // __MKL26Z64__ is for TeensyLC
-  // __SAMD21G18A__ is for Zero/M0 and FeatherM0 (Cortex-M0)
-  #define TEMP_SCALE  3300.0
-#else // ARDUINO_AVR_NANO || defined ARDUINO_AVR_UNO || defined ARDUINO_AVR_MEGA2560 || 
-  // also for all other boards, so change here if required.
-  #define TEMP_SCALE  5000.0
-#endif
-
-#ifdef LOW_POWER
-// this is for the Teensy36, Teensy35, Teensy31/32 & TeensyLC
-// need v6 of Snooze library
-#if defined __MK20DX256__ || defined __MKL26Z64__ || defined __MK64FX512__ || defined __MK66FX1M0__
-#define LOW_POWER_PERIOD 60
-#include <Snooze.h>
-SnoozeTimer timer;
-SnoozeBlock sleep_config(timer);
-//#elif defined ARDUINO_AVR_FEATHER32U4
-//#define LOW_POWER_PERIOD 8
-//#include "Adafruit_SleepyDog.h"
-#else // for all other boards based on ATMega168, ATMega328P, ATMega32U4, ATMega2560, ATMega256RFR2, ATSAMD21G18A
-#define LOW_POWER_PERIOD 8
-// you need the LowPower library from RocketScream
-// https://github.com/rocketscream/Low-Power
-#include "LowPower.h"
-
-#ifdef __SAMD21G18A__
-// use the RTC library
-#include "RTCZero.h"
-/* Create an rtc object */
-RTCZero rtc;
-#endif
-#endif
-unsigned int nCycle = idlePeriodInMin*60/LOW_POWER_PERIOD;
-#endif
-
-double temp;
-unsigned long nextTransmissionTime=0L;
-char float_str[20];
-uint8_t message[100];
-int loraMode=LORAMODE;
-
 #ifdef WITH_EEPROM
 struct sx1272config {
 
@@ -219,102 +95,32 @@
 sx1272config my_sx1272config;
 #endif
 
-// ajoute par C.Dupaty
+///////////////////////////////////////
+// Globals variables
+///////////////////////////////////////
+int loraMode=LORAMODE;
+// added by C.Dupaty
+// For test with LM35DZ temperature captor
 DigitalOut temp_pin_power(TEMP_PIN_POWER);
 AnalogIn temp_pin_read(TEMP_PIN_READ);
 
+/////////////////////////////////////////
+// SETUP SX1272 initialisation
+////////////////////////////////////////
 void setup()
 {
   int e;
-
-  // for the temperature sensor
-  //pinMode(TEMP_PIN_READ, INPUT);
-  // and to power the temperature sensor
-  //pinMode(TEMP_PIN_POWER,OUTPUT);
-
-#ifdef LOW_POWER
-#ifdef __SAMD21G18A__
-  rtc.begin();
-#endif  
-#else
- // digitalWrite(TEMP_PIN_POWER,HIGH);
- temp_pin_power=1;
-#endif
-
-  wait_ms(3000);
-/*
-  // Open serial communications and wait for port to open:
-#if defined __SAMD21G18A__ && not defined ARDUINO_SAMD_FEATHER_M0 
-  SerialUSB.begin(38400);
-#else
- Serial.begin(38400);  
-#endif 
-*/
- 
-  // Print a start message
-  printf("%s","-------------------------------------------------\n");
-  printf("%s","------Simple LoRa temperature sensor-------------\n");
-  printf("%s","--P.Pharm, adaptation NUCELO STM32 C.Dupaty------\n");
-  printf("%s","-------------------------------------------------\n");
+  // Print welcome message
+  printf("-------------------------------------------------\n");
+  printf("------Simple LoRa temperature sensor-------------\n");
+  printf("--P.Pharm, adaptation NUCELO STM32 C.Dupaty------\n");
+  printf("-------------------------------------------------\n\n");
+  printf("!!!!!!!!! During configuration, all states numbers must read at 0\n");
  
-#ifdef ARDUINO_AVR_PRO
-  printf("%s","Arduino Pro Mini detected\n");  
-#endif
-#ifdef ARDUINO_AVR_NANO
-  printf("%s","Arduino Nano detected\n");   
-#endif
-#ifdef ARDUINO_AVR_MINI
-  printf("%s","Arduino Mini/Nexus detected\n");  
-#endif
-#ifdef ARDUINO_AVR_MEGA2560
-  printf("%s","Arduino Mega2560 detected\n");  
-#endif
-#ifdef ARDUINO_SAM_DUE
-  printf("%s","Arduino Due detected\n");  
-#endif
-#ifdef __MK66FX1M0__
-  printf("%s","Teensy36 MK66FX1M0 detected\n");
-#endif
-#ifdef __MK64FX512__
-  printf("%s","Teensy35 MK64FX512 detected\n");
-#endif
-#ifdef __MK20DX256__
-  printf("%s","Teensy31/32 MK20DX256 detected\n");
-#endif
-#ifdef __MKL26Z64__
-  printf("%s","TeensyLC MKL26Z64 detected\n");
-#endif
-#ifdef ARDUINO_SAMD_ZERO 
-  printf("%s","Arduino M0/Zero detected\n");
-#endif
-#ifdef ARDUINO_AVR_FEATHER32U4 
-  printf("%s","Adafruit Feather32U4 detected\n"); 
-#endif
-#ifdef ARDUINO_SAMD_FEATHER_M0
-  printf("%s","Adafruit FeatherM0 detected\n");
-#endif
-
-// See http://www.nongnu.org/avr-libc/user-manual/using_tools.html
-// for the list of define from the AVR compiler
-
-#ifdef __AVR_ATmega328P__
-  printf("%s","ATmega328P detected\n");
-#endif 
-#ifdef __AVR_ATmega32U4__
-  printf("%s","ATmega32U4 detected\n");
-#endif 
-#ifdef __AVR_ATmega2560__
-  printf("%s","ATmega2560 detected\n");
-#endif 
-#ifdef __SAMD21G18A__ 
-  printf("%s","SAMD21G18A ARM Cortex-M0 detected\n");
-#endif
-#ifdef __SAM3X8E__ 
-  printf("%s","SAM3X8E ARM Cortex-M3 detected\n");
-#endif
-
 #ifdef TARGET_NUCLEO_L073RZ
-  printf("%s","NUCLEO L073RZ detected\n");
+  printf("NUCLEO L073RZ detected\n");
+#else
+  printf("WARNING, this software has been tested on NUCLEO L073RZ only !!!\n"); 
 #endif
 
   // Power ON the module
@@ -326,13 +132,11 @@
 
   // found a valid config?
   if (my_sx1272config.flag1==0x12 && my_sx1272config.flag2==0x34) {
-    printf("%s","Get back previous sx1272 config\n");
+    printf("Get back previous sx1272 config\n");
 
     // set sequence number for SX1272 library
     sx1272._packetNumber=my_sx1272config.seq;
-    printf("%s","Using packet sequence number of ");
-    printf("%d", sx1272._packetNumber);
-    printf("\n");
+    printf("Using packet sequence number of %d\n",sx1272._packetNumber);
   }
   else {
     // otherwise, write config and start over
@@ -345,28 +149,21 @@
   int error_config_sx1272=0;
   
   // Set transmission mode and print the result
-  printf("%s","\n-------------------------DEBUT Setting mode -----------> \n");
   e = sx1272.setMode(loraMode);
-  printf("%s","\n-------------------------FIN Setting mode -----------> \n");
   if (e) error_config_sx1272=1;
-  printf("%s","Setting Mode: state ");
-  printf("%d", e);
-  printf("\n");
-
+  printf("Setting Mode: state %d\n",e);
+  
   // enable carrier sense
   sx1272._enableCarrierSense=true;
-#ifdef LOW_POWER
-  // TODO: with low power, when setting the radio module in sleep mode
-  // there seem to be some issue with RSSI reading
+
+  // for LOW POWER
   sx1272._RSSIonSend=false;
-#endif   
+
     
   // Select frequency channel
   e = sx1272.setChannel(DEFAULT_CHANNEL);
   if (e) error_config_sx1272=1;
-  printf("%s","Setting Channel: state ");
-  printf("%d", e);
-  printf("\n");
+  printf("Setting Channel: state %d\n",e);
   
   // Select amplifier line; PABOOST or RFO
 #ifdef PABOOST
@@ -383,102 +180,54 @@
 
   e = sx1272.setPowerDBM((uint8_t)MAX_DBM);
   if (e) error_config_sx1272=1;
-  printf("%s","Setting Power: state ");
-  printf("%d", e);
-  printf("\n");
+  printf("Setting Power: state %d\n",e);
   
   // Set the node address and print the result
   e = sx1272.setNodeAddress(node_addr);
   if (e) error_config_sx1272=1;
-  printf("%s","Setting node addr: state ");
-  printf("%d", e);
-  printf("\n");
+  printf("Setting node addr: state %d\n",e);
   
   // Print a success message
-  if (!error_config_sx1272) printf("%s","SX1272 successfully configured\n");
-  else printf("%s","ERREUR DE CONFIGURATION DU SX1272\n");
+  if (!error_config_sx1272) printf("SX1272 successfully configured\n");
+  else printf("ERREUR DE CONFIGURATION DU SX1272\n");
 
   wait_ms(500);
 }
 
-char *ftoa(char *a, double f, int precision)
-{
- long p[] = {0,10,100,1000,10000,100000,1000000,10000000,100000000};
- 
- char *ret = a;
- long heiltal = (long)f;
- //modifie pa C.Dupaty
-// itoa(heiltal, a, 10);
-sprintf(a,"%d",heiltal);
- while (*a != '\0') a++;
- *a++ = '.';
- long desimal = abs((long)((f - heiltal) * p[precision]));
- if (desimal < p[precision-1]) {
-  *a++ = '0';
- } 
- 
-  //modifie pa C.Dupaty
-//  itoa(desimal, a, 10);
-sprintf(a,"%d",desimal);
-
-
- return ret;
-}
-
-
+//////////////////////////////////////////////////////////////
+//  main was named loop on Arduino
 //////////////////////////////////////////////////////////////
-//  programme principal , loop sur Arduino
-//////////////////////////////////////////////////////////////
-int main(void)
+int main(void)      // return int for cpp compatibility but never ending the program
 {
-  long startSend;
-  long endSend;
-  uint8_t app_key_offset=0;
-  int e;
-  
-  setup();
-  
-while(1)  { /////////////// debut boucle
-//printf("%s","\n-------------------------BOUCLE SANS FIN -----------> \n");
-//while(1); 
+long startSend;
+long endSend;
+uint8_t app_key_offset=0;
+int e;
+double temp;            // variable temperature in this demo 
+char float_str[20];
+uint8_t message[100];   // the message that will be send to the gateway
 
-#ifndef LOW_POWER
-  // 600000+random(15,60)*1000
-  if (millis() > nextTransmissionTime) {
-#endif
+setup();
+ 
+ // main loop start here 
+while(1)  {  
 
-#ifdef LOW_POWER
-    //  digitalWrite(TEMP_PIN_POWER,HIGH);
-    temp_pin_power=1;
-      // security?
+// this demo use a LM35DZ temerature captor
+      temp_pin_power=1;         // LM35DZ is powering by a simple GPIO
       wait_ms(200);   
-#endif
-
       temp = 0;
       int value;
-      
       for (int i=0; i<10; i++) {
-          // change here how the temperature should be computed depending on your sensor type
-          // 
-           value = temp_pin_read.read_u16();
-          temp += ((double)value*50.0/8192.0);
-        
-          printf("%s","Reading ADC temperature -> ");
-          printf("%d", value);
-          printf("\n");   
+          // compute temperature for LM35DZ captor
+          value = temp_pin_read.read_u16();
+          temp += ((double)value*50.0/8192.0)/10;
+          printf("Reading ADC temperature %d/10 -> %d\n",i,value);
           wait_ms(100);
-      }
-      
-#ifdef LOW_POWER
-      //digitalWrite(TEMP_PIN_POWER,LOW);
-      temp_pin_power=0;
-#endif
+      } 
+      temp_pin_power=0;         // LM35DZ power off
+      printf("Mean temp is %f Cent\n",temp);
+// we have now temperature in the variable temp      
 
-      printf("%s","Mean temp is ");
-      temp = temp/10;
-      printf("%f", temp);
-      printf("\n");
-      
 #ifdef WITH_APPKEY
       app_key_offset = sizeof(my_appKey);
       // set the app key in the payload
@@ -487,40 +236,23 @@
 
       uint8_t r_size;
       
-#ifdef FLOAT_TEMP
-      ftoa(float_str,temp,2);
-
-#ifdef NEW_DATA_FIELD
-      // this is for testing, uncomment if you just want to test, without a real temp sensor plugged
-      //strcpy(float_str, "21.55567");
-      r_size=sprintf((char*)message+app_key_offset,"\\!#%d#TC/%s",field_index,float_str);
-#else
-      // this is for testing, uncomment if you just want to test, without a real temp sensor plugged
-      //strcpy(float_str, "21.55567");
-      r_size=sprintf((char*)message+app_key_offset,"\\!#%d#%s",field_index,float_str);
-#endif
-      
-#else
-      
-#ifdef NEW_DATA_FIELD      
-      r_size=sprintf((char*)message+app_key_offset, "\\!#%d#TC/%d", field_index, (int)temp);   
-#else
-      r_size=sprintf((char*)message+app_key_offset, "\\!#%d#%d", field_index, (int)temp);
-#endif         
-#endif
-
-      printf("%s","Sending ");
-      printf("%s",(char*)(message+app_key_offset));
-      printf("\n");
-      
-      printf("%s","Real payload size is ");
-      printf("%d", r_size);
-      printf("\n");
-      
+        // convert float temp to string ASCII
+        sprintf(float_str,"%2.2f",temp);
+        #ifdef NEW_DATA_FIELD
+              // this is for testing, uncomment if you just want to test, without a real temp sensor plugged
+              //strcpy(float_str, "21.55567");
+              r_size=sprintf((char*)message+app_key_offset,"\\!#%d#TC/%s",field_index,float_str);
+        #else
+              // this is for testing, uncomment if you just want to test, without a real temp sensor plugged
+              //strcpy(float_str, "21.55567");
+              r_size=sprintf((char*)message+app_key_offset,"\\!#%d#%s",field_index,float_str);
+        #endif
+          
+      printf("Sending %s\n",message+app_key_offset);
+      printf("Real payload size is %d\n",r_size);
+     
       int pl=r_size+app_key_offset;
-      
       sx1272.CarrierSense();
-      
       startSend=millis();
 
 #ifdef WITH_APPKEY
@@ -535,138 +267,43 @@
       // with the app key if this feature is enabled
 #ifdef WITH_ACK
       int n_retry=NB_RETRIES;
-      
       do {
         e = sx1272.sendPacketTimeoutACK(DEFAULT_DEST_ADDR, message, pl);
-
-        if (e==3)
-          printf("%s","No ACK");
-        
+        if (e==3) printf("No ACK");
         n_retry--;
-        
-        if (n_retry)
-          printf("%s","Retry");
-        else
-          printf("%s","Abort"); 
-          
+        if (n_retry) printf("Retry");
+        else printf("Abort"); 
       } while (e && n_retry);          
 #else      
       e = sx1272.sendPacketTimeout(DEFAULT_DEST_ADDR, message, pl);
 #endif  
       endSend=millis();
-    
 #ifdef WITH_EEPROM
       // save packet number for next packet in case of reboot
       my_sx1272config.seq=sx1272._packetNumber;
       EEPROM.put(0, my_sx1272config);
 #endif
 
-      printf("%s","LoRa pkt size ");
-      printf("%d", pl);
-      printf("\n");
+      printf("LoRa pkt size %d\n",pl);
+      printf("LoRa pkt seq %d\n",sx1272.packet_sent.packnum);
+      printf("LoRa Sent in %ld\n",endSend-startSend);
+      printf("LoRa Sent w/CAD in %ld\n", endSend-sx1272._startDoCad);
+      printf("Packet sent, state %d\n",e);
+      printf("Remaining ToA is %d\n",sx1272.getRemainingToA());
       
-      printf("%s","LoRa pkt seq ");
-      printf("%d", sx1272.packet_sent.packnum);
-      printf("\n");
-    
-      printf("%s","LoRa Sent in ");
-      printf("%ld", endSend-startSend);
-      printf("\n");
-          
-      printf("%s","LoRa Sent w/CAD in ");
-      printf("%ld", endSend-sx1272._startDoCad);
-      printf("\n");
-
-      printf("%s","Packet sent, state ");
-      printf("%d", e);
-      printf("\n");
-
-      printf("%s","Remaining ToA is ");
-      printf("%d", sx1272.getRemainingToA());
-      printf("\n");
-        
-#if defined LOW_POWER && not defined ARDUINO_SAM_DUE
-      printf("%s","Switch to power saving mode\n");
-
+ // compute next time transmission in seconds
+      int waitting = rand()%maxTime+minTime;   // waitting in Sec
+      printf("Switch to power saving mode\n");
       e = sx1272.setSleepMode();
-
       if (!e)
-        printf("%s","Successfully switch LoRa module in sleep mode\n");
+        printf("Successfully switch LoRa module in sleep mode\n");
       else  
-        printf("%s","Could not switch LoRa module in sleep mode\n");
-        
-      FLUSHOUTPUT
-      wait_ms(50);
-
-#ifdef __SAMD21G18A__
-      // For Arduino M0 or Zero we use the built-in RTC
-      //LowPower.standby();
-      rtc.setTime(17, 0, 0);
-      rtc.setDate(1, 1, 2000);
-      rtc.setAlarmTime(17, idlePeriodInMin, 0);
-      // for testing with 20s
-      //rtc.setAlarmTime(17, 0, 20);
-      rtc.enableAlarm(rtc.MATCH_HHMMSS);
-      //rtc.attachInterrupt(alarmMatch);
-      rtc.standbyMode();
-
-      printf("%s","SAMD21G18A wakes up from standby\n");      
-      FLUSHOUTPUT
-#else
-      nCycle = idlePeriodInMin*60/LOW_POWER_PERIOD + random(2,4);
+        printf("Could not switch LoRa module in sleep mode\n");
+      // Deep sleep 
+      printf("Deep sleep allowed: %i for %d seconds\n", sleep_manager_can_deep_sleep(), waitting);
+      wait(waitting);
+}//  end loop
 
-#if defined __MK20DX256__ || defined __MKL26Z64__ || defined __MK64FX512__ || defined __MK66FX1M0__
-      // warning, setTimer accepts value from 1ms to 65535ms max
-      timer.setTimer(LOW_POWER_PERIOD*1000 + random(1,5)*1000);// milliseconds
-
-      nCycle = idlePeriodInMin*60/LOW_POWER_PERIOD;
-#endif          
-      for (int i=0; i<nCycle; i++) {  
-
-#if defined ARDUINO_AVR_PRO || defined ARDUINO_AVR_NANO || defined ARDUINO_AVR_UNO || defined ARDUINO_AVR_MINI || defined __AVR_ATmega32U4__ 
-          // ATmega328P, ATmega168, ATmega32U4
-          LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
-          
-          //LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, 
-          //              SPI_OFF, USART0_OFF, TWI_OFF);
-#elif defined ARDUINO_AVR_MEGA2560
-          // ATmega2560
-          LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
-          
-          //LowPower.idle(SLEEP_8S, ADC_OFF, TIMER5_OFF, TIMER4_OFF, TIMER3_OFF, 
-          //      TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART3_OFF, 
-          //      USART2_OFF, USART1_OFF, USART0_OFF, TWI_OFF);
-#elif defined __MK20DX256__ || defined __MKL26Z64__ || defined __MK64FX512__ || defined __MK66FX1M0__
-          // Teensy31/32 & TeensyLC
-#ifdef LOW_POWER_HIBERNATE
-          Snooze.hibernate(sleep_config);
-#else            
-          Snooze.deepSleep(sleep_config);
-#endif
-#else
-          // use the wait_ms function
-          wait_ms(LOW_POWER_PERIOD*1000);
-#endif                        
-          printf("%s",".");
-          FLUSHOUTPUT
-          wait_ms(10);                        
-      }
-      
-      wait_ms(50);
-#endif      
-      
-#else
-      printf("%ld ", nextTransmissionTime);
-      printf("%s","Will send next value at ");
-      // use a random part also to avoid collision
-      nextTransmissionTime=millis()+(unsigned long)idlePeriodInMin*60*1000+(unsigned long)(rand()%60+15)*1000;
-      printf("%ld", nextTransmissionTime);
-      printf("\n");
-  }
-#endif
-
-}//  fin boucle
-
-//return (0);
+//return (0);  useless here, the program never ends
 
 }