Source-code for cansat implementation in Bibliotheca Alexandrina, Alexandria, Egypt.
Dependencies: JPEGCamera MODGPS RHT03 mbed
main.cpp@0:292a5636b86d, 2013-09-12 (annotated)
- Committer:
- Mohammed_Abo_Arais
- Date:
- Thu Sep 12 14:26:57 2013 +0000
- Revision:
- 0:292a5636b86d
initial revision
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Mohammed_Abo_Arais | 0:292a5636b86d | 1 | #include "mbed.h" |
Mohammed_Abo_Arais | 0:292a5636b86d | 2 | #include "JPEGCamera.h" |
Mohammed_Abo_Arais | 0:292a5636b86d | 3 | #include "RHT03.h" |
Mohammed_Abo_Arais | 0:292a5636b86d | 4 | #include "GPS.h" |
Mohammed_Abo_Arais | 0:292a5636b86d | 5 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 6 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 7 | DigitalOut myled1(LED1); //show successful picture was taken |
Mohammed_Abo_Arais | 0:292a5636b86d | 8 | DigitalOut myled2(LED2); //show end of sequence |
Mohammed_Abo_Arais | 0:292a5636b86d | 9 | DigitalOut myled3(LED3); //show picture take failed |
Mohammed_Abo_Arais | 0:292a5636b86d | 10 | DigitalOut myled4(LED4); //show camera is not ready |
Mohammed_Abo_Arais | 0:292a5636b86d | 11 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 12 | Serial pc(USBTX, USBRX); // tx, rx |
Mohammed_Abo_Arais | 0:292a5636b86d | 13 | /*Xbee Start*/ |
Mohammed_Abo_Arais | 0:292a5636b86d | 14 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 15 | Serial XBee(p13, p14); |
Mohammed_Abo_Arais | 0:292a5636b86d | 16 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 17 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 18 | // SET THIS. |
Mohammed_Abo_Arais | 0:292a5636b86d | 19 | // Create an instance of the GPS object. You will need to |
Mohammed_Abo_Arais | 0:292a5636b86d | 20 | // set p27 to whichever Serial RX pin you have connected |
Mohammed_Abo_Arais | 0:292a5636b86d | 21 | // your GPS module to. |
Mohammed_Abo_Arais | 0:292a5636b86d | 22 | GPS gps(NC,p27); |
Mohammed_Abo_Arais | 0:292a5636b86d | 23 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 24 | char rmc[GPS_BUFFER_LEN]; |
Mohammed_Abo_Arais | 0:292a5636b86d | 25 | char gga[GPS_BUFFER_LEN]; |
Mohammed_Abo_Arais | 0:292a5636b86d | 26 | char vtg[GPS_BUFFER_LEN]; |
Mohammed_Abo_Arais | 0:292a5636b86d | 27 | char ukn[GPS_BUFFER_LEN]; |
Mohammed_Abo_Arais | 0:292a5636b86d | 28 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 29 | // 0.1 second flash of LED2 |
Mohammed_Abo_Arais | 0:292a5636b86d | 30 | DigitalOut led2(LED2); |
Mohammed_Abo_Arais | 0:292a5636b86d | 31 | Timeout t2; |
Mohammed_Abo_Arais | 0:292a5636b86d | 32 | void t2out(void) |
Mohammed_Abo_Arais | 0:292a5636b86d | 33 | { |
Mohammed_Abo_Arais | 0:292a5636b86d | 34 | led2 = 0; |
Mohammed_Abo_Arais | 0:292a5636b86d | 35 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 36 | void blip2(void) |
Mohammed_Abo_Arais | 0:292a5636b86d | 37 | { |
Mohammed_Abo_Arais | 0:292a5636b86d | 38 | led2 = 1; |
Mohammed_Abo_Arais | 0:292a5636b86d | 39 | t2.attach(&t2out, 0.1); |
Mohammed_Abo_Arais | 0:292a5636b86d | 40 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 41 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 42 | // 0.1 second flash of LED3 |
Mohammed_Abo_Arais | 0:292a5636b86d | 43 | DigitalOut led3(LED3); |
Mohammed_Abo_Arais | 0:292a5636b86d | 44 | Timeout t3; |
Mohammed_Abo_Arais | 0:292a5636b86d | 45 | void t3out(void) |
Mohammed_Abo_Arais | 0:292a5636b86d | 46 | { |
Mohammed_Abo_Arais | 0:292a5636b86d | 47 | led3 = 0; |
Mohammed_Abo_Arais | 0:292a5636b86d | 48 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 49 | void blip3(void) |
Mohammed_Abo_Arais | 0:292a5636b86d | 50 | { |
Mohammed_Abo_Arais | 0:292a5636b86d | 51 | led3 = 1; |
Mohammed_Abo_Arais | 0:292a5636b86d | 52 | t3.attach(&t3out, 0.1); |
Mohammed_Abo_Arais | 0:292a5636b86d | 53 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 54 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 55 | // 0.1 second flash of LED4 |
Mohammed_Abo_Arais | 0:292a5636b86d | 56 | DigitalOut led4(LED4); |
Mohammed_Abo_Arais | 0:292a5636b86d | 57 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 58 | Timeout t4; |
Mohammed_Abo_Arais | 0:292a5636b86d | 59 | void t4out(void) |
Mohammed_Abo_Arais | 0:292a5636b86d | 60 | { |
Mohammed_Abo_Arais | 0:292a5636b86d | 61 | led4 = 0; |
Mohammed_Abo_Arais | 0:292a5636b86d | 62 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 63 | void blip4(void) |
Mohammed_Abo_Arais | 0:292a5636b86d | 64 | { |
Mohammed_Abo_Arais | 0:292a5636b86d | 65 | led4 = 1; |
Mohammed_Abo_Arais | 0:292a5636b86d | 66 | t4.attach(&t4out, 0.1); |
Mohammed_Abo_Arais | 0:292a5636b86d | 67 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 68 | ///////////////////////////////////////////////////////////// |
Mohammed_Abo_Arais | 0:292a5636b86d | 69 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 70 | int main() |
Mohammed_Abo_Arais | 0:292a5636b86d | 71 | { |
Mohammed_Abo_Arais | 0:292a5636b86d | 72 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 73 | GPS_Time q1; |
Mohammed_Abo_Arais | 0:292a5636b86d | 74 | // SET THIS. |
Mohammed_Abo_Arais | 0:292a5636b86d | 75 | // Ensure you set the baud rate to match your serial |
Mohammed_Abo_Arais | 0:292a5636b86d | 76 | // communications to your PC/Max/Linux host so you |
Mohammed_Abo_Arais | 0:292a5636b86d | 77 | // can read the messages. |
Mohammed_Abo_Arais | 0:292a5636b86d | 78 | pc.printf("setting the PC baud rate"); |
Mohammed_Abo_Arais | 0:292a5636b86d | 79 | pc.baud(9600); |
Mohammed_Abo_Arais | 0:292a5636b86d | 80 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 81 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 82 | // Tell MODGPS "we want copies of the NMEA sentences". When a callback |
Mohammed_Abo_Arais | 0:292a5636b86d | 83 | // is made our buffers will contain a copy of the last received sentence |
Mohammed_Abo_Arais | 0:292a5636b86d | 84 | // before it was processed/destroyed. |
Mohammed_Abo_Arais | 0:292a5636b86d | 85 | gps.setRmc(rmc); |
Mohammed_Abo_Arais | 0:292a5636b86d | 86 | gps.setGga(gga); |
Mohammed_Abo_Arais | 0:292a5636b86d | 87 | gps.setVtg(vtg); |
Mohammed_Abo_Arais | 0:292a5636b86d | 88 | gps.setUkn(ukn); |
Mohammed_Abo_Arais | 0:292a5636b86d | 89 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 90 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 91 | // SET THIS. |
Mohammed_Abo_Arais | 0:292a5636b86d | 92 | // Most GPS modules use 9600,8,n,1 so that's what |
Mohammed_Abo_Arais | 0:292a5636b86d | 93 | // we default to here. Ensure your GPS module matches |
Mohammed_Abo_Arais | 0:292a5636b86d | 94 | // this, otherwise set it to match. |
Mohammed_Abo_Arais | 0:292a5636b86d | 95 | pc.printf("setting the GPS baud rate"); |
Mohammed_Abo_Arais | 0:292a5636b86d | 96 | gps.baud(9600); |
Mohammed_Abo_Arais | 0:292a5636b86d | 97 | gps.format(8, GPS::None, 1); |
Mohammed_Abo_Arais | 0:292a5636b86d | 98 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 99 | // OPTIONAL |
Mohammed_Abo_Arais | 0:292a5636b86d | 100 | // If you GPS has a 1 pulse per second output you can |
Mohammed_Abo_Arais | 0:292a5636b86d | 101 | // connect it to an Mbed pin. Here you specify what pin |
Mohammed_Abo_Arais | 0:292a5636b86d | 102 | // and on what "edge" teh signal is active. If your GPS |
Mohammed_Abo_Arais | 0:292a5636b86d | 103 | // module has a rising edge at the one second point then |
Mohammed_Abo_Arais | 0:292a5636b86d | 104 | // use GPS::ppsRise |
Mohammed_Abo_Arais | 0:292a5636b86d | 105 | #ifdef PPSPIN |
Mohammed_Abo_Arais | 0:292a5636b86d | 106 | gps.ppsAttach(PPSPIN, GPS::ppsFall); |
Mohammed_Abo_Arais | 0:292a5636b86d | 107 | #endif |
Mohammed_Abo_Arais | 0:292a5636b86d | 108 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 109 | // Sample of a callback to a function when the 1PPS activates. |
Mohammed_Abo_Arais | 0:292a5636b86d | 110 | // For this example, we flash LED2 for 0.1 second. |
Mohammed_Abo_Arais | 0:292a5636b86d | 111 | gps.attach_pps(&blip2); |
Mohammed_Abo_Arais | 0:292a5636b86d | 112 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 113 | // Sample of a callback to a function when a NMEA GGA message is recieved. |
Mohammed_Abo_Arais | 0:292a5636b86d | 114 | // For this example, we flash LED2 for 0.1 second. |
Mohammed_Abo_Arais | 0:292a5636b86d | 115 | gps.attach_gga(&blip3); |
Mohammed_Abo_Arais | 0:292a5636b86d | 116 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 117 | // Sample of a callback to a function when a NMEA RMC message is recieved. |
Mohammed_Abo_Arais | 0:292a5636b86d | 118 | // For this example, we flash LED2 for 0.1 second. |
Mohammed_Abo_Arais | 0:292a5636b86d | 119 | gps.attach_rmc(&blip4); |
Mohammed_Abo_Arais | 0:292a5636b86d | 120 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 121 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 122 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 123 | // Camera Code |
Mohammed_Abo_Arais | 0:292a5636b86d | 124 | pc.printf("Loading camera module"); |
Mohammed_Abo_Arais | 0:292a5636b86d | 125 | JPEGCamera camera(p9, p10); // TX, RX |
Mohammed_Abo_Arais | 0:292a5636b86d | 126 | LocalFileSystem local("local"); //save images on mbed |
Mohammed_Abo_Arais | 0:292a5636b86d | 127 | camera.setPictureSize(JPEGCamera::SIZE320x240); |
Mohammed_Abo_Arais | 0:292a5636b86d | 128 | pc.printf("getting ready for the while loop!"); |
Mohammed_Abo_Arais | 0:292a5636b86d | 129 | int counter = 0; |
Mohammed_Abo_Arais | 0:292a5636b86d | 130 | while(counter <1 ) { |
Mohammed_Abo_Arais | 0:292a5636b86d | 131 | counter++; |
Mohammed_Abo_Arais | 0:292a5636b86d | 132 | // GPS Code |
Mohammed_Abo_Arais | 0:292a5636b86d | 133 | pc.printf("Turning inside the loop()"); |
Mohammed_Abo_Arais | 0:292a5636b86d | 134 | // Every 3 seconds, flip LED1 and print the basic GPS info. |
Mohammed_Abo_Arais | 0:292a5636b86d | 135 | pc.printf("hello GPS"); |
Mohammed_Abo_Arais | 0:292a5636b86d | 136 | wait(3); |
Mohammed_Abo_Arais | 0:292a5636b86d | 137 | myled1 = 1; |
Mohammed_Abo_Arais | 0:292a5636b86d | 138 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 139 | // Demonstrate how to find out the GPS location co-ords. |
Mohammed_Abo_Arais | 0:292a5636b86d | 140 | pc.printf("Method 1. Lat = %.4f ", gps.latitude()); |
Mohammed_Abo_Arais | 0:292a5636b86d | 141 | pc.printf("Lon = %.4f ", gps.longitude()); |
Mohammed_Abo_Arais | 0:292a5636b86d | 142 | pc.printf("Alt = %.4f ", gps.altitude()); |
Mohammed_Abo_Arais | 0:292a5636b86d | 143 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 144 | // Gran a snapshot of the current time. |
Mohammed_Abo_Arais | 0:292a5636b86d | 145 | gps.timeNow(&q1); |
Mohammed_Abo_Arais | 0:292a5636b86d | 146 | pc.printf("%02d:%02d:%02d %02d/%02d/%04d\r\n", |
Mohammed_Abo_Arais | 0:292a5636b86d | 147 | q1.hour, q1.minute, q1.second, q1.day, q1.month, q1.year); |
Mohammed_Abo_Arais | 0:292a5636b86d | 148 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 149 | // Alternative method that does the same thing. |
Mohammed_Abo_Arais | 0:292a5636b86d | 150 | pc.printf("Method 2. Lat = %.4f ", gps.latitude()); |
Mohammed_Abo_Arais | 0:292a5636b86d | 151 | pc.printf("Lon = %.4f ", gps.longitude()); |
Mohammed_Abo_Arais | 0:292a5636b86d | 152 | pc.printf("Alt = %.4f ", gps.altitude()); |
Mohammed_Abo_Arais | 0:292a5636b86d | 153 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 154 | GPS_Time *q2 = gps.timeNow(); |
Mohammed_Abo_Arais | 0:292a5636b86d | 155 | pc.printf("%02d:%02d:%02d %02d/%02d/%04d\r\n\n", |
Mohammed_Abo_Arais | 0:292a5636b86d | 156 | q2->hour, q2->minute, q2->second, q2->day, q2->month, q2->year); |
Mohammed_Abo_Arais | 0:292a5636b86d | 157 | delete(q2); |
Mohammed_Abo_Arais | 0:292a5636b86d | 158 | myled1 = 0; |
Mohammed_Abo_Arais | 0:292a5636b86d | 159 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 160 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 161 | //////////////////// |
Mohammed_Abo_Arais | 0:292a5636b86d | 162 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 163 | //Temperature Sensor Code |
Mohammed_Abo_Arais | 0:292a5636b86d | 164 | pc.printf("hello TEMP"); |
Mohammed_Abo_Arais | 0:292a5636b86d | 165 | int done=0; |
Mohammed_Abo_Arais | 0:292a5636b86d | 166 | float temp,hum; |
Mohammed_Abo_Arais | 0:292a5636b86d | 167 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 168 | RHT03 humtemp(p24); //Initalise the RHT03 (change pin number to the pin its connected to) |
Mohammed_Abo_Arais | 0:292a5636b86d | 169 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 170 | while(!done) { //Loop keeps running until RHT03 is read succesfully |
Mohammed_Abo_Arais | 0:292a5636b86d | 171 | wait(2); //Needed to make sure the sensor has time to initalise and so its not polled too quickly |
Mohammed_Abo_Arais | 0:292a5636b86d | 172 | if(humtemp.readData() == RHT_ERROR_NONE) done=1; //Request data from the RHT03 |
Mohammed_Abo_Arais | 0:292a5636b86d | 173 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 174 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 175 | temp = humtemp.getTemperatureC(); //Gets the current temperature in centigrade |
Mohammed_Abo_Arais | 0:292a5636b86d | 176 | hum = humtemp.getHumidity(); //Gets the current humidity in percentage |
Mohammed_Abo_Arais | 0:292a5636b86d | 177 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 178 | pc.printf("Temperature is %f C \r\n",temp); |
Mohammed_Abo_Arais | 0:292a5636b86d | 179 | pc.printf("Humidity is %f % \r\n",hum); |
Mohammed_Abo_Arais | 0:292a5636b86d | 180 | wait(3); |
Mohammed_Abo_Arais | 0:292a5636b86d | 181 | ///////////////////////////////////////////////// |
Mohammed_Abo_Arais | 0:292a5636b86d | 182 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 183 | //camera Code |
Mohammed_Abo_Arais | 0:292a5636b86d | 184 | Timer timer; |
Mohammed_Abo_Arais | 0:292a5636b86d | 185 | pc.printf("starting timer..."); |
Mohammed_Abo_Arais | 0:292a5636b86d | 186 | timer.start(); |
Mohammed_Abo_Arais | 0:292a5636b86d | 187 | pc.printf("hello CAMERA"); |
Mohammed_Abo_Arais | 0:292a5636b86d | 188 | for (int i = 1; i < 5; i++) { |
Mohammed_Abo_Arais | 0:292a5636b86d | 189 | if (camera.isReady()) { |
Mohammed_Abo_Arais | 0:292a5636b86d | 190 | char filename[32]; |
Mohammed_Abo_Arais | 0:292a5636b86d | 191 | sprintf(filename, "/local/pict%03d.jpg", i); |
Mohammed_Abo_Arais | 0:292a5636b86d | 192 | printf("Picture: %s ", filename); |
Mohammed_Abo_Arais | 0:292a5636b86d | 193 | if (camera.takePicture(filename)) { |
Mohammed_Abo_Arais | 0:292a5636b86d | 194 | while (camera.isProcessing()) { |
Mohammed_Abo_Arais | 0:292a5636b86d | 195 | camera.processPicture(); |
Mohammed_Abo_Arais | 0:292a5636b86d | 196 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 197 | myled1 = 1; //show successful picture was taken |
Mohammed_Abo_Arais | 0:292a5636b86d | 198 | wait(2.0); |
Mohammed_Abo_Arais | 0:292a5636b86d | 199 | myled1 = 0; |
Mohammed_Abo_Arais | 0:292a5636b86d | 200 | } else { |
Mohammed_Abo_Arais | 0:292a5636b86d | 201 | printf("take picture failed\n"); |
Mohammed_Abo_Arais | 0:292a5636b86d | 202 | myled3 = 1; //show picture take failed |
Mohammed_Abo_Arais | 0:292a5636b86d | 203 | wait(2.0); |
Mohammed_Abo_Arais | 0:292a5636b86d | 204 | myled3 = 0; |
Mohammed_Abo_Arais | 0:292a5636b86d | 205 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 206 | } else { |
Mohammed_Abo_Arais | 0:292a5636b86d | 207 | printf("camera is not ready\n"); |
Mohammed_Abo_Arais | 0:292a5636b86d | 208 | myled4 = 1; //show camera is not ready |
Mohammed_Abo_Arais | 0:292a5636b86d | 209 | wait(2.0); |
Mohammed_Abo_Arais | 0:292a5636b86d | 210 | myled4 = 0; |
Mohammed_Abo_Arais | 0:292a5636b86d | 211 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 212 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 213 | myled2 = 1; //show end of sequence |
Mohammed_Abo_Arais | 0:292a5636b86d | 214 | wait(2.0); |
Mohammed_Abo_Arais | 0:292a5636b86d | 215 | myled2 = 0; |
Mohammed_Abo_Arais | 0:292a5636b86d | 216 | printf("time = %f\n", timer.read()); |
Mohammed_Abo_Arais | 0:292a5636b86d | 217 | //////////////////////////////////////////////////// |
Mohammed_Abo_Arais | 0:292a5636b86d | 218 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 219 | //Xbee Code |
Mohammed_Abo_Arais | 0:292a5636b86d | 220 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 221 | pc.printf("i'm Sending.."); |
Mohammed_Abo_Arais | 0:292a5636b86d | 222 | XBee.printf("Hello"); |
Mohammed_Abo_Arais | 0:292a5636b86d | 223 | wait(1.0); |
Mohammed_Abo_Arais | 0:292a5636b86d | 224 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 225 | ///////////////////////////////////////////// |
Mohammed_Abo_Arais | 0:292a5636b86d | 226 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 227 | |
Mohammed_Abo_Arais | 0:292a5636b86d | 228 | } |
Mohammed_Abo_Arais | 0:292a5636b86d | 229 | } |