CORE / Mbed 2 deprecated mission

Dependencies:   BMP180 mbed

Fork of mission by hitomi shio

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "math.h" 
00003 #include "BMP180.h"
00004 
00005 #define p0 1013.25f//海面気圧
00006 #define TIME_TOP      16
00007 #define TIME_WATER    94
00008 #define TIME_BUZZER   274
00009 #define NUM           5
00010 #define RATE          20
00011 #define JUDGE_ALT     2.0
00012 
00013 enum PHASE{EGG,SERVO,CLOSE,RISE,DROP,BUZZER} Phase;
00014 enum MOVE{HEAT,CRACK,OPEN,HUTA,TOP,HEAT_BUZZER} Move;
00015 
00016 PwmOut         servo_crack1(p21);   
00017 PwmOut         servo_crack2(p22);
00018 PwmOut         servo_open1(p23);   
00019 PwmOut         servo_open2(p24);
00020 DigitalIn      rec1(p18);
00021 DigitalIn      rec2(p19);
00022 DigitalOut     heat(p25);  
00023 DigitalOut     buzzer(p16);
00024 DigitalOut     myled1(LED1);
00025 DigitalOut     myled2(LED2);
00026 DigitalOut     myled3(LED3);
00027 DigitalOut     myled4(LED4);
00028 BMP180 bmp     (p28, p27);
00029 LocalFileSystem local("local"); 
00030 
00031 Timer          timer_acc;
00032 Timer          timer_top; 
00033 Timer          timer_all;
00034 Ticker         tic_mission;
00035 Ticker         tic_buzzer;
00036  
00037 bool           Save;
00038 void           _mission(); 
00039 void           _heater_acc(); 
00040 void           _buzzer();
00041 void           _data();
00042 void           _servo();
00043 float          _getAlt(float press, float temp);
00044 float          _median(float data[], int num);
00045 float          Med_alt,Maeno_alt;
00046 float          Pressure,Temperature,Altitude;
00047 float          alt[NUM],max=-5000;
00048 float          t;
00049 int            Cnt_top=0,Cnt_water=0;
00050 int            u=0;
00051 
00052 FILE *fp; 
00053 
00054 int main(){
00055     bmp.Initialize(BMP180_OSS_ULTRA_LOW_POWER);
00056     timer_all.start();
00057     servo_crack1.period_ms(20);
00058     servo_crack2.period_ms(20);
00059     servo_open1.period_ms(20);
00060     servo_open2.period_ms(20);
00061     servo_crack1.pulsewidth(0.001);
00062     servo_crack2.pulsewidth(0.001);
00063     for(float j=0;j<0.00009;j+=0.00001){
00064         servo_open1.pulsewidth(0.00099-j);
00065         wait(0.02);
00066         servo_open2.pulsewidth(0.00094-j);
00067         wait(0.02);
00068     }
00069     fp = fopen("/local/out.txt", "a"); 
00070     fprintf(fp,"%f:Hello,World\n\r");
00071     fclose(fp);
00072     buzzer=0; 
00073     _heater_acc(); 
00074     Phase=EGG;  
00075     tic_mission.attach(&_mission,1.0/20);
00076     while(1){
00077         if(Save){
00078             _data();
00079         }
00080         if(timer_top.read()>=TIME_BUZZER){
00081             buzzer=0;
00082         }
00083     }
00084 }
00085     
00086     
00087 void _mission(){
00088     if(Phase==BUZZER){ 
00089         _buzzer();
00090     }
00091     myled4=!myled4;
00092     switch(Phase){
00093         case EGG:            
00094                         myled1=0;
00095                         myled2=0;
00096                         for(float i=0;i<0.00045;i+=0.00005){
00097                             servo_crack1.pulsewidth(0.001+i);
00098                             wait(0.02);
00099                             servo_crack2.pulsewidth(0.001+i);
00100                             wait(0.02);
00101                         }            
00102                         t=timer_all.read();
00103                         Move=CRACK;
00104                         _data();
00105                         Phase=SERVO;
00106                         break;
00107                         
00108         case SERVO:     
00109                         if(timer_all.read()-t>=0.5){
00110                             for(float j=0;j<0.00009;j+=0.00001){
00111                                 servo_open1.pulsewidth(0.0009+j);
00112                                 wait(0.02);
00113                                 servo_open2.pulsewidth(0.00085+j);
00114                                 wait(0.02);
00115                             }
00116                             Move=OPEN;
00117                             _data();
00118                             Save=true;
00119                             Phase=CLOSE;
00120                         }
00121                         break;
00122                         
00123         case CLOSE:     
00124                         if(timer_all.read()-t>=1.5){
00125                             for(float j=0;j<0.00009;j+=0.00001){
00126                                 servo_open1.pulsewidth(0.00099-j);
00127                                 wait(0.02);
00128                                 servo_open2.pulsewidth(0.00094-j);
00129                                 wait(0.02);
00130                             }
00131                             Move=HUTA;
00132                             _data();
00133                             Save=true;
00134                             Phase=RISE;
00135                         }
00136                         break;
00137                             
00138         case RISE:      
00139                         for(int j=0;j<NUM;j++){
00140                             bmp.ReadData(&Temperature,&Pressure);
00141                             alt[j]=_getAlt(Pressure,Temperature);
00142                         }
00143                         Med_alt=_median(alt,NUM);
00144                         if(Med_alt>max){
00145                             max=Med_alt;
00146                             Cnt_top=0;
00147                         }else if(max-Med_alt>=JUDGE_ALT){
00148                              Cnt_top++;
00149                         }
00150                         if(Cnt_top>=3||timer_acc.read()>=TIME_TOP){
00151                             myled1=1;
00152                             timer_top.start();
00153                             Phase=DROP;
00154                             Move=TOP;
00155                             Save=true;
00156                             _data();
00157                         }
00158                         break;
00159         case DROP:
00160                         Maeno_alt=Med_alt;
00161                         for(int i=0;i<NUM;i++){
00162                             bmp.ReadData(&Temperature,&Pressure);
00163                             alt[i]=_getAlt(Pressure,Temperature);
00164                         }
00165                         Med_alt=_median(alt,NUM);
00166                         if(Maeno_alt-Med_alt>=-5.0&&Maeno_alt-Med_alt<=5.0){
00167                             Cnt_water++;
00168                         }else{
00169                             Cnt_water=0;
00170                         }
00171                         if(Cnt_water>=3||timer_top.read()>=TIME_WATER){
00172                             myled2=1;
00173                             buzzer=1;
00174                             //heat=0;
00175                             Move=HEAT_BUZZER;
00176                             _data();
00177                             Save=true;
00178                             Phase=BUZZER;
00179                         }
00180                         break;
00181         }  
00182 }
00183 
00184 void _heater_acc(){
00185         heat=0;
00186         while(1){ 
00187             if(u!=rec1){
00188                 heat=!heat;
00189                 u=rec1;
00190                 Move=HEAT;
00191                 Save=true;
00192                 _data();
00193             }
00194             if(rec2==1){
00195                 heat=1;
00196                 timer_acc.start();
00197                 break;
00198             }
00199         }
00200 }
00201 
00202 void _buzzer(){
00203         myled3=!myled3;
00204         if(rec2==1){
00205             buzzer=1;
00206         }else if(rec2==0){
00207             buzzer=0;
00208         }
00209 }
00210 
00211 float _getAlt(float press, float temp){
00212     return (pow((p0/press), (1.0f/5.257f))-1.0f)*(temp+273.15f)/0.0065f;
00213 }
00214      
00215 float _median(float data[], int num){
00216     float *data_cpy, ans;
00217     data_cpy = new float[num]; 
00218     memcpy(data_cpy,data,sizeof(float)*num);
00219  
00220     for(int i=0; i<num; i++){
00221         for(int j=0; j<num-i-1; j++){
00222             if(data_cpy[j]>data_cpy[j+1]){
00223                 float buff = data_cpy[j+1];
00224                 data_cpy[j+1] = data_cpy[j];
00225                 data_cpy[j] = buff;
00226             }
00227         }
00228     }
00229     
00230     if(num%2!=0) ans = data_cpy[num/2];
00231     else         ans = (data_cpy[num/2-1]+data_cpy[num/2])/2.0;
00232     delete[] data_cpy;
00233     return ans;
00234 }  
00235 
00236 void _data(){
00237         Save=false;
00238         fp = fopen("/local/out.txt", "a"); 
00239         fprintf(fp,"%f:%d\n\r",timer_all.read(),Move);
00240         fclose(fp);
00241 }