Shared by Polytech Marseille to contribute to the improvement of the mbed community !

Dependencies:   Adafruit_SGP30_mbed mbed GSM X_NUCLEO_IKS01A2 max31865 GroveGPS SDFileSystem DFPlayerMini BME280 DS1820

Committer:
ayoubzahir
Date:
Tue Apr 30 15:00:03 2019 +0000
Revision:
3:cb77ea3370e8
Parent:
0:d7a683cf76d9
This Program is shared by PolytechMarseille_MT to contribute to the improvement of the mbed community.; Have fun !

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ayoubzahir 3:cb77ea3370e8 1 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 2 // AMU - Aix-Marseille Université
ayoubzahir 3:cb77ea3370e8 3 // Polytech Marseille - Microelectronique & Telecommunications (MT)
ayoubzahir 3:cb77ea3370e8 4 // Projet MT5A "STM32 In the Sky - HAB", 2018-2019
ayoubzahir 3:cb77ea3370e8 5 // Enseignants : C.Dufaza & H. Aziza
ayoubzahir 3:cb77ea3370e8 6 // Etudiants : ...
ayoubzahir 3:cb77ea3370e8 7 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 8 // Version avril 2019, C.Dufaza
ayoubzahir 3:cb77ea3370e8 9 /* todo :
ayoubzahir 3:cb77ea3370e8 10 - resoudre incompatibilité mbed thermomètre DS18
ayoubzahir 3:cb77ea3370e8 11 - utilisation de l'entrée Reset du module GSM
ayoubzahir 3:cb77ea3370e8 12 - check si le lecteur MP3 est bien actif
ayoubzahir 3:cb77ea3370e8 13 */
ayoubzahir 3:cb77ea3370e8 14
ayoubzahir 3:cb77ea3370e8 15 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 16 //// ... Includes
ayoubzahir 3:cb77ea3370e8 17
ayoubzahir 3:cb77ea3370e8 18 // Activation des différents modules de ce code (via directives de compilation)
ayoubzahir 3:cb77ea3370e8 19 #include "define_myMODULES.h"
ayoubzahir 3:cb77ea3370e8 20 // Assignation des entrées/sorties des différents modules
ayoubzahir 3:cb77ea3370e8 21 #include "define_myIO.h"
ayoubzahir 3:cb77ea3370e8 22 // Include usuels ...
ayoubzahir 3:cb77ea3370e8 23 #include <stdio.h>
ayoubzahir 3:cb77ea3370e8 24 #include <string>
ayoubzahir 3:cb77ea3370e8 25 #include "mbed.h"
ayoubzahir 3:cb77ea3370e8 26
ayoubzahir 3:cb77ea3370e8 27 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 28 //// Main code
ayoubzahir 3:cb77ea3370e8 29 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 30
ayoubzahir 3:cb77ea3370e8 31 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 32 //// Variables globales ...
ayoubzahir 3:cb77ea3370e8 33
ayoubzahir 3:cb77ea3370e8 34 // Compteur du nombre de recolte de données depuis le démarrage
ayoubzahir 3:cb77ea3370e8 35 unsigned int hab_frame_counter = 1;
ayoubzahir 3:cb77ea3370e8 36 // Mesure de la tension de la batterie
ayoubzahir 3:cb77ea3370e8 37 float vbatt = 0.0;
ayoubzahir 3:cb77ea3370e8 38 AnalogIn pin_vbatt(IO_VBATT);
ayoubzahir 3:cb77ea3370e8 39 // Trame des données des capteurs à stocker sur la carte sd et au GPRS
ayoubzahir 3:cb77ea3370e8 40 char sd_gprs_data[SD_GPRS_DATA_SIZE];
ayoubzahir 3:cb77ea3370e8 41 // GPS variables
ayoubzahir 3:cb77ea3370e8 42 unsigned int timeUTC = 0;
ayoubzahir 3:cb77ea3370e8 43 float lat = 0, lon = 0, alt = 0, speed = 0;
ayoubzahir 3:cb77ea3370e8 44 // Xnucleo variables
ayoubzahir 3:cb77ea3370e8 45 float xnuc_t = 0.0, xnuc_h = 0.0, xnuc_t2 = 0.0, xnuc_p = 0.0;
ayoubzahir 3:cb77ea3370e8 46 int32_t xnuc_acc[3];
ayoubzahir 3:cb77ea3370e8 47 // PT100 variables
ayoubzahir 3:cb77ea3370e8 48 double tempPT100 = 0;
ayoubzahir 3:cb77ea3370e8 49 // SGP30 variables
ayoubzahir 3:cb77ea3370e8 50 int eco2 = 0, tvoc = 0;
ayoubzahir 3:cb77ea3370e8 51 // Temperature DS18 variable
ayoubzahir 3:cb77ea3370e8 52 float tempDS18 = 0;
ayoubzahir 3:cb77ea3370e8 53 // UV & Photo variables
ayoubzahir 3:cb77ea3370e8 54 float uv = 0, photores = 0;
ayoubzahir 3:cb77ea3370e8 55 // BME280 variables (temperature, pression, humidité exterieure)
ayoubzahir 3:cb77ea3370e8 56 float bosch_t = 0, bosch_p = 0, bosch_h = 0;
ayoubzahir 3:cb77ea3370e8 57 // Ozone variable
ayoubzahir 3:cb77ea3370e8 58 double ozone = 0;
ayoubzahir 3:cb77ea3370e8 59
ayoubzahir 3:cb77ea3370e8 60 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 61 //// Tickers d'interruption
ayoubzahir 3:cb77ea3370e8 62
ayoubzahir 3:cb77ea3370e8 63 // Ticker executé toute les xx s pour recolter toute les données des capteurs,
ayoubzahir 3:cb77ea3370e8 64 // les enregistrer sur la carte SD et les envoyer en UART à la carte LoRa
ayoubzahir 3:cb77ea3370e8 65 #ifdef HAB_FUNCTION // Debut directive de compilation module HAB
ayoubzahir 3:cb77ea3370e8 66 Ticker ticker_hab; // Object Ticker
ayoubzahir 3:cb77ea3370e8 67 void isr_ticker_hab(); // Routine ISR appellée lors du tick
ayoubzahir 3:cb77ea3370e8 68 void f_ticker_hab(); // Fonction utile appellée à la suite du tick
ayoubzahir 3:cb77ea3370e8 69 bool flag_ticker_hab = 0; // Flag levé par l'ISR pour appeller la fonction utile
ayoubzahir 3:cb77ea3370e8 70 #endif // Fin directive de compilation module HAB
ayoubzahir 3:cb77ea3370e8 71
ayoubzahir 3:cb77ea3370e8 72 // Ticker executé toute les xx s pour vérifier l'etat du module GSM
ayoubzahir 3:cb77ea3370e8 73 #ifdef GSM_FUNCTION // Debut directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 74 Ticker ticker_check_gsm; // Object Ticker
ayoubzahir 3:cb77ea3370e8 75 void isr_ticker_check_gsm(); // Routine ISR appellée lors du tick
ayoubzahir 3:cb77ea3370e8 76 void f_ticker_check_gsm(); // Fonction utile appellée à la suite du tick
ayoubzahir 3:cb77ea3370e8 77 bool flag_ticker_check_gsm = 0; // Flag levé par l'ISR pour appeller la fonction utile
ayoubzahir 3:cb77ea3370e8 78 #endif // Fin directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 79
ayoubzahir 3:cb77ea3370e8 80 // Ticker executé toute les 10 min pour vérifier l'etat du module GPRS SMS
ayoubzahir 3:cb77ea3370e8 81 #ifdef SMS_FUNCTION // Debut directive de compilation SMS de données toutes les 10 min
ayoubzahir 3:cb77ea3370e8 82 Ticker ticker_sms_data; // Object Ticker
ayoubzahir 3:cb77ea3370e8 83 void isr_ticker_sms_data(); // Routine ISR appellée lors du tick
ayoubzahir 3:cb77ea3370e8 84 void f_ticker_sms_data(); // Fonction utile appellée à la suite du tick
ayoubzahir 3:cb77ea3370e8 85 bool flag_ticker_sms_data = 0; // Flag levé par l'ISR pour appeller la fonction utile
ayoubzahir 3:cb77ea3370e8 86 #endif // Fin directive de compilation SMS de données toutes les 10 min
ayoubzahir 3:cb77ea3370e8 87
ayoubzahir 3:cb77ea3370e8 88 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 89 // UART PC Debug
ayoubzahir 3:cb77ea3370e8 90 #ifdef DEBUG_SERIAL_PC // ACtivation de la liaison UART PC pour Debug
ayoubzahir 3:cb77ea3370e8 91 Serial serial_pc(SERIAL_TX, SERIAL_RX, DEBUG_SERIAL_PC_BAUDRATE);
ayoubzahir 3:cb77ea3370e8 92 #endif
ayoubzahir 3:cb77ea3370e8 93
ayoubzahir 3:cb77ea3370e8 94 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 95 // Buzzer digital Out pin
ayoubzahir 3:cb77ea3370e8 96 #ifdef BUZZ_FUNCTION // Debut directive de compilation buzzer
ayoubzahir 3:cb77ea3370e8 97 DigitalOut pin_buzzer(IO_BUZZER,0);
ayoubzahir 3:cb77ea3370e8 98 #endif // Fin directive de compilation buzzer
ayoubzahir 3:cb77ea3370e8 99
ayoubzahir 3:cb77ea3370e8 100 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 101 // Carte SD
ayoubzahir 3:cb77ea3370e8 102 #ifdef SD_FUNCTION // Debut directive de compilation carte SD
ayoubzahir 3:cb77ea3370e8 103 #include "SDFileSystem.h"
ayoubzahir 3:cb77ea3370e8 104 // MOSI, MISO, SCK, SS
ayoubzahir 3:cb77ea3370e8 105 SDFileSystem sd(IO_SD_MOSI, IO_SD_MISO, IO_SD_SCK, IO_SD_CS, SD_FUNCTION_SDNAME);
ayoubzahir 3:cb77ea3370e8 106 // flag_sd_ok = 1 après la 1ere initialisation reussie de la carte SD
ayoubzahir 3:cb77ea3370e8 107 bool flag_sd_ok = 0;
ayoubzahir 3:cb77ea3370e8 108 #endif // Fin directive de compilation carte SD
ayoubzahir 3:cb77ea3370e8 109
ayoubzahir 3:cb77ea3370e8 110 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 111 // Lecteur MP3 DFPlayer
ayoubzahir 3:cb77ea3370e8 112 #ifdef MP3_FUNCTION // Debut directive de compilation lecteur MP3
ayoubzahir 3:cb77ea3370e8 113 #include "DFPlayerMini.h"
ayoubzahir 3:cb77ea3370e8 114 DFPlayerMini mp3(IO_MP3_TX, IO_MP3_RX); //TX, RX
ayoubzahir 3:cb77ea3370e8 115 #endif // Fin directive de compilation MP3
ayoubzahir 3:cb77ea3370e8 116
ayoubzahir 3:cb77ea3370e8 117 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 118 // Module GSM
ayoubzahir 3:cb77ea3370e8 119 #ifdef GSM_FUNCTION // Debut directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 120 #include <GSM.h> // GSM Library
ayoubzahir 3:cb77ea3370e8 121 // Flag mis à jour par interruption externe sur la LED NET.
ayoubzahir 3:cb77ea3370e8 122 // Passe a true lorsque sa période de clignotement est d'environ 3s
ayoubzahir 3:cb77ea3370e8 123 bool flag_gsm_network_ok = 0;
ayoubzahir 3:cb77ea3370e8 124 // Flag a abaisser lors de la 1ere réponse materielle du module GSM
ayoubzahir 3:cb77ea3370e8 125 bool flag_gsm_absent = 1;
ayoubzahir 3:cb77ea3370e8 126 // Flag à lever lors de la confirmation de la présence matérielle du module GSM
ayoubzahir 3:cb77ea3370e8 127 // et de son démarrage en cours, et à abaisser lorsque celui ci a également démarrer logiciellement
ayoubzahir 3:cb77ea3370e8 128 bool flag_gsm_starting = 0;
ayoubzahir 3:cb77ea3370e8 129 // Compteur calé sur le ticker HAB de période ~5 s, qui compte le temps depuis
ayoubzahir 3:cb77ea3370e8 130 // le dernier reset du module GSM, pour eviter un reset trop fréquent si la connexion est mauvaise.
ayoubzahir 3:cb77ea3370e8 131 unsigned int last_reset_gsm = 0;
ayoubzahir 3:cb77ea3370e8 132 // GSM I/O PinInOut
ayoubzahir 3:cb77ea3370e8 133 DigitalOut gsm_pwr(IO_GSM_PWR); // Sortie d'allumage du GSM
ayoubzahir 3:cb77ea3370e8 134 // todo sortie RESET du GSM
ayoubzahir 3:cb77ea3370e8 135 InterruptIn gsm_net(IO_GSM_NET); // Entrée de la LED "NET"
ayoubzahir 3:cb77ea3370e8 136 DigitalIn gsm_status(IO_GSM_STAT); // Entrée de la LED "STATUS"
ayoubzahir 3:cb77ea3370e8 137 //TX, RX, PWR, NET, STATUS, baudrate, num par defaut
ayoubzahir 3:cb77ea3370e8 138 GSM gsm(IO_GSM_TX, IO_GSM_RX, GSM_BAUDRATE, GSM_SIM_NUMBER);
ayoubzahir 3:cb77ea3370e8 139 // URL du serveur web
ayoubzahir 3:cb77ea3370e8 140 char * url_srv_polytech = POLYTECH_SERVER;
ayoubzahir 3:cb77ea3370e8 141 #endif // Fin directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 142
ayoubzahir 3:cb77ea3370e8 143 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 144 // Module GPS
ayoubzahir 3:cb77ea3370e8 145 #ifdef GPS_FUNCTION // Debut directive de compilation module GPS
ayoubzahir 3:cb77ea3370e8 146 #include "GroveGPS.h"
ayoubzahir 3:cb77ea3370e8 147 //TX, RX, liaison STM --> GPS
ayoubzahir 3:cb77ea3370e8 148 Serial gps_serial(IO_GPS_TX, IO_GPS_RX, GPS_BAUDRATE);
ayoubzahir 3:cb77ea3370e8 149 GroveGPS gps;
ayoubzahir 3:cb77ea3370e8 150 void isr_gps_serial(); // Fonction d'interuption de reception sur le port UART GPS
ayoubzahir 3:cb77ea3370e8 151 char timeUTCBuffer[16], latBuffer[16], lonBuffer[16], altBuffer[16], speedBuffer[16];
ayoubzahir 3:cb77ea3370e8 152 #endif // Fin directive de compilation module GPS
ayoubzahir 3:cb77ea3370e8 153
ayoubzahir 3:cb77ea3370e8 154 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 155 // Shield capteurs ST X_NUCLEO_IKS01A2
ayoubzahir 3:cb77ea3370e8 156 #ifdef XNUCLEO_FUNCTION // Debut directive de compilation shield capteurs XNUCLEO
ayoubzahir 3:cb77ea3370e8 157 #include "XNucleoIKS01A2.h"
ayoubzahir 3:cb77ea3370e8 158 // Instantiate the expansion board: SDA, SCL, option(INT1, INT2)
ayoubzahir 3:cb77ea3370e8 159 static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(IO_XNUC_SDA, IO_XNUC_SCL);
ayoubzahir 3:cb77ea3370e8 160 static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
ayoubzahir 3:cb77ea3370e8 161 static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
ayoubzahir 3:cb77ea3370e8 162 static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
ayoubzahir 3:cb77ea3370e8 163 #endif // Fin directive de compilation shield capteurs XNUCLEO
ayoubzahir 3:cb77ea3370e8 164
ayoubzahir 3:cb77ea3370e8 165 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 166 // Sonde de température PT100 sur ampli MAX31865
ayoubzahir 3:cb77ea3370e8 167 #ifdef PT100_FUNCTION // Debut directive de compilation module PT100
ayoubzahir 3:cb77ea3370e8 168 #include "MAX31865.h"
ayoubzahir 3:cb77ea3370e8 169 // MOSI, MISO, SCK, SS : SPI du MAX311865
ayoubzahir 3:cb77ea3370e8 170 MAX31865_RTD PT100(MAX31865_RTD::RTD_PT100,IO_PT100_MOSI, IO_PT100_MISO, IO_PT100_SCK, IO_PT100_CS);
ayoubzahir 3:cb77ea3370e8 171 #endif // Fin directive de compilation module PT100
ayoubzahir 3:cb77ea3370e8 172
ayoubzahir 3:cb77ea3370e8 173 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 174 // Capteur de temperature (exterieur haut) DS181B20
ayoubzahir 3:cb77ea3370e8 175 #ifdef DS18_FUNCTION // Debut directive de compilation DS181B20
ayoubzahir 3:cb77ea3370e8 176 #include "DS1820.h"
ayoubzahir 3:cb77ea3370e8 177 DS1820 ds18(IO_DS18);
ayoubzahir 3:cb77ea3370e8 178 #endif // Fin directive de compilation DS181B20
ayoubzahir 3:cb77ea3370e8 179
ayoubzahir 3:cb77ea3370e8 180 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 181 // Capteurs lumière (UV et photoresistance)
ayoubzahir 3:cb77ea3370e8 182 #ifdef UV_FUNCTION // Debut directive de compilation capteur UV
ayoubzahir 3:cb77ea3370e8 183 AnalogIn pin_UV(IO_UV);
ayoubzahir 3:cb77ea3370e8 184 #endif // Fin directive de compilation capteur UV
ayoubzahir 3:cb77ea3370e8 185 #ifdef PHOTORES_FUNCTION // Debut directive de compilation capteur lumière
ayoubzahir 3:cb77ea3370e8 186 AnalogIn pin_photores(IO_PHOTORES);
ayoubzahir 3:cb77ea3370e8 187 #endif // Fin directive de compilation capteur lumière
ayoubzahir 3:cb77ea3370e8 188
ayoubzahir 3:cb77ea3370e8 189 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 190 // Capteur Bosch BME280 (temperature, pression, humidité exterieure)
ayoubzahir 3:cb77ea3370e8 191 #ifdef BOSCH_FUNCTION // Debut directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 192 #include "BME280.h"
ayoubzahir 3:cb77ea3370e8 193 BME280 bosch(IO_BOSCH_SDA, IO_BOSCH_SCL); // SDA, SCL
ayoubzahir 3:cb77ea3370e8 194 #endif // Fin directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 195
ayoubzahir 3:cb77ea3370e8 196 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 197 // Capteur eCO2/TVOC SGP30, voir note :
ayoubzahir 3:cb77ea3370e8 198 // Le module eCO2/TVOC produira pendant ~20 s des resultats invalides
ayoubzahir 3:cb77ea3370e8 199 // eCO2=400 et TVOC=0, patientez quelques instants
ayoubzahir 3:cb77ea3370e8 200 // module à allumer 48h à l'avance pour résultats optimums
ayoubzahir 3:cb77ea3370e8 201 #ifdef CO2_FUNCTION // Debut directive de compilation module CO2
ayoubzahir 3:cb77ea3370e8 202 #include "Adafruit_SGP30.h"
ayoubzahir 3:cb77ea3370e8 203 Adafruit_SGP30 co2(IO_CO2_SDA, IO_CO2_SCL); // SDA, SCL
ayoubzahir 3:cb77ea3370e8 204 #endif // Fin directive de compilation module CO2
ayoubzahir 3:cb77ea3370e8 205
ayoubzahir 3:cb77ea3370e8 206 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 207 // Capteur Ozone O3
ayoubzahir 3:cb77ea3370e8 208 // ... todo
ayoubzahir 3:cb77ea3370e8 209 #ifdef O3_FUNCTION // Debut directive de compilation spi_ozone
ayoubzahir 3:cb77ea3370e8 210 SPI spi_ozone(PB_15, PB_14, PB_13); // MOSI, MISO, SCK
ayoubzahir 3:cb77ea3370e8 211 DigitalOut ozone_SS(IO_O3_CS,1);
ayoubzahir 3:cb77ea3370e8 212 #endif // Fin directive de compilation spi_ozone
ayoubzahir 3:cb77ea3370e8 213
ayoubzahir 3:cb77ea3370e8 214 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 215 // LORA Module
ayoubzahir 3:cb77ea3370e8 216 #ifdef LORA_FUNCTION // Debut directive de compilation LoRa
ayoubzahir 3:cb77ea3370e8 217 // todo: liaison UART avec carte LoRa + watchdog carte mère
ayoubzahir 3:cb77ea3370e8 218 Serial lora_serial(IO_LORA_TX, IO_LORA_RX, LORA_FUNCTION_BAUDRATE);
ayoubzahir 3:cb77ea3370e8 219 // Chaine de char contenant la trame des données des capteurs à envoyer
ayoubzahir 3:cb77ea3370e8 220 char lora_data_tx[LORA_FUNCTION_DATASIZE];
ayoubzahir 3:cb77ea3370e8 221 #endif // Fin directive de compilation LoRa
ayoubzahir 3:cb77ea3370e8 222
ayoubzahir 3:cb77ea3370e8 223 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 224 //// Fonctions annexes
ayoubzahir 3:cb77ea3370e8 225
ayoubzahir 3:cb77ea3370e8 226 ////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 227 // Pression - Altitude
ayoubzahir 3:cb77ea3370e8 228 double sealevel(double P, double A)
ayoubzahir 3:cb77ea3370e8 229 // Given a pressure P (mb) taken at a specific altitude (meters),
ayoubzahir 3:cb77ea3370e8 230 // return the equivalent pressure (mb) at sea level.
ayoubzahir 3:cb77ea3370e8 231 // This produces pressure readings that can be used for weather measurements.
ayoubzahir 3:cb77ea3370e8 232 { return (P / pow(1 - (A / 44330.0), 5.255));
ayoubzahir 3:cb77ea3370e8 233 }
ayoubzahir 3:cb77ea3370e8 234
ayoubzahir 3:cb77ea3370e8 235 double altitude(double P, double P0)
ayoubzahir 3:cb77ea3370e8 236 // Given a pressure measurement P (mb) and the pressure at a baseline P0 (mb),
ayoubzahir 3:cb77ea3370e8 237 // return altitude (meters) above baseline.
ayoubzahir 3:cb77ea3370e8 238 { return (44330.0 * (1 - pow(P / P0, 1 / 5.255)));
ayoubzahir 3:cb77ea3370e8 239 }
ayoubzahir 3:cb77ea3370e8 240
ayoubzahir 3:cb77ea3370e8 241 // Initialise l'interruption GPS ... pré-déclaration
ayoubzahir 3:cb77ea3370e8 242 void irq_gps_on();
ayoubzahir 3:cb77ea3370e8 243 void irq_gps_off();
ayoubzahir 3:cb77ea3370e8 244
ayoubzahir 3:cb77ea3370e8 245 // Permet de gérer les modes On-Off des Interruption & Tickers
ayoubzahir 3:cb77ea3370e8 246 void all_irq_on_off(int gps_on_off, int gsm_on_off, int ticker_hab_on_off, int ticker_gsm_on_off) {
ayoubzahir 3:cb77ea3370e8 247 // Interruption GPS On ou Off
ayoubzahir 3:cb77ea3370e8 248 if(gps_on_off == 1) { irq_gps_on(); }
ayoubzahir 3:cb77ea3370e8 249 if(gps_on_off == 0) { irq_gps_off(); }
ayoubzahir 3:cb77ea3370e8 250 // Module GSM Enable ou Disable
ayoubzahir 3:cb77ea3370e8 251 if(gsm_on_off == 1) { gsm_net.enable_irq(); }
ayoubzahir 3:cb77ea3370e8 252 if(gsm_on_off == 0) { gsm_net.disable_irq(); }
ayoubzahir 3:cb77ea3370e8 253 // Ticker HAB Attach ou Detach
ayoubzahir 3:cb77ea3370e8 254 if(ticker_hab_on_off == 1) { ticker_hab.attach(&isr_ticker_hab, TICKER_HAB_TIME); }
ayoubzahir 3:cb77ea3370e8 255 if(ticker_hab_on_off == 0) { ticker_hab.detach(); }
ayoubzahir 3:cb77ea3370e8 256 // Ticker GSM Attach ou Detach
ayoubzahir 3:cb77ea3370e8 257 if(ticker_gsm_on_off == 1) { ticker_check_gsm.attach(&isr_ticker_check_gsm, TICKER_CHECK_GSM_TIME); }
ayoubzahir 3:cb77ea3370e8 258 if(ticker_gsm_on_off == 0) { ticker_check_gsm.detach(); }
ayoubzahir 3:cb77ea3370e8 259 }
ayoubzahir 3:cb77ea3370e8 260
ayoubzahir 3:cb77ea3370e8 261 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 262 // SD
ayoubzahir 3:cb77ea3370e8 263 #ifdef SD_FUNCTION // Debut directive de compilation carte SD
ayoubzahir 3:cb77ea3370e8 264
ayoubzahir 3:cb77ea3370e8 265 // Fonction qui ecrit le message dans le fichier passés en arguments sur la carte SD initialisée
ayoubzahir 3:cb77ea3370e8 266 void ecriture_sd(char * fichier, char * message) {
ayoubzahir 3:cb77ea3370e8 267 // Si la carte SD n'est pas initialisée on quitte
ayoubzahir 3:cb77ea3370e8 268 if(flag_sd_ok == 0) return;
ayoubzahir 3:cb77ea3370e8 269 // On désactive l'interruption UART pour GPS
ayoubzahir 3:cb77ea3370e8 270 all_irq_on_off(0, 2, 2, 2); // irq_gps_off();
ayoubzahir 3:cb77ea3370e8 271 // Fichier en mode a - append ... du type "/sd/data.txt"
ayoubzahir 3:cb77ea3370e8 272 FILE *fp = fopen(fichier, "a");
ayoubzahir 3:cb77ea3370e8 273 if(fp == NULL) { // Erreur d'ouverture du fichier
ayoubzahir 3:cb77ea3370e8 274 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 275 serial_pc.printf("<<<< ERREUR >>>> carte SD, ouverture fichier impossible\n");
ayoubzahir 3:cb77ea3370e8 276 #endif
ayoubzahir 3:cb77ea3370e8 277 }
ayoubzahir 3:cb77ea3370e8 278 else { // Fichier correctement ouvert en mode append, écriture puis fermeture
ayoubzahir 3:cb77ea3370e8 279 fprintf(fp, message); fprintf(fp, "\n");
ayoubzahir 3:cb77ea3370e8 280 fclose(fp);
ayoubzahir 3:cb77ea3370e8 281 }
ayoubzahir 3:cb77ea3370e8 282 // Ré-activation de l'interruption UART pour GPS
ayoubzahir 3:cb77ea3370e8 283 all_irq_on_off(1, 2, 2, 2); // irq_gps_on();
ayoubzahir 3:cb77ea3370e8 284 }
ayoubzahir 3:cb77ea3370e8 285
ayoubzahir 3:cb77ea3370e8 286 #endif // Fin directive de compilation carte SD
ayoubzahir 3:cb77ea3370e8 287
ayoubzahir 3:cb77ea3370e8 288 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 289 // GSM
ayoubzahir 3:cb77ea3370e8 290 #ifdef GSM_FUNCTION // Debut directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 291
ayoubzahir 3:cb77ea3370e8 292 // Initialise le GSM ... pré-déclaration
ayoubzahir 3:cb77ea3370e8 293 void init_GSM();
ayoubzahir 3:cb77ea3370e8 294
ayoubzahir 3:cb77ea3370e8 295 // Variables GSM
ayoubzahir 3:cb77ea3370e8 296 Timer timer_gsm_network; // Compteur de la période de clignotement de la LED "NET"
ayoubzahir 3:cb77ea3370e8 297 unsigned int last_time_gsm_network = 0;
ayoubzahir 3:cb77ea3370e8 298
ayoubzahir 3:cb77ea3370e8 299 void isr_network_gsm() {
ayoubzahir 3:cb77ea3370e8 300 // Arret de toute les sources d'interruptions
ayoubzahir 3:cb77ea3370e8 301 all_irq_on_off(0, 0, 2, 2);
ayoubzahir 3:cb77ea3370e8 302 //irq_gps_off(); // Interruption GPS off
ayoubzahir 3:cb77ea3370e8 303 //gsm_net.disable_irq(); // Disable interrupt GSM
ayoubzahir 3:cb77ea3370e8 304
ayoubzahir 3:cb77ea3370e8 305 timer_gsm_network.stop(); // Arret du timer GSM
ayoubzahir 3:cb77ea3370e8 306 last_time_gsm_network = timer_gsm_network.read_ms(); // Lecture du timer GSM
ayoubzahir 3:cb77ea3370e8 307 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 308 //debug_if(DEBUG_SERIAL_PC, "Timer GSM Network (ms) : %d\n", last_time_gsm_network);
ayoubzahir 3:cb77ea3370e8 309 //serial_pc.printf("Timer GSM Network (ms) : %d\n", last_time_gsm_network);
ayoubzahir 3:cb77ea3370e8 310 #endif
ayoubzahir 3:cb77ea3370e8 311 // Seulement si la période de clignotement est d'environs 3s alors le module
ayoubzahir 3:cb77ea3370e8 312 // GSM est bien connecté au réseau et est pret a etre utilisé.
ayoubzahir 3:cb77ea3370e8 313 if(last_time_gsm_network > 2800 && last_time_gsm_network < 3200) {
ayoubzahir 3:cb77ea3370e8 314 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 315 //serial_pc.printf("> Timer GSM Network (ms) : %d\n", last_time_gsm_network);
ayoubzahir 3:cb77ea3370e8 316 #endif
ayoubzahir 3:cb77ea3370e8 317 flag_gsm_network_ok = 1; // le GSM est ok
ayoubzahir 3:cb77ea3370e8 318 if(flag_gsm_starting == 1) { // est-il tjs en démarrage ?
ayoubzahir 3:cb77ea3370e8 319 init_GSM();
ayoubzahir 3:cb77ea3370e8 320 flag_gsm_starting = 0;
ayoubzahir 3:cb77ea3370e8 321 } }
ayoubzahir 3:cb77ea3370e8 322 else flag_gsm_network_ok = 0; // le GSM n'est pas ok
ayoubzahir 3:cb77ea3370e8 323
ayoubzahir 3:cb77ea3370e8 324 timer_gsm_network.reset(); // Raz et nouveau départ du timer GSM
ayoubzahir 3:cb77ea3370e8 325 timer_gsm_network.start();
ayoubzahir 3:cb77ea3370e8 326
ayoubzahir 3:cb77ea3370e8 327 // On autorise de nouveau les interruptions GPS et GSM
ayoubzahir 3:cb77ea3370e8 328 all_irq_on_off(1, 1, 2, 2);
ayoubzahir 3:cb77ea3370e8 329 //irq_gps_on();
ayoubzahir 3:cb77ea3370e8 330 //gsm_net.enable_irq();
ayoubzahir 3:cb77ea3370e8 331 }
ayoubzahir 3:cb77ea3370e8 332
ayoubzahir 3:cb77ea3370e8 333 // On initialise le GSM
ayoubzahir 3:cb77ea3370e8 334 void init_GSM() {
ayoubzahir 3:cb77ea3370e8 335 // Initialise (logiciellement) le module GSM
ayoubzahir 3:cb77ea3370e8 336 if(gsm_status == 0) return; // Si module GSM arreté ou absent c'est inutile
ayoubzahir 3:cb77ea3370e8 337
ayoubzahir 3:cb77ea3370e8 338 // Arret de toute les sources d'interruptions
ayoubzahir 3:cb77ea3370e8 339 all_irq_on_off(0, 0, 0, 0);
ayoubzahir 3:cb77ea3370e8 340 //irq_gps_off(); // Int sur RX UART
ayoubzahir 3:cb77ea3370e8 341 //gsm_net.disable_irq(); // Int sur LED NET GSM
ayoubzahir 3:cb77ea3370e8 342 //ticker_hab.detach(); // Ticker HAB
ayoubzahir 3:cb77ea3370e8 343 //ticker_check_gsm.detach(); // Ticker check GSM
ayoubzahir 3:cb77ea3370e8 344
ayoubzahir 3:cb77ea3370e8 345 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 346 serial_pc.printf(">>> GSM Initialisation <<<\n");
ayoubzahir 3:cb77ea3370e8 347 serial_pc.printf(" Init GSM : %d\n",gsm.init());
ayoubzahir 3:cb77ea3370e8 348 serial_pc.printf(" Statut SIM : %d\n",gsm.checkSIMStatus());
ayoubzahir 3:cb77ea3370e8 349 serial_pc.printf(" Force signal : %d\n",gsm.checkSignalStrength());
ayoubzahir 3:cb77ea3370e8 350 serial_pc.printf(" Reglage SMS : %d\n",gsm.settingSMS());
ayoubzahir 3:cb77ea3370e8 351 //serial_pc.printf(" Test SMS : %d\n",gsm.sendSMS(GSM_SEND_NUMBER, GSM_SEND_SMS_HELLO));
ayoubzahir 3:cb77ea3370e8 352 #endif
ayoubzahir 3:cb77ea3370e8 353
ayoubzahir 3:cb77ea3370e8 354 // On considere le GSM initialisé et n'est donc plus en phase de démarrage
ayoubzahir 3:cb77ea3370e8 355 flag_gsm_starting = 0;
ayoubzahir 3:cb77ea3370e8 356
ayoubzahir 3:cb77ea3370e8 357 // On autorise de nouveau les interruptions GPS et GSM, ticker HAB
ayoubzahir 3:cb77ea3370e8 358 all_irq_on_off(1, 1, 1, 1);
ayoubzahir 3:cb77ea3370e8 359 //irq_gps_on();
ayoubzahir 3:cb77ea3370e8 360 //gsm_net.enable_irq();
ayoubzahir 3:cb77ea3370e8 361 //ticker_hab.attach(&isr_ticker_hab, TICKER_HAB_TIME);
ayoubzahir 3:cb77ea3370e8 362 //ticker_check_gsm.attach(&isr_ticker_check_gsm, TICKER_CHECK_GSM_TIME);
ayoubzahir 3:cb77ea3370e8 363 }
ayoubzahir 3:cb77ea3370e8 364
ayoubzahir 3:cb77ea3370e8 365 // Fonction qui allume le module GSM (matériellement)
ayoubzahir 3:cb77ea3370e8 366 void gsm_pwr_on() {
ayoubzahir 3:cb77ea3370e8 367 // Entrée : "bool attendre", specifie si la fonction doit attendre que le
ayoubzahir 3:cb77ea3370e8 368 // module GSM démarre.
ayoubzahir 3:cb77ea3370e8 369 if(gsm_status == 0) {
ayoubzahir 3:cb77ea3370e8 370 // Arret de toute les sources d'interruptions
ayoubzahir 3:cb77ea3370e8 371 all_irq_on_off(0, 0, 0, 0);
ayoubzahir 3:cb77ea3370e8 372
ayoubzahir 3:cb77ea3370e8 373 // Creation et lancement d'un timer de time out du démarrage du module GSM
ayoubzahir 3:cb77ea3370e8 374 Timer timer_gsm_init;
ayoubzahir 3:cb77ea3370e8 375 timer_gsm_init.start();
ayoubzahir 3:cb77ea3370e8 376
ayoubzahir 3:cb77ea3370e8 377 // On considere que le GSM est sous-tension, on verifiera ...
ayoubzahir 3:cb77ea3370e8 378 gsm_pwr = 1;
ayoubzahir 3:cb77ea3370e8 379
ayoubzahir 3:cb77ea3370e8 380 while(gsm_status == 0) {
ayoubzahir 3:cb77ea3370e8 381 wait(0.5);
ayoubzahir 3:cb77ea3370e8 382 if(timer_gsm_init.read() > 5) { // Si après 5s ... ?
ayoubzahir 3:cb77ea3370e8 383 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 384 serial_pc.printf("<<<< ERREUR >>>> module GSM absent\n");
ayoubzahir 3:cb77ea3370e8 385 #endif
ayoubzahir 3:cb77ea3370e8 386 flag_gsm_absent = 1; // Constatation de l'absence du module GSM
ayoubzahir 3:cb77ea3370e8 387 timer_gsm_network.stop(); // Arrêt du timer GSM
ayoubzahir 3:cb77ea3370e8 388 gsm_pwr = 0; // le GSM n'est donc pas sous tension
ayoubzahir 3:cb77ea3370e8 389 // On autorise de nouveau les interruptions GPS et GSM, ticker HAB
ayoubzahir 3:cb77ea3370e8 390 all_irq_on_off(1, 1, 1, 1);
ayoubzahir 3:cb77ea3370e8 391 return;
ayoubzahir 3:cb77ea3370e8 392 }
ayoubzahir 3:cb77ea3370e8 393 }
ayoubzahir 3:cb77ea3370e8 394 gsm_pwr = 0;
ayoubzahir 3:cb77ea3370e8 395 timer_gsm_network.stop();
ayoubzahir 3:cb77ea3370e8 396 }
ayoubzahir 3:cb77ea3370e8 397 else
ayoubzahir 3:cb77ea3370e8 398 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 399 serial_pc.printf("Module GSM deja allume ");
ayoubzahir 3:cb77ea3370e8 400 #endif
ayoubzahir 3:cb77ea3370e8 401 // Constatation de la présence du module GSM
ayoubzahir 3:cb77ea3370e8 402 flag_gsm_absent = 0;
ayoubzahir 3:cb77ea3370e8 403 // Indication que le module GSM est en train de démarrer materiellement
ayoubzahir 3:cb77ea3370e8 404 // ou du moins qu'il faudra bientot faire l'init logiciel dès qu'il
ayoubzahir 3:cb77ea3370e8 405 // sera pret (NET LED avec bonne période de 3s.
ayoubzahir 3:cb77ea3370e8 406 flag_gsm_starting = 1;
ayoubzahir 3:cb77ea3370e8 407
ayoubzahir 3:cb77ea3370e8 408 // On autorise de nouveau les interruptions GPS et GSM, ticker HAB
ayoubzahir 3:cb77ea3370e8 409 all_irq_on_off(1, 1, 1, 1);
ayoubzahir 3:cb77ea3370e8 410
ayoubzahir 3:cb77ea3370e8 411 }
ayoubzahir 3:cb77ea3370e8 412
ayoubzahir 3:cb77ea3370e8 413 #endif // Fin directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 414
ayoubzahir 3:cb77ea3370e8 415 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 416 // Ozone O3
ayoubzahir 3:cb77ea3370e8 417 #ifdef O3_FUNCTION // Debut directive de compilation spi_ozone
ayoubzahir 3:cb77ea3370e8 418
ayoubzahir 3:cb77ea3370e8 419 double lecture_ozone() {
ayoubzahir 3:cb77ea3370e8 420 // Variables
ayoubzahir 3:cb77ea3370e8 421 double resultat = 0.0;
ayoubzahir 3:cb77ea3370e8 422 uint32_t chiffre=0;
ayoubzahir 3:cb77ea3370e8 423 uint8_t Buff[4];
ayoubzahir 3:cb77ea3370e8 424 for(int i=0; i<3;i++) Buff[i] = 0;
ayoubzahir 3:cb77ea3370e8 425
ayoubzahir 3:cb77ea3370e8 426 // Paramètres Ozone
ayoubzahir 3:cb77ea3370e8 427 spi_ozone.format(8,3);
ayoubzahir 3:cb77ea3370e8 428 spi_ozone.frequency(1000000);
ayoubzahir 3:cb77ea3370e8 429 ozone_SS.write(0); // Selection de l'esclave
ayoubzahir 3:cb77ea3370e8 430 //spi_ozone.write(0x8F);
ayoubzahir 3:cb77ea3370e8 431 wait_ms(100);
ayoubzahir 3:cb77ea3370e8 432 Buff[0] = spi_ozone.write(0);
ayoubzahir 3:cb77ea3370e8 433 Buff[1] = spi_ozone.write(0);
ayoubzahir 3:cb77ea3370e8 434 Buff[2] = spi_ozone.write(0);
ayoubzahir 3:cb77ea3370e8 435 Buff[3] = spi_ozone.write(0);
ayoubzahir 3:cb77ea3370e8 436 ozone_SS.write(1); // Deselection de l'esclave
ayoubzahir 3:cb77ea3370e8 437
ayoubzahir 3:cb77ea3370e8 438 chiffre = ((uint32_t)(Buff[0]) << 24) | ((uint32_t)(Buff[1]) << 16) | ((uint32_t)(Buff[2]) << 8) | (uint32_t)(Buff[3]);
ayoubzahir 3:cb77ea3370e8 439 chiffre = chiffre >> 7;
ayoubzahir 3:cb77ea3370e8 440 resultat = 100 - (chiffre/41943.040); // Conversion en %ADC
ayoubzahir 3:cb77ea3370e8 441 return resultat;
ayoubzahir 3:cb77ea3370e8 442 }
ayoubzahir 3:cb77ea3370e8 443
ayoubzahir 3:cb77ea3370e8 444 #endif // Fin directive de compilation spi_ozone
ayoubzahir 3:cb77ea3370e8 445
ayoubzahir 3:cb77ea3370e8 446 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 447 //// Tickers, Interruptions, Threads
ayoubzahir 3:cb77ea3370e8 448
ayoubzahir 3:cb77ea3370e8 449 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 450 // GSM
ayoubzahir 3:cb77ea3370e8 451 #ifdef GSM_FUNCTION // Debut directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 452
ayoubzahir 3:cb77ea3370e8 453 void f_ticker_check_gsm() {
ayoubzahir 3:cb77ea3370e8 454 // Fonction du ticker de surveillance du module GSM, lancée toute les .. s
ayoubzahir 3:cb77ea3370e8 455
ayoubzahir 3:cb77ea3370e8 456 // Si module GSM absent, on retourne
ayoubzahir 3:cb77ea3370e8 457 if(flag_gsm_absent == 1) return;
ayoubzahir 3:cb77ea3370e8 458
ayoubzahir 3:cb77ea3370e8 459 // Arret de toute les sources d'interruptions
ayoubzahir 3:cb77ea3370e8 460 all_irq_on_off(0, 2, 2, 2);
ayoubzahir 3:cb77ea3370e8 461
ayoubzahir 3:cb77ea3370e8 462 // Si le module GSM est éteint, on l'allume
ayoubzahir 3:cb77ea3370e8 463 if(gsm_status == 0) gsm_pwr_on();
ayoubzahir 3:cb77ea3370e8 464
ayoubzahir 3:cb77ea3370e8 465 // Si module GSM non connecté
ayoubzahir 3:cb77ea3370e8 466 if(flag_gsm_network_ok == 0) {
ayoubzahir 3:cb77ea3370e8 467 // Si cela fait plus de 15 trames que l'on a démarré alors
ayoubzahir 3:cb77ea3370e8 468 if(hab_frame_counter - last_reset_gsm > 15) {
ayoubzahir 3:cb77ea3370e8 469 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 470 serial_pc.printf("\n Reset du module GSM ...");
ayoubzahir 3:cb77ea3370e8 471 #endif
ayoubzahir 3:cb77ea3370e8 472 // todo : appui sur bouton reset du module gsm
ayoubzahir 3:cb77ea3370e8 473 last_reset_gsm = hab_frame_counter;
ayoubzahir 3:cb77ea3370e8 474 } }
ayoubzahir 3:cb77ea3370e8 475
ayoubzahir 3:cb77ea3370e8 476 // met fin à l'envoi d'un sms, le module reste parfois bloqué dans la
ayoubzahir 3:cb77ea3370e8 477 // commande d'envoi et ne répond pas "OK" lorsqu'on check power en envoyant "AT"
ayoubzahir 3:cb77ea3370e8 478 gsm.gprsSerial.putc((char)0x1A);
ayoubzahir 3:cb77ea3370e8 479
ayoubzahir 3:cb77ea3370e8 480 int sim_status = gsm.checkSIMStatus();
ayoubzahir 3:cb77ea3370e8 481 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 482 serial_pc.printf("\n>>> Check statut SIM : %d\n", sim_status);
ayoubzahir 3:cb77ea3370e8 483 #endif
ayoubzahir 3:cb77ea3370e8 484 if(sim_status != 0) { init_GSM(); } // Il est nécessaire d'initialiser de nouveau le GSM
ayoubzahir 3:cb77ea3370e8 485
ayoubzahir 3:cb77ea3370e8 486 // On autorise de nouveau les interruptions GPS et GSM, ticker HAB
ayoubzahir 3:cb77ea3370e8 487 all_irq_on_off(1, 2, 2, 2);
ayoubzahir 3:cb77ea3370e8 488 // Flag ticker GSM inactif
ayoubzahir 3:cb77ea3370e8 489 flag_ticker_check_gsm = 0;
ayoubzahir 3:cb77ea3370e8 490 }
ayoubzahir 3:cb77ea3370e8 491
ayoubzahir 3:cb77ea3370e8 492 #endif // Fin directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 493
ayoubzahir 3:cb77ea3370e8 494 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 495 // GPS
ayoubzahir 3:cb77ea3370e8 496 #ifdef GPS_FUNCTION // Debut directive de compilation module GPS
ayoubzahir 3:cb77ea3370e8 497 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 498
ayoubzahir 3:cb77ea3370e8 499 // GPS = fonctions d'activation et de desactivation de l'interruption UART
ayoubzahir 3:cb77ea3370e8 500 void irq_gps_off() {
ayoubzahir 3:cb77ea3370e8 501 // IRQ OFF : desactivation de l'interruption pour le port UART du GPS
ayoubzahir 3:cb77ea3370e8 502 gps_serial.attach(NULL);
ayoubzahir 3:cb77ea3370e8 503 }
ayoubzahir 3:cb77ea3370e8 504 void irq_gps_on() {
ayoubzahir 3:cb77ea3370e8 505 // IRQ ON : activation de l'interruption pour le port UART du GPS
ayoubzahir 3:cb77ea3370e8 506 gps_serial.attach(&isr_gps_serial,Serial::RxIrq);
ayoubzahir 3:cb77ea3370e8 507 }
ayoubzahir 3:cb77ea3370e8 508
ayoubzahir 3:cb77ea3370e8 509 // Routine d'interruption (ISR) pour la reception sur port UART du GPS
ayoubzahir 3:cb77ea3370e8 510 void isr_gps_serial() {
ayoubzahir 3:cb77ea3370e8 511 if(gps_serial.readable()) {
ayoubzahir 3:cb77ea3370e8 512 #ifdef GPS_DEBUG
ayoubzahir 3:cb77ea3370e8 513 char c = gps_serial.getc();
ayoubzahir 3:cb77ea3370e8 514 serial_pc.putc(c);
ayoubzahir 3:cb77ea3370e8 515 gps.readCharacter(c);
ayoubzahir 3:cb77ea3370e8 516 #else
ayoubzahir 3:cb77ea3370e8 517 gps.readCharacter(gps_serial.getc());
ayoubzahir 3:cb77ea3370e8 518 #endif
ayoubzahir 3:cb77ea3370e8 519 }
ayoubzahir 3:cb77ea3370e8 520 }
ayoubzahir 3:cb77ea3370e8 521
ayoubzahir 3:cb77ea3370e8 522 #endif // Fin directive de compilation module GPS
ayoubzahir 3:cb77ea3370e8 523
ayoubzahir 3:cb77ea3370e8 524 ////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 525 // SMS (GSM)
ayoubzahir 3:cb77ea3370e8 526 // Ticker executé toute les xx sec pour envoi des données par sms
ayoubzahir 3:cb77ea3370e8 527 #ifdef SMS_FUNCTION // Debut directive de compilation module SMS
ayoubzahir 3:cb77ea3370e8 528
ayoubzahir 3:cb77ea3370e8 529 void f_ticker_sms_data() {
ayoubzahir 3:cb77ea3370e8 530 if(flag_gsm_network_ok == 1) {
ayoubzahir 3:cb77ea3370e8 531 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 532 serial_pc.printf(">>>>>> Send HAB data to SMS\n");
ayoubzahir 3:cb77ea3370e8 533 #endif
ayoubzahir 3:cb77ea3370e8 534 // Portable personnel de Dufaza
ayoubzahir 3:cb77ea3370e8 535 gsm.sendSMS(GSM_SEND_NUMBER, sd_gprs_data);
ayoubzahir 3:cb77ea3370e8 536 // Le SMS a ete envoyé ...
ayoubzahir 3:cb77ea3370e8 537 flag_ticker_sms_data = 0;
ayoubzahir 3:cb77ea3370e8 538 } }
ayoubzahir 3:cb77ea3370e8 539
ayoubzahir 3:cb77ea3370e8 540 #endif // Fin directive de compilation module SMS
ayoubzahir 3:cb77ea3370e8 541
ayoubzahir 3:cb77ea3370e8 542 ////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 543 // HAB
ayoubzahir 3:cb77ea3370e8 544 // Ticker executé toute les 5 s pour recolter toute les données,
ayoubzahir 3:cb77ea3370e8 545 // les enregistrer sur la carte SD et les envoyer en UART à la carte LoRa
ayoubzahir 3:cb77ea3370e8 546 #ifdef HAB_FUNCTION // Debut directive de compilation module HAB
ayoubzahir 3:cb77ea3370e8 547
ayoubzahir 3:cb77ea3370e8 548 void f_ticker_hab() {
ayoubzahir 3:cb77ea3370e8 549 //DS18 thermomètre pt1 (en 2 parties pour eviter d'attendre)
ayoubzahir 3:cb77ea3370e8 550 #ifdef DS18_FUNCTION // Debut directive de compilation DS181B20
ayoubzahir 3:cb77ea3370e8 551 // todo
ayoubzahir 3:cb77ea3370e8 552 #endif // Fin directive de compilation DS181B20
ayoubzahir 3:cb77ea3370e8 553
ayoubzahir 3:cb77ea3370e8 554 // Recuperation donnees capteurs ST X_NUCLEO_IKS01A2
ayoubzahir 3:cb77ea3370e8 555 #ifdef XNUCLEO_FUNCTION // Debut directive de compilation shield capteurs XNUCLEO
ayoubzahir 3:cb77ea3370e8 556 hum_temp->get_temperature(&xnuc_t);
ayoubzahir 3:cb77ea3370e8 557 hum_temp->get_humidity(&xnuc_h);
ayoubzahir 3:cb77ea3370e8 558 press_temp->get_temperature(&xnuc_t2);
ayoubzahir 3:cb77ea3370e8 559 press_temp->get_pressure(&xnuc_p);
ayoubzahir 3:cb77ea3370e8 560 #endif // Fin directive de compilation shield capteurs XNUCLEO
ayoubzahir 3:cb77ea3370e8 561
ayoubzahir 3:cb77ea3370e8 562 //PT100
ayoubzahir 3:cb77ea3370e8 563 #ifdef PT100_FUNCTION // Debut directive de compilation module PT100
ayoubzahir 3:cb77ea3370e8 564 PT100.read_all();
ayoubzahir 3:cb77ea3370e8 565 if(PT100.status() == 0) {
ayoubzahir 3:cb77ea3370e8 566 tempPT100 = PT100.temperature();
ayoubzahir 3:cb77ea3370e8 567 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 568 //serial_pc.printf(">>>>>> Temp PT100 = %f degC \r\n",tempPT100);
ayoubzahir 3:cb77ea3370e8 569 #endif
ayoubzahir 3:cb77ea3370e8 570 }
ayoubzahir 3:cb77ea3370e8 571 else {
ayoubzahir 3:cb77ea3370e8 572 tempPT100 = 0;
ayoubzahir 3:cb77ea3370e8 573 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 574 serial_pc.printf("<<< ERREUR >>> Registre d'erreur PT100 : %d - ",PT100.status( ));
ayoubzahir 3:cb77ea3370e8 575 if(PT100.status() & MAX31865_FAULT_HIGH_THRESHOLD) {
ayoubzahir 3:cb77ea3370e8 576 serial_pc.printf("ERREUR PT100 seuil haut franchi\n");
ayoubzahir 3:cb77ea3370e8 577 }
ayoubzahir 3:cb77ea3370e8 578 else if(PT100.status() & MAX31865_FAULT_LOW_THRESHOLD) {
ayoubzahir 3:cb77ea3370e8 579 serial_pc.printf("ERREUR PT100 seuil bas franchi\n");
ayoubzahir 3:cb77ea3370e8 580 }
ayoubzahir 3:cb77ea3370e8 581 else if(PT100.status() & MAX31865_FAULT_REFIN) {
ayoubzahir 3:cb77ea3370e8 582 serial_pc.printf("ERREUR REFIN- > 0,85 x V_BIAS\n");
ayoubzahir 3:cb77ea3370e8 583 }
ayoubzahir 3:cb77ea3370e8 584 else if(PT100.status( ) & MAX31865_FAULT_REFIN_FORCE) {
ayoubzahir 3:cb77ea3370e8 585 serial_pc.printf("ERREUR REFIN- < 0,85 x V_BIAS, FORCE- ouvert\n");
ayoubzahir 3:cb77ea3370e8 586 }
ayoubzahir 3:cb77ea3370e8 587 else if(PT100.status( ) & MAX31865_FAULT_RTDIN_FORCE ) {
ayoubzahir 3:cb77ea3370e8 588 serial_pc.printf("ERREUR RTDIN- < 0,85 x V_BIAS, FORCE- ouvert\n");
ayoubzahir 3:cb77ea3370e8 589 }
ayoubzahir 3:cb77ea3370e8 590 else if(PT100.status( ) & MAX31865_FAULT_VOLTAGE) {
ayoubzahir 3:cb77ea3370e8 591 serial_pc.printf("ERREUR sur/sous-tension\n");
ayoubzahir 3:cb77ea3370e8 592 }
ayoubzahir 3:cb77ea3370e8 593 else serial_pc.printf("ERREUR inconnue\n");
ayoubzahir 3:cb77ea3370e8 594 #endif
ayoubzahir 3:cb77ea3370e8 595 }
ayoubzahir 3:cb77ea3370e8 596 #endif // Fin directive de compilation module PT100
ayoubzahir 3:cb77ea3370e8 597
ayoubzahir 3:cb77ea3370e8 598 // CO2
ayoubzahir 3:cb77ea3370e8 599 #ifdef CO2_FUNCTION // Debut directive de compilation module CO2
ayoubzahir 3:cb77ea3370e8 600 co2.IAQmeasure();
ayoubzahir 3:cb77ea3370e8 601 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 602 /*serial_pc.printf("TVOC : %d\n", co2.TVOC);
ayoubzahir 3:cb77ea3370e8 603 serial_pc.printf("eCO2: %d\n", co2.eCO2);*/
ayoubzahir 3:cb77ea3370e8 604 #endif
ayoubzahir 3:cb77ea3370e8 605 eco2 = co2.eCO2;
ayoubzahir 3:cb77ea3370e8 606 tvoc = co2.TVOC;
ayoubzahir 3:cb77ea3370e8 607 #endif // Fin directive de compilation module CO2
ayoubzahir 3:cb77ea3370e8 608
ayoubzahir 3:cb77ea3370e8 609 //DS18 thermomètre pt2 (en 2 parties pour eviter d'attendre)
ayoubzahir 3:cb77ea3370e8 610 #ifdef DS18_FUNCTION // Debut directive de compilation DS181B20
ayoubzahir 3:cb77ea3370e8 611 // todo
ayoubzahir 3:cb77ea3370e8 612 #endif // Fin directive de compilation DS181B20
ayoubzahir 3:cb77ea3370e8 613
ayoubzahir 3:cb77ea3370e8 614 // Capteurs UV et lumiere
ayoubzahir 3:cb77ea3370e8 615 #ifdef UV_FUNCTION // Debut directive de compilation capteur UV
ayoubzahir 3:cb77ea3370e8 616 uv = pin_UV.read();
ayoubzahir 3:cb77ea3370e8 617 #endif // Fin directive de compilation capteur UV
ayoubzahir 3:cb77ea3370e8 618 #ifdef PHOTORES_FUNCTION // Debut directive de compilation capteur lumière
ayoubzahir 3:cb77ea3370e8 619 photores = pin_photores.read();
ayoubzahir 3:cb77ea3370e8 620 #endif // Fin directive de compilation capteur lumière
ayoubzahir 3:cb77ea3370e8 621
ayoubzahir 3:cb77ea3370e8 622 // Triple capteur Bosch BME280
ayoubzahir 3:cb77ea3370e8 623 #ifdef BOSCH_FUNCTION // Debut directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 624 bosch_t = bosch.getTemperature();
ayoubzahir 3:cb77ea3370e8 625 //bosch_p = bosch.getPressure();
ayoubzahir 3:cb77ea3370e8 626 bosch_p = 900.0 ;
ayoubzahir 3:cb77ea3370e8 627
ayoubzahir 3:cb77ea3370e8 628 bosch_h = bosch.getHumidity();
ayoubzahir 3:cb77ea3370e8 629 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 630 //serial_pc.printf("-> Bosch : %.2f *C, %.2f mbar, %.2f %%\n", bosch.getTemperature(), bosch.getPressure(), bosch.getHumidity());
ayoubzahir 3:cb77ea3370e8 631 #endif
ayoubzahir 3:cb77ea3370e8 632 #endif // Fin directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 633
ayoubzahir 3:cb77ea3370e8 634 // Ozone
ayoubzahir 3:cb77ea3370e8 635 #ifdef O3_FUNCTION // Debut directive de compilation spi_ozone
ayoubzahir 3:cb77ea3370e8 636 ozone = lecture_ozone();
ayoubzahir 3:cb77ea3370e8 637 #endif // Fin directive de compilation spi_ozone
ayoubzahir 3:cb77ea3370e8 638
ayoubzahir 3:cb77ea3370e8 639 // Mesure tension batterie (tension ref* pont diviseur + chute diode)
ayoubzahir 3:cb77ea3370e8 640 vbatt = ((double) pin_vbatt.read())*3.3*11.07+0.52;
ayoubzahir 3:cb77ea3370e8 641
ayoubzahir 3:cb77ea3370e8 642 // Recuperation données GPS
ayoubzahir 3:cb77ea3370e8 643 #ifdef GPS_FUNCTION // Debut directive de compilation module GPS
ayoubzahir 3:cb77ea3370e8 644 gps.getTimestamp(timeUTCBuffer);
ayoubzahir 3:cb77ea3370e8 645 gps.getLatitude(latBuffer);
ayoubzahir 3:cb77ea3370e8 646 gps.getLongitude(lonBuffer);
ayoubzahir 3:cb77ea3370e8 647 gps.getAltitude(altBuffer);
ayoubzahir 3:cb77ea3370e8 648 gps.getSpeed(speedBuffer);
ayoubzahir 3:cb77ea3370e8 649 //printf("UTC: %s\t Latitude: %s\t Longitude: %s\t altitude: %s\t speed: %s\n", timeUTCBuffer, latBuffer, lonBuffer, altBuffer, speedBuffer);
ayoubzahir 3:cb77ea3370e8 650 // Convertion des chaine en entier et flottant
ayoubzahir 3:cb77ea3370e8 651 timeUTC = atoi(timeUTCBuffer);
ayoubzahir 3:cb77ea3370e8 652 lat = (float)atof(latBuffer);
ayoubzahir 3:cb77ea3370e8 653 lon = (float)atof(lonBuffer);
ayoubzahir 3:cb77ea3370e8 654 alt = (float)atof(altBuffer);
ayoubzahir 3:cb77ea3370e8 655 speed = (float)atof(speedBuffer);
ayoubzahir 3:cb77ea3370e8 656 #endif // Fin directive de compilation module GPS
ayoubzahir 3:cb77ea3370e8 657
ayoubzahir 3:cb77ea3370e8 658 // Mise en forme dans un tableau de caractères
ayoubzahir 3:cb77ea3370e8 659 sprintf((char*) sd_gprs_data, "%d-%.2f-%d-%f-%f-%.1f-%.1f-%.1f-%.1f-%.3f-%.3f-%.3f-%.1f-%.3f-%.2f-%.2f-%d-%d-%f-%.3f-%.3f",
ayoubzahir 3:cb77ea3370e8 660 hab_frame_counter, vbatt, timeUTC, lat, lon, alt, speed,
ayoubzahir 3:cb77ea3370e8 661 xnuc_t, xnuc_t2, tempPT100, tempDS18, bosch_t, xnuc_h, bosch_h, xnuc_p, bosch_p, eco2, tvoc, ozone, (double)uv*100.0, (double)photores*100.0);
ayoubzahir 3:cb77ea3370e8 662
ayoubzahir 3:cb77ea3370e8 663 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 664 // Affichage des données sur port série debug
ayoubzahir 3:cb77ea3370e8 665 serial_pc.printf("\n>>> HAB Frame Counter : %d\n", hab_frame_counter);
ayoubzahir 3:cb77ea3370e8 666 serial_pc.printf("> Tension batterie : %f V\n", vbatt);
ayoubzahir 3:cb77ea3370e8 667 #ifdef GPS_FUNCTION // Debut directive de compilation module GPS
ayoubzahir 3:cb77ea3370e8 668 serial_pc.printf("> Temps UTC : %d\n", timeUTC);
ayoubzahir 3:cb77ea3370e8 669 serial_pc.printf("> Latitude : %f\n", lat);
ayoubzahir 3:cb77ea3370e8 670 serial_pc.printf("> Longitude : %f\n", lon);
ayoubzahir 3:cb77ea3370e8 671 serial_pc.printf("> Altitude : %.2f m\n", alt);
ayoubzahir 3:cb77ea3370e8 672 serial_pc.printf("> Vitesse : %.2f km/h\n", speed);
ayoubzahir 3:cb77ea3370e8 673 #endif // Fin directive de compilation module GPS
ayoubzahir 3:cb77ea3370e8 674
ayoubzahir 3:cb77ea3370e8 675 #ifdef XNUCLEO_FUNCTION // Debut directive de compilation shield capteurs XNUCLEO
ayoubzahir 3:cb77ea3370e8 676 serial_pc.printf("> Temperature 1 (XNUCLEO) : %.3f *C\n", xnuc_t);
ayoubzahir 3:cb77ea3370e8 677 serial_pc.printf("> Temperature 2 (XNUCLEO) : %.3f *C\n", xnuc_t2);
ayoubzahir 3:cb77ea3370e8 678 #endif // Fin directive de compilation shield capteurs XNUCLEO
ayoubzahir 3:cb77ea3370e8 679
ayoubzahir 3:cb77ea3370e8 680 #ifdef PT100_FUNCTION // Debut directive de compilation module PT100
ayoubzahir 3:cb77ea3370e8 681 serial_pc.printf("> Temperature 3 (PT100) : %.3f *C\n", tempPT100);
ayoubzahir 3:cb77ea3370e8 682 #endif // Fin directive de compilation module PT100
ayoubzahir 3:cb77ea3370e8 683
ayoubzahir 3:cb77ea3370e8 684 #ifdef DS18_FUNCTION // Debut directive de compilation DS181B20
ayoubzahir 3:cb77ea3370e8 685 serial_pc.printf("> Temperature 4 (DS18) : %.3f *C\n", tempDS18);
ayoubzahir 3:cb77ea3370e8 686 #endif // Fin directive de compilation DS181B20
ayoubzahir 3:cb77ea3370e8 687
ayoubzahir 3:cb77ea3370e8 688 #ifdef BOSCH_FUNCTION // Debut directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 689 serial_pc.printf("> Temperature 5 (Bosch) : %.3f *C\n",bosch_t);
ayoubzahir 3:cb77ea3370e8 690 #endif // Fin directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 691
ayoubzahir 3:cb77ea3370e8 692 #ifdef XNUCLEO_FUNCTION // Debut directive de compilation shield capteurs XNUCLEO
ayoubzahir 3:cb77ea3370e8 693 serial_pc.printf("> Humidite 1 (XNUCLEO) : %.2f %%\n", xnuc_h);
ayoubzahir 3:cb77ea3370e8 694 #endif // Fin directive de compilation shield capteurs XNUCLEO
ayoubzahir 3:cb77ea3370e8 695
ayoubzahir 3:cb77ea3370e8 696 #ifdef BOSCH_FUNCTION // Debut directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 697 serial_pc.printf("> Humidite 2 (Bosch) : %.2f %%\n",bosch_h);
ayoubzahir 3:cb77ea3370e8 698 #endif // Fin directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 699
ayoubzahir 3:cb77ea3370e8 700 #ifdef XNUCLEO_FUNCTION // Debut directive de compilation shield capteurs XNUCLEO
ayoubzahir 3:cb77ea3370e8 701 serial_pc.printf("> Pression 1 (XNUCLEO) : %.2f mbar - altitude calculee : %.2f m\n", xnuc_p, altitude(xnuc_p, BASE_PRESSURE));
ayoubzahir 3:cb77ea3370e8 702 #endif // Fin directive de compilation shield capteurs XNUCLEO
ayoubzahir 3:cb77ea3370e8 703
ayoubzahir 3:cb77ea3370e8 704 #ifdef BOSCH_FUNCTION // Debut directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 705 serial_pc.printf("> Pression 2 (Bosch) : %.2f mbar - altitude calculee : %.2f m\n",bosch_p, altitude(bosch_p, BASE_PRESSURE));
ayoubzahir 3:cb77ea3370e8 706 #endif // Fin directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 707
ayoubzahir 3:cb77ea3370e8 708 #ifdef CO2_FUNCTION // Debut directive de compilation module CO2
ayoubzahir 3:cb77ea3370e8 709 serial_pc.printf("> eCO2 : %d ppm\n", eco2);
ayoubzahir 3:cb77ea3370e8 710 serial_pc.printf("> TVOC : %d ppb\n", tvoc);
ayoubzahir 3:cb77ea3370e8 711 #endif // Fin directive de compilation module CO2
ayoubzahir 3:cb77ea3370e8 712
ayoubzahir 3:cb77ea3370e8 713 #ifdef UV_FUNCTION // Debut directive de compilation capteur UV
ayoubzahir 3:cb77ea3370e8 714 serial_pc.printf("> UV : %.3f %%ADC\n", (double)uv*100.0);
ayoubzahir 3:cb77ea3370e8 715 #endif // Fin directive de compilation capteur UV
ayoubzahir 3:cb77ea3370e8 716
ayoubzahir 3:cb77ea3370e8 717 #ifdef PHOTORES_FUNCTION // Debut directive de compilation capteur lumière
ayoubzahir 3:cb77ea3370e8 718 serial_pc.printf("> Lum : %.3f %%ADC\n", (double)photores*100.0);
ayoubzahir 3:cb77ea3370e8 719 #endif // Fin directive de compilation capteur lumière
ayoubzahir 3:cb77ea3370e8 720
ayoubzahir 3:cb77ea3370e8 721 #ifdef O3_FUNCTION // Debut directive de compilation spi_ozone
ayoubzahir 3:cb77ea3370e8 722 serial_pc.printf("> Ozone O3 : %f %%ADC\n", ozone);
ayoubzahir 3:cb77ea3370e8 723 #endif // Fin directive de compilation spi_ozone
ayoubzahir 3:cb77ea3370e8 724
ayoubzahir 3:cb77ea3370e8 725 serial_pc.printf("%s\n", sd_gprs_data);
ayoubzahir 3:cb77ea3370e8 726 #endif
ayoubzahir 3:cb77ea3370e8 727
ayoubzahir 3:cb77ea3370e8 728 // Envoi de la chaine par GPRS au Polytech Server
ayoubzahir 3:cb77ea3370e8 729 #ifdef GSM_FUNCTION // Debut directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 730 #ifdef GPRS_FUNCTION // Debut directive de compilation données mobiles
ayoubzahir 3:cb77ea3370e8 731 if(flag_gsm_network_ok == 1) {
ayoubzahir 3:cb77ea3370e8 732 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 733 serial_pc.printf(">>>>>> Send HAB data to Polytech Server\n");
ayoubzahir 3:cb77ea3370e8 734 #endif
ayoubzahir 3:cb77ea3370e8 735 gsm.gprs_message(url_srv_polytech , sd_gprs_data);
ayoubzahir 3:cb77ea3370e8 736 }
ayoubzahir 3:cb77ea3370e8 737 #endif // Fin directive de compilation données mobiles
ayoubzahir 3:cb77ea3370e8 738 /*if(flag_gsm_network_ok == 1) {
ayoubzahir 3:cb77ea3370e8 739 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 740 serial_pc.printf("SMS : %d\n",gsm.sendSMS("+33676040268", sd_gprs_data)); // Envoi de la chaine par SMS
ayoubzahir 3:cb77ea3370e8 741 #endif
ayoubzahir 3:cb77ea3370e8 742 */
ayoubzahir 3:cb77ea3370e8 743 #endif // Fin directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 744
ayoubzahir 3:cb77ea3370e8 745 // Sauvegarde sur carte SD
ayoubzahir 3:cb77ea3370e8 746 #ifdef SD_FUNCTION // Debut directive de compilation carte SD
ayoubzahir 3:cb77ea3370e8 747 ecriture_sd(SD_FUNCTION_FILENAME, sd_gprs_data);
ayoubzahir 3:cb77ea3370e8 748 #endif // Fin directive de compilation carte SD
ayoubzahir 3:cb77ea3370e8 749
ayoubzahir 3:cb77ea3370e8 750 // Creation de la chaine à envoyer à la carte LoRa
ayoubzahir 3:cb77ea3370e8 751 #ifdef LORA_FUNCTION // Debut directive de compilation LoRa
ayoubzahir 3:cb77ea3370e8 752 sprintf((char*) lora_data_tx, "%.2f-%f-%f-%.1f-%.3f", vbatt, lat, lon, alt, tempPT100);
ayoubzahir 3:cb77ea3370e8 753 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 754 serial_pc.printf("%s\n", lora_data_tx);
ayoubzahir 3:cb77ea3370e8 755 #endif
ayoubzahir 3:cb77ea3370e8 756 #endif // Fin directive de compilation LoRa
ayoubzahir 3:cb77ea3370e8 757
ayoubzahir 3:cb77ea3370e8 758 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 759 //serial_pc.printf("------------------------------------------------\n");
ayoubzahir 3:cb77ea3370e8 760 serial_pc.printf("\n");
ayoubzahir 3:cb77ea3370e8 761 #endif
ayoubzahir 3:cb77ea3370e8 762
ayoubzahir 3:cb77ea3370e8 763 // Increment du numéro de la trame transmise
ayoubzahir 3:cb77ea3370e8 764 hab_frame_counter++;
ayoubzahir 3:cb77ea3370e8 765 // Flag ticker HAB inactif
ayoubzahir 3:cb77ea3370e8 766 flag_ticker_hab = 0;
ayoubzahir 3:cb77ea3370e8 767 }
ayoubzahir 3:cb77ea3370e8 768
ayoubzahir 3:cb77ea3370e8 769 #endif // Fin directive de compilation module HAB
ayoubzahir 3:cb77ea3370e8 770
ayoubzahir 3:cb77ea3370e8 771 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 772 // Routines d'interruption appelées au tick des tickers et servant juste à lever un flag
ayoubzahir 3:cb77ea3370e8 773 // Pensez à abaisser le flag dans f_ticker_hab() et f_ticker_gsm() !
ayoubzahir 3:cb77ea3370e8 774 #ifdef HAB_FUNCTION
ayoubzahir 3:cb77ea3370e8 775 void isr_ticker_hab() { flag_ticker_hab = 1; }
ayoubzahir 3:cb77ea3370e8 776 #endif
ayoubzahir 3:cb77ea3370e8 777
ayoubzahir 3:cb77ea3370e8 778 #ifdef GSM_FUNCTION
ayoubzahir 3:cb77ea3370e8 779 void isr_ticker_check_gsm() { flag_ticker_check_gsm = 1; }
ayoubzahir 3:cb77ea3370e8 780 #endif
ayoubzahir 3:cb77ea3370e8 781
ayoubzahir 3:cb77ea3370e8 782 #ifdef SMS_FUNCTION
ayoubzahir 3:cb77ea3370e8 783 void isr_ticker_sms_data() { flag_ticker_sms_data = 1; }
ayoubzahir 3:cb77ea3370e8 784 #endif
ayoubzahir 3:cb77ea3370e8 785
ayoubzahir 3:cb77ea3370e8 786 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 787 // LoRa
ayoubzahir 3:cb77ea3370e8 788 #ifdef LORA_FUNCTION // Debut directive de compilation LoRa
ayoubzahir 3:cb77ea3370e8 789
ayoubzahir 3:cb77ea3370e8 790 void envoi_lora_data_tx() {
ayoubzahir 3:cb77ea3370e8 791 lora_serial.printf("%s\n", lora_data_tx);
ayoubzahir 3:cb77ea3370e8 792 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 793 serial_pc.printf("lora!\n"); // debug
ayoubzahir 3:cb77ea3370e8 794 #endif
ayoubzahir 3:cb77ea3370e8 795 }
ayoubzahir 3:cb77ea3370e8 796
ayoubzahir 3:cb77ea3370e8 797 void isr_lora_serial() {
ayoubzahir 3:cb77ea3370e8 798 char c = lora_serial.getc();
ayoubzahir 3:cb77ea3370e8 799 if(c == 'a') envoi_lora_data_tx();
ayoubzahir 3:cb77ea3370e8 800 #ifdef MP3_FUNCTION // Debut directive de compilation lecteur MP3
ayoubzahir 3:cb77ea3370e8 801 elseif(c == 'b') mp3.mp3_play();
ayoubzahir 3:cb77ea3370e8 802 elseif(c == 'c') mp3.mp3_pause();
ayoubzahir 3:cb77ea3370e8 803 #endif // Fin directive de compilation lecteur MP3
ayoubzahir 3:cb77ea3370e8 804 #ifdef BUZZ_FUNCTION // Debut directive de compilation buzzer
ayoubzahir 3:cb77ea3370e8 805 elseif(c == 'd') pin_buzzer.write(1);
ayoubzahir 3:cb77ea3370e8 806 elseif(c == 'e') pin_buzzer.write(0);
ayoubzahir 3:cb77ea3370e8 807 #endif // Fin directive de compilation buzzer
ayoubzahir 3:cb77ea3370e8 808 }
ayoubzahir 3:cb77ea3370e8 809
ayoubzahir 3:cb77ea3370e8 810 #endif // Fin directive de compilation LoRa
ayoubzahir 3:cb77ea3370e8 811
ayoubzahir 3:cb77ea3370e8 812
ayoubzahir 3:cb77ea3370e8 813 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 814 ///////////////////////////// MAIN ////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 815 /////////////////////////////////////////////////////////////////////////
ayoubzahir 3:cb77ea3370e8 816
ayoubzahir 3:cb77ea3370e8 817 int main() {
ayoubzahir 3:cb77ea3370e8 818
ayoubzahir 3:cb77ea3370e8 819 // Affichage/listage des modules compilés/activés sur port série STLINK
ayoubzahir 3:cb77ea3370e8 820 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 821 serial_pc.printf("\n\n-----------------------------------------------------------------------------------\n");
ayoubzahir 3:cb77ea3370e8 822 serial_pc.printf("--- AMU Aix-Marseille Universit\xE9 - Polytech Marseille MT - STM32 in the Sky HAB ---\n");
ayoubzahir 3:cb77ea3370e8 823 vbatt = ((double)pin_vbatt.read())*3.3*11.07+0.52; // Tension batterie (tension ref * pont diviseur + chute diode)
ayoubzahir 3:cb77ea3370e8 824 serial_pc.printf("- Tension batterie = %f V\n", vbatt);
ayoubzahir 3:cb77ea3370e8 825 serial_pc.printf("- Liste des Fonctionalit\xE9s & Capteurs op\xE9rationnels ...\n");
ayoubzahir 3:cb77ea3370e8 826 #endif
ayoubzahir 3:cb77ea3370e8 827
ayoubzahir 3:cb77ea3370e8 828 //Buzzer, léger bip au démarrage
ayoubzahir 3:cb77ea3370e8 829 #ifdef BUZZ_FUNCTION
ayoubzahir 3:cb77ea3370e8 830 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 831 serial_pc.printf("-> Buzzer ON ... ");
ayoubzahir 3:cb77ea3370e8 832 #endif
ayoubzahir 3:cb77ea3370e8 833 for(int i=1; i<BUZZ_FUNCTION_DURATION; i++) // #périodes de 1,5kHz
ayoubzahir 3:cb77ea3370e8 834 { // 333us x 2 = 1,5k Hz
ayoubzahir 3:cb77ea3370e8 835 pin_buzzer.write(1); wait_us(BUZZ_FUNCTION_HZ);
ayoubzahir 3:cb77ea3370e8 836 pin_buzzer.write(0); wait_us(BUZZ_FUNCTION_HZ);
ayoubzahir 3:cb77ea3370e8 837 };
ayoubzahir 3:cb77ea3370e8 838 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 839 serial_pc.printf("OFF\n");
ayoubzahir 3:cb77ea3370e8 840 #endif
ayoubzahir 3:cb77ea3370e8 841 #endif
ayoubzahir 3:cb77ea3370e8 842
ayoubzahir 3:cb77ea3370e8 843 // Shield ST X_NUCLEO_IKS01A2
ayoubzahir 3:cb77ea3370e8 844 #ifdef XNUCLEO_FUNCTION
ayoubzahir 3:cb77ea3370e8 845 // Hum, Temp, Press, Temp, Accelero enable
ayoubzahir 3:cb77ea3370e8 846 hum_temp->enable();
ayoubzahir 3:cb77ea3370e8 847 press_temp->enable();
ayoubzahir 3:cb77ea3370e8 848 accelerometer->enable();
ayoubzahir 3:cb77ea3370e8 849 // Lecture des capteurs
ayoubzahir 3:cb77ea3370e8 850 hum_temp->get_temperature(&xnuc_t);
ayoubzahir 3:cb77ea3370e8 851 hum_temp->get_humidity(&xnuc_h);
ayoubzahir 3:cb77ea3370e8 852 press_temp->get_temperature(&xnuc_t2);
ayoubzahir 3:cb77ea3370e8 853 press_temp->get_pressure(&xnuc_p);
ayoubzahir 3:cb77ea3370e8 854 accelerometer->get_x_axes(xnuc_acc);
ayoubzahir 3:cb77ea3370e8 855 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 856 serial_pc.printf("-> XNucleo = %.3f \xB0 C, %.3f \xB0 C, %.3f mbar, %.2f %%, ",xnuc_t, xnuc_t2, xnuc_p, xnuc_h);
ayoubzahir 3:cb77ea3370e8 857 serial_pc.printf("Acc x = %ld, y = %ld, z = %ld\n", xnuc_acc[0], xnuc_acc[1], xnuc_acc[2]);
ayoubzahir 3:cb77ea3370e8 858 #endif
ayoubzahir 3:cb77ea3370e8 859 #endif
ayoubzahir 3:cb77ea3370e8 860
ayoubzahir 3:cb77ea3370e8 861 // GSM
ayoubzahir 3:cb77ea3370e8 862 #ifdef GSM_FUNCTION
ayoubzahir 3:cb77ea3370e8 863 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 864 serial_pc.printf("-> GSM ON ");
ayoubzahir 3:cb77ea3370e8 865 #endif
ayoubzahir 3:cb77ea3370e8 866 gsm_pwr_on();
ayoubzahir 3:cb77ea3370e8 867 #endif
ayoubzahir 3:cb77ea3370e8 868
ayoubzahir 3:cb77ea3370e8 869 // GPRS SMS
ayoubzahir 3:cb77ea3370e8 870 #ifdef GPRS_FUNCTION
ayoubzahir 3:cb77ea3370e8 871 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 872 serial_pc.printf("& GPRS ON\n");
ayoubzahir 3:cb77ea3370e8 873 #endif
ayoubzahir 3:cb77ea3370e8 874 #endif
ayoubzahir 3:cb77ea3370e8 875
ayoubzahir 3:cb77ea3370e8 876 #ifdef PT100_FUNCTION
ayoubzahir 3:cb77ea3370e8 877 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 878 serial_pc.printf("-> PT100 = ");
ayoubzahir 3:cb77ea3370e8 879 #endif
ayoubzahir 3:cb77ea3370e8 880 // Configuration initiale du MAX31865
ayoubzahir 3:cb77ea3370e8 881 /*
ayoubzahir 3:cb77ea3370e8 882 1: v_biais : Vbias (tension de polarisation) activée (true) ou non (false)
ayoubzahir 3:cb77ea3370e8 883 2: conversion_mode : mode de conversion automatique activé (true) ou non (false)
ayoubzahir 3:cb77ea3370e8 884 3: one_shot : mesure au coup par coup (true) ou en continue (false)
ayoubzahir 3:cb77ea3370e8 885 4: three_wire : mesure 3 fils activée (true) ou 2/4 fils (false)
ayoubzahir 3:cb77ea3370e8 886 5: fault_cycle : detection d'erreur (voir datasheet) activée (true) ou non (false)
ayoubzahir 3:cb77ea3370e8 887 6: fault_clear : acquittement automatique des erreurs activée (true) ou non (false)
ayoubzahir 3:cb77ea3370e8 888 7: filter_50hz : filtre 50 Hz activé (true) ou non (false)
ayoubzahir 3:cb77ea3370e8 889 8: low_threshold : seuil d'erreur bas. (0x0000 = 0)
ayoubzahir 3:cb77ea3370e8 890 9: high_threshold : seuil d'erreur haut. (0x7fff = 32767)
ayoubzahir 3:cb77ea3370e8 891 */
ayoubzahir 3:cb77ea3370e8 892 PT100.configure(true, true, false, false, MAX31865_FAULT_DETECTION_NONE, true, true, 0x0000, 0x7fff);
ayoubzahir 3:cb77ea3370e8 893 PT100.read_all();
ayoubzahir 3:cb77ea3370e8 894 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 895 if(PT100.status() == 0) {
ayoubzahir 3:cb77ea3370e8 896 //serial_pc.printf("PT100 OK Temp = %.3f *C\n",PT100.temperature());
ayoubzahir 3:cb77ea3370e8 897 serial_pc.printf("PT100 OK\n");
ayoubzahir 3:cb77ea3370e8 898 }
ayoubzahir 3:cb77ea3370e8 899 else {
ayoubzahir 3:cb77ea3370e8 900 serial_pc.printf("\n!!! Registre d'erreur PT100 = %d - ",PT100.status( ));
ayoubzahir 3:cb77ea3370e8 901 if(PT100.status() & MAX31865_FAULT_HIGH_THRESHOLD) {
ayoubzahir 3:cb77ea3370e8 902 serial_pc.printf("ERREUR PT100 seuil haut franchi\n");
ayoubzahir 3:cb77ea3370e8 903 }
ayoubzahir 3:cb77ea3370e8 904 else if(PT100.status() & MAX31865_FAULT_LOW_THRESHOLD) {
ayoubzahir 3:cb77ea3370e8 905 serial_pc.printf("ERREUR PT100 seuil bas franchi\n");
ayoubzahir 3:cb77ea3370e8 906 }
ayoubzahir 3:cb77ea3370e8 907 else if(PT100.status() & MAX31865_FAULT_REFIN) {
ayoubzahir 3:cb77ea3370e8 908 serial_pc.printf("ERREUR REFIN- > 0,85 x V_BIAS\n");
ayoubzahir 3:cb77ea3370e8 909 }
ayoubzahir 3:cb77ea3370e8 910 else if(PT100.status( ) & MAX31865_FAULT_REFIN_FORCE) {
ayoubzahir 3:cb77ea3370e8 911 serial_pc.printf("ERREUR REFIN- < 0,85 x V_BIAS, FORCE- ouvert\n");
ayoubzahir 3:cb77ea3370e8 912 }
ayoubzahir 3:cb77ea3370e8 913 else if(PT100.status( ) & MAX31865_FAULT_RTDIN_FORCE ) {
ayoubzahir 3:cb77ea3370e8 914 serial_pc.printf("ERREUR RTDIN- < 0,85 x V_BIAS, FORCE- ouvert\n");
ayoubzahir 3:cb77ea3370e8 915 }
ayoubzahir 3:cb77ea3370e8 916 else if(PT100.status( ) & MAX31865_FAULT_VOLTAGE) {
ayoubzahir 3:cb77ea3370e8 917 serial_pc.printf("ERREUR sur/sous-tension\n");
ayoubzahir 3:cb77ea3370e8 918 }
ayoubzahir 3:cb77ea3370e8 919 else serial_pc.printf("ERREUR inconnue\n");
ayoubzahir 3:cb77ea3370e8 920 }
ayoubzahir 3:cb77ea3370e8 921 #endif
ayoubzahir 3:cb77ea3370e8 922 #endif
ayoubzahir 3:cb77ea3370e8 923
ayoubzahir 3:cb77ea3370e8 924 // Carte SD, initialisation, et creation d'un fichier de test d'ecriture
ayoubzahir 3:cb77ea3370e8 925 // /!\ Faire cette étape après l'initialisation du capteur PT100 qui partage le même SPI
ayoubzahir 3:cb77ea3370e8 926 #ifdef SD_FUNCTION
ayoubzahir 3:cb77ea3370e8 927 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 928 serial_pc.printf("-> SD = ");
ayoubzahir 3:cb77ea3370e8 929 #endif
ayoubzahir 3:cb77ea3370e8 930 //mkdir("/sd/TEST", 0777);
ayoubzahir 3:cb77ea3370e8 931 FILE *fp = fopen(SD_FUNCTION_TESTFILENAME, "w");
ayoubzahir 3:cb77ea3370e8 932 if(fp == NULL) {
ayoubzahir 3:cb77ea3370e8 933 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 934 serial_pc.printf("ERREUR - Ecriture carte SD\n");
ayoubzahir 3:cb77ea3370e8 935 #endif
ayoubzahir 3:cb77ea3370e8 936 // Desactivation de la sauvegarde sur carte SD
ayoubzahir 3:cb77ea3370e8 937 flag_sd_ok = 0;
ayoubzahir 3:cb77ea3370e8 938 }
ayoubzahir 3:cb77ea3370e8 939 else {
ayoubzahir 3:cb77ea3370e8 940 fprintf(fp, "AMU - Polytech Marseille - HAB STM32 in the Sky - Test ecriture SD");
ayoubzahir 3:cb77ea3370e8 941 fclose(fp);
ayoubzahir 3:cb77ea3370e8 942 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 943 serial_pc.printf("Ecriture carte SD - ok\n");
ayoubzahir 3:cb77ea3370e8 944 #endif
ayoubzahir 3:cb77ea3370e8 945 //Activation de la sauvegarde sur carte SD
ayoubzahir 3:cb77ea3370e8 946 flag_sd_ok = 1;
ayoubzahir 3:cb77ea3370e8 947 }
ayoubzahir 3:cb77ea3370e8 948 #endif
ayoubzahir 3:cb77ea3370e8 949
ayoubzahir 3:cb77ea3370e8 950 // CO2
ayoubzahir 3:cb77ea3370e8 951 #ifdef CO2_FUNCTION
ayoubzahir 3:cb77ea3370e8 952 co2.begin();
ayoubzahir 3:cb77ea3370e8 953 co2.IAQmeasure();
ayoubzahir 3:cb77ea3370e8 954 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 955 serial_pc.printf("-> CO2 = TVOC = %d, eCO2 = %d\n", co2.TVOC, co2.eCO2);
ayoubzahir 3:cb77ea3370e8 956 #endif
ayoubzahir 3:cb77ea3370e8 957 #endif
ayoubzahir 3:cb77ea3370e8 958
ayoubzahir 3:cb77ea3370e8 959 //DS18 thermomètre
ayoubzahir 3:cb77ea3370e8 960 #ifdef DS18_FUNCTION // Debut directive de compilation DS181B20
ayoubzahir 3:cb77ea3370e8 961
ayoubzahir 3:cb77ea3370e8 962 if (ds18.begin()) {
ayoubzahir 3:cb77ea3370e8 963 while (1) {
ayoubzahir 3:cb77ea3370e8 964 ds18.startConversion(); // start temperature conversion from analog to digital
ayoubzahir 3:cb77ea3370e8 965 wait(1.0); // let DS1820 complete the temperature conversion
ayoubzahir 3:cb77ea3370e8 966 result = ds18.read(tempDS18); // read temperature from DS1820 and perform cyclic redundancy check (CRC)
ayoubzahir 3:cb77ea3370e8 967 switch (result) {
ayoubzahir 3:cb77ea3370e8 968 case 0: // no errors -> 'tempDS18' contains the value of measured temperature
ayoubzahir 3:cb77ea3370e8 969 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 970 serial_pc.printf("temp = %3.1f%cC\r\n", tempDS18, 176);
ayoubzahir 3:cb77ea3370e8 971 #endif
ayoubzahir 3:cb77ea3370e8 972 break;
ayoubzahir 3:cb77ea3370e8 973 case 1: // no sensor present -> 'tempDS18' is not updated
ayoubzahir 3:cb77ea3370e8 974 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 975 serial_pc.printf("no sensor present\n\r");
ayoubzahir 3:cb77ea3370e8 976 #endif
ayoubzahir 3:cb77ea3370e8 977 break;
ayoubzahir 3:cb77ea3370e8 978 case 2: // CRC error -> 'tempDS18' is not updated
ayoubzahir 3:cb77ea3370e8 979 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 980 serial_pc.printf("CRC error\r\n");
ayoubzahir 3:cb77ea3370e8 981 #endif
ayoubzahir 3:cb77ea3370e8 982 }
ayoubzahir 3:cb77ea3370e8 983 }
ayoubzahir 3:cb77ea3370e8 984 }
ayoubzahir 3:cb77ea3370e8 985 else
ayoubzahir 3:cb77ea3370e8 986 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 987 serial_pc.printf("No DS1820 sensor found!\r\n");
ayoubzahir 3:cb77ea3370e8 988 #endif
ayoubzahir 3:cb77ea3370e8 989
ayoubzahir 3:cb77ea3370e8 990 #endif // Fin directive de compilation DS181B20
ayoubzahir 3:cb77ea3370e8 991
ayoubzahir 3:cb77ea3370e8 992 //UV
ayoubzahir 3:cb77ea3370e8 993 #ifdef UV_FUNCTION
ayoubzahir 3:cb77ea3370e8 994 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 995 serial_pc.printf("-> UV = %.3f %%ADC\n",pin_UV.read());
ayoubzahir 3:cb77ea3370e8 996 #endif
ayoubzahir 3:cb77ea3370e8 997 #endif
ayoubzahir 3:cb77ea3370e8 998
ayoubzahir 3:cb77ea3370e8 999 //Photoresistance
ayoubzahir 3:cb77ea3370e8 1000 #ifdef PHOTORES_FUNCTION
ayoubzahir 3:cb77ea3370e8 1001 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 1002 serial_pc.printf("-> Photoresistance = %.3f %%ADC\n",(double)pin_photores.read()*100.0);
ayoubzahir 3:cb77ea3370e8 1003 #endif
ayoubzahir 3:cb77ea3370e8 1004 #endif
ayoubzahir 3:cb77ea3370e8 1005
ayoubzahir 3:cb77ea3370e8 1006 // Triple capteur Bosch BME280
ayoubzahir 3:cb77ea3370e8 1007 #ifdef BOSCH_FUNCTION // Debut directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 1008 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 1009 serial_pc.printf("-> Bosch = %.2f *C, %.2f mbar, %.2f %%\n", bosch.getTemperature(), bosch.getPressure(), bosch.getHumidity());
ayoubzahir 3:cb77ea3370e8 1010 #endif
ayoubzahir 3:cb77ea3370e8 1011 #endif // Fin directive de compilation Bosch
ayoubzahir 3:cb77ea3370e8 1012
ayoubzahir 3:cb77ea3370e8 1013 // Lecteur MP3
ayoubzahir 3:cb77ea3370e8 1014 // Creer un fichier 0.mp3 à la racine de la carte SD
ayoubzahir 3:cb77ea3370e8 1015 #ifdef MP3_FUNCTION // Debut directive de compilation lecteur MP3
ayoubzahir 3:cb77ea3370e8 1016 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 1017 serial_pc.printf("-> MP3 ON\n");
ayoubzahir 3:cb77ea3370e8 1018 #endif
ayoubzahir 3:cb77ea3370e8 1019 mp3.mp3_reset();
ayoubzahir 3:cb77ea3370e8 1020 wait(1);
ayoubzahir 3:cb77ea3370e8 1021 mp3.mp3_set_EQ(0);
ayoubzahir 3:cb77ea3370e8 1022 wait(0.5);
ayoubzahir 3:cb77ea3370e8 1023 mp3.mp3_set_volume(20);
ayoubzahir 3:cb77ea3370e8 1024 wait(0.5);
ayoubzahir 3:cb77ea3370e8 1025 mp3.mp3_set_device(2); // 1,2,3,4,5 : USB,SD,AUX,SLEEP,FLASH
ayoubzahir 3:cb77ea3370e8 1026 wait(0.5);
ayoubzahir 3:cb77ea3370e8 1027 mp3.mp3_single_loop(0);
ayoubzahir 3:cb77ea3370e8 1028 //mp3.mp3_single_play(0) ;
ayoubzahir 3:cb77ea3370e8 1029 wait(0.5);
ayoubzahir 3:cb77ea3370e8 1030 //serial_pc.printf("We are in the MP3 func !!!!!\n\r");
ayoubzahir 3:cb77ea3370e8 1031 mp3.mp3_play();
ayoubzahir 3:cb77ea3370e8 1032 #endif // Fin directive de compilation MP3
ayoubzahir 3:cb77ea3370e8 1033
ayoubzahir 3:cb77ea3370e8 1034 #ifdef LORA_FUNCTION
ayoubzahir 3:cb77ea3370e8 1035 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 1036 serial_pc.printf("-> LoRa ON\n");
ayoubzahir 3:cb77ea3370e8 1037 #endif
ayoubzahir 3:cb77ea3370e8 1038 #endif
ayoubzahir 3:cb77ea3370e8 1039
ayoubzahir 3:cb77ea3370e8 1040 #ifdef GPS_FUNCTION
ayoubzahir 3:cb77ea3370e8 1041 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 1042 serial_pc.printf("-> GPS ON\n");
ayoubzahir 3:cb77ea3370e8 1043 #endif
ayoubzahir 3:cb77ea3370e8 1044 #endif
ayoubzahir 3:cb77ea3370e8 1045
ayoubzahir 3:cb77ea3370e8 1046 #ifdef O3_FUNCTION
ayoubzahir 3:cb77ea3370e8 1047 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 1048 serial_pc.printf("-> Ozone O3 = %f %%ADC\n", lecture_ozone());
ayoubzahir 3:cb77ea3370e8 1049 #endif
ayoubzahir 3:cb77ea3370e8 1050 #endif
ayoubzahir 3:cb77ea3370e8 1051
ayoubzahir 3:cb77ea3370e8 1052 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 1053 serial_pc.printf("\n");
ayoubzahir 3:cb77ea3370e8 1054 #endif
ayoubzahir 3:cb77ea3370e8 1055
ayoubzahir 3:cb77ea3370e8 1056 ////// Lancement des ticker et des interruptions ////////
ayoubzahir 3:cb77ea3370e8 1057
ayoubzahir 3:cb77ea3370e8 1058 // GPS
ayoubzahir 3:cb77ea3370e8 1059 // Mise en place de l'interruption pour le port UART du GPS
ayoubzahir 3:cb77ea3370e8 1060 #ifdef GPS_FUNCTION // Debut directive de compilation module GPS
ayoubzahir 3:cb77ea3370e8 1061 gps_serial.attach(&isr_gps_serial,Serial::RxIrq);
ayoubzahir 3:cb77ea3370e8 1062 #endif // Fin directive de compilation module GPS
ayoubzahir 3:cb77ea3370e8 1063
ayoubzahir 3:cb77ea3370e8 1064 // Ticker de creation de la chaine de données toute les 5s
ayoubzahir 3:cb77ea3370e8 1065 ticker_hab.attach(&isr_ticker_hab, TICKER_HAB_TIME);
ayoubzahir 3:cb77ea3370e8 1066
ayoubzahir 3:cb77ea3370e8 1067 // GSM
ayoubzahir 3:cb77ea3370e8 1068 #ifdef GSM_FUNCTION // Debut directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 1069 if(flag_gsm_absent == 0) {
ayoubzahir 3:cb77ea3370e8 1070
ayoubzahir 3:cb77ea3370e8 1071 // Interruption sur LED "NET" et compteur de sa période
ayoubzahir 3:cb77ea3370e8 1072 timer_gsm_network.reset(); // Démarrage du compteur de la période de clignotement de la LED "NET"
ayoubzahir 3:cb77ea3370e8 1073 timer_gsm_network.start();
ayoubzahir 3:cb77ea3370e8 1074 gsm_net.rise(&isr_network_gsm); // Attachement de l'interruption externe sur la LED "NET"
ayoubzahir 3:cb77ea3370e8 1075
ayoubzahir 3:cb77ea3370e8 1076 // Ticker de surveillance GSM toute les xx sec
ayoubzahir 3:cb77ea3370e8 1077 ticker_check_gsm.attach(&isr_ticker_check_gsm, TICKER_CHECK_GSM_TIME);
ayoubzahir 3:cb77ea3370e8 1078
ayoubzahir 3:cb77ea3370e8 1079 // Ticker d'envoi de données par sms toute les xx sec
ayoubzahir 3:cb77ea3370e8 1080 #ifdef SMS_FUNCTION // Debut directive de compilation envoi SMS
ayoubzahir 3:cb77ea3370e8 1081 ticker_sms_data.attach(&isr_ticker_sms_data, TICKER_SMS_DATA_TIME);
ayoubzahir 3:cb77ea3370e8 1082 #endif // Fin directive de compilation SMS de données toutes les xx sec
ayoubzahir 3:cb77ea3370e8 1083 }
ayoubzahir 3:cb77ea3370e8 1084 #endif // Fin directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 1085
ayoubzahir 3:cb77ea3370e8 1086 // LoRa
ayoubzahir 3:cb77ea3370e8 1087 // Mise en place de l'interruption pour le port UART LoRa
ayoubzahir 3:cb77ea3370e8 1088 #ifdef LORA_FUNCTION // Debut directive de compilation LoRa
ayoubzahir 3:cb77ea3370e8 1089 lora_serial.attach(&isr_lora_serial,Serial::RxIrq);
ayoubzahir 3:cb77ea3370e8 1090 #endif // Fin directive de compilation LoRa
ayoubzahir 3:cb77ea3370e8 1091
ayoubzahir 3:cb77ea3370e8 1092 /////////////////// BOUCLE PRINCIPALE /////////////////
ayoubzahir 3:cb77ea3370e8 1093 while(1) {
ayoubzahir 3:cb77ea3370e8 1094
ayoubzahir 3:cb77ea3370e8 1095 // Vérification du flag d'interruption pour la routine de recuperation
ayoubzahir 3:cb77ea3370e8 1096 // des données des capteurs, enregistrement, envoi LoRa, etc.
ayoubzahir 3:cb77ea3370e8 1097 #ifdef HAB_FUNCTION
ayoubzahir 3:cb77ea3370e8 1098 if(flag_ticker_hab == 1) f_ticker_hab();
ayoubzahir 3:cb77ea3370e8 1099 #endif
ayoubzahir 3:cb77ea3370e8 1100
ayoubzahir 3:cb77ea3370e8 1101 // Vérification du flag d'interruption pour la routine de vérification
ayoubzahir 3:cb77ea3370e8 1102 // de l'état du module
ayoubzahir 3:cb77ea3370e8 1103 #ifdef GSM_FUNCTION // Debut directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 1104 if(flag_ticker_check_gsm == 1)
ayoubzahir 3:cb77ea3370e8 1105 { if ( (altitude(xnuc_p, BASE_PRESSURE) < GSM_START_ALTITUDE ) || (altitude(bosch_p, BASE_PRESSURE) < GSM_START_ALTITUDE) )
ayoubzahir 3:cb77ea3370e8 1106 {
ayoubzahir 3:cb77ea3370e8 1107 #ifdef DEBUG_SERIAL_PC
ayoubzahir 3:cb77ea3370e8 1108 serial_pc.printf("> Pression 1 (XNUCLEO) : %.2f mbar - altitude GSM : %.2f m\n", xnuc_p, altitude(xnuc_p, BASE_PRESSURE));
ayoubzahir 3:cb77ea3370e8 1109 serial_pc.printf("> Pression 1 (BOSCH) : %.2f mbar - altitude GSM : %.2f m\n", bosch_p, altitude(bosch_p, BASE_PRESSURE));
ayoubzahir 3:cb77ea3370e8 1110 #endif
ayoubzahir 3:cb77ea3370e8 1111 f_ticker_check_gsm();
ayoubzahir 3:cb77ea3370e8 1112 }
ayoubzahir 3:cb77ea3370e8 1113 }
ayoubzahir 3:cb77ea3370e8 1114 #endif // Fin directive de compilation module GSM
ayoubzahir 3:cb77ea3370e8 1115
ayoubzahir 3:cb77ea3370e8 1116 // Vérification du flag d'interruption pour la routine d'envoi de SMS
ayoubzahir 3:cb77ea3370e8 1117 // de donnée toute les 10 min
ayoubzahir 3:cb77ea3370e8 1118 #ifdef SMS_FUNCTION // Debut directive de compilation SMS de données toutes les 10 min
ayoubzahir 3:cb77ea3370e8 1119 if(flag_ticker_sms_data == 1) f_ticker_sms_data();
ayoubzahir 3:cb77ea3370e8 1120 #endif // Fin directive de compilation SMS de données toutes les 10 min
ayoubzahir 3:cb77ea3370e8 1121 }
ayoubzahir 3:cb77ea3370e8 1122 }