BASIC4MCU | 질문게시판 | 아두이노 서보모터 질문있습니다.
페이지 정보
작성자 맛이있어 작성일2020-12-03 14:54 조회22,634회 댓글8건본문
#include<Servo.h>
#include<SoftwareSerial.h>
SoftwareSerial btSerial(12,13);
Servo myservo;
float temperature;
int Rain;
int Sensor_val;
int data;
int temp=1;
int reading;
void setup()
{
myservo.attach(11);
Serial.begin(9600);
btSerial.begin(9600);
delay(100);
}
void loop()
{
reading = analogRead(A2);
temperature = 500.0*reading / 1023.0 ;
////////////////////0포트에는 빗물센서 연결////////////////////////
btSerial.println(analogRead(0));
Serial.println(analogRead(0));
if(temp == 1)////////////////////////////////////자동제어모드
{
if(analogRead(0)>1000)////////////////비가 올 때
{
myservo.write(90);
}
else if(analogRead(0)<500)
{
myservo.write(150);
delay(2500);
myservo.detach();
btSerial.println(" rain! ");
}
else if(analogRead(0)>300 && analogRead(0)<1000)
{
myservo.write(0);
delay(2500);
myservo.detach();
btSerial.println(" sunny! ");
}
}
if(temp == 2 )//////////////////////////////////////////////////2 열겠다
{
myservo.write(0);
delay(5000);
myservo.write(90);
myservo.detach();
btSerial.print(" open! ");
}
if(temp == 3 )////////////////////////////////////////3닫겠다
{
myservo.write(150);
delay(5000);
myservo.write(90);
myservo.detach();
btSerial.print("closed ");
}
btSerial.println(temperature); //btSerial.println("℃");
delay(1000);
if(btSerial.available())
{
data = btSerial.read();
Serial.println(data);
if(data == 1)//자동제어모드
temp = 1;
else if(data == 2)//open
temp = 2;
else if(data == 3)//close
temp = 3;
}
}
창문 제어를 하고싶습니다. 자동제어 부분에 빗물감지 센서에 물이 묻으면 문이 닫힌 후에 모터가 멈추고 제자리에 머물게 하고싶은데 모터가 계속 돌아갑니다. 반대로 센서에 물이 없어지면 창문이 열리고 모터를 멈추게 하고싶은데 혹시 해결 방법이 있을까요?
댓글 8
조회수 22,634master님의 댓글
master 작성일
myservo.write(0); delay(5000); myservo.write(90);
myservo.write(150); delay(5000); myservo.write(90);
바퀴형 서보모터인가보군요
맛이있어님의 댓글
맛이있어
이렇게 설정을 했을경우 모터가 5초돌아가고 정지한 후에 다시 돌아가는데 어떻게 해야되죠 ..
master님의 댓글
master 작성일
if(temp == 1)////////////////////////////////////자동제어모드
{
자동제어 모드에서는 왜 90도로 출력하지 않나요?
맛이있어님의 댓글
맛이있어
myservo.write(90)이 멈추는 각도인데
myservo.write(150);
delay(2500);
myservo.write(90);
delay(2500);
btSerial.println(" rain! ");
이렇게 할 경우 2.5초 돌아가고 2.5초 멈춘다음에 다시 돌아갑니다..
master님의 댓글
master 작성일
#include<Servo.h>
#include<SoftwareSerial.h>
SoftwareSerial btSerial(12,13);
Servo myservo;
//
float temperature;
int Rain,Sensor_val,data,temp=1,reading;
int open_flag=0; // 초기값 닫힘 상태
//
void setup(){
myservo.attach(11);
Serial.begin(9600);
btSerial.begin(9600);
delay(100);
}
//
void open(){
if(open_flag==0){ open_flag=1; btSerial.print(" open! "); myservo.write(0); delay(5000); myservo.write(90); myservo.detach(); }
}
void close(){
if(open_flag){ open_flag=0; btSerial.print("closed "); myservo.write(150); delay(5000); myservo.write(90); myservo.detach(); }
}
//
void loop(){
reading=analogRead(A2); temperature=500.0*reading/1023.0 ; btSerial.println(temperature); //btSerial.println("℃");
Rain=analogRead(0); btSerial.println(Rain); Serial.println(Rain);
if(temp==1){ //자동제어모드
if(Rain>500){ btSerial.println(" sunny! "); open(); }
else { btSerial.println(" rain! "); close(); }
}
//
delay(1000);
//
if(btSerial.available()){
data=btSerial.read();
Serial.println(data);
if(data==1)temp=1; //자동제어모드
else if(data==2){ temp=0; open(); } //open
else if(data==3){ temp=0; close(); } //close
}
}
맛이있어님의 댓글
맛이있어
오
void open(){
if(open_flag==0){ open_flag=1; btSerial.print(" open! "); myservo.write(0); delay(5000); myservo.write(90); myservo.detach(); }
}
void close(){
if(open_flag){ open_flag=0; btSerial.print("closed "); myservo.write(150); delay(5000); myservo.write(90); myservo.detach(); }
이 자리에 myservo.detach(); 를 지우니 제가 원하는대로 움직였어요!!
master님의 댓글
master
myservo.detach(); 는 모두 삭제하세요
myservo.detach(); 후 다시 서보모터를 구동하려면 myservo.attach(11); 를 실행 해야하는데 번거롭죠
맛이있어님의 댓글
맛이있어
감사합니다.
해결되었습니다.