Code final de la cellule du RC de réception, celle-ci est connectée en Bluetooth à l'autre cellule et en BLE à l'application Android.

Dependencies:   mbed SimpleBLE X_NUCLEO_IDB0XA1 LIS3DH_spi

main.cpp

Committer:
MaxenceGalopin
Date:
2020-01-26
Revision:
10:9911eb25b6a7
Parent:
9:504c19ac8bba

File content as of revision 10:9911eb25b6a7:

/*
Programme pour l'ObCP connecté à la fois à l'autre ObCP et à l'application Android
C'est la cellule qui fait la porte d'arrivée en mode solo
La sortie de la photodiode est reliée à la broche A0
Le laser est alimenté en 3V3 (suffisant) ou en 5V.
Les pattes RX et TX dumodule HC-05 sont reliées aux broches D0 et D1 (Attention à relier RX à TX et Tx à RX)
Le shield est fonctionnel (sauf BLE) mais il faut inverser TX et RX pour le HC-05/HC06
Il comporte aussi 2 leds, 2 boutons, et un transistor pour controler le laser.
*/
/*
Penser à mettre à jour les librairies
*/

  //Includes

#include "mbed.h"
#include "SimpleBLE.h"
#include "stdlib.h"


//Bluetooth hc05-6
//USBTX et USBRX sont utilisés
#define TX D0
#define RX D1

//Init simpleBLE

SimpleBLE ble("ObCP_Roller_Catcher2");


// GPIO set

//Interrupt input

InterruptIn user1(PC_13);  //User1
InterruptIn boutton1(D3);  //Bouton 1 shield
InterruptIn boutton2(D4);  //Bouton 2 shield 
InterruptIn event(A0);     //Passage dans la porte laser 

//Création du Timer

Timer timer;

//Sorties numériques

DigitalOut led1(D14);
DigitalOut transistor(D6);

//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

//Création des variables

float flag = 0;
bool flag2=false;
int c;
int temps1;
int tref;
char message ;
float end,begin;
int temps2 =0;


//Création des liaisons série (pc et bluetooth hc-05)

//Serial pc(USBTX, USBRX);
Serial BT(USBTX,USBRX);

// Characteristics pour affiche sur l'appli Android via BLE

SimpleChar<float> compteur = ble.readOnly_float(0xA000, 0xA003);
SimpleChar<float> Temps = ble.readOnly_float(0xA000, 0xA004);
SimpleChar<float> Temps2 = ble.readOnly_float(0xA000, 0xA007);


void envoi(char message)
{
    BT.printf("%c\n", message);
}

void resetUpdate(float rst)
{
    message = 'R';
    envoi(message);
    timer.reset();
    tref=timer.read_ms();
}

// Changement de mode de course ou changements couleur led

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;
    flag  = static_cast<float>(channels[3]);
    

    if(flag == 1) {
        //  pc.printf("Mode duo actif");
        message = 'D';
        envoi(message);
        timer.reset();
        flag2=true;
    }else if(flag == 0) {
        //  pc.printf("Mode solo actif   ");
        message = 'S';
        envoi(message);
        timer.reset();
        flag2=false;
    }
}

void pressed2(){
    led1 = !led1;
    temps2 = timer.read_ms();
    
    if(flag2==false){
        Temps=(temps2-(temps1+1040))/1000.0f;    //LE 1040 correspond au terme de correction du temps que nous avons calculé
        
    }else{
        Temps = (temps1+1040-tref)/1000.0f;
        Temps2 = (temps2-tref)/1000.0f;
    }
}

void arret_laser(){
    transistor = !transistor;
}



// 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);

SimpleChar<float> reset = ble.writeOnly_float(0xA000, 0xA005, &resetUpdate);
SimpleChar<float> depart_course = ble.writeOnly_float(0xA000, 0xA006, &resetUpdate);


/*
void skater_d()
{
    if(flag==false) {
        //printf("Ligne de depart coupee solo \n");
        if( flag == false) {
            //printf("Depart skate \n");
            begin = timer.read_ms();
            compteur=100;
            //pc.printf("                                         skater lance %.0f \n", begin);
            flag = true;
        } else if(flag == true) {
            //printf("erreur \n");
            //pc.printf("                                                                      Temps du skater : %.0f \n", end-begin);
            flag = false;
        }
    }
    else if(flag==true) {
        //printf("Ligne d'arrivee coupee \n");
        if( flag == false ) {
            //printf("arrivee coupe sans depart\n");
            flag = true;
        } else if(flag == true ) {
            //printf("Arrivee skate \n");
            end = timer.read_ms();
            //Temps = end-begin;
            compteur=200;
            //wait(1);
            //pc.printf("                                                                      Temps du skater : %.0f \n", end-begin);
            flag = false;
        }
    } 
}
*/



void RXevent (){

    if(BT.readable()){
        BT.scanf("%i", &temps1);
    }    
}    


  

int main(int, char**)
{
    transistor=1;
    ble.start();
    timer.start();
    BT.attach(&RXevent);
    user1.fall(&pressed2);
    boutton1.fall(&arret_laser);
    //boutton2.fall(&pressed);
    event.fall(&pressed2);
    

    while (1) {
        ble.waitForEvent();
    }
}