BASIC4MCU | 질문게시판 | 스텝모터 제어 코드 질문
페이지 정보
작성자 pmh11 작성일2023-05-31 19:44 조회8,149회 댓글6건본문
#include <DHT.h>#include <Stepper.h>#define DHTPIN 2#define DHTTYPE DHT11DHT dht(DHTPIN, DHTTYPE);const int stepsPerRevolution = 200;Stepper stepper1(stepsPerRevolution, 4, 5);Stepper stepper2(stepsPerRevolution, 6, 7);float temperature, humidity;unsigned long t, t1 = 0, t2 = 0;void setup() {Serial.begin(9600);dht.begin();stepper1.setSpeed(60);stepper2.setSpeed(60);}void loop() {t = millis();if (t - t1 >= 1000) {t1 = t; // 1초temperature = dht.readTemperature();humidity = dht.readHumidity();Serial.print(temperature);Serial.print(", ");Serial.println(humidity);if (temperature >= 25 || humidity < 70) {stepper1.step(2 * stepsPerRevolution); // 1번 스텝모터를 정방향으로 구동}else {stepper1.step(0); // 스텝모터를 정지}}if (t - t2 >= 30000) {t2 = t; // 30초stepper1.step(2 * stepsPerRevolution); // 1번 스텝모터를 정방향으로 구동for (int i = 0; i < 5; i++) {delay(1000); // 5초}stepper1.step(-2 * stepsPerRevolution); // 1번 스텝모터를 역방향으로 구동stepper1.step(0); // 스텝모터를 정지}}위의 코드를 이용해서 스텝모터를 온습도센서나 시간마다 구동시키려고 하고 있습니다.
스텝모터가 멈춰있다가 작동이 되게 하고 싶은데 Void setup() 내에서 stepper.setSpeed(60); 이 부분 때문에
전원공급기로 전원을 주자마자 계속 돌아가는가 궁금하네요. 그래서 stepper.setSpeed(0);을 이용해 처음에 멈춰있게
하려고 해봤는데도 계속 멈춰만 있지 void loop()내에서의 동작이 실행되지 않았습니다. 혹시 어떻게 수정을 해야하나 여쭈어보고싶습니다.
바쁘신 와중에 감사드립니다.
댓글 6
조회수 8,149master님의 댓글
master 작성일
stepper1.setSpeed(60);
stepper2.setSpeed(60);
이 코드들은 스텝모터의 속도를 지정하는 것일 뿐, 모타가 돌아가는 것과 상관없습니다.
master님의 댓글
master 작성일
else { stepper1.step(0); } // 스텝모터를 정지
stepper1.step(0); // 스텝모터를 정지
이 코드들은 필요 없고요
없어도 되는 코드는 쓰레기입니다.
//
if (t - t1 >= 1000) { t1 = t; // 1초
if (temperature >= 25 || humidity < 70) {
stepper1.step(2 * stepsPerRevolution); // 1번 스텝모터를 정방향으로 구동
}
1초는 금새 지나갑니다.
습도가 70%가 안되서 모터가 돌아가겠군요
시리얼모니터에 온습도가 얼마로 나오든가요?
pmh11님의 댓글
pmh11 작성일
우선 답변 남겨주신 점 너무 감사드립니다. 시리얼 모니터에 온습도를 둘 다 측정하는 코딩을 사용하였을 때는 대략 온도는 12, 습도는 130~150정도 나왔습니다. 차라리 그냥 온습도 둘 다 말고 온도만 측정하고자 했을 때는 주위 온도랑 거의 비슷하게 나왔습니다.
#include <Stepper.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const int stepsPerRevolution = 200;
Stepper stepper1(stepsPerRevolution, 4, 5);
Stepper stepper2(stepsPerRevolution, 6, 7);
float temperature;
float prevTemperature = 0;
unsigned long t, t1 = 0, t2 = 0;
void setup() {
Serial.begin(9600);
dht.begin();
stepper1.setSpeed(60);
stepper2.setSpeed(60);
}
void loop() {
t = millis();
if (t - t1 >= 1000) {
t1 = t; // 1초
temperature = dht.readTemperature();
Serial.print(temperature);
Serial.println();
if ((temperature >= 25) && (prevTemperature < 25)) {
stepper1.step(2*stepsPerRevolution); // 1번 스텝모터를 정방향으로 구동
} else if ((temperature < 25) && (prevTemperature >= 25)) {
stepper1.step(-2*stepsPerRevolution); // 1번 스텝모터를 역방향으로 구동
}
prevTemperature = temperature;
}
if (t - t2 >= 30000) {
t2 = t; // 30초
stepper1.step(2*stepsPerRevolution); // 1번 스텝모터를 정방향으로 구동
for (int i = 0; i < 5; i++) {
delay(1000); // 5초
}
stepper1.step(-2*stepsPerRevolution); // 1번 스텝모터를 역방향으로 구동
}
}
온도만 측정할 수 있도록 하는 코드로 수정한 코드입니다. 하지만 막상 코드를 업로드 하고 회로를 짜서 돌려보니 온도가 24도 정도로 측정되는데도 스텝모터가 회전하고, 맨 아래 30초마다 정방향 회전하게 하는 부분도 안 맞는거 같습니다. 아무리 생각해도 원인을 잘 모르겠네요..
master님의 댓글
master 작성일
24도면 25도가 될 가능성이 많군요
왜 30도로 높이지 않았을까요?
pmh11님의 댓글
pmh11 작성일dht11의 오차를 생각하지 못했던 것 같습니다. 30도로 높히고 코드를 업로드를 하였으며 dc supply 전원공급기를 이용해 전원을 인가하고 회로를 구성했을 때 스텝모터에 전류가 흐르지 않는 것 같습니다. 바쁘시겠지만 답변 달아주시면 감사드리겠습니다.
master님의 댓글
master 작성일
24도를 체크해서 모터가 돌아간다고 질문하셨는데
30도를 체크하면 모터가 안돌아가는 것이 정상 아닌가요?
제가 뭘 이해하지 못하고 있을까요?