Real-time bike tracker using Adafruit Ultimate GPS, Huzzah wifi, and Pubnub

Dependencies:   MBed_Adafruit-GPS-Library mbed

Committer:
ECE4180
Date:
Wed Apr 19 01:00:53 2017 +0000
Revision:
1:0701bf58c9fa
Child:
2:834f8d2ebe3f
GPS String sending to Pubnub and working.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ECE4180 1:0701bf58c9fa 1 #include "Huzzah.h"
ECE4180 1:0701bf58c9fa 2
ECE4180 1:0701bf58c9fa 3
ECE4180 1:0701bf58c9fa 4 extern Serial pc;
ECE4180 1:0701bf58c9fa 5 extern volatile int tx_in;
ECE4180 1:0701bf58c9fa 6 extern volatile int tx_out;
ECE4180 1:0701bf58c9fa 7 extern volatile int rx_in;
ECE4180 1:0701bf58c9fa 8 extern volatile int rx_out;
ECE4180 1:0701bf58c9fa 9 extern char tx_buffer[4096];
ECE4180 1:0701bf58c9fa 10 extern char rx_buffer[4096];
ECE4180 1:0701bf58c9fa 11
ECE4180 1:0701bf58c9fa 12
ECE4180 1:0701bf58c9fa 13 Huzzah::Huzzah(PinName tx_pin, PinName rx_pin, string ssid, string pwd)
ECE4180 1:0701bf58c9fa 14 :esp(tx_pin, rx_pin), ssid(ssid), pwd(pwd)
ECE4180 1:0701bf58c9fa 15 {
ECE4180 1:0701bf58c9fa 16 tx_in=0;
ECE4180 1:0701bf58c9fa 17 tx_out=0;
ECE4180 1:0701bf58c9fa 18 rx_in=0;
ECE4180 1:0701bf58c9fa 19 rx_out=0;
ECE4180 1:0701bf58c9fa 20 esp.baud(9600);
ECE4180 1:0701bf58c9fa 21 }
ECE4180 1:0701bf58c9fa 22
ECE4180 1:0701bf58c9fa 23
ECE4180 1:0701bf58c9fa 24 Huzzah::Huzzah(PinName tx_pin, PinName rx_pin)
ECE4180 1:0701bf58c9fa 25 :esp(tx_pin, rx_pin), ssid(""), pwd("")
ECE4180 1:0701bf58c9fa 26 {
ECE4180 1:0701bf58c9fa 27 tx_in=0;
ECE4180 1:0701bf58c9fa 28 tx_out=0;
ECE4180 1:0701bf58c9fa 29 rx_in=0;
ECE4180 1:0701bf58c9fa 30 rx_out=0;
ECE4180 1:0701bf58c9fa 31 esp.baud(9600);
ECE4180 1:0701bf58c9fa 32 }
ECE4180 1:0701bf58c9fa 33
ECE4180 1:0701bf58c9fa 34
ECE4180 1:0701bf58c9fa 35 void Huzzah::setssid(string s)
ECE4180 1:0701bf58c9fa 36 {
ECE4180 1:0701bf58c9fa 37 ssid = s;
ECE4180 1:0701bf58c9fa 38 }
ECE4180 1:0701bf58c9fa 39
ECE4180 1:0701bf58c9fa 40
ECE4180 1:0701bf58c9fa 41 void Huzzah::setpwd(string s)
ECE4180 1:0701bf58c9fa 42 {
ECE4180 1:0701bf58c9fa 43 pwd = s;
ECE4180 1:0701bf58c9fa 44 }
ECE4180 1:0701bf58c9fa 45
ECE4180 1:0701bf58c9fa 46
ECE4180 1:0701bf58c9fa 47 string Huzzah::get_ip()
ECE4180 1:0701bf58c9fa 48 {
ECE4180 1:0701bf58c9fa 49 strcpy(cmdbuff, "print(wifi.sta.getip())\r\n");
ECE4180 1:0701bf58c9fa 50 send_cmd();
ECE4180 1:0701bf58c9fa 51 getreply();
ECE4180 1:0701bf58c9fa 52 string s(replybuff);
ECE4180 1:0701bf58c9fa 53 return s;
ECE4180 1:0701bf58c9fa 54 }
ECE4180 1:0701bf58c9fa 55
ECE4180 1:0701bf58c9fa 56
ECE4180 1:0701bf58c9fa 57 void Huzzah::http_get(string request, string host, string port)
ECE4180 1:0701bf58c9fa 58 {
ECE4180 1:0701bf58c9fa 59 string conn("conn:connect(");
ECE4180 1:0701bf58c9fa 60 conn += port + "\,\"" + host + "\")\r\n";
ECE4180 1:0701bf58c9fa 61
ECE4180 1:0701bf58c9fa 62 string r("conn:send(\"");
ECE4180 1:0701bf58c9fa 63 r += request + "\")\r\n";
ECE4180 1:0701bf58c9fa 64
ECE4180 1:0701bf58c9fa 65 sprintf(cmdbuff, "conn=net.createConnection(net.TCP, false)\r\n" );
ECE4180 1:0701bf58c9fa 66 send_cmd();
ECE4180 1:0701bf58c9fa 67 getreply();
ECE4180 1:0701bf58c9fa 68 wait(0.2);
ECE4180 1:0701bf58c9fa 69 sprintf(cmdbuff, "print(conn)\r\n" );
ECE4180 1:0701bf58c9fa 70 send_cmd();
ECE4180 1:0701bf58c9fa 71 getreply();
ECE4180 1:0701bf58c9fa 72 wait(0.2);
ECE4180 1:0701bf58c9fa 73 sprintf(cmdbuff, "conn:on(\"receive\", function(conn, pl) print(pl) end)\r\n");
ECE4180 1:0701bf58c9fa 74 send_cmd();
ECE4180 1:0701bf58c9fa 75 getreply();
ECE4180 1:0701bf58c9fa 76 wait(0.2);
ECE4180 1:0701bf58c9fa 77 sprintf(cmdbuff, conn.c_str());
ECE4180 1:0701bf58c9fa 78 send_cmd();
ECE4180 1:0701bf58c9fa 79 getreply();
ECE4180 1:0701bf58c9fa 80 wait(3.0);
ECE4180 1:0701bf58c9fa 81 sprintf(cmdbuff, r.c_str());
ECE4180 1:0701bf58c9fa 82 send_cmd();
ECE4180 1:0701bf58c9fa 83 wait(1.0);
ECE4180 1:0701bf58c9fa 84 send_cmd();
ECE4180 1:0701bf58c9fa 85 getreply();
ECE4180 1:0701bf58c9fa 86 wait(0.2);
ECE4180 1:0701bf58c9fa 87 }
ECE4180 1:0701bf58c9fa 88
ECE4180 1:0701bf58c9fa 89
ECE4180 1:0701bf58c9fa 90 void Huzzah::send_cmd()
ECE4180 1:0701bf58c9fa 91 {
ECE4180 1:0701bf58c9fa 92 int i;
ECE4180 1:0701bf58c9fa 93 char temp_char;
ECE4180 1:0701bf58c9fa 94 bool empty;
ECE4180 1:0701bf58c9fa 95 i = 0;
ECE4180 1:0701bf58c9fa 96 // Start Critical Section - don't interrupt while changing global buffer variables
ECE4180 1:0701bf58c9fa 97 NVIC_DisableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 98 empty = (tx_in == tx_out);
ECE4180 1:0701bf58c9fa 99 while ((i==0) || (cmdbuff[i-1] != '\n')) {
ECE4180 1:0701bf58c9fa 100 // Wait if buffer full
ECE4180 1:0701bf58c9fa 101 if (((tx_in + 1) % buffer_size) == tx_out) {
ECE4180 1:0701bf58c9fa 102 // End Critical Section - need to let interrupt routine empty buffer by sending
ECE4180 1:0701bf58c9fa 103 NVIC_EnableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 104 while (((tx_in + 1) % buffer_size) == tx_out) {
ECE4180 1:0701bf58c9fa 105 }
ECE4180 1:0701bf58c9fa 106 // Start Critical Section - don't interrupt while changing global buffer variables
ECE4180 1:0701bf58c9fa 107 NVIC_DisableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 108 }
ECE4180 1:0701bf58c9fa 109 tx_buffer[tx_in] = cmdbuff[i];
ECE4180 1:0701bf58c9fa 110 i++;
ECE4180 1:0701bf58c9fa 111 tx_in = (tx_in + 1) % buffer_size;
ECE4180 1:0701bf58c9fa 112 }
ECE4180 1:0701bf58c9fa 113 if (esp.writeable() && (empty)) {
ECE4180 1:0701bf58c9fa 114 temp_char = tx_buffer[tx_out];
ECE4180 1:0701bf58c9fa 115 tx_out = (tx_out + 1) % buffer_size;
ECE4180 1:0701bf58c9fa 116 // Send first character to start tx interrupts, if stopped
ECE4180 1:0701bf58c9fa 117 esp.putc(temp_char);
ECE4180 1:0701bf58c9fa 118 }
ECE4180 1:0701bf58c9fa 119 // End Critical Section
ECE4180 1:0701bf58c9fa 120 NVIC_EnableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 121 return;
ECE4180 1:0701bf58c9fa 122 }
ECE4180 1:0701bf58c9fa 123
ECE4180 1:0701bf58c9fa 124
ECE4180 1:0701bf58c9fa 125 void Huzzah::getreply()
ECE4180 1:0701bf58c9fa 126 {
ECE4180 1:0701bf58c9fa 127 read_line();
ECE4180 1:0701bf58c9fa 128 sscanf(rx_line,replybuff);
ECE4180 1:0701bf58c9fa 129 }
ECE4180 1:0701bf58c9fa 130
ECE4180 1:0701bf58c9fa 131
ECE4180 1:0701bf58c9fa 132 void Huzzah::read_line()
ECE4180 1:0701bf58c9fa 133 {
ECE4180 1:0701bf58c9fa 134 int i;
ECE4180 1:0701bf58c9fa 135 i = 0;
ECE4180 1:0701bf58c9fa 136 // Start Critical Section - don't interrupt while changing global buffer variables
ECE4180 1:0701bf58c9fa 137 NVIC_DisableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 138 // Loop reading rx buffer characters until end of line character
ECE4180 1:0701bf58c9fa 139 while ((i==0) || (rx_line[i-1] != '\r')) {
ECE4180 1:0701bf58c9fa 140 // Wait if buffer empty
ECE4180 1:0701bf58c9fa 141 if (rx_in == rx_out) {
ECE4180 1:0701bf58c9fa 142 // End Critical Section - need to allow rx interrupt to get new characters for buffer
ECE4180 1:0701bf58c9fa 143 NVIC_EnableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 144 while (rx_in == rx_out) {
ECE4180 1:0701bf58c9fa 145 }
ECE4180 1:0701bf58c9fa 146 // Start Critical Section - don't interrupt while changing global buffer variables
ECE4180 1:0701bf58c9fa 147 NVIC_DisableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 148 }
ECE4180 1:0701bf58c9fa 149 rx_line[i] = rx_buffer[rx_out];
ECE4180 1:0701bf58c9fa 150 i++;
ECE4180 1:0701bf58c9fa 151 rx_out = (rx_out + 1) % buffer_size;
ECE4180 1:0701bf58c9fa 152 }
ECE4180 1:0701bf58c9fa 153 // End Critical Section
ECE4180 1:0701bf58c9fa 154 NVIC_EnableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 155 rx_line[i-1] = 0;
ECE4180 1:0701bf58c9fa 156 return;
ECE4180 1:0701bf58c9fa 157 }
ECE4180 1:0701bf58c9fa 158
ECE4180 1:0701bf58c9fa 159
ECE4180 1:0701bf58c9fa 160 void Huzzah::espsendcmd()
ECE4180 1:0701bf58c9fa 161 {
ECE4180 1:0701bf58c9fa 162 esp.printf("%s", configsnd);
ECE4180 1:0701bf58c9fa 163 }
ECE4180 1:0701bf58c9fa 164
ECE4180 1:0701bf58c9fa 165
ECE4180 1:0701bf58c9fa 166 void Huzzah::espgetreply()
ECE4180 1:0701bf58c9fa 167 {
ECE4180 1:0701bf58c9fa 168 Timer t;
ECE4180 1:0701bf58c9fa 169 memset(configbuf, '\0', sizeof(configbuf));
ECE4180 1:0701bf58c9fa 170 t.start();
ECE4180 1:0701bf58c9fa 171 ended=0;
ECE4180 1:0701bf58c9fa 172 count=0;
ECE4180 1:0701bf58c9fa 173 while(!ended) {
ECE4180 1:0701bf58c9fa 174 if(esp.readable()) {
ECE4180 1:0701bf58c9fa 175 configbuf[count] = esp.getc();
ECE4180 1:0701bf58c9fa 176 count++;
ECE4180 1:0701bf58c9fa 177 }
ECE4180 1:0701bf58c9fa 178 if(t.read() > timeout) {
ECE4180 1:0701bf58c9fa 179 ended = 1;
ECE4180 1:0701bf58c9fa 180 t.stop();
ECE4180 1:0701bf58c9fa 181 t.reset();
ECE4180 1:0701bf58c9fa 182 }
ECE4180 1:0701bf58c9fa 183 }
ECE4180 1:0701bf58c9fa 184 }
ECE4180 1:0701bf58c9fa 185
ECE4180 1:0701bf58c9fa 186
ECE4180 1:0701bf58c9fa 187 void Huzzah::espconfig()
ECE4180 1:0701bf58c9fa 188 {
ECE4180 1:0701bf58c9fa 189 wait(5);
ECE4180 1:0701bf58c9fa 190 pc.printf("\f---------- Starting ESP Config ----------\r\n\n");
ECE4180 1:0701bf58c9fa 191 pc.printf("---------- Reset & get Firmware ----------\r\n");
ECE4180 1:0701bf58c9fa 192 strcpy(configsnd,"node.restart()\r\n");
ECE4180 1:0701bf58c9fa 193 espsendcmd();
ECE4180 1:0701bf58c9fa 194 timeout=5;
ECE4180 1:0701bf58c9fa 195 espgetreply();
ECE4180 1:0701bf58c9fa 196 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 197
ECE4180 1:0701bf58c9fa 198 wait(2);
ECE4180 1:0701bf58c9fa 199
ECE4180 1:0701bf58c9fa 200 pc.printf("\n---------- Get Version ----------\r\n");
ECE4180 1:0701bf58c9fa 201 strcpy(configsnd,"print(node.info())\r\n");
ECE4180 1:0701bf58c9fa 202 espsendcmd();
ECE4180 1:0701bf58c9fa 203 timeout=4;
ECE4180 1:0701bf58c9fa 204 espgetreply();
ECE4180 1:0701bf58c9fa 205 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 206
ECE4180 1:0701bf58c9fa 207 wait(3);
ECE4180 1:0701bf58c9fa 208
ECE4180 1:0701bf58c9fa 209 // set CWMODE to 1=Station,2=AP,3=BOTH, default mode 1 (Station)
ECE4180 1:0701bf58c9fa 210 pc.printf("\n---------- Setting Mode ----------\r\n");
ECE4180 1:0701bf58c9fa 211 strcpy(configsnd, "wifi.setmode(wifi.STATION)\r\n");
ECE4180 1:0701bf58c9fa 212 espsendcmd();
ECE4180 1:0701bf58c9fa 213 timeout=4;
ECE4180 1:0701bf58c9fa 214 espgetreply();
ECE4180 1:0701bf58c9fa 215 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 216
ECE4180 1:0701bf58c9fa 217 wait(2);
ECE4180 1:0701bf58c9fa 218
ECE4180 1:0701bf58c9fa 219 pc.printf("\n---------- Listing Access Points ----------\r\n");
ECE4180 1:0701bf58c9fa 220 strcpy(configsnd, "function listap(t) \r\n");
ECE4180 1:0701bf58c9fa 221 espsendcmd();
ECE4180 1:0701bf58c9fa 222 wait(1);
ECE4180 1:0701bf58c9fa 223 strcpy(configsnd, "for k,v in pairs(t) do \r\n");
ECE4180 1:0701bf58c9fa 224 espsendcmd();
ECE4180 1:0701bf58c9fa 225 wait(1);
ECE4180 1:0701bf58c9fa 226 strcpy(configsnd, "print(k..\" : \"..v)\r\n");
ECE4180 1:0701bf58c9fa 227 espsendcmd();
ECE4180 1:0701bf58c9fa 228 wait(1);
ECE4180 1:0701bf58c9fa 229 strcpy(configsnd, "end\r\n");
ECE4180 1:0701bf58c9fa 230 espsendcmd();
ECE4180 1:0701bf58c9fa 231 wait(1);
ECE4180 1:0701bf58c9fa 232 strcpy(configsnd, "end\r\n");
ECE4180 1:0701bf58c9fa 233 espsendcmd();
ECE4180 1:0701bf58c9fa 234 wait(1);
ECE4180 1:0701bf58c9fa 235 strcpy(configsnd, "wifi.sta.getap(listap) \r\n");
ECE4180 1:0701bf58c9fa 236 espsendcmd();
ECE4180 1:0701bf58c9fa 237 wait(1);
ECE4180 1:0701bf58c9fa 238 timeout=15;
ECE4180 1:0701bf58c9fa 239 espgetreply();
ECE4180 1:0701bf58c9fa 240 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 241
ECE4180 1:0701bf58c9fa 242 wait(2);
ECE4180 1:0701bf58c9fa 243
ECE4180 1:0701bf58c9fa 244 pc.printf("\n---------- Connecting to AP ----------\r\n");
ECE4180 1:0701bf58c9fa 245 pc.printf("ssid = %s pwd = %s\r\n",ssid.c_str(),pwd.c_str());
ECE4180 1:0701bf58c9fa 246 strcpy(configsnd, "wifi.sta.config(\"");
ECE4180 1:0701bf58c9fa 247 strcat(configsnd, ssid.c_str());
ECE4180 1:0701bf58c9fa 248 strcat(configsnd, "\",\"");
ECE4180 1:0701bf58c9fa 249 strcat(configsnd, pwd.c_str());
ECE4180 1:0701bf58c9fa 250 strcat(configsnd, "\")\r\n");
ECE4180 1:0701bf58c9fa 251 espsendcmd();
ECE4180 1:0701bf58c9fa 252 timeout=10;
ECE4180 1:0701bf58c9fa 253 espgetreply();
ECE4180 1:0701bf58c9fa 254 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 255
ECE4180 1:0701bf58c9fa 256 wait(10);
ECE4180 1:0701bf58c9fa 257
ECE4180 1:0701bf58c9fa 258 pc.printf("\n---------- Get IP's ----------\r\n");
ECE4180 1:0701bf58c9fa 259 strcpy(configsnd, "print(wifi.sta.getip())\r\n");
ECE4180 1:0701bf58c9fa 260 espsendcmd();
ECE4180 1:0701bf58c9fa 261 timeout=3;
ECE4180 1:0701bf58c9fa 262 espgetreply();
ECE4180 1:0701bf58c9fa 263 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 264
ECE4180 1:0701bf58c9fa 265 wait(1);
ECE4180 1:0701bf58c9fa 266
ECE4180 1:0701bf58c9fa 267 pc.printf("\n---------- Get Connection Status ----------\r\n");
ECE4180 1:0701bf58c9fa 268 strcpy(configsnd, "print(wifi.sta.status())\r\n");
ECE4180 1:0701bf58c9fa 269 espsendcmd();
ECE4180 1:0701bf58c9fa 270 timeout=5;
ECE4180 1:0701bf58c9fa 271 getreply();
ECE4180 1:0701bf58c9fa 272 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 273
ECE4180 1:0701bf58c9fa 274 pc.printf("\n\n\n If you get a valid (non zero) IP, ESP8266 has been set up.\r\n");
ECE4180 1:0701bf58c9fa 275 pc.printf(" Run this if you want to reconfig the ESP8266 at any time.\r\n");
ECE4180 1:0701bf58c9fa 276 pc.printf(" It saves the SSID and password settings internally\r\n");
ECE4180 1:0701bf58c9fa 277 wait(10);
ECE4180 1:0701bf58c9fa 278 }