Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mission by
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 }
Generated on Mon Jul 25 2022 05:22:43 by
1.7.2
