BASIC4MCU | 질문게시판 | 빗물감지 창문 답변좀 부탁드립니다
페이지 정보
작성자 아두이노개어렵 작성일2020-11-11 17:01 조회3,090회 댓글2건본문
#define sensor A0
#define sw_left 2
#define sw_right 3
int state = 0; // 0 open / 1 close
int now_state = 0;
int m_step = 4;
int m_dir = 5;
int m_ena = 6;
void setup()
{
Serial.begin(9600);
pinMode(sw_left, INPUT_PULLUP);
pinMode(sw_right, INPUT_PULLUP);
pinMode(m_step, OUTPUT);
pinMode(m_dir, OUTPUT);
pinMode(m_ena, OUTPUT);
}
void loop()
{
int rain_value = analogRead(sensor);
if (rain_value < 500) state = 1; // close
else state = 0;
if (now_state != state)
{
if (state == 0)
{
while (1)
{
digitalWrite(m_dir, LOW);
digitalWrite(m_ena, HIGH);
digitalWrite(m_step, HIGH);
delayMicroseconds(100);
digitalWrite(m_step, LOW);
delayMicroseconds(100);
int sw_left_value = digitalRead(sw_left);
if (sw_left_value == 1) break;
}
}
else
{
while (1)
{
digitalWrite(m_dir, HIGH);
digitalWrite(m_ena, HIGH);
digitalWrite(m_step, HIGH);
delayMicroseconds(100);
digitalWrite(m_step, LOW);
delayMicroseconds(100);
int sw_right_value = digitalRead(sw_right);
if (sw_right_value == 0) break;
}
}
delay(500);
now_state = state;
}
delay(10);
}
현재 저희가 사용하고있는 코드인데 저희가 원하는 방향대로 작동이 안되어서 질문드립니다
처음에 모터가 작동하지 않다가 물이 닿으면 모터가 작동을 합니다
그러고 리미트 스위치에 닿으면 모터가 동작을 멈추게 되고
빗물감지 센서에 물기가 사라지면 다시 반대로 동작을 해야하는데 동작을 하지 않습니다
혹시 어느 부분을 더 추가해야하는지 알 수 있을까요??
1.빗물센서에 비가 감지되지 않으면 모터가 문을 열도록 합니다.
2.리미트 스위치에 닿으면 모터가 동작을 멈춥니다.
3.빗물센서에 비가 감지되면 모터가 역방향으로 동작하게되어 닫히게 됩니다.
4.문이 다 닫힐경우 반대쪽 리미트스위치가 작동되어 모터가 동작을 멈춥니다.
5.다시 1번으로가서 반복되도록 되는 시스템을 생각합니다.
댓글 2
조회수 3,090master님의 댓글
master 작성일
void loop(){
int rain_value = analogRead(sensor);
if (rain_value < 500) state = 1; // close
else state = 0;
if (now_state != state){
if (state == 0){
while (digitalRead(sw_left)) { // 리미트 만나기 전이라면 모터 동작
digitalWrite(m_dir, LOW); digitalWrite(m_ena, HIGH);
digitalWrite(m_step, HIGH); delayMicroseconds(100); digitalWrite(m_step, LOW); delayMicroseconds(100);
}
}
else{
while (digitalRead(sw_right)) {
digitalWrite(m_dir, HIGH); digitalWrite(m_ena, HIGH);
digitalWrite(m_step, HIGH); delayMicroseconds(100); digitalWrite(m_step, LOW); delayMicroseconds(100);
}
}
now_state = state;
delay(500);
}
}
이렇게 변경해서 돌려보세요
아두이노개어렵님의 댓글
아두이노개어렵
답변 감사합니다
digitalWrite(m_dir, LOW);
digitalWrite(m_ena, HIGH);
digitalWrite(m_step, HIGH);
delayMicroseconds(100);
digitalWrite(m_step, LOW);
delayMicroseconds(100);
int sw_left_value = digitalRead(sw_left);
if (sw_left_value == 1) break;
이부분에서 (sw_left_value == 1) 숫자 1을 0으로 바꾸면 되는 아주 간단한 거였는데 너무 헤맸던것 같습니다.