Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

энкодер freeRTOS

Тема в разделе "FreeRTOS", создана пользователем igorlab, 16 апр 2019.

Метки:
  1. igorlab

    igorlab Новичок

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

    Код (C):
    1. #include "AiEsp32RotaryEncoder.h"
    2. #include "Arduino.h"
    3.  
    4. /*
    5. connecting Rotary encoder
    6. CLK (A pin) - to any microcontroler intput pin with interrupt -> in this example pin 32
    7. DT (B pin) - to any microcontroler intput pin with interrupt -> in this example pin 21
    8. SW (button pin) - to any microcontroler intput pin -> in this example pin 25
    9. VCC - to microcontroler VCC (then set ROTARY_ENCODER_VCC_PIN -1) or in this example pin 25
    10. GND - to microcontroler GND
    11. */
    12. #define ROTARY_ENCODER_A_PIN 32
    13. #define ROTARY_ENCODER_B_PIN 21
    14. #define ROTARY_ENCODER_BUTTON_PIN 25
    15. #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 */
    16.  
    17. AiEsp32RotaryEncoder rotaryEncoder = AiEsp32RotaryEncoder(ROTARY_ENCODER_A_PIN, ROTARY_ENCODER_B_PIN, ROTARY_ENCODER_BUTTON_PIN, ROTARY_ENCODER_VCC_PIN);
    18.  
    19. int test_limits = 2;
    20.  
    21. void rotary_onButtonClick() {
    22.     //rotaryEncoder.reset();
    23.     //rotaryEncoder.disable();
    24.     rotaryEncoder.setBoundaries(-test_limits, test_limits, false);
    25.     test_limits *= 2;
    26. }
    27.  
    28. void rotary_loop() {
    29.     //first lets handle rotary encoder button click
    30.     if (rotaryEncoder.currentButtonState() == BUT_RELEASED) {
    31.         //we can process it here or call separate function like:
    32.         rotary_onButtonClick();
    33.     }
    34.  
    35.     //lets see if anything changed
    36.     int16_t encoderDelta = rotaryEncoder.encoderChanged();
    37.    
    38.     //optionally we can ignore whenever there is no change
    39.     if (encoderDelta == 0) return;
    40.    
    41.     //for some cases we only want to know if value is increased or decreased (typically for menu items)
    42.     if (encoderDelta>0) Serial.print("+");
    43.     if (encoderDelta<0) Serial.print("-");
    44.  
    45.     //for other cases we want to know what is current value. Additionally often we only want if something changed
    46.     //example: when using rotary encoder to set termostat temperature, or sound volume etc
    47.    
    48.     //if value is changed compared to our last read
    49.     if (encoderDelta!=0) {
    50.         //now we need current value
    51.         int16_t encoderValue = rotaryEncoder.readEncoder();
    52.         //process new value. Here is simple output.
    53.         Serial.print("Value: ");
    54.         Serial.println(encoderValue);
    55.     }
    56.    
    57. }
    58.  
    59. void setup() {
    60.  
    61.     Serial.begin(115200);
    62.  
    63.     //we must initialize rorary encoder
    64.     rotaryEncoder.begin();
    65.     rotaryEncoder.setup([]{rotaryEncoder.readEncoder_ISR();});
    66.     //optionally we can set boundaries and if values should cycle or not
    67.     rotaryEncoder.setBoundaries(0, 10, true); //minValue, maxValue, cycle values (when max go to min and vice versa)
    68. }
    69.  
    70. void loop() {
    71.     //in loop call your custom function which will process rotary encoder values
    72.     rotary_loop();
    73.    
    74.     delay(50);                                                            
    75.     if (millis()>20000) rotaryEncoder.enable ();
    76. }
     
  2. nikolz

    nikolz Гуру

    Сообщения:
    3.668
    Симпатии:
    399
    можно.
    А зачем?
    у вас одно ядро.
    Задачи будут исполняться последовательно.
    можно сделать проще используя прерывание и все в одной задаче, а еще проще на основе NonOS.
     
    igorlab нравится это.
  3. igorlab

    igorlab Новичок

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

Поделиться этой страницей