BASIC4MCU | 질문게시판 | 답변 : 다시 인터럽트 질문드립니다~~
페이지 정보
작성자 master 작성일2018-10-09 07:17 조회624회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=5037
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-10-09 오전 7:22:12// 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 6#define interruptPin1 3MD_TCS230 CS(S2_OUT,S3_OUT);SoftwareSerial mySerial(10,11);//colorData rgb;uint8_t modeOp='M',ctIndex,runState=0,readState=0;char runflag=1,stopflag=0;unsigned long time=0;//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);pinMode(interruptPin1,INPUT);digitalWrite(interruptPin1,INPUT_PULLUP);attachInterrupt(digitalPinToInterrupt(interruptPin1),toggle,FALLING);}//char getChar(){ while(Serial.available()==0); return(toupper(Serial.read())); }//void clearInput(){ while(Serial.read()!=-1); }//void toggle(){runflag^=1;if(runflag)stopflag=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; uint32_t 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(){if(runflag){if(stopflag){ mp3_play(2); stopflag=0; }//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); }else if(!strcmp(ct[i].name,"주황색")){ mp3_play(1); }else if(!strcmp(ct[i].name,"노란색")){ mp3_play(1); }else if(!strcmp(ct[i].name,"초록색")){ mp3_play(1); }else if(!strcmp(ct[i].name,"파란색")){ mp3_play(0); }else if(!strcmp(ct[i].name,"남색") ){ mp3_play(1); }else if(!strcmp(ct[i].name,"보라색")){ mp3_play(1); }else if(!strcmp(ct[i].name,"검정색")){ mp3_play(0); }else if(!strcmp(ct[i].name,"하얀색")){ mp3_play(1); }else if(!strcmp(ct[i].name,"분홍색")){ mp3_play(1); }runState++;for(int i=0; i<100; i++){ delay(30); if(!runflag)break; }break;}default: runState=0;}}}
이 코드로 돌려보세요
댓글 0
조회수 624등록된 댓글이 없습니다.