TP CAN DII4A

Dependencies:   mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
yoshiz37
Date:
Sat Jun 03 19:05:11 2017 +0000
Commit message:
TP CAN DII4A

Changed in this revision

TP_can.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
tHIH6130.cpp Show annotated file Show diff for this revision Revisions of this file
tHIH6130.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r f7a3b8c3f8ce TP_can.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TP_can.cpp	Sat Jun 03 19:05:11 2017 +0000
@@ -0,0 +1,165 @@
+#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) 
+    {
+    }
+}
+
diff -r 000000000000 -r f7a3b8c3f8ce mbed-rtos.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Sat Jun 03 19:05:11 2017 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/mbed_official/code/mbed-rtos/#58563e6cba1e
diff -r 000000000000 -r f7a3b8c3f8ce mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Jun 03 19:05:11 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/86740a56073b
\ No newline at end of file
diff -r 000000000000 -r f7a3b8c3f8ce tHIH6130.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tHIH6130.cpp	Sat Jun 03 19:05:11 2017 +0000
@@ -0,0 +1,66 @@
+#include "tHIH6130.h"
+
+tHIH6130::tHIH6130(unsigned char aAdrHIH,I2C* apI2c)
+{
+    pI2c = apI2c;
+    WrAdr = ((aAdrHIH)<<1) & 0xFE ;
+    RdAdr = WrAdr | 0x01;
+    
+    
+}
+
+
+float   tHIH6130::getTemp(void)
+{
+    return Temp;
+}
+
+
+
+float   tHIH6130::getHumi(void)
+{
+    return Humi;
+}
+    
+int     tHIH6130::StartMesure(void)
+{
+    int Res;
+    pI2c->start();
+    Res = pI2c->write(WrAdr);
+    pI2c->stop();
+    
+    return Res;
+}
+    
+int     tHIH6130::UpdateData(void)
+{
+    int Res;
+    unsigned char   Data[4];
+    unsigned int    Tmp;
+    
+    Res = pI2c->read(RdAdr,(char*)Data,4);
+    
+    // MAJ Humidité
+    Tmp = Data[0] & 0x3F;
+    Tmp <<= 8;
+    Tmp += Data[1];
+    
+    Humi = ((float)Tmp / (float)16383)*float(100); 
+    
+    
+    // MAJ Température
+    Tmp = Data[2];
+    Tmp <<= 8;
+    Tmp += (Data[3] & 0xFC);
+    Tmp >>=2;
+    
+    Temp = ((float)Tmp / (float)16383)*(float)165;
+    Temp -= 40;
+    
+    return Res;
+}
+    
+    
+
+
+    
diff -r 000000000000 -r f7a3b8c3f8ce tHIH6130.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tHIH6130.h	Sat Jun 03 19:05:11 2017 +0000
@@ -0,0 +1,37 @@
+#ifndef THIH6130_H
+#define THIH6130_H
+
+#include "mbed.h"
+
+class tHIH6130
+{
+    private:
+    I2C *pI2c;
+    unsigned char WrAdr;
+    unsigned char RdAdr;
+    
+    float   Temp,Humi;
+    
+    
+    
+    public:
+    tHIH6130(unsigned char aAdrHIH,I2C* apI2c);
+    float   getTemp(void);
+    float   getHumi(void);
+    
+    
+    int     StartMesure(void);  // Déclenche la mesure
+    int     UpdateData(void);   // Met à jour température et humidié, à appeler au plus tôt 50ms après StartMesure
+
+
+
+
+
+
+
+};
+
+#endif
+
+
+