Albert Durdiev / Mbed 2 deprecated TP_CAN

Dependencies:   mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers TP_can.cpp Source File

TP_can.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 #include "tHIH6130.h"
00004 
00005 // I2C
00006 #define I2C_SDA p28
00007 #define I2C_SCL p27
00008 
00009 // CAN 
00010 #define CAN_RD p30
00011 #define CAN_TD p29
00012 
00013 #define SIG_RX_CAN  0x01
00014 #define ADR_HIH     0x27            // adresse I2C réelle (sur 7 bits)
00015 #define FREQUENCY_CAN  20000 
00016 
00017 // DATAS
00018 #define TROP_CHAUD_TEMP 40  // Il fait "trop chaud" lorsqu'on dépasse 40°C
00019 #define TROP_FROID_TEMP -10  // Il fait "trop froid" lorsqu'on est en dessous de 10°C
00020 #define IL_PLEUT 80  // Forte probabilité de pleuvoir lorsqu'on est au dessus de 80% d'humidité
00021 
00022 // TEMPORISATION
00023 #define DELAY_ACQUISITION_MS 500
00024 
00025 // IDENTIFIANTS TRAMES CAN
00026     // Module HIH6130
00027 #define ID_TEMP             0x011
00028 #define ID_HUMI             0x021
00029 #define ID_TEMP_HUMI        0x031
00030 #define ID_TROP_CHAUD       0x111
00031 #define ID_TEMP_NORMAL      0x112
00032 #define ID_TROP_FROID       0x113
00033 #define ID_IL_PLEUT         0x121
00034 #define ID_IL_PLEUT_PAS     0x122
00035     // Module LCD
00036 #define ID_REQUETE_LCD      0x401
00037 
00038 
00039 // LED
00040 DigitalOut led1(LED1);
00041 
00042 // CAPTEUR HIH6130
00043 I2C i2c(I2C_SDA , I2C_SCL ); 
00044 tHIH6130 Capteur(ADR_HIH,&i2c);
00045 int currentTemp, currentHumi ;
00046 
00047 // CAN
00048 CAN CanPort(CAN_RD, CAN_TD);
00049 CANMessage  MessageRx; 
00050 CANMessage  MessageTx;
00051 
00052 // Autres
00053 Thread threadPrincipal;
00054 Thread threadCANSend ;
00055 
00056 /**
00057     Fonction d'envoi des données CAN.
00058 **/
00059 void envoiCAN(){
00060     while(true){
00061         Thread::signal_wait(SIG_RX_CAN); 
00062         
00063         // Config Tx general (à notre protocole applicatif)
00064         MessageTx.format = CANStandard;
00065         
00066         // Température datas
00067         MessageTx.type = CANData ;
00068         MessageTx.id = ID_TEMP_HUMI ;
00069         MessageTx.len= 2 ;
00070         MessageTx.data[0] = (char)currentTemp;
00071         MessageTx.data[1] = (char)currentHumi;
00072         CanPort.write(MessageTx);
00073         
00074         // Trop chaud/Trop froid/Température normale
00075             // Selection
00076         if(currentTemp >= TROP_CHAUD_TEMP)
00077             MessageTx.id = ID_TROP_CHAUD;
00078         else if(currentTemp <= TROP_FROID_TEMP)
00079             MessageTx.id = ID_TROP_FROID;
00080         else
00081             MessageTx.id = ID_TEMP_NORMAL;
00082             
00083             // Envoi 
00084         MessageTx.type = CANRemote ;
00085         MessageTx.len = 0 ;
00086         CanPort.write(MessageTx);
00087         
00088         
00089         // Il pleut/Il pleut pas  
00090             // Selection
00091         if(currentHumi >= IL_PLEUT)
00092             MessageTx.id = ID_IL_PLEUT ;
00093         else
00094             MessageTx.id = ID_IL_PLEUT_PAS ;
00095             
00096             // Envoi
00097         MessageTx.type = CANRemote ;
00098         MessageTx.len = 0 ;
00099         CanPort.write(MessageTx);
00100     }
00101 }
00102 
00103 /**
00104     Fonction de lecture de la communication CAN.
00105 **/
00106 void canReader(){
00107     if (CanPort.read(MessageRx))
00108     {
00109         if(MessageRx.id == ID_REQUETE_LCD){  // Si le message est du LCD alors...
00110             led1 = !led1;   // On change l'état de la LED eventuellement (effet de clignotement si rapide)
00111             threadPrincipal.signal_set(SIG_RX_CAN); // On réveille notre thread qui enverra les valeurs des capteurs
00112         }
00113     }
00114 }
00115 
00116 /**
00117     Fonction de lecture des données des capteurs.
00118 **/
00119 void lireCapteurs(){
00120     // Récupérer la valeur des capteurs
00121     Capteur.StartMesure();
00122     wait_ms(50);
00123     Capteur.UpdateData();
00124     currentTemp = (int) Capteur.getTemp();
00125     currentHumi = (int) Capteur.getHumi();
00126     
00127 }
00128 
00129 /**
00130     Fonction d'acquisition des données des capteurs.
00131 **/
00132 void acquisition(){
00133     while(1){
00134         lireCapteurs();
00135         wait_ms(DELAY_ACQUISITION_MS);
00136     }   
00137 }
00138 
00139 /**
00140     Fonction d'initialisation de la communication CAN et des threads
00141 **/
00142 void init(){
00143     // Initialisation du CAN
00144     CanPort.frequency(FREQUENCY_CAN);  
00145     
00146     // Attach 
00147     CanPort.attach(canReader,CAN::RxIrq);
00148     
00149     // Threads
00150     threadPrincipal.start(acquisition); 
00151     threadCANSend.start(envoiCAN);
00152 }
00153 
00154 int main() { 
00155         
00156     // initialisation
00157     init();
00158     
00159     printf("Start OK\n");
00160     
00161     while(1) 
00162     {
00163     }
00164 }
00165