BASIC4MCU | 질문게시판 | 모터를 돌리면서 부저와 led를 동시에 작동시키기
페이지 정보
작성자 승천 작성일2022-12-04 00:19 조회737회 댓글1건본문
블루투스로 서보모터를 제어하면서 그 순간에 led와 부저를 같이 작동시키고 싶은데요
폰에서 정해진 명령어를 넣었을때
모터가 다 돌아가고나서 그때 led와 부저가 울리더라구요 ...
인터럽트..? 아니면 밀리스로 수정을 해서 같이 멀티태스킹 구동이 가능하다면 더 좋을것같긴한데..
밀리스 함수도 해보려고하긴했는데 너무 헷갈려서요...ㅜㅠㅠ
아래의 코드까지 해봤는데 도저히 어떻게 해야할지 모르겠어서 여쭤봅니다 ㅠㅠ
(모터 속도 제어까지 하고 있어서 더 어려워지네요 ㅜㅜ)
#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출
#include "Servo.h" //서보 라이브러리
int buzzer = 7;
int led = 9;
Servo myservo; //서보객체
int blueTx=2; //Tx (블투 보내는핀 설정)
int blueRx=3; //Rx (블투 받는핀 설정)
SoftwareSerial mySerial(blueTx, blueRx); //시리얼 통신을 위한 객체선언
String myString=""; //받는 문자열
void setup() {
myservo.attach(12); //서보 시그널 핀설정
myservo.write(0); //서보 초기각도 0도 설정
mySerial.begin(9600); //블루투스 시리얼 개방
pinMode(buzzer, OUTPUT);
pinMode(led, OUTPUT);
}
void loop() {
while(mySerial.available()) //mySerial 값이 있으면
{
char myChar = (char)mySerial.read(); //mySerial int형식의 값을 char형식으로 변환
myString+=myChar; //수신되는 문자열을 myString에 모두 붙임 (1바이트씩 전송되는 것을 모두 붙임)
delay(5); //수신 문자열 끊김 방지
}
if(!myString.equals("")) //myString 값이 있다면
{
Serial.println("input value: "+myString); //시리얼모니터에 myString값 출력
int angle = 0;
if(myString=="on") //myString 값이 'on' 이라면
{
for (angle = 0; angle < 180; angle++)
{ myservo.write(angle);
delay(80);
}
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
digitalWrite(buzzer, HIGH);
delay(5000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
digitalWrite(buzzer, LOW);
}
else {
for (angle = 180; angle > 0; angle--)
{ myservo.write(angle);
delay(80);
}
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
digitalWrite(buzzer, HIGH);
delay(5000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
digitalWrite(buzzer, LOW);
}
myString=""; //myString 변수값 초기화
}
}
댓글 1
조회수 737master님의 댓글
master 작성일
if(myString=="on"){
for (angle = 0; angle < 180; angle++){ myservo.write(angle); delay(80); }
digitalWrite(led, HIGH); digitalWrite(buzzer, HIGH);
delay(5000);
digitalWrite(led, LOW); digitalWrite(buzzer, LOW);
}
이런 코드를 말하는 건가요?
if(myString=="on"){
digitalWrite(led, HIGH); digitalWrite(buzzer, HIGH);
for (angle = 0; angle < 180; angle++){ myservo.write(angle); delay(80); }
digitalWrite(led, LOW); digitalWrite(buzzer, LOW);
}
순서만 바꾸면 되지 않나요?
서보모터 구동에 오랜 시간이 걸리므로 5초 딜레이는 제거해도 되겠습니다.