BASIC4MCU | 질문게시판 | 아두이노를 이용한 축이 회전하는 환풍기
페이지 정보
작성자 굳은살 작성일2018-10-30 11:03 조회971회 댓글0건본문
도움주셔서 많이 진행되어서 너무 감사드립니다.
마스터님이 알려주신 코드로 센서들은 다 제대로 동작하는 것을 확인하였습니다.(다만 미세먼지센서코드는 조금 수정이 필요했습니다.)
다만 몇 가지 문제점이 발생해서 또 질문드립니다..
첫째로 LED가 켜지는 조건이 성립되면 켜지긴 합니다만, 다시 꺼지질 않고 계속 ON상태를 유지합니다.
둘째로 환풍기의 팬인 BLDC모터가 동작하지 않습니다.
셋쨰로 환풍기의 축을 회전시켜주는 스텝모터가 동작하지 않습니다.
(*과부하때문에 아두이노가 고장난적이 있어서 BLDC모터와 스텝모터의 전원측과 접지측에 각각 1.2K옴 저항을 달았는데 그게 문제가 될 가능성이 있을까요? *)
나름 수정해본다고 하였으나 난관에 봉착하여 문의드립니다..
아래는 현재까지 진행된 코드입니다(LED OFF동작 안됨 , BLDC모터 작동X, 스텝모터 작동X)
#include <DHT.h>
#define DHTTYPE DHT22
#define DHTPIN1 52
#define DHTPIN2 53
DHT dht1(DHTPIN1,DHTTYPE);
DHT dht2(DHTPIN2,DHTTYPE);
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,20,4);
//
#include <SoftwareSerial.h>
SoftwareSerial mySerial(13,11);
//
#include <Stepper.h>
const int stepsPerRevolution=100;
Stepper myStepper(stepsPerRevolution,6,7,8,9);
//
int MQ5LPG=48,MQ7CO=49;
int ENA=5,ENB=10;
int fan=4,dir=3,led=45,buzzer=44;
//
float Tin=0,Tout=0;
int target=0,angle=0;
unsigned char Send_data[5] = {0x11,0x02,0x0b,0x01, 0xE1};
unsigned char Receive_Buff[20];
unsigned long PM25;
unsigned long COM_SUCCESS, COM_COUNT;
unsigned char recv_cnt = 0;//
void Send_CMD(void)
{
unsigned char i;
for(i=0; i<5; i++)
{
mySerial.write(Send_data[i]);
delay(1);
}
}//
unsigned char Checksum_cal(void)
{
unsigned char count, SUM=0;
for(count=0; count<19; count++)
{
SUM += Receive_Buff[count];
}
return 256-SUM;
}//
void setup(){
pinMode(fan,OUTPUT); pinMode(dir,OUTPUT); pinMode(led,OUTPUT); pinMode(buzzer,OUTPUT); pinMode(11,OUTPUT);
analogWrite(ENA,255); analogWrite(ENB,255);
pinMode(13,INPUT);
myStepper.setSpeed(60);
lcd.init(); lcd.backlight();
Serial.begin(9600); while(!Serial);
mySerial.begin(9600); while(!mySerial);
digitalWrite(dir, LOW);
}
//
void loop(){
COM_COUNT++;
Send_CMD();
while(1)
{
if(mySerial.available())
{
Receive_Buff[recv_cnt++] = mySerial.read();
if(recv_cnt ==20){recv_cnt = 0; break;}
}
}
if(Checksum_cal() == Receive_Buff[19])
{
COM_SUCCESS++;
PM25 = (unsigned long)Receive_Buff[3]<<24 | (unsigned long)Receive_Buff[4]<<16 | (unsigned long)Receive_Buff[5]<<8| (unsigned long)Receive_Buff[6];
Serial.write(" PM2.5 : ");
Serial.println(PM25);
}
else
{
Serial.write("CHECKSUM Error");
}
//
Tin=dht1.readTemperature(); Serial.write("DHT_1: "); Serial.println(Tin);
Tout=dht2.readTemperature(); Serial.write("DHT_2: "); Serial.println(Tout);
Serial.write("MQ5LPG: "); Serial.println(digitalRead(MQ5LPG));
Serial.write("MQ7CO: "); Serial.println(digitalRead(MQ7CO));
//
int dif=Tin-Tout; // 실내 실외 온도차를 계산
//
if( !digitalRead(MQ5LPG) || !digitalRead(MQ7CO) || (PM25>=35.1) ){ // LPG or CO감지 or 미세먼지 농도가 높으면
while(180>angle){ angle++; myStepper.step(1); delay(10); } // 환풍기 외부 방향으로 열고
analogWrite(fan,150); digitalWrite(led,HIGH); tone(buzzer,500,100); // 고속회전, 내부공기를 외부로 방출
}
else if( dif>0 ){ // 실내 온도가 더 높으면
if( Tin<=25 ){ // 실내 온도가 25도 이상이면
while(180>angle){ angle++; myStepper.step(1); delay(10); } // 환풍기 외부 방향으로 열고
analogWrite(fan,150); digitalWrite(led,LOW); noTone(buzzer); // 고속회전, 내부공기를 외부로 방출
}
}
else if( dif<0 ){ // 실외 온도가 더 높으면
if( Tin<=18 ){ // 실내 온도가 18도 이하면
while(0<angle){ angle--; myStepper.step(-1); delay(10); } // 환풍기 내부 방향으로 열고
analogWrite(fan,150); digitalWrite(led,LOW); noTone(buzzer); // 고속회전, 외부공기를 내부로 유입
}
}
else{ // 위 조건에 해당하지 않으면
analogWrite(fan,0); digitalWrite(led,HIGH); noTone(buzzer); // 정지
}
//
lcd.setCursor(0,0); lcd.print("Tin: "); lcd.print(Tin); lcd.print("Tout: "); lcd.print(Tout);
lcd.setCursor(0,1); lcd.print("D: "); lcd.print(PM25);
delay(3000);
}
댓글 0
조회수 971등록된 댓글이 없습니다.