Programme complet du projet SBra. Lecture de 64 capteur thermique I2C avec 2 multiplexeur TCA9548A, enregistrement sur carte microSD et communication BLE.

Dependencies:   TCA9548A mbed SimpleBLE X_NUCLEO_IDB0XA1 SDFileSystem3 USBDevice

Revision:
9:0b803d9b4af4
Parent:
7:f5e10b18984d
--- a/main.cpp	Tue Dec 17 14:25:24 2019 +0000
+++ b/main.cpp	Tue Jan 28 11:19:57 2020 +0000
@@ -1,95 +1,232 @@
-//Includes
+/*      MEMOS 
+
+Addresses of the different sensors TMP117 :
+            112 (Decimel) = 70 (Hexadecimal)
+            116 (Decimel) = 74 (Hexadecimal)
 
+Addresses of the different sensors TMP117 :
+              Ground  1001000x (0x90/0x91)                      Address 1 
+              V+      1001001x (0x92/0x93)                      Address 2
+              SDA     1001010x (0x94/0x95)                      Address 3
+              SCL     1001011x (0x96/0x97)                      Address 4
+*/
+
+
+int Intervalle_Mesures = 300;      //Choix de l'intervalle de mesure en sec
+
+
+
+ //Includes
 #include "mbed.h"
 #include "SimpleBLE.h"
-#include "LIS3DH.h"
+#include "tca9548a.h"                           // tca954a  libary
+#include "SDFileSystem.h"                       // Sd-Card Libray
+Timer timer;
+#include "USBSerial.h"
 
-//Accelerometer
+#define I2C_SDA                  PB_9           // The µcontrolleur SDA 
+#define I2C_SCL                  PB_8           // The µcontrolleur SCL
 
-#define MOSI PC_12
-#define MISO PC_11
-#define CS PC_5
-#define SCLK PC_10
+//SD Card
+#define MOSI        PA_7
+#define MISO        PA_6
+#define sclk        PA_5
+#define cs          PB_6
+
+
+//USART
+USBSerial pc(0x1f00, 0x2012, 0x0001, false);
 
 //Init simpleBLE
+SimpleBLE ble("SBRA");
 
-SimpleBLE ble("ObCP_CROC_ENSMM");
+// Multiplexeurs
+TCA9548A i2c_sw1(I2C_SDA, I2C_SCL, 0x70);                          
+TCA9548A i2c_sw2(I2C_SDA, I2C_SCL, 0x74);
 
+//Voie I2C du F411
+I2C i2c(I2C_SDA, I2C_SCL);
 
-// GPIO set
+//SD Pinout
+SDFileSystem sd(MOSI, MISO, sclk, cs, "sd");
 
 //Interrupt input
+InterruptIn button(PC_13); //User1
 
-InterruptIn user1(PC_13);  //User1
 
-//PWM output
 
-PwmOut PWMoutput(PB_1);          //Main PWM output
-PwmOut Green(PC_8);              //PWM Red LED
-PwmOut Red(PC_6);                //PWM Green LED
-PwmOut Blue(PC_9);               //PWM Blue LED
+//Variables
+FILE *SDsave;
+float tmp[64];
+char cmd[2];
+//Sensors Address
+char ADD[8];
+    
+    
+// Characteristics BLE_Sensors input
+SimpleChar<float> T11 = ble.readOnly_float(0xA000, 0xA002);
+SimpleChar<float> T21 = ble.readOnly_float(0xA000, 0xA006);
+SimpleChar<float> T31 = ble.readOnly_float(0xA000, 0xA010);
+
+
+
+void SD(int Save){
 
-//Init accelerometer
-
-LIS3DH      acc(MOSI, MISO, SCLK, CS, LIS3DH_DR_NR_LP_50HZ, LIS3DH_FS_2G);
-
-// Characteristics Accelerometer input
-
-SimpleChar<float> accX = ble.readOnly_float(0xA000, 0xA002);
-SimpleChar<float> accY = ble.readOnly_float(0xA000, 0xA003);
-SimpleChar<float> accZ = ble.readOnly_float(0xA000, 0xA004);
+    if (Save == 2){ 
+    SDsave= fopen("/sd/SBraTests.txt", "w");        // Open the .txt file
+    pc.printf(" initialisation SD OK\t");
+    }
+    
+    if (Save == 1){
+        //SD Save
+        for (int z=0; z<=63; z++){
+            pc.printf(" %0.2f", tmp[z]);            //Affichage pour validation
+            fprintf(SDsave, "%0.3f\t", tmp[z]);     // Savegarde sur carte SD
+            
+            if(SDsave == NULL) { error("Could not open file for write\n");}     
+        }
+        fprintf(SDsave, "\n");
+        pc.printf(" \n\r");
+    }
+    
+    if (Save == 3){
+        fclose(SDsave);
+        pc.printf("Finish\n");
+    }
+}
 
 
-// When characteristic LED RGB changing
-
-void LEDupdate(uint32_t newColor)
-{
-    // read individual bytes
-    uint8_t* channels = (uint8_t*)&newColor;
-
-    // cast to float, as PwmOut expects a value between 0.0f and 1.0f
-    Red   = static_cast<float>(channels[0]) / 255.0f;
-    Green = static_cast<float>(channels[1]) / 255.0f;
-    Blue  = static_cast<float>(channels[2]) / 255.0f;
-}
-
-// When characteristic PWM output changing
-
-void PWMupdate(uint8_t pwmvalue)
-{
-
-    // cast to float, as PwmOut expects a value between 0.0f and 1.0f
-    PWMoutput   = static_cast<float>(pwmvalue) / 255.0f;
+void Sensors(int Lecture){
+    if (Lecture == 0){
+        //Initialisation des capteurs
+        for (int channel=0; channel<=7; channel++){
+            i2c_sw1.select(channel);
+            for (int i=0; i<=6;){
+                cmd[0] = 0x01;
+                cmd[1] = 0x00;
+        
+                i2c.write(ADD[i+1], cmd, 2);
+                cmd[0] = 0x00;
+                i2c.write(ADD[i+1], cmd, 1);
+        
+                wait(0.3);
+                i = i + 2;
+            }
+            wait(0.3);
+        
+            i2c_sw2.select(channel);
+            wait(0.1);
+            for (int i=0; i<=6;){
+                cmd[0] = 0x01;
+                cmd[1] = 0x00;
+        
+                i2c.write(ADD[i+1], cmd, 2);
+                cmd[0] = 0x00;
+                i2c.write(ADD[i+1], cmd, 1);
+        
+                wait(0.3);
+                i = i + 2;
+            }
+        }
+        pc.printf(" initialisation Sensors OK\t");
+    }
+    
+    if (Lecture == 1){
+        int num_capteur = 0;
+        //Valeurs du multiplexeur n°1
+        for (int channel=0; channel<=7; channel++){
+            i2c_sw1.select(channel);
+            //Lecture des sensors de chaine selectionne
+            for (int i=0; i<=6;){
+                cmd[0] = 0;
+                cmd[1] = 0;
+            
+                i2c.read(ADD[i], cmd, 2);
+                wait(0.1);
+        
+                float x = float(cmd[0])*2;
+                float y = float(cmd[1])*0.0078125;
+                tmp[num_capteur] = x + y;
+                //printf(" %0.2f", x+y);//*********
+                i = i+2;
+                num_capteur++;
+            }
+        }
+        wait(0.1);
+        //Valeurs du multiplexeur n°2
+        for (int channel=0; channel<=7; channel++){
+            i2c_sw2.select(channel);
+            //Lecture des sensors de chaine selectionne
+            for (int i=0; i<=6;){
+                cmd[0] = 0;
+                cmd[1] = 0;
+            
+                i2c.read(ADD[i], cmd, 2);
+                wait(0.1);
+        
+                float x = float(cmd[0])*2;
+                float y = float(cmd[1])*0.0078125;
+                tmp[num_capteur] = x + y;
+                //printf(" %0.2f", x+y);//*****
+                i = i+2;
+                num_capteur++;
+            }
+        }
+        SD(1);
+    }
 }
 
 // When characteristic input changing
 void Accupdate()
 {
-
-    accX = float(short((acc.read_reg(LIS3DH_OUT_X_H) << 8) | acc.read_reg(LIS3DH_OUT_X_L))) * 0.001F / 15;
-    accY = float(short((acc.read_reg(LIS3DH_OUT_Y_H) << 8) | acc.read_reg(LIS3DH_OUT_Y_L))) * 0.001F / 15;
-    accZ = float(short((acc.read_reg(LIS3DH_OUT_Z_H) << 8) | acc.read_reg(LIS3DH_OUT_Z_L))) * 0.001F / 15;
-
+    T11 = tmp[0];
+    T21 = tmp[4];
+    T31 = tmp[8];
 }
 
-// Characteritic PWM LED RGB
-SimpleChar<uint32_t> color = ble.writeOnly_u32(0x6200, 0x6201, &LEDupdate);
-
-// Characteristic PWM output
-SimpleChar<uint8_t> pwmout = ble.writeOnly_u8(0xA000, 0xA001, &PWMupdate);
-
-
 //Main program
-
-int main(int, char**)
-{
-
+int main(){
+    
+    timer.start();
+    float time, time1;
+    
+    time = timer.read_ms()/1000;
+//Sensors Address 1
+    ADD[0]=0x90;
+    ADD[1]=0x91;
+//Sensors Address 2
+    ADD[2]=0x92;
+    ADD[3]=0x93;
+//Sensors Address 3
+    ADD[4]=0x94;
+    ADD[5]=0x95;
+//Sensors Address 4
+    ADD[6]=0x96;
+    ADD[7]=0x97;
+    
+    pc.printf("Initialiation...\t");
+    
+    Sensors(0);
+    SD(2);
+    wait(2);
     ble.start();
     Ticker t;
     t.attach(&Accupdate, 5.0f);
+    
+    pc.printf("Initialisation OK\t");
+    pc.printf(" \n\r");
 
-    while (1) {
+    while (button == 1) {
+        time1 = timer.read_ms()/1000;
         ble.waitForEvent();
-
-    }
+        
+        if (time1-time>Intervalle_Mesures){
+            Sensors(1);
+            time=timer.read_ms()/1000;
+            time1=timer.read_ms()/1000;
+        }
+    }SD(3);
 }
+        
+        
+