ESP32-DHT11 집 온도와 습도 측정!

반응형

어제(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로 나타내니 훨씬 정상작동한다.

이렇게 그래프도 nan 때문에 점으로 나왔다(dtostr 사용)

이제 홈어시스턴트 코드!

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