Прошу помощи, зависает Arduino Pro Micro

Akhmedbekov
Offline
Зарегистрирован: 20.09.2019

Доброго дня, Я не давно с arduino. Не могу разобраться почему зависает моя ардуино.

Прошу гляньте на код, и не судите строго). После минут 5 работы, перестает реагировать на внешнии раздражители. 

Заранее благодарен 


#include "Keyboard.h"
#include "Keypad.h"

int pauseM = 50; 
int pause = 50;  

int KluchPin = A0;

const byte ROWS = 8; //four rows
const byte COLS = 4; //four columns
byte rowPins[ROWS] = {15, 14, 16, 10, 9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2};             //connect to the column pinouts of the keypad

char keys[ROWS][COLS] = {
  {'A', 'B', 'C', 'D'}, //Выход,        КОД,        ШК,        С\\  24(ESC)           16(F5)            8(F6)             0(F12)
  {'E', 'F', 'G', 'H'}, //Секция, Ред. цену, Ред. кол.,   Сторно\\  25(LShift F1)     17(LAlt F8)       9(LAlt F7)        1(Keypad -)
  {'7', '8', '9', 'I'}, //     7,         8,         9,        Х\\  26(Keypad 7)      18(Keypad 8)      10(Keypad 9)      2(Keypad *)
  {'4', '5', '6', 'J'}, //     4,         5,         6,пром итог\\  27(Keypad 4)      19(Keypad 5)      11(Keypad 6)      3(Keypad /)
  {'1', '2', '3', 'K'}, //     1,         2,         3,   Оплата\\  28(Keypad 1)      20(Keypad 2)      12(Keypad 3)      31(ENTER) 
  {'0', 'L', 'M', 'N'}, //     0,         .,        00,   Ключ0 \\  4(Keypad 0)       29(Keypad .)      21(Keypad +)      100(Ключ0)
  {'O', 'P', 'Q', 'R'}, //Сервис,     вверх, откр.ящик    Ключ1 \\  13(LCtrl F7)      5 (Стрелка вверх) 30(LCtrl F6)      101(Ключ1)
  {'S', 'T', 'U', 'V'}  //  лево,      вниз,    вправо    Ключ2 \\  22(Стрелка влево) 14(Стрелка вниз)  6(Стрелка вправо) 102(Ключ2)
};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void(* resetFunc) (void) = 0;

void setup() {
  Keyboard.begin(); // initialize control over the keyboard 
//  Serial.begin(9600);
}


void loop() {
char key = keypad.getKey();
if (key) {
  //Проверка Статусов и Выравнивание
  bool NUM_LOCK = Keyboard.getLedStatus(LED_NUM_LOCK);
  if (NUM_LOCK == 0) {Keyboard.press(0xDB);} 
  bool CAPS_LOCK = Keyboard.getLedStatus(LED_CAPS_LOCK);
  if (CAPS_LOCK == 1) {Keyboard.press(0xC1);} 
  bool SCROLL_LOCK = Keyboard.getLedStatus(LED_SCROLL_LOCK);
  if (SCROLL_LOCK == 1) {Keyboard.press(0xCF);} 
  //Serial.println(key);
    switch (key) {
    case 'A': //ESC Выход
      Keyboard.press(KEY_ESC); delay(pause); Keyboard.releaseAll(); break;
    case 'B': //F5 Код
      Keyboard.press(KEY_F5); delay(pause); Keyboard.releaseAll(); break;
    case 'C': //F6 ШК
      Keyboard.press(KEY_F6); delay(pause); Keyboard.releaseAll(); break; 
    case 'D': //F12 С 
      Keyboard.press(KEY_F12); delay(pause); Keyboard.releaseAll(); break;
    case 'E': //LShift + F1 Секция   
      Keyboard.press(KEY_LEFT_SHIFT); delay(pauseM); Keyboard.press(KEY_F1); delay(pause); Keyboard.releaseAll(); break;
    case 'F': //LAlt + F8 Ред. цену
      Keyboard.press(KEY_LEFT_ALT); delay(pauseM); Keyboard.press(KEY_F8); delay(pause); Keyboard.releaseAll(); break;
    case 'G': //LAlt + F7 Ред. кол.
      Keyboard.press(KEY_LEFT_ALT); delay(pauseM);  Keyboard.press(KEY_F7); delay(pause); Keyboard.releaseAll(); break;
    case 'H': //Keypad -   Сторно ???
      Keyboard.press('\336'); delay(pause); Keyboard.releaseAll(); break;
    case '7': //Keypad 7
      Keyboard.press('\347'); delay(pause); Keyboard.releaseAll(); break;
    case '8': //Keypad 8
      Keyboard.press('\350'); delay(pause); Keyboard.releaseAll(); break;
    case '9': //Keypad 9
      Keyboard.press('\351'); delay(pause); Keyboard.releaseAll(); break;
    case 'I': //Keypad * - X
      Keyboard.press('\335'); delay(pause); Keyboard.releaseAll(); break;
    case '4': //Keypad 4
      Keyboard.press('\344'); delay(pause); Keyboard.releaseAll(); break;
    case '5': //Keypad 5
      Keyboard.press('\345'); delay(pause); Keyboard.releaseAll(); break;
    case '6': //Keypad 6
      Keyboard.press('\346'); delay(pause); Keyboard.releaseAll(); break;
    case 'J': // Keypad / - пром итог
      Keyboard.press('\334'); delay(pause); Keyboard.releaseAll(); break;
    case '1': //Keypad 1
      Keyboard.press('\341'); delay(pause); Keyboard.releaseAll(); break;
    case '2': //Keypad 2
      Keyboard.press('\342'); delay(pause); Keyboard.releaseAll(); break;
    case '3': //Keypad 3
      Keyboard.press('\343'); delay(pause); Keyboard.releaseAll(); break; 
    case 'K': //Оплата ENTER
      Keyboard.press('\340'); delay(pause); Keyboard.releaseAll(); break;
    case '0': //Keypad 0
      Keyboard.press('\352'); delay(pause); Keyboard.releaseAll(); break;
    case 'L': //Keypad .
      Keyboard.press('\353'); delay(pause); Keyboard.releaseAll(); break;
    case 'M': //Keypad +
      Keyboard.press('\337'); delay(pause); Keyboard.releaseAll(); break;
    case 'O': //Сервис LCtrl F7
      Keyboard.press(KEY_LEFT_CTRL); delay(pauseM); Keyboard.press(KEY_F7); delay(pause); Keyboard.releaseAll(); break;
    case 'P': // вверх Стрелка вверх
      Keyboard.press(KEY_UP_ARROW); delay(pause); Keyboard.releaseAll(); break;
    case 'Q': //откр.ящик LCtrl F6
      Keyboard.press(KEY_LEFT_CTRL); delay(pauseM); Keyboard.press(KEY_F6); delay(pause); Keyboard.releaseAll(); break;
    case 'S': //лево 
      Keyboard.press(KEY_LEFT_ARROW); delay(pause); Keyboard.releaseAll(); break;
    case 'T': //вниз
      Keyboard.press(KEY_DOWN_ARROW); delay(pause); Keyboard.releaseAll(); break;
    case 'U': //вправо
      Keyboard.press(KEY_RIGHT_ARROW); delay(pause); Keyboard.releaseAll(); break;
    case 'N': //100(Ключ0)
     break;
    case 'R': //Ключ1
     break;
    case 'V': //Ключ2
     break;
  }
  }
}

byte Kluch(){  
    int val = analogRead(KluchPin);   // считываем значение с аналогового входа и записываем в переменную val
        if (val < 50) return 1;       // сверяем переменную, если val меньше 50 возвращаем 1 (первая кнопка)
        else if (val < 150) return 2; // если val меньше 150 вторая кнопка
        else if (val < 350) return 5; // если val меньше 350 третья кнопка
        else if (val < 500) return 4; // если val меньше 500 четвертая кнопка
        else return 0;  
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ахмед, спашивай у автора кода, а не у нас

Akhmedbekov
Offline
Зарегистрирован: 20.09.2019

Меня зовут Руслан, фамилия у меня Ахмедбеков, просто). И я и есть автор кода. И к сожалению у меня не хватает опыта понять в чем проблема, поэтому у вас и спрашиваю.

Akhmedbekov
Offline
Зарегистрирован: 20.09.2019

Я могу предположить что заканчивается память, только как ее освобождать еще не понял.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Если ты автор кода, ответствуй, зачем тебе строка 27?

Akhmedbekov
Offline
Зарегистрирован: 20.09.2019

Это программный резет) я думал уже счетчик поставить и на 1000 разе резет нажимать

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Чота ржу. Удачи. 

b707
Offline
Зарегистрирован: 26.05.2017

Руслан, у меня два вопроса:

1. Вы уверены, что библиотека понимает такую запись кода кнопки:

Keyboard.press('\337');
что такое \377 - это восьмеричное число? почему не написать просто 255?

 

 

2. Строки 115 и далее, процедура Kluch() - первая кнопка возвращает единицу, вторая двойку... четвертая - четверку, а вот кнопка три почемуто возвращает пять. Это не ошибка?

Я. правда. не знаю. насколько это критично , процедура нигде в коде не используется. Но если этот индекс использовать при адресации массива, с учетом того что кнопок всего пять -  такая ошибка может вызвать переполнение и перезагрузку МК

 

Akhmedbekov
Offline
Зарегистрирован: 20.09.2019

Все коды кнопок верны. Это коды цифр numpad. Kluch пока не используется. Сам я давно программирую в 1с и простейшие основы програмирование хорошо знаю. Но никогда не писал ничего для такого небольшого железа как arduino.a

Akhmedbekov
Offline
Зарегистрирован: 20.09.2019

Смысл кода сводиться к тому что на матричной клавиатуре нажимаеться клавиша а ардуино передает компу какую клавишу нажать. Смотрел в сторону питания думал может usb не вытягивает. Подключил внешний и на питания платы поставил 100 микрофарад. Эффекта не дало.

n971030
Offline
Зарегистрирован: 09.01.2017

строки 106-110 не имеют смысла 

027 строка зачем? Зачем принудительно заставлять контроллер уходить в Reset? 

Akhmedbekov
Offline
Зарегистрирован: 20.09.2019

Можно удалить 027 строку ничего не поменяется. 106-110 еще не доделаны, но ведь они никак не могут повлиять на зависание ардуинки.

n971030
Offline
Зарегистрирован: 09.01.2017

Откуда вы взяли код? Сами писали или этот код уже был? 

Akhmedbekov
Offline
Зарегистрирован: 20.09.2019

Сам писал
Поэтому и есть пустые функции