programme intégré

Dependencies:   MODSERIAL Servo mbed

main.cpp

Committer:
matth420
Date:
2018-05-30
Revision:
1:ca1ad3dc37b3
Parent:
0:d811d2c0da76
Child:
2:566244a93a7a

File content as of revision 1:ca1ad3dc37b3:

#include "mbed.h"                                                                       //
#include <iostream>                                                                     //
#include <string>                                                                       //
#include <fstream>                                                                      //Déclaration des librairies utilisées
#include "MODSERIAL.h"                                                                  //
#include "Servo.h"                                                                      //
#include <Serial.h>
#include "stdio.h"

Serial pc(USBTX, USBRX);
Serial rfid1(p9, NC);
Serial rfid2(NC, p10);
MODSERIAL esp(p28, p27);                                                                // tx, rx
DigitalOut reset(p26);
Timer t;                                                                                //Timer
Servo myservo(p21);                                                                     //Servomoteur
DigitalIn manuel1 (p20);                                                                //Mode manuel position n°1 (entrée seulement)
DigitalIn manuel2 (p19);                                                                //Mode manuel position n°2 (sortie seulement)(non réalisé car changement de servomoteur)
DigitalOut ledmm (p18);                                                                 //Led indiquant si le mode manuel est activé
DigitalIn manuel3 (p17);                                                                //Mode manuel position n°3 (entréé ou sortie)
DigitalIn manuel4 (p16);                                                                //Mode manuel position n°4 (verrouillage complet)
DigitalIn bpmanuel (p15);                                                               //Bouton ON/OFF du mode manuel
DigitalIn capteurfermeture (p14);                                                       //Capteur détectant la fermeture
DigitalIn capext (p12) ;                                                                //Capteur de présence extérieur
DigitalIn capint (p11) ;                                                                //Capteur de présence intérieur
DigitalIn CTS(p8);
DigitalIn F411 (p7);                                                                    //Detection alimentation servomoteur (CHALLENGE LEGRAND !!!!!!!!!!!)

DigitalOut led1(LED1);                                                                  //Led n°1 du mbed
DigitalOut led2(LED2);                                                                  //Led n°2 du mbed
DigitalOut led3(LED3);                                                                  //Led n°3 du mbed
DigitalOut led4(LED4);                                                                  //Led n°4 du mbed

int egal1 = 0;                                                                          //TAG RFID n°1
int egal2 = 0;                                                                          //TAG RFID n°2
int egal3 = 0;                                                                          //TAG RFID n°3
int egal4 = 0;                                                                          //TAG RFID n°
int egal5 = 0;                                                                          //TAG RFID n°
int tag1[4]= {0xAE,0xFB,0x63,0x10};                                                     //Identifiant TAG RFID n°1
int tag2[4]= {0x25,0x02,0x64,0x10};                                                     //Identifiant TAG RFID n°2
int tag3[4]= {0x3F,0xFC,0x63,0x10};                                                     //Identifiant TAG RFID n°3
int tag4[4]= {0xCE,0xEE,0x63,0x10};                                                     //Identifiant TAG RFID n°4
int tag5[4]= {0xD6,0xD9,0x63,0x10};                                                     //Identifiant TAG RFID n°5
int tag[4]= {0x00,0x00,0x00,0x00};                                                      //Tableau relevant l'identifiant du TAG RFID
int reponse_rfid[5];                                                        
int reponse_rfid1[255];
int lireuid[8]= {0x52,0x00};

int position ;                                                                          //Position de la chatière
float pos1 = 1.0 ;                                                                      //Position n°1 (entrée seulement)
float pos3 = 0.001 ;                                                                    //Position n°3 (complétement ouvert)
float pos4 = 0.42 ;                                                                     //Position n°4 (complétement fermé)


int i = 0;
int e = 0;
int  count,ended,timeout;

char buf[1024];
char snd[255];

char ssid[32] = "IOP_LEGRAND_2";                                                        //Nom du WIFI IOP
char pwd [32] = "legrandMDP";                                                           //Mot de passe du WIFI IOP

char ECHA[5] = "ECHA";                                                                  //Le chat vient de l'extérieur
char ICHA[5] = "ICHA";                                                                  //Le chat vient de l'intérieur


char tcpip[14] = "192.168.1.42";                                                       //Adresse IP du module ESP8666
char tcpport[3] = "23";

int longueur_recue = 0;
int nouvelle_reception = 0;
int a = 0;
int b = 0;

char recept[18];
char tabconnect[10] = {0};
char tabclosed[9] = {0};
char tabrec[5] = {0};
char connect[10] = "0,CONNECT";
char closed[9] = "0,CLOSED";

int drapeau = 1;

void HandShake();
void Antenna();
void field();
void SendCMD(),getreply(),ESPconfig(),ESPsetbaudrate(),WIFI(), Donnee();                //Déclaration des voids

using namespace std;

int main()                                                                              //Début du int main
{
ledmm = 0;
myservo = 0.001 ;                                                                       //La chatière est fermé
wait_ms(200);

    reset=0;                                                                            //Reset du module ESP8266
    pc.baud(9600);                                                                      //Vitesse de transmission du terminal
    pc.printf("\f\n\r--------------- Demarrage du module WIFI ---------------\n\r");    //Démarrage du module WIFI ESP8266
    wait(0.25);
    reset=1;
    timeout=2;
    getreply();

    esp.baud(115200);                                                                   //Vitesse de transmission du module WIFI ESP8266

    ESPconfig();                                                                        //Configuration du module WIFI ESP8266

    pc.printf("\f\n\r- Module pret -\n\r");                                             //Le module WIFI ESP8266
        
    while(1) {
        // Partie RFID
        led4=1;
        ledmm = 0;
        egal1=0;
        egal2=0;
        egal3=0;
        egal4=0;
        egal5=0;



        if (CTS == 0) {
            led4=0;
            led2=1;

            for (int i=0; i<2; i++) {
                rfid2.putc(lireuid[i]);
            }
            wait_ms(25);
            for (int e=0; e<1; e++) {
                reponse_rfid1[e]=(rfid1.getc());
                led1=1;
            }
            if (reponse_rfid1[0] == 0xD6) {
                for (int i=0; i<2; i++) {
                    rfid2.putc(lireuid[i]);
                    led2=1;
                }
                wait_ms(50);
                for (int e=1; e<5; e++) {
                    reponse_rfid[e]=(rfid1.getc());
                    led3=1;
                }

                pc.printf("---------------------------------------");
                pc.printf("\n\r");
                pc.printf("Trame de reponse du PCB en hexa : ");
                for (int i=0; i<2; i++) pc.printf("%X ",lireuid[i]);
                pc.printf("\n\r");
                pc.printf("Status = %X\n\r",reponse_rfid1[0]);
                pc.printf("UID = ");
                for (int i=1; i<5; i++) pc.printf("%X ",reponse_rfid[i]);
                pc.printf("\n\r");
                pc.printf("---------------------------------------");
                pc.printf("\n\r");
            } else if (reponse_rfid1[0] == 0xC0) {
                field();
            }
            if (reponse_rfid1[0] == 0xE0) {
                Antenna();
            }
                for(int i=1; i<5; i++) {
                tag[i-1] = reponse_rfid[i];
            }
            if(tag[0] != 0x00) {
                pc.printf("\n\r");
                pc.printf("tableau de 0: %X", tag[0]);
                pc.printf("\n\r");

                for(int i=0; i<4; i++) {
                    if(tag[i] == tag1[i]) {
                        egal1 = 1;
                        pc.printf("Tag1 - OK ");
                        pc.printf("\n\r");
                        break;
                        //pc.printf(tag[i]);
                    } else if(tag[i] != tag1[i]) {
                        pc.printf("Tag1 - NOK ");
                        pc.printf("\n\r");
                        egal1 = 0;
                        break;
                        //pc.printf(tag[i]);
                    }
                }
                for(int i=0; i<4; i++) {
                    if(tag[i] == tag2[i]) {
                        egal2 = 1;
                        pc.printf("Tag2 - OK ");
                        pc.printf("\n\r");
                        break;
                        //pc.printf(tag[i]);
                    } else if(tag[i] != tag2[i]) {
                        pc.printf("Tag2 - NOK ");
                        pc.printf("\n\r");
                        egal2 = 0;
                        break;
                        //pc.printf(tag[i]);
                    }
                }
                for(int i=0; i<4; i++) {
                    if(tag[i] == tag3[i]) {
                        egal3 = 1;
                        pc.printf("Tag3 - OK ");
                        pc.printf("\n\r");
                        break;
                        //pc.printf(tag[i]);
                    } else if(tag[i] != tag3[i]) {
                        pc.printf("Tag3 - NOK ");
                        pc.printf("\n\r");
                        egal3 = 0;
                        break;
                        //pc.printf(tag[i]);
                    }
                }
                for(int i=0; i<4; i++) {
                    if(tag[i] == tag4[i]) {
                        egal4 = 1;
                        pc.printf("Tag4 - OK ");
                        pc.printf("\n\r");
                        break;
                        //pc.printf(tag[i]);
                    } else if(tag[i] != tag4[i]) {
                        pc.printf("Tag4 - NOK ");
                        pc.printf("\n\r");
                        egal4 = 0;
                        break;
                        //pc.printf(tag[i]);
                    }
                }
                for(int i=0; i<4; i++) {
                    if(tag[i] == tag5[i]) {
                        egal5 = 1;
                        pc.printf("Tag5 - OK ");
                        pc.printf("\n\r");
                        break;
                        //pc.printf(tag[i]);
                    } else if(tag[i] != tag5[i]) {
                        pc.printf("Tag5 - NOK ");
                        pc.printf("\n\r");
                        egal5 = 0;
                        break;
                        //pc.printf(tag[i]);
                    }
                }
                reponse_rfid[1]=0x00;
            }

            led1=0;
            led2=0;
            led3=1;

            wait_ms(500);

        }


        if(capext ==1 && egal1 ==1) {                                                  //Si le capteur extérieur est à 1 & le TAG 1 est détecté
            pc.printf("---------- Envoi de donnees au serveur ----------\r\n");        //Envoi de données au serveur
            strcpy(snd, "AT+CIPSEND=4\r\n");                                           //Commande envoyant le nombre de bytes voulu
            SendCMD();
            timeout=5;
            getreply();
            pc.printf(buf);
            strcpy(snd, "ECHA\r\n");                                                    //Le chat vient de l'extérieur
            SendCMD();
            timeout=5;
            getreply();
            pc.printf(buf);                                                             //Statut de l'étape (OK/ERROR)
            wait(2);
            if (F411==1) 
            {                                                                           //Vérification alimentation servo par F411
                myservo = 0.42 ;                                                        //Position du servomoteur n°3 (ouvert)
                wait(5);   
                while(capteurfermeture==0)
                {
                    led2=1;
                    }
                    led2=0;
                    wait(2);
                    myservo=0.001;
                    position = 4;
                    } 
            }                

            myservo = 0.001 ;                                                           //La chatière est fermé
            position = 4;
                
            }

        
    

    if(capint ==1 && egal1 ==1)                                                         //Si le capteur intérieur est à 1 & le TAG 1 est détecté
    {                                                       
        pc.printf("---------- Envoi de donnees au serveur ----------\r\n");             //Envoi de données au serveur
        strcpy(snd, "AT+CIPSEND=4\r\n");                                                //Commande envoyant le nombre de bytes voulu
        SendCMD();
        timeout=5;
        getreply();
        pc.printf(buf);
        strcpy(snd, "ICHA\r\n");                                                        //Le chat vient de l'intérieur
        SendCMD();
        timeout=5;
        getreply();
        pc.printf(buf);                                                                 //Statut de l'étape (OK/ERROR)
        wait(2);
        if (F411 ==1) 
        {                                                                               //Vérification alimentation servo par F411 (MyHome)
            myservo = 0.42 ;                                                            //Position du servomoteur n°3 (ouvert)
            wait(5)    ;                                                                
          while(capteurfermeture==0)
            {
                led3=1;
            } 
                led3=0;
                wait(2);                                                           
                myservo = 0.001 ;                                                       //La chatière est fermé
                position=4;                                                             
        }
    }

    



    while(bpmanuel ==1 ) {                                                             //Activation du mode manuel
        ledmm = 1 ;                                                                    //Allumage Led indiquant que le mode manuel est activé
        if (manuel1==1){
            position = 1;
            }
         if (manuel3==1){
            position = 3;
            }
        if (manuel4==1){
            position = 4;
            }   
        switch(position) {                                                                  //Switch en fonction de la position de la chatière pour le mode manuel
            case 1 :                                                                        //Mode manuel position n°1 (entrée seulement)
                                                                                            
                                                                                            //Position du servomoteur n°1
                    if(capteurfermeture==1) {                                               //Vérification de la fermeture de la chatière
                    myservo = pos1 ;
                        position = 1;
                                                                                            //La chatière est en position n°1 (entrée seulement)
                    
                }
                break;                                                                      //Fin du case n°1
                     
            case 4 :                                                                        //Mode manuel position n°3 (entréé ou sortie)
                                                                                            //Vérification alimentation servo par F411
                                                                                            //Position du servomoteur n°3
                    if(capteurfermeture==1) {                                               //Vérification de la fermeture de la chatière
                    myservo = pos3 ;
                        position = 3;                                                       //La chatière est en position n°3 (entréé ou sortie)
                    
                }
                break;                                                                      //Fin du case n°3
            case 3 :                                                                        //Mode manuel position n°4 (verrouillage complet)
                                                                                            //Position du servomoteur n°4
                    if(capteurfermeture==1) {                                               //Vérification de la fermeture de la chatière
                    myservo = pos4 ;
                        position = 4;                                                       //La chatière est en position n°4 (verrouillage complet)
              
                }
                break;                                                                  //Fin du case n°4
            default :                                                                   //Fin du mode manuel
                       }                                                                //Fin du switch
        } myservo=0.001;
     
                                                                                     //Fin du mode manuel
}                                                                                  //Fin du int main
//+++++++++++++++++++++++++++++ Voids RFID +++++++++++++++++++++++++++++
/*void HandShake(){
  pc.printf("\n\r");
  pc.printf("CTS IS TO 0");
  pc.printf("\n\r");
}*/

void Antenna()
{
    pc.printf("\n\r");
    pc.printf("ANTENNA NOT DETECTED");
    pc.printf("\n\r");
}

void field()
{
    pc.printf("\n\r");
    pc.printf("NOT TAG IN FIELD");
    pc.printf("\n\r");
}

//  +++++++++++++++++++++++++++++++++ This is for ESP8266 config only, run this once to set up the ESP8266 +++++++++++++++
void ESPconfig()
{
    wait(5);
    strcpy(snd,"AT\r\n");
    SendCMD();
    timeout=1;
    getreply();
    wait(1);
    pc.printf("-------------- Redemarrage du module --------------\r\n");               //Redémarrage du module WIFI ESP8266
    strcpy(snd,"AT+RST\r\n");                                                           //Commande redémarrage du module WIFI ESP8266
    SendCMD();
    timeout=5;
    getreply();
    pc.printf(buf);

    wait(3);                                                                            //Délai inter-étape

    pc.printf("\n---------- Mode Wifi ----------\r\n");                                 //Initialisation du mode WIFI
    strcpy(snd, "AT+CWMODE=3\r\n");                                                     //Commande initialisation du module WIFI ESP8266
    SendCMD();
    timeout=4;
    getreply();
    pc.printf(buf);

    wait(2);                                                                            //Délai inter-étape

    pc.printf("\n---------- Connexion au point d acces ----------\r\n");                //Connection au serveur IOP
    pc.printf("ssid = %s   pwd = %s\r\n",ssid,pwd);
    strcpy(snd, "AT+CWJAP=\"");                                                         //Commande de connection au serveur IOP
    strcat(snd, ssid);
    strcat(snd, "\",\"");
    strcat(snd, pwd);
    strcat(snd, "\"\r\n");
    SendCMD();
    timeout=10;
    getreply();
    pc.printf(buf);                                                                     //Statut de l'étape (OK/ERROR)

    wait(2);                                                                            //Délai inter-étape

    pc.printf("\n---------- Adresse IP local ----------\r\n");                          //Adressage IP
    strcpy(snd, "AT+CIFSR\r\n");                                                        //Commande affichant adresse IP et MAC du PC ainsi que du module WIFI ESP8266
    SendCMD();
    timeout=3;
    getreply();
    pc.printf(buf);                                                                     //Statut de l'étape (OK/ERROR)

    wait(3);                                                                            //Délai inter-étape

    pc.printf("\n---------- TCP Client ----------\r\n");                                //Connection au serveur en tant que client
    strcpy(snd, "AT+CIPSTART=\"TCP\",\"192.168.2.1\",55555\r\n");                     //Commande connection au serveur : Protocol , Adresse IP serveur , port
    SendCMD();
    timeout=5;
    getreply();
    pc.printf(buf);                                                                     //Statut de l'étape (OK/ERROR)

    wait(3);                                                                            //Délai inter-étape


}                                                                                       //Fin du void config

void SendCMD()
{
    esp.printf("%s", snd);
}

void getreply()
{
    memset(buf, '\0', sizeof(buf));
    t.start();
    ended=0;
    count=0;
    while(!ended) {
        if(esp.readable()) {
            buf[count] = esp.getc();
            count++;
        }
        if(t.read() > timeout) {
            ended = 1;
            t.stop();
            t.reset();
        }
    }
}