ESP-WROOM-32 ve ESP-IDF ile Real-Time Operating System (RTOS) Kullanımı

ESP-WROOM-32 ve ESP-IDF ile Real-Time Operating System (RTOS) Kullanımı

ESP-WROOM-32 kartı, Espressif tarafından üretilen ve Wi-Fi ve Bluetooth özelliklerini entegre eden güçlü bir mikrodenetleyicidir. Bu makalede, ESP-WROOM-32 kartını kullanarak VSCode ortamında ESP-IDF ve RTOS komutlarını nasıl kullanacağınızı anlatacağız. Ayrıca, bazı C++ kod örnekleri ile bu konseptleri daha iyi anlamanıza yardımcı olacağız.


ESP-IDF, Espressif tarafından sağlanan resmi bir geliştirme çerçevesidir ve ESP-WROOM-32 kartıyla kullanılmak üzere tasarlanmıştır. Bu çerçeve, geniş bir donanım ve yazılım desteği sunar ve özellikle IoT (Internet of Things) projeleri için uygundur.

Gerekli Araçlar

1. VSCode Kurulumu: VSCode'u resmi web sitesinden indirip kurun.
2. PlatformIO Eklentisi: VSCode üzerinde PlatformIO eklentisini yükleyin. Bu eklenti, ESP-IDF tabanlı projeleri kolayca oluşturmanıza ve yönetmenize olanak tanır.
3. ESP-IDF Kurulumu: ESP-IDF'yi resmi GitHub deposundan indirip kurun.

Proje Oluşturma
1. VSCode'u Açın: VSCode'u başlatın ve bir projeye başlamak için yeni bir klasör oluşturun.
2. PlatformIO Projesi Oluşturun: VSCode'un sol kenar çubuğundaki "PlatformIO" sekmesine gidin, ardından "Home" sekmesine tıklayın ve "New Project" seçeneğini seçerek bir yeni PlatformIO projesi oluşturun.
3. Proje Ayarlarını Yapın: Oluşturulan projenin platformio.ini dosyasını açın ve ESP-IDF sürümünü belirtin:

[env:esp32]
platform = espressif32
framework = espidf
board = esp32dev

 

RTOS Komutları


RTOS, ESP-IDF içinde sağlanan bir özelliktir ve gerçek zamanlı görevlerin yönetimini kolaylaştırır. İşte basit bir RTOS görevi oluşturmak için adımlar:

1. RTOS Görevi Oluşturun: main.cpp dosyanıza aşağıdaki gibi bir RTOS görevi ekleyin:

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void rtos_task(void *pvParameter) {
    while (1) {
        // RTOS görevi burada
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

extern "C" void app_main() {
    xTaskCreate(&rtos_task, "rtos_task", 4096, NULL, 5, NULL);
}


RTOS Görevini Başlatın: app_main fonksiyonunda, oluşturulan RTOS görevini başlatın.

 

C++ Kod Örnekleri


1. GPIO Kontrolü: ESP32'nin GPIO pinlerini kontrol etmek için basit bir C++ kod örneği:

#include "driver/gpio.h"

void init_gpio() {
    gpio_config_t io_config;
    io_config.pin_bit_mask = GPIO_Pin_2;
    io_config.mode = GPIO_MODE_OUTPUT;
    gpio_config(&io_config);
}

void toggle_led() {
    while (1) {
        gpio_set_level(GPIO_NUM_2, 1);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        gpio_set_level(GPIO_NUM_2, 0);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

extern "C" void app_main() {
    init_gpio();
    xTaskCreate(&toggle_led, "toggle_led", 4096, NULL, 5, NULL);
}

Bu örnekler, ESP-WROOM-32 kartını kullanarak VSCode ortamında ESP-IDF ve RTOS komutlarını nasıl kullanacağınızı anlamanıza yardımcı olacaktır. Kendi projelerinize uyarlamak için bu örnekleri kullanabilir ve ESP32 ile güçlü IoT uygulamaları geliştirebilirsiniz. 

RTOS'u daha iyi anlatmak için bir kod örneği daha ekleyelim. 2 adet task bulunan kod örneği:

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"

SemaphoreHandle_t xSemaphore;

void vTask1(void *pvParameters) {
    while (1) {
        xSemaphoreTake(xSemaphore, portMAX_DELAY);
        printf("Task 1 is running...\n");
        xSemaphoreGive(xSemaphore);

        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void vTask2(void *pvParameters) {
    while (1) {
        xSemaphoreTake(xSemaphore, portMAX_DELAY);
        printf("Task 2 is running...\n");
        xSemaphoreGive(xSemaphore);

        vTaskDelay(1500 / portTICK_PERIOD_MS);
    }
}

extern "C" void app_main() {
    xSemaphore = xSemaphoreCreateMutex();

    xTaskCreate(&vTask1, "Task 1", 4096, NULL, 5, NULL);
    xTaskCreate(&vTask2, "Task 2", 4096, NULL, 5, NULL);

    vTaskStartScheduler();
}

Bu örnekte, iki farklı görev (vTask1 ve vTask2) tanımlanmıştır. Her iki görev de belirli aralıklarla çalışır ve bir paylaşılan semafor kullanarak kritik bölgeye girmelerini kontrol eder. vTask1 her saniyede bir çalışırken, vTask2 1.5 saniyede bir çalışmaktadır. vTaskDelay fonksiyonu, görevin belirli bir süre boyunca beklemesini sağlar.
Bu örnekte semafor, iki görev arasında veri paylaşımını kontrol etmek için kullanılmaktadır. Semafor, bir görev bir kritik bölgeye girdiğinde diğer görevin beklemesini sağlar, böylece veri bütünlüğü korunur.