Gestion du Trafic Adaptatif - Code des mbed récepteurs
Dependencies: XBeeLib mbed mbed-rtos
main.cpp
- Committer:
- pierreblouet
- Date:
- 2018-12-04
- Revision:
- 26:9f2c70bfb336
- Parent:
- 25:7ce844f9a1ae
File content as of revision 26:9f2c70bfb336:
#include "mbed.h" #include "XBeeLib.h" #include "rtos.h" #if defined(ENABLE_LOGGING) #include "DigiLoggerMbedSerial.h" using namespace DigiLog; #endif #define REMOTE_NODE_ADDR64_MSB ((uint32_t)0x0013A200) //#error "Replace next define with the LSB of the remote module's 64-bit address (SL parameter)" #define REMOTE_NODE_ADDR64_LSB ((uint32_t)0x40E779AF) #define REMOTE_NODE_ADDR64 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB) using namespace XBeeLib; //feux gauche //rouge DigitalOut feu_rouge(p30); //orange DigitalOut feu_orange(p28); //vert DigitalOut feu_vert(p26); DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); int nbVoiture = 0; Thread t_affichage; Thread t_nbVoitureBouton; Thread t_nbVoitureCapteur; Thread t_feuRouge; Timer timer; DigitalIn boutonPlus(p24); DigitalIn boutonMoins(p23); AnalogIn signal(p20); char moins[]="m"; // m comme "moins" - une voiture de moins char plus[]="p"; // p comme "plus" - une voiture de plus char rouge[]="r"; // r comme "rouge" - confirmation que le feu est rouge int compteur =0; int wait_front_montant = 0; int wait_front_descendant = 0; double frequence =0; Serial *log_serial; XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600); const RemoteXBeeZB remoteDevice = RemoteXBeeZB(REMOTE_NODE_ADDR64); /** Callback function, invoked at packet reception */ static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len) { const uint64_t remote_addr64 = remote.get_addr64(); 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); if (data[0]==0x72){ t_feuRouge.signal_set(0x1); } else if (data[0]==0x76){ feu_rouge = 0; feu_orange = 0; feu_vert = 1; } log_serial->printf("\r\n"); } static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data) { const uint8_t dstEP = 0xE8; const uint8_t srcEP = 0xE8; const uint16_t clusterID = 0x0011; const uint16_t profileID = 0xC105; const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data, strlen(data)); } void connect_Xbee() { log_serial = new Serial(DEBUG_TX, DEBUG_RX); log_serial->baud(9600); log_serial->printf("Sample application to demo how to receive unicast and broadcast data with the XBeeZB\r\n\r\n"); log_serial->printf(XB_LIB_BANNER); #if defined(ENABLE_LOGGING) new DigiLoggerMbedSerial(log_serial, LogLevelInfo); #endif /* Register callbacks */ xbee.register_receive_cb(&receive_cb); RadioStatus const radioStatus = xbee.init(); MBED_ASSERT(radioStatus == Success); /* Wait until the device has joined the network */ log_serial->printf("Waiting for device to join the network: "); while (!xbee.is_joined()) { wait_ms(1000); log_serial->printf("."); } log_serial->printf("OK\r\n"); } void set_feuRouge() { while(1) { Thread::signal_wait(0x1); if (feu_rouge!=1){ feu_vert = 0; feu_orange = 1; Thread::wait(2000); feu_orange = 0; feu_rouge = 1; } send_explicit_data_to_remote_node(xbee, remoteDevice,rouge); } } void nbVoitureBouton() { //TO DO : // - faire un compteur de voitures interne au recepteur et envoyer ce nombre // au coordinateur -> plus fiable en cas de perte de donnees dans un envoi // - faire un buffer pour envoyer les donnees // while(1) { if(boutonPlus){ nbVoiture++; send_explicit_data_to_remote_node(xbee, remoteDevice,plus); Thread::wait(500); } if(boutonMoins){ nbVoiture--; send_explicit_data_to_remote_node(xbee, remoteDevice,moins); Thread::wait(500); } } } void nbVoitureCapteur() { while(1){ //lecture valeur analogique du capteur à effet doppler hb100 int value = signal.read_u16(); // si inferieur a 100 on commence la mesure de la frequence du signal if (signal.read_u16()<100&&compteur==0){ timer.start(); compteur++; wait_front_montant = 1; } // on attend un front montant else if (signal.read_u16()>45000&&wait_front_montant==1){ wait_front_montant=0; wait_front_descendant = 1; } //deuxieme front dessandant, on a mesurer la frequence , on répète l'opération 3 fois (jusqu'a compteur == 5 ) else if (signal.read_u16()<100&&wait_front_descendant==1){ wait_front_descendant = 0; wait_front_montant=1; timer.stop(); double t = timer.read(); frequence = frequence + 1/t; compteur++; timer.reset(); timer.start(); } if(compteur==5){ // on fait la moyenne de la somme des trois frequences mesurées frequence = frequence/3; // on calcule la vitesse a partir d'une formule donnée dans la doc du capteur double vitesse = frequence*2/19.49; // si la vitesse est superieur à 1km/h, on considère qu'une voiture est passer if (vitesse>1){ send_explicit_data_to_remote_node(xbee, remoteDevice,plus); nbVoiture++; printf("vitesse : %f KM/H \r\n",vitesse); Thread::wait(1000); } compteur=0; timer.reset(); } } } void affichage(){ while(1){ int a = nbVoiture; if(a>=8){ led4=1; a-=8; } else{led4=0;} if(a>=4){ led3=1; a-=4; } else{led3=0;} if(a>=2){ led2=1; a-=2; } else{led2=0;} if(a>=1){ led1=1; a-=1; } else{led1=0;} } } int main() { connect_Xbee(); t_nbVoitureBouton.start(nbVoitureBouton); t_nbVoitureCapteur.start(nbVoitureCapteur); t_feuRouge.start(set_feuRouge); t_affichage.start(affichage); while (true) { uint32_t receive_value = xbee.process_rx_frames(); } }