BASIC4MCU | 질문게시판 | 답변 : 외부 인터럽트를 이용해서 모두 정지하려고 하는데요~~
페이지 정보
작성자 master 작성일2018-10-01 23:52 조회585회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=5022
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-10-01 오후 11:53:01// by Ok-Hyun Park//#include <MD_TCS230.h>#include <FreqCount.h>#include <SoftwareSerial.h>#include <DFPlayer_Mini_Mp3.h>#include "ColorMatch.h"#define BLACK_CAL 0#define WHITE_CAL 1#define READ_VAL 2#define LEARN_VAL 3#define LEARN_MODE 'L'#define MATCH_MODE 'M'#define S2_OUT 7#define S3_OUT 6MD_TCS230 CS(S2_OUT,S3_OUT);SoftwareSerial mySerial(10,11);//uint8_t modeOp='M';uint8_t ctIndex;colorData rgb;unsigned long time=0;//char runflag=1;//void setup(){Serial.begin(115200);mySerial.begin(9600);CS.begin();if(modeOp==MATCH_MODE){ CS.setDarkCal(&sdBlack); CS.setWhiteCal(&sdWhite); }mp3_set_serial(mySerial);delay(1);mp3_set_volume(15);}//char getChar(){ while(Serial.available()==0); return(toupper(Serial.read())); }void clearInput(){ while(Serial.read()!=-1); }//char *readASCII(uint8_t size){#define BUF_SIZE(9+1)static char s[BUF_SIZE];uint8_t i=0;char c;s[0]='\0';size--;while((i<size)&&(size<BUF_SIZE)){c=getChar();if(c=='\n')break;s[i++]=c;s[i]='\0';}clearInput();return(s);#undef BUF_SIZE}//uint8_t fsmReadValue(uint8_t state,uint8_t valType){static uint8_t selChannel,readCount;static sensorData sd;switch(state){case 0:{ // 시작하기 위한 안내문을 보여줍니다:Serial.print(F("\n\n값을 읽는 중: "));switch(valType){case BLACK_CAL: Serial.print(("검정색 영점 조정")); break;case WHITE_CAL: Serial.print(("하얀색 영점 조정")); break;case READ_VAL: Serial.print(("색 맞추기")); break;case LEARN_VAL: Serial.print(ct[ctIndex].name); break;default: Serial.print(F("??")); break;}clearInput();if(valType==LEARN_VAL){ char *p; }else{Serial.print(("\n시작하려면 어떤 키든 눌러주세요..."));clearInput();}state++;break;}case 1: CS.read(); state++; break; // 센서 값을 읽기 시작합니다case 2:{ // 값을 읽어 들일 때까지 기다립니다if(CS.available()){switch(valType){case BLACK_CAL: CS.getRaw(&sdBlack); CS.setDarkCal(&sdBlack); break;case WHITE_CAL: CS.getRaw(&sdWhite); CS.setWhiteCal(&sdWhite); break;case READ_VAL: case LEARN_VAL:{CS.getRGB(&rgb);Serial.print(("\nRGB["));Serial.print(rgb.value[TCS230_RGB_R]); Serial.print((","));Serial.print(rgb.value[TCS230_RGB_G]); Serial.print((","));Serial.print(rgb.value[TCS230_RGB_B]); Serial.print(("]"));break;}}state++;}break;}default: state=0; break; // reset fsm}return(state);}//uint8_t colorMatch(colorData *rgb){int32_t d,v,minV=999999L;uint8_t minI;for(uint8_t i=0; i<ARRAY_SIZE(ct); i++){v=0;for(uint8_t j=0; j<RGB_SIZE; j++){d=ct[i].rgb.value[j]-rgb->value[j];v+=(d*d);}if(v<minV){ minV=v; minI=i; }if(v==0)break;}return(minI);}//void loop(){static uint8_t runState=0,readState=0;if(runflag){switch(runState){case 0:{ // 색의 RGB 값을 읽어들입니다readState=fsmReadValue(readState,READ_VAL);if(readState==0)runState++;break;}case 1:{ // 가까운 색을 찾아냅니다:uint8_t i=colorMatch(&rgb);Serial.print(("\n가장 가까운 색은 "));Serial.print(ct[i].name);Serial.print(("입니다"));if (!strcmp(ct[i].name,"빨간색")){ mp3_play(0); delay(100); }else if(!strcmp(ct[i].name,"주황색")){ mp3_play(1); delay(100); }else if(!strcmp(ct[i].name,"노란색")){ mp3_play(0); delay(100); }else if(!strcmp(ct[i].name,"초록색")){ mp3_play(1); delay(100); }else if(!strcmp(ct[i].name,"파란색")){ mp3_play(0); delay(100); }else if(!strcmp(ct[i].name,"남색" )){ mp3_play(1); delay(100); }else if(!strcmp(ct[i].name,"보라색")){ mp3_play(1); delay(100); }else if(!strcmp(ct[i].name,"검정색")){ mp3_play(0); delay(100); }else if(!strcmp(ct[i].name,"하얀색")){ mp3_play(1); delay(100); }else if(!strcmp(ct[i].name,"분홍색")){ mp3_play(1); delay(100); }runState++;delay(3000);break;}default: runState=0;}}}
//char runflag=1;전역변수 하나 선언했고요void loop(){static uint8_t runState=0,readState=0;if(runflag){기존 코드}}runflag 변수를 체크해서 코드가 동작하거나 하지 않게 됩니다.
멈췄다가 다시 시작 할 때는 먼저번 하던 곳에서 이어서 하게 되겠죠
인터럽트 함수 사용법 공부함 후
인터럽트 함수(){runflag^=1; // 0,1 토글}인터럽트 함수 안에서 변수를 토글 시켜주면 됩니다.
댓글 0
조회수 585등록된 댓글이 없습니다.