projet en 1 main.cpp

Dependencies:   DHT11 HMC5883L

Committer:
wallsow
Date:
Mon Feb 06 10:18:50 2017 +0000
Revision:
4:06944df56a2d
Parent:
3:d2c57ab99c8e
instrctable fin

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jijou 0:0e12a7930611 1 #include "mbed.h"
wallsow 3:d2c57ab99c8e 2
wallsow 2:7e718a1be318 3 char lati[20], longi[20];
wallsow 2:7e718a1be318 4 int Ilati, Ilongi;
wallsow 2:7e718a1be318 5
jijou 0:0e12a7930611 6 Serial pc(PA_0,PA_1); // tx, rx
jijou 0:0e12a7930611 7
jijou 0:0e12a7930611 8 char gpsString[1024];
jijou 0:0e12a7930611 9 char tmp[20] = {};
jijou 0:0e12a7930611 10 char tmp2[20] = {};
jijou 0:0e12a7930611 11 char gga1[1024];
jijou 0:0e12a7930611 12 char * gga2;
jijou 0:0e12a7930611 13 char * fix;
jijou 0:0e12a7930611 14 uint8_t sep;
jijou 0:0e12a7930611 15 uint8_t mode = 2; //mode=1 fix information; mode=2 normal
jijou 0:0e12a7930611 16
jijou 0:0e12a7930611 17 typedef struct {
jijou 0:0e12a7930611 18 uint8_t heure;
jijou 0:0e12a7930611 19 uint8_t minute;
jijou 0:0e12a7930611 20 uint8_t seconde;
jijou 0:0e12a7930611 21 } tim_t;
jijou 0:0e12a7930611 22
jijou 0:0e12a7930611 23 typedef struct {
jijou 0:0e12a7930611 24 uint8_t deg;
jijou 0:0e12a7930611 25 uint8_t min;
jijou 0:0e12a7930611 26 double sec;
jijou 0:0e12a7930611 27 char azimute;
jijou 0:0e12a7930611 28 } pos_t;
jijou 0:0e12a7930611 29
jijou 0:0e12a7930611 30 typedef struct {
jijou 0:0e12a7930611 31 tim_t tim;
jijou 0:0e12a7930611 32 pos_t lat;
jijou 0:0e12a7930611 33 pos_t lon;
jijou 0:0e12a7930611 34 uint8_t sat; // Nombre de satellites utilisés pour calculer les coordonnées
jijou 0:0e12a7930611 35 uint8_t fix; // Fix qualification : (0 = non valide, 1 = Fix GPS, 2 = Fix DGPS), Type de positionnement (le 1 est un positionnement GPS)
jijou 0:0e12a7930611 36 float prs; // Précision horizontale ou HDOP (Horizontal dilution of precision)
jijou 0:0e12a7930611 37 float alt; // Altitude, en Metres, au dessus du MSL (mean see level) niveau moyen des Océans.
jijou 0:0e12a7930611 38 char unitAlt; // Unité de l'altitude (en mètre dans la majorité des trames)
jijou 0:0e12a7930611 39 } gps_t;
jijou 0:0e12a7930611 40
jijou 0:0e12a7930611 41 // structure contenant les données de la trame GGA à envoyer
jijou 0:0e12a7930611 42 gps_t GPGGA;
jijou 0:0e12a7930611 43
jijou 0:0e12a7930611 44 char * convert(char* ch, pos_t* pos) {
jijou 0:0e12a7930611 45
jijou 0:0e12a7930611 46 double f = atof(ch);
jijou 0:0e12a7930611 47
jijou 0:0e12a7930611 48 pos->deg = (uint8_t)(f / 100.0);
jijou 0:0e12a7930611 49 pos->min = (uint8_t)(f - ((pos->deg) * 100.0));
jijou 0:0e12a7930611 50 pos->sec = 60.0*(f - ((pos->deg)*100.0) - (pos->min));
jijou 0:0e12a7930611 51
jijou 0:0e12a7930611 52 char *s = (char*)calloc(14,sizeof(char));
jijou 0:0e12a7930611 53
wallsow 2:7e718a1be318 54 sprintf(s,"%3d'%2d'%5.3f\"",pos->deg,pos->min,pos->sec);
jijou 0:0e12a7930611 55
jijou 0:0e12a7930611 56 return s;
jijou 0:0e12a7930611 57 }
jijou 0:0e12a7930611 58
jijou 0:0e12a7930611 59 char * time(char* ch, tim_t* tim) {
jijou 0:0e12a7930611 60
jijou 0:0e12a7930611 61 char hh[3], mm[3], ss[7];
jijou 0:0e12a7930611 62 //hhmmss.nnn
jijou 0:0e12a7930611 63 memcpy(hh, &ch[0], 2);
jijou 0:0e12a7930611 64 memcpy(mm, &ch[2], 2);
jijou 0:0e12a7930611 65 memcpy(ss, &ch[4], 6);
jijou 0:0e12a7930611 66
jijou 0:0e12a7930611 67 tim->heure = atoi(hh);
jijou 0:0e12a7930611 68 tim->minute = atoi(mm);
jijou 0:0e12a7930611 69 tim->seconde = atoi(ss); //cast de double vers intteger, on perd la précision des millisecondes
jijou 0:0e12a7930611 70 tim->heure++; //convertion des heures de UTC vers UTC+1
jijou 0:0e12a7930611 71
jijou 0:0e12a7930611 72 char *s = (char*)calloc(14,sizeof(char));
jijou 0:0e12a7930611 73
jijou 0:0e12a7930611 74 sprintf(s,"%02d:%02d:%02d",tim->heure,tim->minute,tim->seconde);
jijou 0:0e12a7930611 75
jijou 0:0e12a7930611 76 return s;
jijou 0:0e12a7930611 77 }
jijou 0:0e12a7930611 78 /**************************************/
jijou 0:0e12a7930611 79
wallsow 3:d2c57ab99c8e 80
jijou 0:0e12a7930611 81 uint8_t parseGGA() {
jijou 0:0e12a7930611 82 gga2 = strtok(gga1, ",");
wallsow 3:d2c57ab99c8e 83 while (gga2 != NULL) {
jijou 0:0e12a7930611 84 switch (sep) {
jijou 0:0e12a7930611 85 case 1: // heure d'envoi de la trame
jijou 0:0e12a7930611 86 if (mode == 2) {
jijou 0:0e12a7930611 87 strcpy(tmp2,time( gga2,&(GPGGA.tim) ));
wallsow 3:d2c57ab99c8e 88 pc.printf("\r\n-----Donnees GPS-----\r\nTim: %s\r\n",tmp2);
wallsow 3:d2c57ab99c8e 89
jijou 0:0e12a7930611 90 }
jijou 0:0e12a7930611 91 break;
jijou 0:0e12a7930611 92 case 2 : // latitude
jijou 0:0e12a7930611 93 if (mode == 2) {
jijou 0:0e12a7930611 94 strcpy(tmp,convert( gga2,&(GPGGA.lat) ));
wallsow 2:7e718a1be318 95 sprintf(lati,"\r%s",tmp);
wallsow 2:7e718a1be318 96 pc.printf("\r%s",lati);
wallsow 3:d2c57ab99c8e 97
jijou 0:0e12a7930611 98 }
jijou 0:0e12a7930611 99 break;
jijou 0:0e12a7930611 100 case 3 : // N: Nord, S : Sud
jijou 0:0e12a7930611 101 if (mode == 2) {
jijou 0:0e12a7930611 102 GPGGA.lat.azimute = gga2[0];
jijou 0:0e12a7930611 103 pc.printf("%s\n\r",gga2);
jijou 0:0e12a7930611 104 wait(0.25);
jijou 0:0e12a7930611 105 }
jijou 0:0e12a7930611 106 break;
jijou 0:0e12a7930611 107 case 4 : // longitude
jijou 0:0e12a7930611 108 if (mode == 2) {
jijou 0:0e12a7930611 109 strcpy(tmp,convert( gga2,&(GPGGA.lat) ));
wallsow 2:7e718a1be318 110 sprintf(longi,"\r%s",tmp);
wallsow 2:7e718a1be318 111 pc.printf("\r%s",longi);
jijou 0:0e12a7930611 112 }
jijou 0:0e12a7930611 113 break;
jijou 0:0e12a7930611 114 case 5 : // E: Est, W: Ouest
jijou 0:0e12a7930611 115 if (mode == 2) {
jijou 0:0e12a7930611 116 GPGGA.lat.azimute = gga2[0];
jijou 1:352fcb35e812 117 pc.printf("%s\n\r-----Donnees GPS-----\r\n",gga2);
wallsow 3:d2c57ab99c8e 118
jijou 0:0e12a7930611 119 wait(0.25);
jijou 0:0e12a7930611 120 }
jijou 0:0e12a7930611 121 break;
jijou 0:0e12a7930611 122 case 6:
jijou 0:0e12a7930611 123 if (mode == 1) {
jijou 0:0e12a7930611 124 if (gga2 == "0") {
jijou 0:0e12a7930611 125 fix = "Invalid";
jijou 0:0e12a7930611 126 }
jijou 0:0e12a7930611 127 if (gga2 == "1") {
jijou 0:0e12a7930611 128 fix = "GPS Fix (SPS)";
jijou 0:0e12a7930611 129 }
jijou 0:0e12a7930611 130 if (gga2 == "2") {
jijou 0:0e12a7930611 131 fix = "DGPS Fix";
jijou 0:0e12a7930611 132 }
jijou 0:0e12a7930611 133 if (gga2 == "3") {
jijou 0:0e12a7930611 134 fix = "PPS Fix";
jijou 0:0e12a7930611 135 }
jijou 0:0e12a7930611 136 if (gga2 == "4") {
jijou 0:0e12a7930611 137 fix = "Real Time Kinematic";
jijou 0:0e12a7930611 138 }
jijou 0:0e12a7930611 139 if (gga2 == "5") {
jijou 0:0e12a7930611 140 fix = "Float RTK";
jijou 0:0e12a7930611 141 }
jijou 0:0e12a7930611 142 if (gga2 == "6") {
jijou 0:0e12a7930611 143 fix = "Estimated (Dead Reckoning)";
jijou 0:0e12a7930611 144 }
jijou 0:0e12a7930611 145 if (gga2 == "7") {
jijou 0:0e12a7930611 146 fix = "Manual Input Mode";
jijou 0:0e12a7930611 147 }
jijou 0:0e12a7930611 148 if (gga2 == "8") {
jijou 0:0e12a7930611 149 fix = "Simulation Mode";
jijou 0:0e12a7930611 150 }
jijou 0:0e12a7930611 151 GPGGA.fix = atoi(gga2);
jijou 0:0e12a7930611 152 pc.printf("FIX: %s_%s",gga2,fix);
jijou 0:0e12a7930611 153 }
jijou 0:0e12a7930611 154 break;
jijou 0:0e12a7930611 155 case 7 : // Nombre de satellites
jijou 0:0e12a7930611 156 if (mode == 2) {
jijou 0:0e12a7930611 157 GPGGA.sat = atoi(gga2);
jijou 0:0e12a7930611 158 pc.printf("Inf: Sat:%s",gga2);
jijou 0:0e12a7930611 159 }
jijou 0:0e12a7930611 160 break;
jijou 0:0e12a7930611 161 case 8 : // Precision
jijou 0:0e12a7930611 162 if (mode == 2) {
jijou 0:0e12a7930611 163 GPGGA.prs = atof(gga2);
jijou 0:0e12a7930611 164 pc.printf(" Prs:%s",gga2);
jijou 0:0e12a7930611 165 }
jijou 0:0e12a7930611 166 break;
jijou 0:0e12a7930611 167 case 9 : // Altitude
jijou 0:0e12a7930611 168 if (mode == 2) {
jijou 0:0e12a7930611 169 GPGGA.alt = atof(gga2);
jijou 0:0e12a7930611 170 pc.printf(" Alt:%s",gga2);
jijou 0:0e12a7930611 171 }
jijou 0:0e12a7930611 172 break;
jijou 0:0e12a7930611 173 case 10 : // Unité altitude
jijou 0:0e12a7930611 174 if (mode == 2) {
jijou 0:0e12a7930611 175 GPGGA.unitAlt = gga2[0];
jijou 0:0e12a7930611 176 pc.printf("%s\n\r",gga2);
jijou 0:0e12a7930611 177 }
jijou 0:0e12a7930611 178 break;
wallsow 3:d2c57ab99c8e 179 }
jijou 0:0e12a7930611 180 gga2 = strtok(NULL, ",");
wallsow 3:d2c57ab99c8e 181 sep++;
jijou 0:0e12a7930611 182 }
wallsow 3:d2c57ab99c8e 183 sep = 1;
jijou 0:0e12a7930611 184 return *gga2;
wallsow 3:d2c57ab99c8e 185
jijou 0:0e12a7930611 186 }
jijou 0:0e12a7930611 187
wallsow 3:d2c57ab99c8e 188 uint8_t getGPSstring() { // str used to choose between GPS trame type, here we have only GPGGA wich is available
wallsow 3:d2c57ab99c8e 189 uint8_t str=1;
jijou 0:0e12a7930611 190 if (pc.scanf("%s", &gpsString) ==1) {
wallsow 3:d2c57ab99c8e 191 if(str==1) {
wallsow 3:d2c57ab99c8e 192 if (sscanf(gpsString, "$GPGGA,%s",gga1) >=1)
wallsow 3:d2c57ab99c8e 193 {
wallsow 4:06944df56a2d 194 sep = 1;
jijou 0:0e12a7930611 195 parseGGA();
jijou 0:0e12a7930611 196 }
jijou 0:0e12a7930611 197 return *gga2;
jijou 0:0e12a7930611 198 }
jijou 0:0e12a7930611 199 }
jijou 0:0e12a7930611 200 else
jijou 0:0e12a7930611 201 {
wallsow 4:06944df56a2d 202 pc.printf("NO GPGGA DATA RECEIVED\n\r");
jijou 0:0e12a7930611 203 }
wallsow 4:06944df56a2d 204 return 0;
jijou 0:0e12a7930611 205 }
wallsow 3:d2c57ab99c8e 206