Sat program
Dependencies: Adafruit_GFX Adafruit_RTCLib BMP180 L3GD20 LSM303DLHC SHTx mbed
main.cpp@1:526ac0828b77, 2016-04-05 (annotated)
- Committer:
- oscarvzfz
- Date:
- Tue Apr 05 16:17:27 2016 +0000
- Revision:
- 1:526ac0828b77
- Parent:
- 0:07c50519b515
blabla
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
oscarvzfz | 0:07c50519b515 | 1 | #include "mbed.h" |
oscarvzfz | 0:07c50519b515 | 2 | #include "Adafruit_SSD1306.h" |
oscarvzfz | 0:07c50519b515 | 3 | #include "DS1307.h" |
oscarvzfz | 0:07c50519b515 | 4 | #include "SHTx/sht15.hpp" |
oscarvzfz | 0:07c50519b515 | 5 | #include "L3GD20.h" |
oscarvzfz | 0:07c50519b515 | 6 | #include "LSM303DLHC.h" |
oscarvzfz | 0:07c50519b515 | 7 | #include "BMP180.h" |
oscarvzfz | 0:07c50519b515 | 8 | #include "MS5803.h" |
oscarvzfz | 1:526ac0828b77 | 9 | #include "SDFileSystem.h" |
oscarvzfz | 1:526ac0828b77 | 10 | #include "FastJpegCamera.h" |
oscarvzfz | 1:526ac0828b77 | 11 | #include<stdio.h> |
oscarvzfz | 1:526ac0828b77 | 12 | #include<string.h> |
oscarvzfz | 1:526ac0828b77 | 13 | #include<iostream> |
oscarvzfz | 1:526ac0828b77 | 14 | #include<fstream> |
oscarvzfz | 1:526ac0828b77 | 15 | #include<errno.h> |
oscarvzfz | 0:07c50519b515 | 16 | |
oscarvzfz | 1:526ac0828b77 | 17 | //Puertos |
oscarvzfz | 1:526ac0828b77 | 18 | DigitalOut LEDs[4] = { DigitalOut(LED4), DigitalOut(LED3), DigitalOut(LED2), DigitalOut(LED1)}; |
oscarvzfz | 0:07c50519b515 | 19 | I2C myI2C(p9,p10); |
oscarvzfz | 0:07c50519b515 | 20 | Adafruit_SSD1306_I2c o(myI2C,D13,0x7A,64,128); |
oscarvzfz | 1:526ac0828b77 | 21 | //Serial pc(USBTX,USBRX); |
oscarvzfz | 1:526ac0828b77 | 22 | Serial xbee(p28,p27); |
oscarvzfz | 0:07c50519b515 | 23 | RtcDs1307 gRtc ( myI2C ); |
oscarvzfz | 0:07c50519b515 | 24 | DateTime dt; |
oscarvzfz | 0:07c50519b515 | 25 | SHTx::SHT15 sensor(p22, p21); |
oscarvzfz | 0:07c50519b515 | 26 | L3GD20 gyro(p9, p10); |
oscarvzfz | 0:07c50519b515 | 27 | LSM303DLHC compass(p9, p10); |
oscarvzfz | 1:526ac0828b77 | 28 | BMP180 bmp180(&myI2C); |
oscarvzfz | 1:526ac0828b77 | 29 | AnalogIn uv(p20); |
oscarvzfz | 1:526ac0828b77 | 30 | AnalogIn Vol(p19); |
oscarvzfz | 1:526ac0828b77 | 31 | MS5803 press_sensor( p9, p10, 0x76); |
oscarvzfz | 1:526ac0828b77 | 32 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
oscarvzfz | 1:526ac0828b77 | 33 | Timer timer; |
oscarvzfz | 1:526ac0828b77 | 34 | InterruptIn geiger(p29); |
oscarvzfz | 1:526ac0828b77 | 35 | |
oscarvzfz | 1:526ac0828b77 | 36 | |
oscarvzfz | 1:526ac0828b77 | 37 | //variables |
oscarvzfz | 0:07c50519b515 | 38 | float ax, ay, az; |
oscarvzfz | 0:07c50519b515 | 39 | float mx, my, mz; |
oscarvzfz | 0:07c50519b515 | 40 | float gx, gy, gz; |
oscarvzfz | 0:07c50519b515 | 41 | double yaw,pitch,roll; |
oscarvzfz | 0:07c50519b515 | 42 | int press; |
oscarvzfz | 0:07c50519b515 | 43 | float temp; |
oscarvzfz | 0:07c50519b515 | 44 | float uv_rad=0; |
oscarvzfz | 1:526ac0828b77 | 45 | using namespace std; |
oscarvzfz | 1:526ac0828b77 | 46 | int m=0; |
oscarvzfz | 1:526ac0828b77 | 47 | int loop_count; |
oscarvzfz | 1:526ac0828b77 | 48 | float amperaje; |
oscarvzfz | 1:526ac0828b77 | 49 | float voltaje; |
oscarvzfz | 1:526ac0828b77 | 50 | char file[32]; |
oscarvzfz | 1:526ac0828b77 | 51 | char send_buffer[15000]; |
oscarvzfz | 1:526ac0828b77 | 52 | char final[20000]; |
oscarvzfz | 1:526ac0828b77 | 53 | int cont=0; |
oscarvzfz | 1:526ac0828b77 | 54 | #define M_PI 3.14159265358979323846 |
oscarvzfz | 1:526ac0828b77 | 55 | #define archivof "/sd/fotos/pic%05d.jpg" |
oscarvzfz | 1:526ac0828b77 | 56 | #define archivod "/sd/datos/dato%05d.txt" |
oscarvzfz | 0:07c50519b515 | 57 | |
oscarvzfz | 1:526ac0828b77 | 58 | void contador() |
oscarvzfz | 1:526ac0828b77 | 59 | { |
oscarvzfz | 1:526ac0828b77 | 60 | cont++; |
oscarvzfz | 1:526ac0828b77 | 61 | } |
oscarvzfz | 0:07c50519b515 | 62 | |
oscarvzfz | 1:526ac0828b77 | 63 | int main() { |
oscarvzfz | 1:526ac0828b77 | 64 | wait(3); |
oscarvzfz | 1:526ac0828b77 | 65 | |
oscarvzfz | 1:526ac0828b77 | 66 | o.clearDisplay(); |
oscarvzfz | 1:526ac0828b77 | 67 | o.setTextCursor(0,0); |
oscarvzfz | 1:526ac0828b77 | 68 | //pc.printf("CANSAT v.2 UPAEP\n\r"); |
oscarvzfz | 0:07c50519b515 | 69 | |
oscarvzfz | 1:526ac0828b77 | 70 | o.printf("CANSAT v.2 UPAEP\n\r"); |
oscarvzfz | 1:526ac0828b77 | 71 | o.display(); |
oscarvzfz | 1:526ac0828b77 | 72 | geiger.mode(PullUp); |
oscarvzfz | 1:526ac0828b77 | 73 | geiger.rise(&contador); |
oscarvzfz | 1:526ac0828b77 | 74 | |
oscarvzfz | 1:526ac0828b77 | 75 | wait(1); |
oscarvzfz | 1:526ac0828b77 | 76 | LEDs[0]=!LEDs[0]; |
oscarvzfz | 1:526ac0828b77 | 77 | |
oscarvzfz | 1:526ac0828b77 | 78 | mkdir("/sd/fotos", 0777); |
oscarvzfz | 1:526ac0828b77 | 79 | mkdir("/sd/datos", 0777); |
oscarvzfz | 0:07c50519b515 | 80 | sensor.setOTPReload(false); |
oscarvzfz | 0:07c50519b515 | 81 | sensor.setResolution(true); |
oscarvzfz | 1:526ac0828b77 | 82 | timer.start(); |
oscarvzfz | 1:526ac0828b77 | 83 | xbee.baud(115200); |
oscarvzfz | 1:526ac0828b77 | 84 | FastJpegCamera fast_jpeg_camera(p13, p14, xbee); |
oscarvzfz | 1:526ac0828b77 | 85 | o.clearDisplay(); |
oscarvzfz | 1:526ac0828b77 | 86 | o.setTextCursor(0,0); |
oscarvzfz | 1:526ac0828b77 | 87 | o.printf("Tomara la foto, la foto debe tardar aproximadamente 4 segundos, si tarda es que esta mal la camara"); |
oscarvzfz | 1:526ac0828b77 | 88 | o.display(); |
oscarvzfz | 1:526ac0828b77 | 89 | |
oscarvzfz | 1:526ac0828b77 | 90 | while(1) |
oscarvzfz | 1:526ac0828b77 | 91 | { |
oscarvzfz | 1:526ac0828b77 | 92 | wait(2); |
oscarvzfz | 1:526ac0828b77 | 93 | xbee.baud(115200); |
oscarvzfz | 1:526ac0828b77 | 94 | loop_count += 1; |
oscarvzfz | 1:526ac0828b77 | 95 | //h=0; |
oscarvzfz | 1:526ac0828b77 | 96 | //t=1; |
oscarvzfz | 1:526ac0828b77 | 97 | //pc.printf("%f\n\r",timer.read()); |
oscarvzfz | 1:526ac0828b77 | 98 | timer.reset(); |
oscarvzfz | 1:526ac0828b77 | 99 | fast_jpeg_camera.shoot(loop_count); |
oscarvzfz | 1:526ac0828b77 | 100 | FILE *picture; |
oscarvzfz | 0:07c50519b515 | 101 | |
oscarvzfz | 1:526ac0828b77 | 102 | int size, read_size, packet_index; |
oscarvzfz | 1:526ac0828b77 | 103 | char send_buffer[10240]; |
oscarvzfz | 1:526ac0828b77 | 104 | packet_index = 1; |
oscarvzfz | 1:526ac0828b77 | 105 | char file[32]; |
oscarvzfz | 1:526ac0828b77 | 106 | sprintf(file, archivof, loop_count); |
oscarvzfz | 1:526ac0828b77 | 107 | picture = fopen(file, "r"); |
oscarvzfz | 1:526ac0828b77 | 108 | //printf("Getting Picture Size\n"); |
oscarvzfz | 0:07c50519b515 | 109 | |
oscarvzfz | 0:07c50519b515 | 110 | |
oscarvzfz | 1:526ac0828b77 | 111 | fseek(picture, 0, SEEK_END); |
oscarvzfz | 1:526ac0828b77 | 112 | size = ftell(picture); |
oscarvzfz | 1:526ac0828b77 | 113 | fseek(picture, 0, SEEK_SET); |
oscarvzfz | 1:526ac0828b77 | 114 | //printf("Total Picture size: %i\n",size); |
oscarvzfz | 1:526ac0828b77 | 115 | // xbee.printf("Total Picture size: %i\n",size); |
oscarvzfz | 1:526ac0828b77 | 116 | |
oscarvzfz | 1:526ac0828b77 | 117 | while(!feof(picture)) { |
oscarvzfz | 1:526ac0828b77 | 118 | //while(packet_index = 1){ |
oscarvzfz | 1:526ac0828b77 | 119 | //Read from the file into our send buffer |
oscarvzfz | 1:526ac0828b77 | 120 | read_size = fread(send_buffer, 1, sizeof(send_buffer)-1, picture); |
oscarvzfz | 1:526ac0828b77 | 121 | |
oscarvzfz | 1:526ac0828b77 | 122 | //Send data through our socket |
oscarvzfz | 1:526ac0828b77 | 123 | |
oscarvzfz | 1:526ac0828b77 | 124 | packet_index++; |
oscarvzfz | 1:526ac0828b77 | 125 | |
oscarvzfz | 1:526ac0828b77 | 126 | } |
oscarvzfz | 1:526ac0828b77 | 127 | |
oscarvzfz | 1:526ac0828b77 | 128 | fclose(picture); |
oscarvzfz | 1:526ac0828b77 | 129 | o.clearDisplay(); |
oscarvzfz | 1:526ac0828b77 | 130 | o.setTextCursor(0,0); |
oscarvzfz | 1:526ac0828b77 | 131 | o.printf("Foto %d\n\r",loop_count ); |
oscarvzfz | 1:526ac0828b77 | 132 | o.display(); |
oscarvzfz | 1:526ac0828b77 | 133 | o.printf("Datos \n\r"); |
oscarvzfz | 1:526ac0828b77 | 134 | fclose(picture); |
oscarvzfz | 1:526ac0828b77 | 135 | LEDs[1]=!LEDs[1]; |
oscarvzfz | 1:526ac0828b77 | 136 | bmp180.init(); |
oscarvzfz | 1:526ac0828b77 | 137 | compass.read(&ax, &ay, &az, &mx, &my, &mz); |
oscarvzfz | 1:526ac0828b77 | 138 | gyro.read(&gx, &gy, &gz); |
oscarvzfz | 1:526ac0828b77 | 139 | roll=atan2(ay, az); |
oscarvzfz | 1:526ac0828b77 | 140 | |
oscarvzfz | 1:526ac0828b77 | 141 | pitch=atan((-ax)/(ay*sin(roll)+az*cos(roll))); |
oscarvzfz | 1:526ac0828b77 | 142 | yaw=atan2(mz*sin(roll)-my*cos(roll),mx*cos(pitch)+my*sin(pitch)*sin(roll)+mz*sin(pitch)*cos(roll)); |
oscarvzfz | 1:526ac0828b77 | 143 | press_sensor.Barometer_MS5803(); |
oscarvzfz | 1:526ac0828b77 | 144 | bmp180.startTemperature(); |
oscarvzfz | 1:526ac0828b77 | 145 | wait_ms(5); // Wait for conversion to complete |
oscarvzfz | 1:526ac0828b77 | 146 | if(bmp180.getTemperature(&temp) != 0) {o.printf("Error getting temperature\n");} |
oscarvzfz | 1:526ac0828b77 | 147 | bmp180.startPressure(BMP180::ULTRA_LOW_POWER); |
oscarvzfz | 1:526ac0828b77 | 148 | wait_ms(10); // Wait for conversion to complete |
oscarvzfz | 1:526ac0828b77 | 149 | if(bmp180.getPressure(&press) != 0) {o.printf("Error getting pressure\n");} |
oscarvzfz | 1:526ac0828b77 | 150 | xbee.baud(9600); |
oscarvzfz | 1:526ac0828b77 | 151 | uv_rad=((uv.read()*3.3)-1)/0.125; |
oscarvzfz | 1:526ac0828b77 | 152 | if(uv_rad<0)uv_rad=0; |
oscarvzfz | 1:526ac0828b77 | 153 | sensor.update(); |
oscarvzfz | 1:526ac0828b77 | 154 | dt = gRtc.now(); |
oscarvzfz | 1:526ac0828b77 | 155 | |
oscarvzfz | 1:526ac0828b77 | 156 | voltaje=(Vol.read()*3.3)/(.2423); |
oscarvzfz | 1:526ac0828b77 | 157 | |
oscarvzfz | 1:526ac0828b77 | 158 | |
oscarvzfz | 1:526ac0828b77 | 159 | o.setTextCursor(0,0); |
oscarvzfz | 1:526ac0828b77 | 160 | o.clearDisplay(); |
oscarvzfz | 1:526ac0828b77 | 161 | |
oscarvzfz | 1:526ac0828b77 | 162 | char fil[32]; |
oscarvzfz | 1:526ac0828b77 | 163 | sprintf(fil, archivod, loop_count); |
oscarvzfz | 1:526ac0828b77 | 164 | FILE *fp = fopen(fil, "w"); |
oscarvzfz | 1:526ac0828b77 | 165 | |
oscarvzfz | 1:526ac0828b77 | 166 | |
oscarvzfz | 1:526ac0828b77 | 167 | o.printf("%u/%u/%02u %2u:%02u:%02u\n\r",dt.month(),dt.day(),dt.year(),(dt.hour()),dt.minute(),dt.second()); |
oscarvzfz | 1:526ac0828b77 | 168 | o.printf("Temperatura: %3.2f C\r\n", sensor.getTemperature()); |
oscarvzfz | 1:526ac0828b77 | 169 | o.printf("Humedad: %3.2f %%\r\n", sensor.getHumidity()); |
oscarvzfz | 1:526ac0828b77 | 170 | o.printf("P=%d Pa\n\rT=%.2fC\n\r", press, temp); |
oscarvzfz | 1:526ac0828b77 | 171 | o.printf("r:%.1fp:%.1fy:%.1f\n\r",roll*180/M_PI,pitch*180/M_PI,yaw*180/M_PI); |
oscarvzfz | 1:526ac0828b77 | 172 | o.printf("UV=%.3fmW/cm^2\n\r",uv_rad); |
oscarvzfz | 1:526ac0828b77 | 173 | o.printf("P=%.0fPa T=%.2fC\r\n", press_sensor.MS5803_Pressure()*100,press_sensor.MS5803_Temperature()); |
oscarvzfz | 1:526ac0828b77 | 174 | o.printf("Vol:%f V\n\r",voltaje); |
oscarvzfz | 1:526ac0828b77 | 175 | o.printf("Geiger: %d en tiempo:%f\n\r",cont,timer.read()); |
oscarvzfz | 1:526ac0828b77 | 176 | |
oscarvzfz | 1:526ac0828b77 | 177 | fprintf(fp,"%u/%u/%02u %2u:%02u:%02u\n\r",dt.month(),dt.day(),dt.year(),(dt.hour()),dt.minute(),dt.second()); |
oscarvzfz | 1:526ac0828b77 | 178 | fprintf(fp,"Temperatura: %3.2f C\r\n", sensor.getTemperature()); |
oscarvzfz | 1:526ac0828b77 | 179 | fprintf(fp,"Humedad: %3.2f %%\r\n", sensor.getHumidity()); |
oscarvzfz | 1:526ac0828b77 | 180 | fprintf(fp,"P=%d Pa\n\rT=%.2fC\n\r", press, temp); |
oscarvzfz | 1:526ac0828b77 | 181 | fprintf(fp,"r:%.1fp:%.1fy:%.1f\n\r",roll*180/M_PI,pitch*180/M_PI,yaw*180/M_PI); |
oscarvzfz | 1:526ac0828b77 | 182 | fprintf(fp,"UV=%.3fmW/cm^2\n\r",uv_rad); |
oscarvzfz | 1:526ac0828b77 | 183 | fprintf(fp,"P=%.0fPa T=%.2fC\r\n", press_sensor.MS5803_Pressure()*100,press_sensor.MS5803_Temperature()); |
oscarvzfz | 1:526ac0828b77 | 184 | fprintf(fp,"Vol:%f V\n\r",voltaje); |
oscarvzfz | 1:526ac0828b77 | 185 | fprintf(fp,"Geiger: %d en tiempo:%f\n\r",cont,timer.read()); |
oscarvzfz | 1:526ac0828b77 | 186 | |
oscarvzfz | 1:526ac0828b77 | 187 | cont=0; |
oscarvzfz | 1:526ac0828b77 | 188 | timer.reset(); |
oscarvzfz | 1:526ac0828b77 | 189 | fclose(fp); |
oscarvzfz | 1:526ac0828b77 | 190 | m++; |
oscarvzfz | 1:526ac0828b77 | 191 | |
oscarvzfz | 1:526ac0828b77 | 192 | o.fillCircle(125,61,2,1); |
oscarvzfz | 1:526ac0828b77 | 193 | o.drawCircle(118,61,2,1); |
oscarvzfz | 1:526ac0828b77 | 194 | o.fillCircle(111,61,2,1); |
oscarvzfz | 1:526ac0828b77 | 195 | o.drawCircle(104,61,2,1); |
oscarvzfz | 1:526ac0828b77 | 196 | o.fillCircle(97,61,2,1); |
oscarvzfz | 1:526ac0828b77 | 197 | o.display(); |
oscarvzfz | 1:526ac0828b77 | 198 | |
oscarvzfz | 1:526ac0828b77 | 199 | //Envio |
oscarvzfz | 1:526ac0828b77 | 200 | |
oscarvzfz | 1:526ac0828b77 | 201 | xbee.printf("INI%2u,%2u,%2u,",(dt.hour()),dt.minute(),dt.second()); |
oscarvzfz | 1:526ac0828b77 | 202 | xbee.printf("%.3f,",uv_rad); |
oscarvzfz | 1:526ac0828b77 | 203 | xbee.printf("%2.2f,%2.2f,%2.2f,%2.2f,%2.2f,2.2f,%3.1f,%3.1f,%3.1f,",ax,ay,az,gx,gy,gz,yaw,pitch,roll); |
oscarvzfz | 1:526ac0828b77 | 204 | xbee.printf("%2.2f,%7d,",temp,press); |
oscarvzfz | 1:526ac0828b77 | 205 | xbee.printf("%2.2f,%3.1f,", sensor.getTemperature(),sensor.getHumidity()); |
oscarvzfz | 1:526ac0828b77 | 206 | xbee.printf("%7.0f,%2.2f,", press_sensor.MS5803_Pressure()*100,press_sensor.MS5803_Temperature()); |
oscarvzfz | 1:526ac0828b77 | 207 | xbee.printf("%1.1f,",voltaje); |
oscarvzfz | 1:526ac0828b77 | 208 | xbee.printf("%5u,",cont); |
oscarvzfz | 1:526ac0828b77 | 209 | xbee.printf("%7i,",size); |
oscarvzfz | 1:526ac0828b77 | 210 | m=0; |
oscarvzfz | 1:526ac0828b77 | 211 | while(m<read_size) |
oscarvzfz | 1:526ac0828b77 | 212 | { |
oscarvzfz | 1:526ac0828b77 | 213 | xbee.printf("%02hx",send_buffer[m]); |
oscarvzfz | 1:526ac0828b77 | 214 | m++; |
oscarvzfz | 1:526ac0828b77 | 215 | |
oscarvzfz | 1:526ac0828b77 | 216 | } |
oscarvzfz | 1:526ac0828b77 | 217 | xbee.printf("FIN"); |
oscarvzfz | 1:526ac0828b77 | 218 | m=0; |
oscarvzfz | 1:526ac0828b77 | 219 | |
oscarvzfz | 1:526ac0828b77 | 220 | strcpy(send_buffer, ""); |
oscarvzfz | 0:07c50519b515 | 221 | |
oscarvzfz | 0:07c50519b515 | 222 | } |
oscarvzfz | 0:07c50519b515 | 223 | |
oscarvzfz | 1:526ac0828b77 | 224 | } |