티스토리 뷰

반응형


지난번 만들었던 보일러 컨트롤러에 온도 제어 기능이 없었다.



dht22 센서를 각 방마다 달아야 하는데 무선 인터넷이 되어야했고 전원을 어떻게 공급하냐가 문제였다.


ESP8266 모듈을 가지고 직접 시도를 해봤지만 펌웨어부터 기본 통신까지 번번히 실패했다.


그런 와중에 NodeMCU 라는 모듈을 알게되었고 알리에서 구매한후 지금까지 이것저것 테스트 해보았는데 아두이노로 기본적인것은 다 되는것같았다. 


완전 신세계다. 집안팎으로 재밌는것을 만들기에 딱 좋은아이템이다.


그럼 이제 NodeMCU 와 DHT22 ( AM2302 ) 모듈을 이용한 집안 온습도를 모니터링 할수 있게 해보자!


준비물은 NodeMCU 보드와 DHT22 센서 그리고 연결할 케이블이면 된다. 


NodeMCU 보드 $2.8

DHT22 센서 $2.5 

재료비는 약 6천원 정도. 



NodeMCU 와의 연결은

 NodeMCU

AM2302 

 3.3v

 1 (VCC)

 Ground

 4 (GND) 

 D2

 2 (DATA)

위의 표와 같이 하면 된다. 


다음, 아두이노 IDE 의 라이브러리 관리창에서 dht22 를 검색하여 Adafruit 의 DHT sensor library 를 다운받는다.  


컴파일 중 Adafruit_Sensor.h 관련 에러가 난다면  https://github.com/adafruit/Adafruit_Sensor 이곳에서 Adafruit_Sensor.h 파일을 다운받아서 다운받은 sensor library 폴더에 다음과 같이 추가해준다. 


여기까지 준비 되었으면 다음 소스와 함께 빌드를 한다. 

#include "DHT.h"

#include <ESP8266WiFi.h>

#include <ESP8266HTTPClient.h>


#define DHTPIN 4     // NodeMCU D2 Pin 

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);


// WiFi credentials.

const char* WIFI_SSID = "접속할 SSID 이름";

const char* WIFI_PASS = "와이파이 비번";


WiFiClientSecure wifiClient;


void connect() {


  // Connect to Wifi.

  Serial.println();

  Serial.print("Connecting to ");

  Serial.println(WIFI_SSID);


  WiFi.mode(WIFI_OFF);

  delay(1000);

  WiFi.mode(WIFI_STA);

  WiFi.begin(WIFI_SSID, WIFI_PASS);


  unsigned long wifiConnectStart = millis();


  while (WiFi.status() != WL_CONNECTED) {

    // Check to see if

    if (WiFi.status() == WL_CONNECT_FAILED) {

      Serial.println("Failed to connect to WIFI. Please verify credentials");

    }


    delay(500);

    Serial.println("...");

    // Only try for 5 seconds.

    if (millis() - wifiConnectStart > 10000) {

      Serial.println("Failed to connect to WiFi");

      Serial.println("Please attempt to send updated configuration parameters.");

      return;

    }

  }


  Serial.println();

  Serial.println("WiFi connected");

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());

  Serial.println();

}


void report(float humidity, float tempC ) {


  HTTPClient http;    //Declare object of class HTTPClient


  http.begin("http://192.168.0.150:8000/set_temp");  //Specify request destination

  http.addHeader("Content-Type", "application/x-www-form-urlencoded");  //Specify content-type header


  //Post Data

  String postData = "temp=" + String(tempC) + "&hum=" + String(humidity) ;

  int httpCode = http.POST(postData);   //Send the request

  String payload = http.getString();                  //Get the response payload


  Serial.println(httpCode);   //Print HTTP return code

  Serial.println(payload);    //Print request response payload


  http.end();  //Close connection


  Serial.println("Reported!");

}



void setup()

{

  Serial.begin(9600);

  Serial.println();

}


void loop()

{


  bool toReconnect = false;


  if (WiFi.status() != WL_CONNECTED) {

    Serial.println("Disconnected from WiFi");

    toReconnect = true;

  }


  if (toReconnect) {

    connect();

  }



  delay(3000);


  float humidity = dht.readHumidity();

  float temperature = dht.readTemperature();


  if (isnan(humidity) || isnan(temperature)) {

    Serial.println("Failed to read from DHT sensor!");

    return;

  }


  report(humidity, temperature);


  Serial.print("\tHumidity : ");

  Serial.print(humidity, 1);

  Serial.print("\t\tTemp : ");

  Serial.print(temperature, 1);

  Serial.print("\t\t");


  int delaySecond = 1000 * 60 * 5;

  delay(delaySecond);

}




시리얼 모니터에 결과를 살펴보자. 

온습도 데이터와 함께 통신이 잘 되고있다. 


여기까지 작업을 하면서 가장 큰 삽질을 했던건 바로 저 위의 라이브러리였다.


기존 아두이노 보드에서 사용하던 DHT_MASTER 라는 라이브러리를 사용했는데, 빌드하고 시리얼 모니터로 보면 잘 나오는데, 보드를 재부팅 하면 이상하게 온습도 측정이 되지가 않았다.


그래서 어쩔수없이 라이브러리를 바꿔보게 된거였는데 바꿨더니 바로 된다..

왜 그러는지 이유가 궁금하다. 




방에 있던 아날로그 온습도계가 보여서 비교해보았다.

AM2302 모듈과 오차가 거의 없이 잘 측정되고있다. 



실제 보일러 컨트롤러 서버로 전송되는 온습도 히스토리 데이터를 캡춰해 보았다.

5분 간격으로 저장시키도록 해두었는데 추후 계절별 방안의 온도 히스토리를 그래프로 보면 좋을것같다.


전송되는 데이터를 토대로 아래는 보일러 컨트롤러 화면에서 보여지는 실시간 온습도 화면이다. 


우리집의 지역은 지역난방을 사용중이다.


지역난방을 사용하는 아파트에서 유량계로 요금계산을 하는곳은 벨브만 조절해도 굉장히 비용을 아낄수 있다. 


지금은 벨브를 방마다 20~30% 정도만 열어놓고 하루 6~8시간정도 돌렸을때 한달 난방비는 10만원 내외였다. 

겨울동안 보일러 돈 걱정없이 하루종일 따듯하게 잘 보냈던것같다. 

단, 방이 따듯해지는데까지 시간이 많이 걸린다는 단점이 있다. 


가장 좋은건 가동 초기에는 유속을 빨리해서 골고루 방이 빨리 따듯해지게 하고 어느정도 따듯해지면 유속을 느리게 해서 보온을 할수 있도록 하면 좋을텐데, 지금은 이렇게 원격이나 타이머로 시간만 잘 맞춰 미리미리 가동하니 크게 불편하지는 않다. 

(반대로 유속이 너무 느리면 뜨거운 물이 멀리 가지 못하고 중간에 가기전에 다 열을 빼앗겨 버린다. 벨브 앞만 따듯할정도 ) 


다음 겨울이 되기 전에는 중앙 벨브의 들어오는 물 온도와 나가는 물 온도를 체크해서 유량조절 벨브를 어떻게 해두었을때 열손실 없는 최적의 조건이 되는지 데이터를 수집해서 동적 벨브 조절기를 만들어 보는건 어떨까.. 


반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함