• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

энкодер freeRTOS

igorlab

New member
Доброго врнмени суток! Господа, можно ли данную библиотеку работы с энкодером запихнуть в таски freeRTOS? отдельный таск выполняет то что в rotary_loop(); и значения encoderValue отправляются в очередь откуда читаются другим таском для обработки, получится ли или идея не очень?

Код:
#include "AiEsp32RotaryEncoder.h"
#include "Arduino.h"

/*
connecting Rotary encoder
CLK (A pin) - to any microcontroler intput pin with interrupt -> in this example pin 32
DT (B pin) - to any microcontroler intput pin with interrupt -> in this example pin 21
SW (button pin) - to any microcontroler intput pin -> in this example pin 25
VCC - to microcontroler VCC (then set ROTARY_ENCODER_VCC_PIN -1) or in this example pin 25
GND - to microcontroler GND
*/
#define ROTARY_ENCODER_A_PIN 32
#define ROTARY_ENCODER_B_PIN 21
#define ROTARY_ENCODER_BUTTON_PIN 25
#define ROTARY_ENCODER_VCC_PIN 27 /*put -1 of Rotary encoder Vcc is connected directly to 3,3V; else you can use declared output pin for powering rotary encoder */

AiEsp32RotaryEncoder rotaryEncoder = AiEsp32RotaryEncoder(ROTARY_ENCODER_A_PIN, ROTARY_ENCODER_B_PIN, ROTARY_ENCODER_BUTTON_PIN, ROTARY_ENCODER_VCC_PIN);

int test_limits = 2;

void rotary_onButtonClick() {
    //rotaryEncoder.reset();
    //rotaryEncoder.disable();
    rotaryEncoder.setBoundaries(-test_limits, test_limits, false);
    test_limits *= 2;
}

void rotary_loop() {
    //first lets handle rotary encoder button click
    if (rotaryEncoder.currentButtonState() == BUT_RELEASED) {
        //we can process it here or call separate function like:
        rotary_onButtonClick();
    }

    //lets see if anything changed
    int16_t encoderDelta = rotaryEncoder.encoderChanged();
   
    //optionally we can ignore whenever there is no change
    if (encoderDelta == 0) return;
   
    //for some cases we only want to know if value is increased or decreased (typically for menu items)
    if (encoderDelta>0) Serial.print("+");
    if (encoderDelta<0) Serial.print("-");

    //for other cases we want to know what is current value. Additionally often we only want if something changed
    //example: when using rotary encoder to set termostat temperature, or sound volume etc
   
    //if value is changed compared to our last read
    if (encoderDelta!=0) {
        //now we need current value
        int16_t encoderValue = rotaryEncoder.readEncoder();
        //process new value. Here is simple output.
        Serial.print("Value: ");
        Serial.println(encoderValue);
    }
   
}

void setup() {

    Serial.begin(115200);

    //we must initialize rorary encoder
    rotaryEncoder.begin();
    rotaryEncoder.setup([]{rotaryEncoder.readEncoder_ISR();});
    //optionally we can set boundaries and if values should cycle or not
    rotaryEncoder.setBoundaries(0, 10, true); //minValue, maxValue, cycle values (when max go to min and vice versa)
}

void loop() {
    //in loop call your custom function which will process rotary encoder values
    rotary_loop();
   
    delay(50);                                                            
    if (millis()>20000) rotaryEncoder.enable ();
}
 

nikolz

Well-known member
можно.
А зачем?
у вас одно ядро.
Задачи будут исполняться последовательно.
можно сделать проще используя прерывание и все в одной задаче, а еще проще на основе NonOS.
 

igorlab

New member
виноват, не указал что это для ESP32, уже есть часть кода на freertos, поэтому и спросил - не ясно надо использовать обычные функции или те что "FromISR"
 
Сверху Снизу