마무리

by 고학능 | 2018-02-05 13:54
relay wemos 가습기 메이커 아두이노

한달만에 다시 글을  쓰게됐습니다. 


오늘은 코드 완성본, wemos d1, dht22, relay, 0.96인치 액정, 가습기를 조합해보도록 하겠습니다.

1.코드

//필요한 라이브러리
#include "UbidotsMicroESP8266.h"
#include "DHT.h"
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//ubidots에 연결에 필요한 토큰, 와이파이 등
#define TOKEN  "**********************************"  
#define ID_Temperature "**********************************" 
#define ID_Humidity "**********************************" 
#define WIFISSID "**********************************"
#define PASSWORD "**********************************" 
Ubidots client(TOKEN);

//dht22 핀, 종류, class 선언
#define DHTPIN D6   
#define DHTTYPE DHT22   
DHT dht(DHTPIN, DHTTYPE,11);

//릴레이 핀
#define RELAY D5

//oled class 선언
#define OLED_RESET LED_BUILTIN 
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif // 128*64화면인지 확인하기

int hum;  // 적정습도보다 낮으면 1, 적정습도보다 높으면 0입니다.
int turn;   // 가습기 켰는지 여부 확인하는 변수
char _h[5], _t[5];

void setup(){
  Serial.begin(9600);
  client.wifiConnection(WIFISSID, PASSWORD);

  Serial.println("DHT22 test!");
  dht.begin();  

  pinMode(RELAY, OUTPUT);
  turn_on();
  turn_off();  

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.display();  
}

void loop(){
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  dtostrf(h, 4, 1, _h);
  dtostrf(t, 4, 1, _t);  
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    client.add(ID_Temperature, t);
    client.add(ID_Humidity, h);
    client.sendAll(false);  
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.clearDisplay();    
    display.setCursor(0,0);   display.println("hum : "); 
    display.setCursor(0,30);  display.println("temp: ");   
    display.setCursor(70,0);   display.println(_h); 
    display.setCursor(70,30);  display.println(_t);
    display.display();

    if((h<70 & t<15)){                // 기상청에서 제공한 적정습도입니다.
      hum = 1; 
    }else if(h<60 & (t>=15 & t <20)){
      hum = 1;
    }else if(h<50 & (t>=20 & t<23)){
      hum = 1;
    }else if(h<40 & t>=23){
      hum = 1;
    }else{
      hum = 0;
    }
    delay(3000);
  }
  
  if(hum == 1 & turn == 0){
    turn_on();
    turn = 1;
  }else if(hum == 0 & turn == 1){
    turn_off();
    turn = 0;
  }else{
    delay(1000);
  }  
}

void turn_on(){
  digitalWrite(RELAY, HIGH);
  delay(100);
  digitalWrite(RELAY, LOW);
  delay(100);
}

void turn_off(){
  for(int i = 0; i < 3; i++){
    digitalWrite(RELAY, HIGH);
    delay(100);
    digitalWrite(RELAY, LOW);
    delay(100);
  }
}
100줄이 넘는 코드이지만 자세히 보면 DHT22, wemos d1, 0.96인치 액정, 릴레이 등 앞에서 언급했던 내용이라 어렵게만 느껴지지 않을 것입니다.


2. 회로구성

회로구성에는 정답이 없습니다. 원하는대로 만들면 됩니다.

판매용으로 만드는 제품이라면 디자인을 고려하게되고 그로인해 부품을 어떻게 배치할지 고려를 많이 합니다. 하지만 이번에 만든 제품은 굳이 디자인을 고려 안 한 제품이니 부품을 회로만 잘 구성하면 됩니다.

저는 이번 가습기를 만들 때 빵판을 사용하지 않고 만들기 위해서 프로토쉴드를 이용했습니다.

프로토쉴드 위에 부품을 붙인 뒤 빵판 대신 납땜을 해서 선을 연결했습니다.
프로토 쉴드는 아두이노 우노에 사용할 수 있는데, wemos d1이 아두이노 우노와 크기가 같으니 호환이됩니다. 
또 wemos d1은 아날로그 핀이 A0만 있어서 A1~A5까지는 공갈핀(?) 형식상 있는 핀입니다. 그래서 이 곳에 0.96인치 액정을 붙였습니다. 

프로토 쉴드에 연결할 때 주의할 점이 있따면 프로토쉴드에 부품을 바로 붙이면 안되고 전연체 같은 걸 깔아야 합니다.(저는 두꺼운 양면테이프 두 겹으로 연결했습니다.) 


마지막 글인데 약간 허무하게 끝난 감이 있습니다.
전기회로를 어떻게 설명할 길이 없어서 그런 것이니 이해해주기 바랍니다.

가습기 프로젝트에서
1. 릴레이로 물리스위치를 제어하는 하기
2. ubidots 서비스 이용해서 보드를 인터넷에 연결하기
이 2가지가 주된 내용이였습니다.

감사합니다.



댓글 0

MADE BY

고학능

3d모델링, 아두이노, 전기회로 구성