Непонятная работа esp32

Тема в разделе "Проводная и беспроводная связь", создана пользователем Burguy2010, 23 мар 2023.

  1. Burguy2010

    Burguy2010 Нуб

    Помогите кто может. Второй день бьюсь с ESP32. При использовании оператора if-else в месте с командами bleKeyboard.press
    и bleKeyboard.release выполняется цикличная перезагрузка ESP.
    Программа работает, но перезагружается примерно каждые 15 секунд.
    Если убрать bleKeyboard.releaseAll(); перезапуск прекращается.
    ПОМОГИТЕ!!!!


    например:

    Код (C++):

    #include <BleKeyboard.h>
    BleKeyboard bleKeyboard;



    #define BT1 34 // ПИН к которому подключена кнопка А
    #define BT2 35 // ПИН к которому подключена кнопка В


    void setup () {
       // запуск последовательного порта
       Serial.begin (115200);
       pinMode(BT1, INPUT_PULLUP);     // ПИН кнопки как вход
       pinMode(BT2, INPUT_PULLUP);     // ПИН кнопки как вход
       pinMode(LED_BUILTIN, OUTPUT);   // встроеный светодиод
       bleKeyboard.begin();
    }
    void loop () {

    digitalWrite (LED_BUILTIN, bleKeyboard.isConnected());

      if (!digitalRead(BT1))               // если нажата кнока A
        {            
        bleKeyboard.press('C');           // нажимаем клавишу C
        }
        else
        {
        bleKeyboard.releaseAll();         // отпускаем все клавиши
        }

      if (!digitalRead(BT2))             // если нажата кнока B
        {                                  
        bleKeyboard.press('V');           // нажимаем клавишу V
        }
        else
        {    
        bleKeyboard.releaseAll();         // отпускаем все клавиши
        }
      }
     
    Последнее редактирование: 23 мар 2023
  2. issaom

    issaom Гуру

    Там в примерах везде задержки натолканы....
    А у вас программа, когда кнопки не нажаты постоянно долбит
    bleKeyboard.releaseAll(); // отпускаем все клавиши
    а это точно допустимо!?
    Возможно алгоритм должен быть типа
    кнопку нажали - вызвали bleKeyboard.press('C');
    кнопку отпустили - вызвали bleKeyboard.releaseAll();
    но только один раз!!!
    Я сам конечно не проверял - но попробовать наверное стоит.....
     
  3. Burguy2010

    Burguy2010 Нуб

    Думаю в этом есть зерно. нужно попробовать.
     
  4. parovoZZ

    parovoZZ Гуру

    очевидно, что срабатывает вачдог, т.к. не получает управление из пользовательской программы.
     
  5. Burguy2010

    Burguy2010 Нуб

    Спасибо огромное. Работаю над решением проблемы.
     
  6. ИгорьК

    ИгорьК Гуру

    Если пользователь держит цикл 500-750 мс срабатывает WD.
     
  7. Burguy2010

    Burguy2010 Нуб

    Всем спасибо! Действительно проблема в WD/
    Вот рабочий вариант.
    Код (C++):
    #include <BleKeyboard.h>
    BleKeyboard bleKeyboard;


    #define VRX_PIN  32 // ESP32 pin GIOP36 (ADC0) connected to VRX pin
    #define VRY_PIN  33 // ESP32 pin GIOP39 (ADC0) connected to VRY pin

    int currStateY1;
    int prevStateY1;
    int currStateY2;
    int prevStateY2;
    int currStateX1;
    int prevStateX1;
    int currStateX2;
    int prevStateX2;

    void setup () {
       // запуск последовательного порта
       Serial.begin (115200);
       bleKeyboard.begin();
    }
    void loop () {


      int sensorValueY = analogRead(VRX_PIN);
      int sensorValueX = analogRead(VRY_PIN);

      { // Y+
        currStateY1 = sensorValueY > 1000;
        if (currStateY1 != prevStateY1)
        {
          if (currStateY1 == (sensorValueY < 10))
          {
            bleKeyboard.press('w');
          }
          else
          {
            bleKeyboard.release('w');
          }
        }
        prevStateY1 = currStateY1;
      }

      { //Y-
        currStateY2 = sensorValueY < 3000;
        if (currStateY2 != prevStateY2)
        {
          if (currStateY2 == (sensorValueY > 4090))
          {
            bleKeyboard.press('s');
          }
          else
          {
            bleKeyboard.release('s');
          }
        }
        prevStateY2 = currStateY2;
      }

      { //X
        currStateX1 = sensorValueX > 1000;
        if (currStateX1 != prevStateX1)
        {
          if (currStateX1 == (sensorValueX < 10))
          {
            bleKeyboard.press('a');
          }
          else
          {
            bleKeyboard.release('a');
          }
        }
        prevStateX1 = currStateX1;
      }

      { //X-
        currStateX2 = sensorValueX < 3000;
        if (currStateX2 != prevStateX2)
        {
          if (currStateX2 == (sensorValueX > 4090))
          {
            bleKeyboard.press('d');
          }
          else
          {
            bleKeyboard.release('d');
          }
        }
        prevStateX2 = currStateX2;
      }
    }
     
    issaom нравится это.