Menggunakan Sensor DHT11 Pada ESP32

Pendahuluan

Kita menggunakan Sensor untuk berhubungan dengan dunia fisik. Contoh button atau pot adalah sensors, namun ketika perlu mengukur fenomena yang berbeda, katakanlah temperatur, kita dapat gunakan temperature sensor dengan interface komunikasi yang lebih advanced dibanding GPIO atau ADC interface.

Pada modul ini, kita akan bahas penggunaan temperature and humidity sensor, DHT11.

Pengenalan DHT11

DHT11 adalah sensor basic untuk mengukur temperature dan humidity dengan harga yang terjangkau. Operational voltage dalam rentang 3 – 5 V, jadi dapat dihubungkan langsung dengan ESP32 (tidak diperlukan level shifter).

DHT11 mengukur temperature dengan rentang 0-50°C, dengan akurasi ±2°C dan resolusi 1°C . Kita juga dapat mengukur humidity antara 20% dan 90% dengan akurasi ±5%.

DHT11 sudah terkalibrasi, jadi kita tidak perlu melakukan kalibrasi. DHT11 menggunakan simple 8-bit processor, memungkinkan kita untuk mengimplementasikan basic single-wire serial communication protocol. Berikut contoh DHT11 yang beredar dipasaran:

Sensor DHT11

DHT11 memiliki 3 pin, yaitu: ground, voltage common collector (VCC) dan signal. Pin signal digunakan untuk komunikasi.

Contoh Project Penggunaan DHT11

Component

  • DHT11 module
  • Buzzer module

Diagram

Code

Kita akan gunakan external library untuk DHT11 communication. Library dapat didownload disini https://github.com/UncleRus/esp-idf-lib

Aplikasi akan membaca temperatur melalui DHT11, jika melebih batas, buzzer akan berbunyi.

Perhatian: Setelah project dibuat, kita perlu mengedit platformio.ini untuk mengatur serial monitor baud rate dan external libraries. (gunakan path dimana Anda menyimpan external libraries yang telah didownload dari link diatas).

monitor_speed = 115200
lib_extra_dirs =
../esp-idf-lib/components

Buka file main.c, lalu tambahkan code berikut:

//import library
#include <stdio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <dht.h>
#include "driver/gpio.h"
#define DHT11_PIN 17
#define BUZZER_PIN 18
#define BUZZER_PIN_SEL (1ULL << BUZZER_PIN)
#define HUM_THRESHOLD 800
#define TEMP_THRESHOLD 250

//fungsi init hardware
static void init_hw(void)
{
    gpio_config_t io_conf;
    io_conf.mode = GPIO_MODE_OUTPUT;
    io_conf.pin_bit_mask = BUZZER_PIN_SEL;
    io_conf.intr_type = GPIO_INTR_DISABLE;
    io_conf.pull_down_en = 0;
    io_conf.pull_up_en = 0;
    gpio_config(&io_conf);
}

//bagian membuat sound
static void beep(void *arg)
{
    int cnt = 2 * (int)arg;
    bool state = true;
    for (int i = 0; i < cnt; ++i, state = !state)
    {
        gpio_set_level(BUZZER_PIN, state);
        vTaskDelay(100 / portTICK_PERIOD_MS);
    }
    vTaskDelete(NULL);
}

//fungsi check_alarm
static int16_t temperature;
static bool temp_alarm = false;
static int16_t humidity;
static bool hum_alarm =false;

//bagian check alarm
static void check_alarm(void)
{
    bool is_alarm = temperature >= TEMP_THRESHOLD;
    bool run_beep = is_alarm && !temp_alarm;
    temp_alarm = is_alarm;

    if (run_beep)
    {
        xTaskCreate(beep, "beep", configMINIMAL_STACK_SIZE,
        (void *)3, 5, NULL);
        return;
    }
    is_alarm = humidity >= HUM_THRESHOLD;
    run_beep = is_alarm && !hum_alarm;
    hum_alarm = is_alarm;

    if (run_beep)
    {
        xTaskCreate(beep, "beep", configMINIMAL_STACK_SIZE,
        (void *)2, 5, NULL);
    }
}

//main function
int app_main()
{
    init_hw();
    while (1)
    {
        if (dht_read_data(DHT_TYPE_DHT11, (gpio_num_t)DHT11_PIN, &humidity, &temperature) == ESP_OK)
        {
            printf("Humidity: %d%% Temp: %dC\n", humidity / 10,
            temperature / 10);
            check_alarm();
        }
        else
        {
            printf("Could not read data from sensor\n");
        }
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}

Penjelasan Code

Bagian library import

Kita gunakan library dht.h untuk menggunakan DHT11 (file didownload dari link github diatas). Untuk buzzer, digunakan library driver/gpio.h.

DHT11 mengembalikan 10 kali dari pengukuran ambient values, jadi untuk kemudahan perbandingan, HUM_THRESHOLD dan TEMP_THRESHOLD values menunjukan 10 kali dari actual threshold values.

Pada init_hw function, kita hanya meng-inisialisasi BUZZER_PIN untuk alarm output.

Bagian membuat sound

Fungsi beep akan mengatur BUZZER_PIN level on dan off setiap100 ms yang diloop sesuai paramater dari fungsi. Fungsi akan dipanggil dari FreeRTOS task setiap threshold dilebihi, dan task akan dihapus setelah job finish.

Bagian check alarm

Digunakan empat global variables untuk menyimpan ambient readings dan alarm states.

Fungsi check_alarm akan memeriksa alarm baru untuk temparature dan humidity, jika ada, akan membuat new beep task dengan memanggil fungsi xTaskCreate dari FreeRTOS.

Terdapat 6 parameter:

  • Function yang akan dipanggil.
  • Task name.
  • Task local stack size dalam bytes. Kita perlu reserve memory untuk menjalankan sebuah task.
  • Function parameter(s).
  • Task priority.
  • Pointer untuk task handle (jika diperlukan). Pada contoh, kita tidak perlu, cukup jalankan task saja.

Kita akan bahas lebih mendalam fungsi freeRTOS pada modul terpisah.

Bagian app_main function

Pertama, kita jalankan init_hw untuk inisialisasi hardware.

Kemudian dalam while loop, baca dari DHT11 sensor secara periodik menggunakan fungsi dht_read_data. Fungsi tersebut memmerlukan parameter DHT sensor type (pada project digunakan DHT_TYPE_DHT11), GPIO
pin yang dihubungkan dengan sensor, dan addresses dari variables untuk menulis hasil readings.

Jika tidak ada masalah, fungsi akan mengembalikan ESP_OK, kemudian kita print values pada serial port, dan periksa alarm.

Terakhir kita atur reading dengan 2-second delay.

Perhatian, sampling rate dari DHT11 tidak boleh melebihi 1 Hz (one reading per
second). Untuk mencegah sensor panas yang dapat menyebabkan readings tidak akurat.

DHT11 adalah sensor low-cost, mudah digunakan, namun jika diperlukan resolusi yang lebih tinggi, gunakan DS18B20.

Sharing is caring:

Leave a Comment