BASIC4MCU | 질문게시판 | 아두이노를 이용한 스마트 환풍기
페이지 정보
작성자 굳은살 작성일2018-09-05 15:21 조회6,868회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=2924
본문
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=2907
아두이노를 이용한 스마트 환풍기 글을 올린 사람인데 혹시 조건을 만족시 스텝모터가 회전하는데 그 각도가 180도 돌아가는게 아니라 약 30도 정도만 돌아가는게 혹시 코드상으로 수정해야될 부분이 따로 있을까요? 어제 나름대로 수정한다고 해봤는게 잘 안되서요..번거롭게 해드려서 죄송합니다..
#include <DHT.h>
#include <Stepper.h>
#include <LiquidCrystal.h>
#define DHTPIN1 24
#define DHTPIN2 25
#define DHTTYPE DHT22
LiquidCrystal lcd(6,7,2,3,4,5);
const int stepsPerRevolution=1024;
int lcd_key =0;
int adc_key_in =0;
int MQ5=A1;
int MQ7=A2;
int Vo=A0;
int V_LED=23;
int FAN=26;
int SM=0;
int target=0;
int angle=0;
int MQ5_val,MQ7_val;
float t1=0;
float t2=0;
float Vo_value=0;
float Voltage=0;
float dustDensity=0;
Stepper myStepper(stepsPerRevolution,11,9,10,8);
DHT dht1(DHTPIN1,DHTTYPE);
DHT dht2(DHTPIN2,DHTTYPE);
void setup(){
pinMode(MQ5,INPUT);
pinMode(MQ7,INPUT);
pinMode(V_LED,OUTPUT);
pinMode(Vo,INPUT);
lcd.begin(16,2);
pinMode(FAN,OUTPUT);
pinMode(SM,OUTPUT);
myStepper.setSpeed(14);
Serial.begin(9600);
}
void loop(){
t1=dht1.readTemperature(); Serial.print("Temperature_01(℃)="); Serial.print(t1);
Serial.print("\n");
t2=dht2.readTemperature(); Serial.print("Temperature_02(℃)="); Serial.print(t2);
Serial.print("\n");
MQ5_val=analogRead(MQ5);
MQ7_val=analogRead(MQ7);
Serial.print("MQ-5="); Serial.println(MQ5_val);
Serial.print("MQ-7="); Serial.println(MQ7_val);
digitalWrite(V_LED,LOW); delayMicroseconds(280);
Vo_value=analogRead(Vo); delayMicroseconds(40);
digitalWrite(V_LED,HIGH); delayMicroseconds(9680);
Voltage=(Vo_value*5.0)/1024.0; dustDensity=(Voltage-0.10)/0.005;
Serial.print("dustDensity="); Serial.println(dustDensity);
lcd.print(t1); lcd.print(t2);
lcd.print(dustDensity);
if((MQ5_val>=1000) || (MQ7_val>=1000)){ //LPG나 일산화탄소 검출
while(180>angle){ angle++; myStepper.step( 1); delay(10); }
digitalWrite(FAN,HIGH);
}
else if((MQ5_val<=999) || (MQ7_val<=999) && dustDensity>=1000){
digitalWrite(FAN,LOW);
}
else if((MQ5_val<=999) || (MQ7_val<=999) && dustDensity<=999 && t2>=18.0 && t2<=25){ // 실내온도가 사람이 지내기 좋은 최적온도
digitalWrite(FAN,LOW);
}
else if((MQ5_val<=999) || (MQ7_val<=999) && dustDensity<=999 && t2<=17.9 && t1>=18){ // 실내온도가 17.9도 이하 실외온도가 18도 이상
while(0<angle){ angle--; myStepper.step(-1); delay(10); }
digitalWrite(FAN,HIGH);
}
else if((MQ5_val<=999) || (MQ7_val<=999) && dustDensity<=999 && t2>=25.1 && t1<=25){ // 실내온도가 25.1도 이상 실외온도가 25도 이하
while(180>angle){ angle++; myStepper.step( 1); delay(10); }
digitalWrite(FAN,HIGH);
}
delay(3000);
}
댓글 1
조회수 6,868master님의 댓글
master 작성일
while(180>angle){ angle++; myStepper.step( 1); delay(10); }
while(0<angle){ angle--; myStepper.step(-1); delay(10); }
이 두개 종류의 문장만 설명하면 되겠죠?
정확하게 1/6만 회전한다면
while(180>angle){ angle++; myStepper.step( 6); delay(10); }
while(0<angle){ angle--; myStepper.step(-6); delay(10); }
이렇게 고치면 됩니다만
정확한 1/6배가 아니라면 180도 0도 위치가 조금 어긋나게 됩니다.
while(1080>angle){ angle++; myStepper.step( 1); delay(10); }
while(0<angle){ angle--; myStepper.step(-1); delay(10); }
while()안의 값을 증가시키면 원하는만큼 정확한 각도를 조정할 수 있습니다.
180도 조금 덜 돌아가면 1080보다 큰 값으로 증가시키고
180도 조금 오버하면 1080보다 작은 값으로 감소시키면 되겠죠