BASIC4MCU | 질문게시판 | 아두이노 미세먼지, 온습도팬 제어 질문
페이지 정보
작성자 전자맨 작성일2020-11-26 15:47 조회7,363회 댓글1건본문
#include "DHT.h"
#include "Adafruit_Sensor.h"
#include "DHT_U.h"
#define no_dust 0.6
#define DHTPIN 10
#define FANPIN 3
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>float _ED_8C_AC = 0;
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);float vo_value=0;
float sensor_voltage=0;
float dust_density=0;
float get_voltage(float value)
{
float V= value * 5.0 / 1024; // 아날로그값을 전압값으로 바꿈
return V;
}float get_dust_density(float voltage)
{
float dust=(voltage-no_dust) / 0.005; // 데이터 시트에 있는 미세먼지 농도(ug) 공식 기준
return dust;
}
DHT dht(10,DHT22);
int v_led= A5;
int dustout= A4;int s_ledr= 13;
int s_ledg= 12;
int s_ledb= 11;
int FAN= 3;void _delay(float seconds)
{
long endTime = millis() + seconds * 1000;
while(millis() < endTime) _loop();
}void setup() {
Serial.begin(9600);
Serial.println();
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.clear();
dht.begin();
pinMode(v_led,OUTPUT);
digitalWrite(v_led,LOW);
pinMode(s_ledr,OUTPUT);
pinMode(s_ledg,OUTPUT);
pinMode(s_ledb,OUTPUT);
pinMode(FAN,OUTPUT);
digitalWrite(s_ledr,LOW);
digitalWrite(s_ledb,LOW);
digitalWrite(s_ledg,LOW);
digitalWrite(FAN,LOW);while(1) {
float h= dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
float hif = dht.computeHeatIndex(f, h);
float hic = dht.computeHeatIndex(t, h, false);
int h1 = h;
int hic1 = hic;
lcd.setCursor(0,0);
lcd.print("Temp:");
lcd.setCursor(5,0);
lcd.print(hic1);
lcd.setCursor(7,0);
lcd.print("C");
lcd.setCursor(9,0);
lcd.print("Hum:");
lcd.setCursor(13,0);
lcd.print(h1);
lcd.setCursor(15,0);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("Dust:");
digitalWrite(v_led,LOW);
delayMicroseconds(280); // 280us동안 딜레이
vo_value=analogRead(dustout); // 데이터를 읽음
delayMicroseconds(40); // 320us - 280us
digitalWrite(v_led,HIGH); // 적외선 LED OFF
delayMicroseconds(9680); // 10us(주기) -320us(펄스폭) 한 값
sensor_voltage=get_voltage(vo_value); // get_voltage 함수 실행
dust_density=get_dust_density(sensor_voltage); // get_dust_density 함수 실행
int dust_density1 = dust_density;
lcd.setCursor(5,1);
lcd.print(dust_density1);
lcd.setCursor(8,1);
lcd.print("[ug/m^3]");
if(dust_density <= 30){
digitalWrite(s_ledr,LOW); digitalWrite(s_ledb,HIGH); digitalWrite(s_ledg,LOW);
}
else if(dust_density >= 200){
digitalWrite(s_ledr,HIGH); digitalWrite(s_ledb,LOW); digitalWrite(s_ledg,LOW); digitalWrite(FAN,HIGH);
}
else {
digitalWrite(s_ledr,LOW); digitalWrite(s_ledb,LOW); digitalWrite(s_ledg,HIGH);
}
if(h >=50){
digitalWrite(FAN,HIGH);
}
else{
digitalWrite(FAN,LOW);
}
if(t >=20){
digitalWrite(FAN,HIGH);
}
else{
digitalWrite(FAN,LOW);
}
}
_delay(1);
lcd.clear();
_loop();
}void _loop(){
}
void loop(){
_loop();
}
이렇게 코딩을 했는데 연결해서 lcd에 온습도값은 잘 나오고 팬 제어가 가능한데 lcd에 미세먼지값만 너무빨리 띄어서 아무리 수정해봐도 문제점을 잘 모르겠어요ㅠㅜ
어디부분이 문제일까요..?
댓글 1
조회수 7,363master님의 댓글
master 작성일미세먼지 예제로 미세먼지만 구동하면서 같은 오동작을 하는지 정상인지 체크하세요