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)
{
}
}