Menggunakan EMR Pada ESP32

Pendahuluan

Pada modul ini kita akan membahas penggunaan aktuator. Seperti sudah dibahas sebelumnya aktuator adalah cara IoT device melakukan aksi terhadap lingkungan.

Electromechanical relay (EMR) berfungsi melakukan switch output on
atau off berdasarkan input control signal. Input signal level rendah voltage, jadi dapat dijalankan oleh microcontroller unit atau system on a chip (SoC), seperti ESP32.

Output dari EMR adalah secara kelistrikan terisolasi dari input dan melakukan switch peralatan yang memiliki high-voltage/high-current . Sumber daya dari load dapat berupa alternating
current (AC) atau DC.

EMR 10A 250VAC 1 Channel

EMR dapat digunakan untuk mengatur power source dari peralatan rumah tangga. Silakan pelajari spesfikasi yang disertakan oleh produk.

Perhatian, EMR digunakan untuk mengatur high voltage / high current loads, jadi harap berhati-hati dalam menggunakannya. Pastikan tidak terhubung dengan devkit dan listrik ketikan melakukan setup sirkuit. Pastikan tidak ada short circuit dan kabel yang terekspos.

Pada contoh aplikasi, kita akan gunakan EMR module untuk melakukan switch on dan off tanpa menhubungkan load (untuk keamanan). Kita akan mengetahui apakah switching berhasil atau tidak, karena EMR akan mengeluarkan bunyi click.

Tujuan dari program yang dibuat adalah akan melakukan switch on pada relay jika terdeteksi pergerakan pada PIR module.

Component

  • EMR module
  • 5 V power module
  • Level converter untuk 5V-3.3 V logic-level conversion
  • Passive infrared (PIR) motion detection module

Diagram

Kita perlu membagi breadboard menjadi dua bagian untuk dua logic levels, yaitu: 3.3V dan 5V.

ESP32 beroperasi dengan 3.3 V logic level. Sedangkan, relay module dan PIR module memerlukan 5 V logic level.

Oleh karena itu, 3.3 V – 5 V logic converter (pada bagian tengah) akan dihubungkan dengan ESP32 devkit pada 3.3 V pin, dan dengan relay dan PIR modules pada 5 V pin.

Diperlukan extra 5 V power supply untuk digunakan oleh modules.

Code

Buka file main.c, tambahkan code berikut

//bagian import
#include <stddef.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define RELAY_PIN 4
#define GPIO_RELAY_PIN_SEL (1ULL << RELAY_PIN)
#define PIR_PIN 5
#define GPIO_PIR_PIN_SEL (1ULL << PIR_PIN)
#define ESP_INTR_FLAG_DEFAULT 0
#define STATE_CHECK_PERIOD 10000

//bagian hardware init
static void pir_handler(void *arg);
static void init_hw(void)
{
    gpio_config_t io_conf;
    io_conf.mode = GPIO_MODE_OUTPUT;
    io_conf.pin_bit_mask = GPIO_RELAY_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);
    io_conf.mode = GPIO_MODE_INPUT;
    io_conf.pin_bit_mask = GPIO_PIR_PIN_SEL;
    io_conf.intr_type = GPIO_INTR_POSEDGE;
    io_conf.pull_up_en = 1;
    gpio_config(&io_conf);
    gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
    gpio_isr_handler_add(PIR_PIN, pir_handler, NULL);
}

//bagian pir_handler
static TickType_t next = 0;
const TickType_t period = STATE_CHECK_PERIOD / portTICK_PERIOD_MS;
static void IRAM_ATTR pir_handler(void *arg)
{
    TickType_t now = xTaskGetTickCountFromISR();
    if (now > next)
    {
        gpio_set_level(RELAY_PIN, 1);
    }
    next = now + period;
}

//bagian relay
static void open_relay(void *arg)
{
    while (1)
    {
        TickType_t now = xTaskGetTickCount();
        if (now > next)
        {
            gpio_set_level(RELAY_PIN, 0);
            vTaskDelay(period);
        }
        else
        {
            vTaskDelay(next - now);
        }
    }
}

//bagian main function
void app_main()
{
    init_hw();
    xTaskCreate(open_relay, "openrl", configMINIMAL_STACK_SIZE, NULL, 5, NULL);
}

Penjelasan Code

Bagian import library dan Init Variable

Module akan kita drive melalui GPIO pins. Relay terhubung ke GPIO4 dan PIR module pada GPIO5. Kemudian untuk relay, kita definisikan STATE_CHECK_PERIOD dalam 10 seconds.

Bagian Inisialisasi Hardware

Pada fungsi init_hw kita lakukan konfigurasi pins. PIR pin sebagai input dan relay pin sebagai output.

Bagian pir_handle

Kita konfigurasi ISR service handler untuk PIR sensor, fungsi ini akan dipanggil ketikan motion terdeteksi.

global variable next menunjukan tick time untuk opening relay. If current time, now lebih besar dari variable next, relay akan switches on. Fungsi xtaskGetTickCountFromISR dari FreeRTOS berguna untuk mendapatkan current tick time.

Bagian open_relay

Fungsi open_relay akan me-monitor value dari next untuk menentukan apakah relay akan di switch off. Jika waktu habis, relay pin level di set ke 0. Fungsi The xtaskGetTickCount dari FreeRTOS digunakan untuk mendapatkan current time.

Bagian main app

Pada app_main akan memanggil fungsi init_hw dan pass control ke open_relay dengan membuat FreeRTOS task.

Sampai disini kita sudah bisa mengontrol ERM, pada modul berikutnya kita akan menggunakan stepper motor.

Sharing is caring:

Leave a Comment