Gestion du Trafic Adaptatif - Code des mbed récepteurs
Dependencies: XBeeLib mbed mbed-rtos
main.cpp
00001 #include "mbed.h" 00002 #include "XBeeLib.h" 00003 #include "rtos.h" 00004 #if defined(ENABLE_LOGGING) 00005 #include "DigiLoggerMbedSerial.h" 00006 using namespace DigiLog; 00007 #endif 00008 00009 00010 #define REMOTE_NODE_ADDR64_MSB ((uint32_t)0x0013A200) 00011 00012 //#error "Replace next define with the LSB of the remote module's 64-bit address (SL parameter)" 00013 #define REMOTE_NODE_ADDR64_LSB ((uint32_t)0x40E779AF) 00014 00015 #define REMOTE_NODE_ADDR64 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB) 00016 00017 using namespace XBeeLib; 00018 00019 //feux gauche 00020 //rouge 00021 DigitalOut feu_rouge(p30); 00022 //orange 00023 DigitalOut feu_orange(p28); 00024 //vert 00025 DigitalOut feu_vert(p26); 00026 00027 DigitalOut led1(LED1); 00028 DigitalOut led2(LED2); 00029 DigitalOut led3(LED3); 00030 DigitalOut led4(LED4); 00031 int nbVoiture = 0; 00032 Thread t_affichage; 00033 00034 Thread t_nbVoitureBouton; 00035 Thread t_nbVoitureCapteur; 00036 Thread t_feuRouge; 00037 Timer timer; 00038 00039 DigitalIn boutonPlus(p24); 00040 DigitalIn boutonMoins(p23); 00041 AnalogIn signal(p20); 00042 00043 char moins[]="m"; // m comme "moins" - une voiture de moins 00044 char plus[]="p"; // p comme "plus" - une voiture de plus 00045 char rouge[]="r"; // r comme "rouge" - confirmation que le feu est rouge 00046 00047 int compteur =0; 00048 int wait_front_montant = 0; 00049 int wait_front_descendant = 0; 00050 double frequence =0; 00051 00052 Serial *log_serial; 00053 XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600); 00054 const RemoteXBeeZB remoteDevice = RemoteXBeeZB(REMOTE_NODE_ADDR64); 00055 00056 /** Callback function, invoked at packet reception */ 00057 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len) 00058 { 00059 const uint64_t remote_addr64 = remote.get_addr64(); 00060 00061 log_serial->printf("\r\nGot a %s RX packet [%08x:%08x|%04x], len %d\r\nData: ", broadcast ? "BROADCAST" : "UNICAST", UINT64_HI32(remote_addr64), UINT64_LO32(remote_addr64), remote.get_addr16(), len); 00062 00063 if (data[0]==0x72){ 00064 t_feuRouge.signal_set(0x1); 00065 } 00066 else if (data[0]==0x76){ 00067 feu_rouge = 0; 00068 feu_orange = 0; 00069 feu_vert = 1; 00070 } 00071 00072 log_serial->printf("\r\n"); 00073 } 00074 00075 00076 static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data) 00077 { 00078 const uint8_t dstEP = 0xE8; 00079 const uint8_t srcEP = 0xE8; 00080 const uint16_t clusterID = 0x0011; 00081 const uint16_t profileID = 0xC105; 00082 00083 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data, strlen(data)); 00084 } 00085 00086 void connect_Xbee() 00087 { 00088 log_serial = new Serial(DEBUG_TX, DEBUG_RX); 00089 log_serial->baud(9600); 00090 log_serial->printf("Sample application to demo how to receive unicast and broadcast data with the XBeeZB\r\n\r\n"); 00091 log_serial->printf(XB_LIB_BANNER); 00092 00093 #if defined(ENABLE_LOGGING) 00094 new DigiLoggerMbedSerial(log_serial, LogLevelInfo); 00095 #endif 00096 00097 /* Register callbacks */ 00098 xbee.register_receive_cb(&receive_cb); 00099 00100 RadioStatus const radioStatus = xbee.init(); 00101 MBED_ASSERT(radioStatus == Success); 00102 00103 /* Wait until the device has joined the network */ 00104 log_serial->printf("Waiting for device to join the network: "); 00105 while (!xbee.is_joined()) { 00106 wait_ms(1000); 00107 log_serial->printf("."); 00108 } 00109 log_serial->printf("OK\r\n"); 00110 } 00111 00112 void set_feuRouge() 00113 { 00114 while(1) 00115 { 00116 Thread::signal_wait(0x1); 00117 if (feu_rouge!=1){ 00118 feu_vert = 0; 00119 feu_orange = 1; 00120 Thread::wait(2000); 00121 feu_orange = 0; 00122 feu_rouge = 1; 00123 } 00124 send_explicit_data_to_remote_node(xbee, remoteDevice,rouge); 00125 } 00126 } 00127 00128 void nbVoitureBouton() { 00129 //TO DO : 00130 // - faire un compteur de voitures interne au recepteur et envoyer ce nombre 00131 // au coordinateur -> plus fiable en cas de perte de donnees dans un envoi 00132 // - faire un buffer pour envoyer les donnees 00133 // 00134 while(1) { 00135 if(boutonPlus){ 00136 nbVoiture++; 00137 send_explicit_data_to_remote_node(xbee, remoteDevice,plus); 00138 Thread::wait(500); 00139 } 00140 if(boutonMoins){ 00141 nbVoiture--; 00142 send_explicit_data_to_remote_node(xbee, remoteDevice,moins); 00143 Thread::wait(500); 00144 } 00145 } 00146 } 00147 00148 void nbVoitureCapteur() { 00149 while(1){ 00150 00151 //lecture valeur analogique du capteur à effet doppler hb100 00152 int value = signal.read_u16(); 00153 00154 // si inferieur a 100 on commence la mesure de la frequence du signal 00155 if (signal.read_u16()<100&&compteur==0){ 00156 timer.start(); 00157 compteur++; 00158 wait_front_montant = 1; 00159 } 00160 00161 // on attend un front montant 00162 else if (signal.read_u16()>45000&&wait_front_montant==1){ 00163 wait_front_montant=0; 00164 wait_front_descendant = 1; 00165 } 00166 00167 //deuxieme front dessandant, on a mesurer la frequence , on répète l'opération 3 fois (jusqu'a compteur == 5 ) 00168 else if (signal.read_u16()<100&&wait_front_descendant==1){ 00169 wait_front_descendant = 0; 00170 wait_front_montant=1; 00171 timer.stop(); 00172 double t = timer.read(); 00173 frequence = frequence + 1/t; 00174 compteur++; 00175 timer.reset(); 00176 timer.start(); 00177 } 00178 00179 00180 if(compteur==5){ 00181 // on fait la moyenne de la somme des trois frequences mesurées 00182 frequence = frequence/3; 00183 // on calcule la vitesse a partir d'une formule donnée dans la doc du capteur 00184 double vitesse = frequence*2/19.49; 00185 // si la vitesse est superieur à 1km/h, on considère qu'une voiture est passer 00186 if (vitesse>1){ 00187 send_explicit_data_to_remote_node(xbee, remoteDevice,plus); 00188 nbVoiture++; 00189 printf("vitesse : %f KM/H \r\n",vitesse); 00190 Thread::wait(1000); 00191 } 00192 compteur=0; 00193 timer.reset(); 00194 } 00195 } 00196 } 00197 00198 void affichage(){ 00199 while(1){ 00200 int a = nbVoiture; 00201 if(a>=8){ 00202 led4=1; 00203 a-=8; 00204 } 00205 else{led4=0;} 00206 if(a>=4){ 00207 led3=1; 00208 a-=4; 00209 } 00210 else{led3=0;} 00211 if(a>=2){ 00212 led2=1; 00213 a-=2; 00214 } 00215 else{led2=0;} 00216 if(a>=1){ 00217 led1=1; 00218 a-=1; 00219 } 00220 else{led1=0;} 00221 } 00222 } 00223 00224 int main() 00225 { 00226 connect_Xbee(); 00227 t_nbVoitureBouton.start(nbVoitureBouton); 00228 t_nbVoitureCapteur.start(nbVoitureCapteur); 00229 t_feuRouge.start(set_feuRouge); 00230 t_affichage.start(affichage); 00231 while (true) { 00232 uint32_t receive_value = xbee.process_rx_frames(); 00233 } 00234 }
Generated on Wed Jul 13 2022 18:39:12 by 1.7.2