![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
2018.08能代CORE'S キッチン ミッション用プログラム
Fork of mission by
main.cpp
- Committer:
- ShioHitomi
- Date:
- 2018-08-08
- Revision:
- 3:0562feabce7b
- Parent:
- 2:b145797d04fb
- Child:
- 4:82660534b32d
File content as of revision 3:0562feabce7b:
#include "mbed.h" #include "math.h" #include "BMP180.h" #define p0 1013.25f//海面気圧 #define TIME_TOP 13 #define TIME_WATER 10 #define TIME_BUZZER 15 #define NUM 5 #define RATE 10 enum PHASE{EGG,SERVO,RISE,DROP,BUZZER} Phase; enum MOVE{HEAT,CRACK,OPEN,TOP,HEAT_BUZZER} Move; PwmOut servo_crack1(p26); PwmOut servo_crack2(p25); PwmOut servo_open1(p24); PwmOut servo_open2(p23); DigitalIn rec1(p5); DigitalIn rec2(p6); DigitalOut heat(p22); DigitalOut buzzer(p21); 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; //Timeout tim_servo; 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=-1000; 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); 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); //tic_buzzer.attach(&_buzzer,1.0/RATE); while(1){ //_buzzer(); /*if(Phase==BUZZER){ tic_mission.detach();*/ if(Save){ _data(); } /*if(timer_top.read()>=TIME_BUZZER){ buzzer=0; }*/ } } void _mission(){ if(Phase==BUZZER){ _buzzer(); } myled4=!myled4; switch(Phase){ case EGG: buzzer=0; myled1=0; myled2=0; servo_crack1.pulsewidth(0.005); servo_crack2.pulsewidth(0.024); t=timer_all.read(); Move=CRACK; Save=true; Phase=SERVO; case SERVO: if(timer_all.read()-t>=1.0){ servo_open1.pulsewidth(0.005); servo_open2.pulsewidth(0.024); Move=OPEN; Save=true; //tim_servo.attach(&_servo, 1.0); 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>=2.0){ 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>=-1.0&&Maeno_alt-Med_alt<=1.0){ Cnt_water++; }else{ Cnt_water=0; } if(/*Cnt_water>=3||*/timer_top.read()>=TIME_WATER){ //fp = fopen("/local/out.txt", "a"); myled2=1; buzzer=1; heat=0; //tic_buzzer.attach(&_buzzer,1/100); Move=HEAT_BUZZER; Save=true; //fclose(fp); Phase=BUZZER; //tic_buzzer.attach(&_buzzer,1.0/40); //tic_mission.detach(); } //break; /*case BUZZER: if(timer_top.read()>=TIME_BUZZER){ fp = fopen("/local/out.txt", "a"); buzzer=0; fprintf(fp, "%f:ブザーOFF\n\r",timer_all.read()); fclose(fp); } break;*/ } } void _heater_acc(){ heat=0; while(1){ if(u!=rec1){ heat=!heat; u=rec1; Move=HEAT; Save=true; _data(); } /*if(rec1==1){ heat=1; Move=HEAT_ON; Save=true; _data(); }else if(rec1==0){ heat=0; Move=HEAT_OFF; Save=true; }*/ if(rec2==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); } /*void _servo(){ servo_open1.pulsewidth(0.005); servo_open2.pulsewidth(0.024); Move=OPEN; Save=true; }*/