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.
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
Generated on Wed Jul 13 2022 19:52:43 by
1.7.2