BASIC4MCU | 질문게시판 | 답변 : 프로그램 코드에 기능동작에 대한 질문입니다.
페이지 정보
작성자 master 작성일2018-10-28 07:06 조회851회 댓글7건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-10-28 오전 6:59:26// by Ok-Hyun Park////setColor(255, 0, 0)-빨간//setColor(128, 65,217)-보라//setColor(255, 94, 0)-주황//setColor( 29,219, 22)-녹색//int R=6,G=9,B=10,BTN=2,pump=7;//int mode=0,val=0,count=0,sec=0;long lastChangeTime=0,shortPressTime=600,longPressTime=1000;float voltage=0;//void setup(){Serial.begin(57600);pinMode(BTN,INPUT);pinMode(pump,OUTPUT);}//void setColor(int r1,int g1,int b1){analogWrite(R,r1); analogWrite(G,g1); analogWrite(B,b1);}//void loop(){if(digitalRead(BTN)){ delay(10); count++; } // 버튼 누른시간 카운트업else{if(count){ // count가 0이 아니면if(count<60){ // 600ms 이하for(int i=0; i<=255; i++){ setColor(i,i,i); delayMicroseconds(1953); }for(int i=255; i>=0; i--){ setColor(i,i,i); delayMicroseconds(1953); }mode=1; sec=0;}else{ mode=0; sec=0; } // 600ms 이상count=0;}}//---------------------------------------------------if(mode==1){val=analogRead(0);voltage=(float)val*5.0/1024.0; Serial.println(voltage);//if(voltage>=3.0){ // 밧데리 전압이 3.0V이상이면digitalWrite(pump,HIGH); // pump ONif(sec<120){ // 120sec=2분동안 LED 점멸for(int i=0; i<=255; i++){ setColor(i,i,i); delayMicroseconds(1953); }for(int i=255; i>=0; i--){ setColor(i,i,i); delayMicroseconds(1953); }}if(++sec>=240)sec=0; // 2분~4분 LED OFF}else{ // 3.0미만digitalWrite(pump,LOW); // pump OFFsetColor(0,0,0);}}}loop 문에 있는 setColor는 밧데리 상태를 읽어와서 색상을 표시하는 부분인가요?val=analogRead(0);배터리 전압을 읽는 코드는 위와 같습니다.(voltage>=3.4)==setColor(29,219,22)(voltage<3.4&&voltage>3.0)==setColor(255,94,0)(voltage<=3.0)==setColor(255,0,0)밧데리 상태를 읽어와서 전압레벨의 색상으로 표현하는 방법이 안될까요?전압으로 변경하는 예제는 쉽게 찾을 수 있습니다만계산식에 사용하는 수식은 회로도가 있어야지 작성 가능합니다.-버튼을 한번 누른다음 밧데리가 3.0V이상이면 바로 mode==1으로 진입합니다.혹시 버튼을 한번 더 눌렀을때 진입할수 있을까요?스위치를 누른 시간으로 모드를 구분하겠다고 작성한 코드입니다.스위치를 누를 때마다 모드를 변경하는 것은 어렵지 않지만누른 시간으로 모드를 구분하지 않겠다는 전제가 우선되어야겠죠.-2분 동작후 꺼져야 하는데 계속 동작하고 있습니다.sec<120 숫자를 바꿔봐도 같습니다."(2분동작하고, 2분 쉬고)를 반복하겠다"로 해석했습니다.어떻게 동작할 것인지를 타인에게 전달 하려면상세하고 정확한 설명이 있어야겠죠-동작중 버튼을 길게 누르면 초기모드(버튼을 한번도 누르지 않은 상태)로 돌아가는동작이 안되는것 같습니다.-버튼이 터치스위치입니다.버튼이 잘 안먹을때가 있습니다.다른 변수가 있나요?LED를 표시하는 시간이 상당히 길고
이 시간에는 스위치 입력을 받지 않기 때문에
버튼입력이 잘 먹지 않는 것입니다.
시분할 구동을 공부해서 LED를 표시해야 합니다만
스위치를 길게, 짧게 누르는 것으로 모드를 변경할 것인지
아니면 누를 때마다 모드를 변경 할 것인지부터 결정해야겠죠
"알파고"로 제어하더라도
변적쟁이 인간의 마음을 맞춰주지는 못합니다.
알고리즘부터 정리하세요
댓글 7
조회수 851스캉이님의 댓글
스캉이 작성일
처음 하고자 하는 것들을 적어두고 시작했습니다.
버튼 1초 누름 → 밧데리 상태 체크 (녹색, 주황, 빨간색)
→ 버튼 1초 누름
→ [A]밧데리 상태양호일 때 (녹색, 주황)
→ pump동작, 보라색 PWM동작 (2분)
→ 30분간 대기.pump 중지, led pwm중지
→ pump동작, 보라색 PWM동작 (2분)
→ 버튼을 누르기전까지 pump 중지, led pwm중지
→ [B]밧데리 충전이 필요할 때 (빨간)
→ 아무런 동작하지 않음
동작중 버튼 2초 누름 → 초기상태로 전환
아무런 동작이 없을때 usb포트로 충전시 진행상태 led로 표시. 버튼이 눌러지면 다시 처음 메인동작만 보여짐.
master님의 댓글
master
- 버튼을 한번 누른다음 밧데리가 3.0V이상이면 바로 mode==1으로 진입합니다.
혹시 버튼을 한번 더 눌렀을때 진입할수 있을까요?
//
위 내용은 무슨 뜻인가요?
스캉이님의 댓글
스캉이 작성일버튼을 한번 누르면, 밧데리 상태 led pwm출력한 다음 다시 버튼을 눌렀을때 밧데리가 3.0v이상이면 mode 1으로 진입하는 동작을 하고 싶습니다
master님의 댓글
master
그 내용을 1초 2초 짧게 길게 누르는 것과 섞어서 정리 해보세요
//
그리고 1초 이하를 짧게, 2초 이상은 길게로 인식 한다고하면
1초~2초 사이에 누른 것은 무시하나요?
스캉이님의 댓글
스캉이
버튼 입력시간 바꿔서 작성했습니다
버튼 0.5초에서 1초 누름 → 밧데리 상태 체크 (녹색, 주황, 빨간색)
→ 버튼 0.5초에서 1초 누름
→ [A]밧데리 상태양호일 때 (녹색, 주황)
→ pump동작, 보라색 PWM동작 (2분)
→ 30분간 대기.pump 중지, led pwm중지
→ pump동작, 보라색 PWM동작 (2분)
→ 버튼을 누르기전까지 pump 중지, led pwm중지
→ [B]밧데리 충전이 필요할 때 (빨간)
→ 아무런 동작하지 않음
동작중 버튼 1초이내로 누르는 입력은 무시
동작중 버튼 1초이상 누름 → 초기상태로 전환
아무런 동작이 없을때 usb포트로 충전시 진행상태 led로 표시. 버튼이 눌러지면 다시 처음 메인동작만 보여짐
스캉이님의 댓글
스캉이 작성일
밧데리 상태를 읽어와서 전압레벨의 색상으로 표현하는 방법이 안될까요?
==>A0에 들어오는 값만으로 밧데리 상태 체크 (녹색, 주황, 빨간색) LED를 1초동안 PWM 동작을 할수는 없을까요?
master님의 댓글
master
pwm이 8비트라서 세밀한 색상 표현이 안되지만
대충 흉내를 낼 수는 있습니다.
//
스위치 알고리즘 부터 정리하세요