Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp
00001 /******************************************************************************* 00002 Université de Montpellier 00003 NemoSpace IUT de Nîmes 00004 IniSat Modèle 1 Version 2 00005 *******************************************************************************/ 00006 // La lecture du GPS utilise une liaison série software 00007 00008 // TP n°5 : Correction 00009 00010 // Exo 1 : Enregistrement des coordonnées GPS sur carte SD 00011 // Exo 2 : Gestion de messages descendants (Supervision) et montants (Commande) 00012 // Exo 3 : Tracer sur My Maps votre déplacement autour du batiment (Mission) 00013 00014 #include "mbed.h" 00015 //#include "platform/mbed_thread.h" 00016 #include "SDFileSystem.h" 00017 00018 #include "system.h" 00019 #include "user.h" 00020 #include "soft_uart.h" 00021 #include "gps.h" 00022 00023 SDFileSystem sd(PB_5, PB_4, PB_3, PA_11, "sd"); // MOSI, MISO, SCK, CS -> SPI pins on the Inisat 00024 00025 uint8_t etat, etat_mem; 00026 uint16_t compteur; 00027 float mes_accu; 00028 00029 uint8_t xb_ptr; 00030 char xb_buf[10], cmd[3], param[10]; 00031 00032 void Rx_interrupt(void); 00033 00034 int main() 00035 { 00036 Init_System(); 00037 etat = 0; 00038 Init_Soft_UART(); 00039 // thread_sleep_for(1000); 00040 xb_ptr = 0; 00041 cmd[0] = 'P'; // Controle montant par PC 00042 // Setup a serial interrupt function to receive data 00043 xbee.attach(&Rx_interrupt, Serial::RxIrq); 00044 __enable_irq(); 00045 00046 wait_ms(1000); 00047 00048 while (1) { 00049 // thread_sleep_for(1); // Boucle toutes les 1 milliseconde environ 00050 wait_ms(1); 00051 compteur++; 00052 00053 // Gestion des modes avec une machine d'états 00054 switch (etat) { 00055 /******************************************************************************/ 00056 // Mode Init : Mise sous tension 00057 // Initialisation du µC 00058 case 0: { 00059 Init_User_Fonctions(); 00060 // thread_sleep_for(1000); 00061 wait_ms(1000); 00062 Stop_Led(); 00063 GPS_Init(); 00064 Start_Led(); 00065 Set_Led(Ve); 00066 00067 // Création d'un fichier "gps_data.txt" sur la carte SD 00068 FILE *fp = fopen("/sd/gps_data.txt", "w"); 00069 if(fp == NULL) { 00070 error("Erreur : fichier non accessible en ecriture\n"); 00071 } 00072 pc.printf("Carte SD Ok!\r\n"); 00073 xbee.printf("Station Sol par XBee Ok!\r\n"); 00074 00075 // Write text in file 00076 // fprintf(fp, "Hello World, greats from Inisat!"); 00077 // pc.printf("Write some words in sdtest.txt on sd/mydir directory\r\n"); 00078 00079 // Close file 00080 fclose(fp); 00081 // thread_sleep_for(1000); 00082 wait_ms(1000); 00083 etat = 1; 00084 break; } 00085 /******************************************************************************/ 00086 // Mode Gestion : Gestion des actions 00087 // Contrôle du système 00088 case 1: 00089 mes_accu = Mes_Bat(); 00090 if(mes_accu < BAT_SEUIL_BAS_1) { 00091 etat = 4; 00092 Set_Led(Ro); 00093 } else { 00094 etat = 2; 00095 Set_Led(Ve); 00096 } 00097 // thread_sleep_for(1000); 00098 wait_ms(1000); 00099 break; 00100 /******************************************************************************/ 00101 // Mode Mission : Acquisition de données 00102 // Mesure Batterie 00103 // Mesure Courant faces solaires 00104 // Stockage 00105 case 2: 00106 Lect_GPS(); 00107 GPS_Decodage(); 00108 Mes_SP(); 00109 Mes_Temp(); 00110 mes_accu = Mes_Bat(); 00111 if(mes_accu > BAT_SEUIL_HAUT_1) 00112 { 00113 etat = 3; 00114 Set_Led(Ro_Ve); 00115 } 00116 else 00117 { 00118 etat = 1; 00119 } 00120 // thread_sleep_for(1000); 00121 // wait_ms(1000); 00122 break; 00123 /******************************************************************************/ 00124 // Mode Radio : Transmission de données 00125 // Mise en forme pour affichage 00126 case 3: 00127 switch (cmd[0]) { // Commn 00128 case 'P': { // Commande montante filaire 00129 Envoi_GPS(); 00130 Envoi_Mes_Bat(); 00131 // Envoi_Mes_SP(); 00132 Envoi_Mes_Temp(); 00133 break; } 00134 case 'X': // Commande montante sans fil par XBee 00135 XBee_Envoi_GPS(); 00136 XBee_Envoi_Mes_Bat(); 00137 // XBee_Envoi_Mes_SP(); 00138 XBee_Envoi_Mes_Temp(); 00139 break; 00140 default: 00141 cmd[0] = 'P'; 00142 break; 00143 } 00144 etat = 1; 00145 break; 00146 /******************************************************************************/ 00147 // Mode Survie : Attente recharge de l'accu 00148 00149 case 4: 00150 mes_accu = Mes_Bat(); 00151 if(mes_accu < BAT_SEUIL_BAS_2) { 00152 etat = 5; 00153 Stop_User_Fonctions(); 00154 } 00155 00156 if(mes_accu > BAT_SEUIL_HAUT_1) { 00157 etat = 1; 00158 Set_Led(Ve); 00159 } 00160 break; 00161 /******************************************************************************/ 00162 // Mode Zombie : Coupure des consommateurs 00163 // Passage en mode faible consommation 00164 // Diminution de la fréquence du CPU 00165 // Passage en mode Sleep 00166 case 5: 00167 sleep(); 00168 mes_accu = Mes_Bat(); 00169 if(mes_accu > BAT_SEUIL_HAUT_1) 00170 etat = 0; 00171 break; 00172 /******************************************************************************/ 00173 default: 00174 etat = 0; 00175 break; 00176 /******************************************************************************/ 00177 } // end switch 00178 /* if(etat != etat_mem) // Debug des états 00179 { 00180 pc.printf("Etat_%d\r\n",etat); 00181 etat_mem = etat; 00182 }*/ 00183 /******************************************************************************/ 00184 } // end while 00185 } // end main 00186 /******************************************************************************/ 00187 void Rx_interrupt(void) { 00188 if(xbee.readable()) 00189 { 00190 xb_buf[xb_ptr] = xbee.getc(); 00191 00192 if((xb_buf[xb_ptr] == 0x0A) || (xb_buf[xb_ptr] == 0x0D)) // Test touche entrée en mode ASCII 00193 { 00194 xb_buf[xb_ptr] = 0; // Transforme le tableau en chaine de caractères 00195 xb_ptr = 0; 00196 if (xb_buf[0] == '$') // Entete de message valide 00197 { 00198 cmd[0] = xb_buf[1]; 00199 xbee.printf("#%c\r\n",cmd[0]+0x20); // Acquittement 00200 param[0] = xb_buf[2]; 00201 } 00202 // xb_ok = 1; // Trame disponible pour décodage 00203 // pc.printf("%s\n\r",buffer); // Echo 00204 } 00205 else { 00206 xb_ptr++; 00207 } 00208 } 00209 }
Generated on Mon Aug 15 2022 23:44:49 by
1.7.2