어제(2021/7/2)부터 너무너무너무너무 미치도록 덥다.
그래서 esp32에 DHT11로 집 온도 습도를 측정해서 홈어시스턴트로 보려한다.
물론 DHT11 센서가 dallas18B20에 비하면 상당히 크다.
DHT11 | |
온도 측정오차 | ±2°C |
습도 측정오차 | ±5% |
Dallas 18B20 | |
온도 측정오차 | ±0.5°C |
dallas18B20의 오차가 ±0.5°C 인것에 비하면 상당히 크다.
그래도 대략적인 것은 알 수있고 습도가 높아졌는지 낮아졌는지는 알수있으니까 달았다.
사실 저번에 설치를 한번 시험삼아 해보았는데 값이 이상했었다....
값이 한 10억도 정도?.......?
해결도 할겸 그리고 습도 때문에 너무 짜증이 나서
만들기로했다.
도대체 습도가 얼마길래!!!!!!!!!!!!
일단 요로코롬 연결 했다.
아, 그리고 15번 핀이 analod to digital converter 라 일단 그 핀에 연결했다.
다른 분들이 대부분 아날로그 핀에 연결하시길래....
그리고 아두이노 코딩!
장치 설정 하고
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#define DHTPIN 15
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const char *ssid = "olleh_WiFi_BA83";
const char *password = "0000002583";
const char* ID = "테스트"; // Name of our device, must be unique
const char* TOPIC1 = "house/temper";
const char* TOPIC2 = "house/hum";
const char* mqttUser = "dragon";
const char* mqttPassword = "qazwsxedcrfvtgbyhnujm";
const char* broker = "172.30.1.48";
WiFiClient wclient;
PubSubClient client(wclient);
char messages[50];
// Connect to WiFi network
void setup_wifi() {
Serial.print("\nConnecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Received messages: ");
Serial.print("None");
for(int i=0; i<length; i++){
Serial.println((char) payload[i]);
}
Serial.println();
}
// Reconnect to client
void reconnect() {
// Loop until reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(ID, mqttUser, mqttPassword)) {
Serial.println("connected");
Serial.print("Publishing to: ");
Serial.println(TOPIC1);
Serial.println('\n');
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println("\n try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
delay(100);
dht.begin();
setup_wifi(); // Connect to network
client.setServer(broker, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()){
reconnect();
}
client.loop();
float humi = dht.readHumidity();
float temp = dht.readTemperature();
snprintf(messages, 75, "%.1f", temp);
client.publish(TOPIC1, messages);
snprintf(messages, 75, "%.1f", humi);
client.publish(TOPIC2, messages);
delay(1000);
}
이게 성공형이다.
저번에도 그렇고 이번에도 이 친구가 사실
snprintf(messages, 75, "%ld", temp);
이렇게 구성되어있었는데
%ld가 정수를 나타내는 것인데
내가 여기에 실수를 넣었으니 값이 이상할 수 밖에 없었다.
뭐.... 그냥하는소리다.
그리고 snprintf(messages, 75, "%f", temp);
로 바꾸면 값은 잘 전달 되지만
28.9000000000000 이런식으로 표시가 된다.
그래서 dtostrf 함수를 이용하여 소수점 자리수를 지정하고 문자열로 바꾸었다.
dtostrf(humi, 5, 1, val); - dtostrf(변경하고자 하는 변수, 총 자릿수(소수점 포함), 소수점 이하 자릿수, 대입 되는 변수);
이렇게 변경하면 문자열이라 0이 추가 됮 않을 것 이라서 이다.
물론 mqtt로 전송되고나면 homeassistant는 숫자로 인식해준다.
snprintf(messages, 75, "%s", val);
%s가 문자열을 의미한다.
그러면 문제 없이 원하는 데로 전송이 된다.
처음에는 문제 없이 작동하는 줄 알았는데 이후에 dtostr로 버퍼를 바꾸는 거다 보니
홈어시스턴트가 값을 nan으로 표시하는 경우가 많아졌다.....
그래서 %.(원하는 소수점자리 숫자)f로 나타내니 훨씬 정상작동한다.
이제 홈어시스턴트 코드!
sensor:
- platform: mqtt
name: "집온도"
state_topic: "house/temper"
unit_of_measurement: °C
device_class: temperature
- platform: mqtt
name: "집습도"
state_topic: "house/hum"
unit_of_measurement: "%"
device_class: humidity
이렇게 같은 부류
여기서는 센서는 이런 식으로 같은 부분에 구성해야한다.
잘 나온다
애플 홈에도 잘 나온다.
하우스 온도는 코드가 빠져있다. 그래서 0임.
거실에 꼽아보니 습도가 72%
어쩐지 더 덥더라 ㅋㅋㅋ
'스마트 홈 > esp32' 카테고리의 다른 글
esp32 스마트 스위치 다시 살펴보기 (0) | 2021.07.06 |
---|---|
esp32 스위치에 생긴 문제! (0) | 2021.07.04 |
ESP32-CAM 외장 안테나 달깅! (0) | 2021.06.27 |
esp32-cam 도착! (0) | 2021.06.26 |
비닐하우스 개폐기 esp32~!(1) (0) | 2021.06.21 |