티스토리 뷰
지난번 만들었던 보일러 컨트롤러에 온도 제어 기능이 없었다.
dht22 센서를 각 방마다 달아야 하는데 무선 인터넷이 되어야했고 전원을 어떻게 공급하냐가 문제였다.
ESP8266 모듈을 가지고 직접 시도를 해봤지만 펌웨어부터 기본 통신까지 번번히 실패했다.
그런 와중에 NodeMCU 라는 모듈을 알게되었고 알리에서 구매한후 지금까지 이것저것 테스트 해보았는데 아두이노로 기본적인것은 다 되는것같았다.
완전 신세계다. 집안팎으로 재밌는것을 만들기에 딱 좋은아이템이다.
그럼 이제 NodeMCU 와 DHT22 ( AM2302 ) 모듈을 이용한 집안 온습도를 모니터링 할수 있게 해보자!
준비물은 NodeMCU 보드와 DHT22 센서 그리고 연결할 케이블이면 된다.
NodeMCU 보드 $2.8
재료비는 약 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만원 내외였다.
겨울동안 보일러 돈 걱정없이 하루종일 따듯하게 잘 보냈던것같다.
단, 방이 따듯해지는데까지 시간이 많이 걸린다는 단점이 있다.
가장 좋은건 가동 초기에는 유속을 빨리해서 골고루 방이 빨리 따듯해지게 하고 어느정도 따듯해지면 유속을 느리게 해서 보온을 할수 있도록 하면 좋을텐데, 지금은 이렇게 원격이나 타이머로 시간만 잘 맞춰 미리미리 가동하니 크게 불편하지는 않다.
(반대로 유속이 너무 느리면 뜨거운 물이 멀리 가지 못하고 중간에 가기전에 다 열을 빼앗겨 버린다. 벨브 앞만 따듯할정도 )
다음 겨울이 되기 전에는 중앙 벨브의 들어오는 물 온도와 나가는 물 온도를 체크해서 유량조절 벨브를 어떻게 해두었을때 열손실 없는 최적의 조건이 되는지 데이터를 수집해서 동적 벨브 조절기를 만들어 보는건 어떨까..
'iOT , DIY > Arduino' 카테고리의 다른 글
펠티어소자로 와인냉장고 만들기 1부 - 냉각 모듈 조립 (0) | 2020.06.21 |
---|---|
아두이노 NTC thermistor 온도측정기 만들기 (0) | 2020.05.25 |
아두이노 미니 3.3V , 5V 구분 방법 (1) | 2018.03.25 |
미세먼지 센서를 다시 꺼내들다 (0) | 2018.03.13 |
SDS011 미세먼지 센서 신뢰성 검증하기 (0) | 2017.05.18 |
- Total
- Today
- Yesterday
- php
- 아이폰
- Python
- OpenCV
- 사물인터넷
- xcode
- 캠핑
- 우분투
- IOT
- 강좌
- 공기청정기
- 머신러닝
- mysql
- object-C
- 스위프트
- 엘라스틱서치
- 서버
- 아두이노
- 파이썬
- ios
- Deeplearning
- ubuntu
- 리눅스
- 미세먼지
- swift
- 라즈베리파이
- 딥러닝
- diy
- 인공지능
- Android
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |