![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
2018.08能代CORE'S キッチン ミッション用プログラム
Fork of mission by
main.cpp
- Committer:
- ShioHitomi
- Date:
- 2018-08-20
- Revision:
- 4:82660534b32d
- Parent:
- 3:0562feabce7b
- Child:
- 5:b4ebd3587dae
File content as of revision 4:82660534b32d:
#include "mbed.h" #include "math.h" #include "BMP180.h" #define p0 1013.25f//海面気圧 #define TIME_TOP 17 #define TIME_WATER 94 #define TIME_BUZZER 274 #define NUM 5 #define RATE 20 #define JUDGE_ALT 2.0 enum PHASE{EGG,SERVO,CLOSE,RISE,DROP,BUZZER} Phase; enum MOVE{HEAT,CRACK,OPEN,HUTA,TOP,HEAT_BUZZER} Move; PwmOut servo_crack1(p21); PwmOut servo_crack2(p22); PwmOut servo_open1(p23); PwmOut servo_open2(p24); DigitalIn rec1(p18); DigitalIn rec2(p19); DigitalOut heat(p25); DigitalOut buzzer(p16); DigitalOut myled1(LED1); DigitalOut myled2(LED2); DigitalOut myled3(LED3); DigitalOut myled4(LED4); BMP180 bmp (p28, p27); LocalFileSystem local("local"); Timer timer_acc; Timer timer_top; Timer timer_all; Ticker tic_mission; Ticker tic_buzzer; bool Save; void _mission(); void _heater_acc(); void _buzzer(); void _data(); void _servo(); float _getAlt(float press, float temp); float _median(float data[], int num); float Med_alt,Maeno_alt; float Pressure,Temperature,Altitude; float alt[NUM],max=-5000; float t; int Cnt_top=0,Cnt_water=0; int u=0; FILE *fp; int main(){ bmp.Initialize(BMP180_OSS_ULTRA_LOW_POWER); timer_all.start(); servo_crack1.period_ms(20); servo_crack2.period_ms(20); servo_open1.period_ms(20); servo_open2.period_ms(20); servo_crack1.pulsewidth(0.001); servo_crack2.pulsewidth(0.001); for(float j=0;j<0.00009;j+=0.00001){ servo_open1.pulsewidth(0.00099-j); wait(0.02); servo_open2.pulsewidth(0.00094-j); wait(0.02); } fp = fopen("/local/out.txt", "a"); fprintf(fp,"%f:Hello,World\n\r"); fclose(fp); buzzer=0; _heater_acc(); Phase=EGG; tic_mission.attach(&_mission,1.0/20); while(1){ if(Save){ _data(); } if(timer_top.read()>=TIME_BUZZER){ buzzer=0; } } } void _mission(){ if(Phase==BUZZER){ _buzzer(); } myled4=!myled4; switch(Phase){ case EGG: myled1=0; myled2=0; for(float i=0;i<0.00045;i+=0.00005){ servo_crack1.pulsewidth(0.001+i); wait(0.02); servo_crack2.pulsewidth(0.001+i); wait(0.02); } t=timer_all.read(); Move=CRACK; _data(); Phase=SERVO; break; case SERVO: if(timer_all.read()-t>=0.5){ for(float j=0;j<0.00009;j+=0.00001){ servo_open1.pulsewidth(0.0009+j); wait(0.02); servo_open2.pulsewidth(0.00085+j); wait(0.02); } Move=OPEN; _data(); Save=true; Phase=CLOSE; } break; case CLOSE: if(timer_all.read()-t>=1.5){ for(float j=0;j<0.00009;j+=0.00001){ servo_open1.pulsewidth(0.00099-j); wait(0.02); servo_open2.pulsewidth(0.00094-j); wait(0.02); } Move=HUTA; _data(); Save=true; Phase=RISE; } break; case RISE: for(int j=0;j<NUM;j++){ bmp.ReadData(&Temperature,&Pressure); alt[j]=_getAlt(Pressure,Temperature); } Med_alt=_median(alt,NUM); if(Med_alt>max){ max=Med_alt; Cnt_top=0; }else if(max-Med_alt>=JUDGE_ALT){ Cnt_top++; } if(Cnt_top>=3||timer_acc.read()>=TIME_TOP){ myled1=1; timer_top.start(); Phase=DROP; Move=TOP; Save=true; _data(); } break; case DROP: Maeno_alt=Med_alt; for(int i=0;i<NUM;i++){ bmp.ReadData(&Temperature,&Pressure); alt[i]=_getAlt(Pressure,Temperature); } Med_alt=_median(alt,NUM); if(Maeno_alt-Med_alt>=-5.0&&Maeno_alt-Med_alt<=5.0){ Cnt_water++; }else{ Cnt_water=0; } if(Cnt_water>=3||timer_top.read()>=TIME_WATER){ myled2=1; buzzer=1; //heat=0; Move=HEAT_BUZZER; _data(); Save=true; Phase=BUZZER; } break; } } void _heater_acc(){ heat=0; while(1){ if(u!=rec1){ heat=!heat; u=rec1; Move=HEAT; Save=true; _data(); } if(rec2==1){ heat=1; timer_acc.start(); break; } } } void _buzzer(){ myled3=!myled3; if(rec2==1){ buzzer=1; }else if(rec2==0){ buzzer=0; } } float _getAlt(float press, float temp){ return (pow((p0/press), (1.0f/5.257f))-1.0f)*(temp+273.15f)/0.0065f; } float _median(float data[], int num){ float *data_cpy, ans; data_cpy = new float[num]; memcpy(data_cpy,data,sizeof(float)*num); for(int i=0; i<num; i++){ for(int j=0; j<num-i-1; j++){ if(data_cpy[j]>data_cpy[j+1]){ float buff = data_cpy[j+1]; data_cpy[j+1] = data_cpy[j]; data_cpy[j] = buff; } } } if(num%2!=0) ans = data_cpy[num/2]; else ans = (data_cpy[num/2-1]+data_cpy[num/2])/2.0; delete[] data_cpy; return ans; } void _data(){ Save=false; fp = fopen("/local/out.txt", "a"); fprintf(fp,"%f:%d\n\r",timer_all.read(),Move); fclose(fp); }