![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
TP CAN DII4A
TP_can.cpp
- Committer:
- yoshiz37
- Date:
- 2017-06-03
- Revision:
- 0:f7a3b8c3f8ce
File content as of revision 0:f7a3b8c3f8ce:
#include "mbed.h" #include "rtos.h" #include "tHIH6130.h" // I2C #define I2C_SDA p28 #define I2C_SCL p27 // CAN #define CAN_RD p30 #define CAN_TD p29 #define SIG_RX_CAN 0x01 #define ADR_HIH 0x27 // adresse I2C réelle (sur 7 bits) #define FREQUENCY_CAN 20000 // DATAS #define TROP_CHAUD_TEMP 40 // Il fait "trop chaud" lorsqu'on dépasse 40°C #define TROP_FROID_TEMP -10 // Il fait "trop froid" lorsqu'on est en dessous de 10°C #define IL_PLEUT 80 // Forte probabilité de pleuvoir lorsqu'on est au dessus de 80% d'humidité // TEMPORISATION #define DELAY_ACQUISITION_MS 500 // IDENTIFIANTS TRAMES CAN // Module HIH6130 #define ID_TEMP 0x011 #define ID_HUMI 0x021 #define ID_TEMP_HUMI 0x031 #define ID_TROP_CHAUD 0x111 #define ID_TEMP_NORMAL 0x112 #define ID_TROP_FROID 0x113 #define ID_IL_PLEUT 0x121 #define ID_IL_PLEUT_PAS 0x122 // Module LCD #define ID_REQUETE_LCD 0x401 // LED DigitalOut led1(LED1); // CAPTEUR HIH6130 I2C i2c(I2C_SDA , I2C_SCL ); tHIH6130 Capteur(ADR_HIH,&i2c); int currentTemp, currentHumi ; // CAN CAN CanPort(CAN_RD, CAN_TD); CANMessage MessageRx; CANMessage MessageTx; // Autres Thread threadPrincipal; Thread threadCANSend ; /** Fonction d'envoi des données CAN. **/ void envoiCAN(){ while(true){ Thread::signal_wait(SIG_RX_CAN); // Config Tx general (à notre protocole applicatif) MessageTx.format = CANStandard; // Température datas MessageTx.type = CANData ; MessageTx.id = ID_TEMP_HUMI ; MessageTx.len= 2 ; MessageTx.data[0] = (char)currentTemp; MessageTx.data[1] = (char)currentHumi; CanPort.write(MessageTx); // Trop chaud/Trop froid/Température normale // Selection if(currentTemp >= TROP_CHAUD_TEMP) MessageTx.id = ID_TROP_CHAUD; else if(currentTemp <= TROP_FROID_TEMP) MessageTx.id = ID_TROP_FROID; else MessageTx.id = ID_TEMP_NORMAL; // Envoi MessageTx.type = CANRemote ; MessageTx.len = 0 ; CanPort.write(MessageTx); // Il pleut/Il pleut pas // Selection if(currentHumi >= IL_PLEUT) MessageTx.id = ID_IL_PLEUT ; else MessageTx.id = ID_IL_PLEUT_PAS ; // Envoi MessageTx.type = CANRemote ; MessageTx.len = 0 ; CanPort.write(MessageTx); } } /** Fonction de lecture de la communication CAN. **/ void canReader(){ if (CanPort.read(MessageRx)) { if(MessageRx.id == ID_REQUETE_LCD){ // Si le message est du LCD alors... led1 = !led1; // On change l'état de la LED eventuellement (effet de clignotement si rapide) threadPrincipal.signal_set(SIG_RX_CAN); // On réveille notre thread qui enverra les valeurs des capteurs } } } /** Fonction de lecture des données des capteurs. **/ void lireCapteurs(){ // Récupérer la valeur des capteurs Capteur.StartMesure(); wait_ms(50); Capteur.UpdateData(); currentTemp = (int) Capteur.getTemp(); currentHumi = (int) Capteur.getHumi(); } /** Fonction d'acquisition des données des capteurs. **/ void acquisition(){ while(1){ lireCapteurs(); wait_ms(DELAY_ACQUISITION_MS); } } /** Fonction d'initialisation de la communication CAN et des threads **/ void init(){ // Initialisation du CAN CanPort.frequency(FREQUENCY_CAN); // Attach CanPort.attach(canReader,CAN::RxIrq); // Threads threadPrincipal.start(acquisition); threadCANSend.start(envoiCAN); } int main() { // initialisation init(); printf("Start OK\n"); while(1) { } }