공부/기초설계

온습도 + 미세먼지 측정을 캐릭터 표현(1)

오비루 2021. 11. 9. 20:39
728x90
728x90

학부 강의 중 아두이노 보드를 통해 완성품을 제작하는 기초설계 강의를 듣고있다.

아직 완성까지는 외관 디자인을 포함해서 부족한 부분이 많기에 업데이트 되는대로 블로그에 글을 적어보고자 한다.

 

현재 목표로 제작 중인 프로젝트는

온습도 + 미세먼지 센서를 이용해 측정. (푸쉬버튼을 눌렀을때만 동작)

- 온도 측정값에 따라 캐릭터를 원판 중 한곳을 스텝모터를 통해 표현.

- 미세먼지 측정값에 따라 마스크를 착용할지 안할지 서보모터를 이용해 표현.

 

사용 센서

- 푸쉬버튼, 온습도 센서, 미세먼지 센서, 스텝모터, 서보모터, LCD판

 

#include <Wire.h>
#include <hd44780.h>
#include <HD44780ioClass/hd44780_I2Cexp.h>
#include <DHT.h>
#include <DHT_U.h>
#include <Stepper.h> //스텝모터 라이브러리 불러옴


#define DHTPIN 2
#define DHTTYPE DHT11

hd44780_I2Cexp lcd; //LCD 객체
DHT dht(DHTPIN, DHTTYPE);

int button = 8; //버튼은 8번핀

int steps = 2048; // 한바퀴에 해당하는 값 선언
Stepper stepper(steps, 12, 10, 11, 9);
int step_count = 0; //스텝모터 동작 여부 판단을 위한 카운트


/*LED 핀 번호입력
int green = 10;
int red = 11;
int yellow = 12;*/

void setup() {
  Serial.begin(9600);
  //Serial.println("DHT11 test!");
  pinMode(button, INPUT);
  lcd.begin(16,2);
  dht.begin();

  stepper.setSpeed(10); // rpm : 1분당 도는 횟수, 너무 큰값을 하면 안돌아감.
  
  /*LED 출력 핀모드 입력
  pinMode(green, OUTPUT);
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);*/

}

void loop(){
  int buttonValue = digitalRead(button);

  if(buttonValue == LOW){ //버튼을 눌렀을때 측정& LCD 출력이 이루어짐
  float humi = dht.readHumidity(); //습도 측정
  float temp = dht.readTemperature(); //온도 측정
  

  if(26<= temp && temp <= 27 && step_count == 0){ // 26~27 도 + 스텝 카운트가 0 일때에는 1번 구역
    stepper.step(steps/360 * 90); //1번구역
    step_count = 1;//스텝 카운트 1번으로 구역화 만들어둠
  }
  else if(temp <= 25 && step_count == 0){ // 25도 이하 + 스텝 카운트 0 일때 2번 구역
    stepper.step(steps/360 * 180);//2번 구역
    step_count = 2;//이하 동문
  }
  else if(27 < temp && temp <= 30 && step_count == 0){ // 27~30 + 스텝 카운트 0일때 3번 구역
    stepper.step(steps/360 * 270);//3번 구역
    step_count = 3;
  }
  else if(temp > 30 && step_count == 0){ // 30도 초과 + 스텝 카운트 0일때 4번 구역
    stepper.step(steps);
    step_count = 4;
  }

  else{
    stepper.step(0);// 이외의 경우 스텝 모터는 구동하지 않는다.
  }
  
 

  //센서가 측정하지 못할 경우 측정 종료
  if(isnan(humi)||isnan(temp)){
    Serial.print("Failed to read from DHT sensor!");
    return;
  }
//측정된 온도와 습도 출력하기
  lcd.backlight(); //LCD 백라이트 켜짐
  lcd.clear(); //LCD 출력내용 지우기
  lcd.setCursor(0,0);
  lcd.print("TEMP : ");
  lcd.print(temp);
  lcd.print("'C, ");
  lcd.setCursor(0,1);
  lcd.print("HUMi : ");
  lcd.print(humi);
  lcd.print("%");
  delay(300);
  }

  
  else{ //버튼이 꺼진 상태에서는 측정과 출력이 모두 안된다.
    lcd.noBacklight();//LCD 백라이트 꺼짐
    if(step_count == 1){
    stepper.step(-steps/360 * 90); //1번구역 + 이동한 만큼 역회전 , 이하동문
    step_count = 0;//스텝 카운트 변수를 버튼을 뗀 상태일때 초기화 해준다. 이하 동문
    }
    else if(step_count == 2){
    stepper.step(-steps/360 * 180); //2번구역
    step_count = 0;
    }
    else if(step_count == 3){
    stepper.step(-steps/360 * 270); //3번구역
    step_count = 0;
    }
    else if(step_count == 4){ //4번 구역
      stepper.step(-steps);
      step_count = 0;
    }
    else stepper.step(0);//이외의 경우는 스텝모터 작동하지 않는다.
    
    /*digitalWrite(green, LOW);
    digitalWrite(red, LOW);
    digitalWrite(yellow, LOW);*/
  }


  /*Serial.print("Humidity:");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");*/
}

 

우선 현재 버튼을 눌렀을 때 온습도 측정값을 LCD 를 통해 출력하고,

요구하는 온도값에 따라 특정 구간의 스텝모터를 구동후 버튼을 떼었을 시 원상복구하는 코드까지 작성을 하였다.

 

추후, 미세먼지 센서값에 따른 서보모터 동작(마스크 on & off)이 가능하도록 코드를 추가하고, 외관 디자인에 신경을 쓸 계획이다.

 

728x90
반응형

'공부 > 기초설계' 카테고리의 다른 글

온습도 + 미세먼지 (최종)  (0) 2021.12.22
온습도 + 미세먼지 (4)  (0) 2021.11.20
온습도 + 미세먼지 (3)  (0) 2021.11.18
온습도+미세먼지 (2)  (0) 2021.11.16