projet en 1 main.cpp

Dependencies:   DHT11 HMC5883L

Committer:
jijou
Date:
Fri Jan 20 22:51:30 2017 +0000
Revision:
1:352fcb35e812
Parent:
0:0e12a7930611
Child:
2:7e718a1be318
je pense c'est OP sauf le gps dans la reboucle du while il fait que une fois le gps j'ai l'impression

Who changed what in which revision?

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