Arduino перестает работать после нескольких минут использования - PullRequest
0 голосов
/ 01 ноября 2019

Когда я запускаю этот код на моем arduino nano по какой-то причине, через некоторое время он, кажется, останавливается. Я пытался загрузить его и ждать 5 минут, но, похоже, это еще не останавливает его.

Кто-нибудь знает, может ли waitforkey () остановить процессорный процессор, например, после слишком долгого ожидания? ? Или у меня может быть какая-то утечка памяти?

#include<Keypad.h>
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'0', 'E', 'C'}
};
byte rowPins[ROWS] = {8, 7, 6, 9};
byte colPins[COLS] = {2, 3, 4};
char command[4];
char p0;
char p1;
char p2;
char p3;
int count = 0;
int relayPin = 10;
bool solved = false;

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

void setup() {
  keypad.setHoldTime(0);               // Default is 1000mS
  keypad.setDebounceTime(0);           // Default is 50mS
  pinMode(relayPin, OUTPUT);
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
}
void loop() {
  ledCompare(count);
  if (solved == true) {
    digitalWrite(relayPin, HIGH);
    digitalWrite(A0, HIGH);
    command[3] = 'E';//makes statement untrue
    char key = keypad.waitForKey();
    count = 0;
    solved = false;
    ledsOff();
  }
  char key = keypad.waitForKey();
  if (key == 'C') {
    count = 0;
  }
  else {
    command[count] = key;
    count++;
  }
  if (count == 4) {
      if (command[0] == p0 && command[1] == p1 && command[2] == p2 && command[3] == p3) {
        solved = true;
      }
      else if(command[0] == p0 && command[1] == p1 && command[2] == p2 && command[3] == p3){
        reprogram();
      }
      else {
        ledsOff();
        digitalWrite(relayPin, LOW);
        solved = false;
        count = 0;
      }
    }
}

void ledsOn() {
  digitalWrite(A0, HIGH);//Meest rechter
  digitalWrite(A1, HIGH);
  digitalWrite(A2, HIGH);
  digitalWrite(A3, HIGH);
}

void ledsOff() {
  digitalWrite(A0, LOW);//Meest rechter
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, LOW);
}

void ledCompare(int x){
  if (count >= 1) {
    digitalWrite(A3, HIGH);
  }
  if (count >= 2) {
    digitalWrite(A2, HIGH);
  }
  if (count >= 3) {
    digitalWrite(A1, HIGH);
  }
}

void reprogram(){
  ledsOff();
  char key = keypad.waitForKey();
  if(key != 'C'){
    p0 = key;
    digitalWrite(A3, HIGH);
  }
  else{
    reprogram();
  }
  key = keypad.waitForKey();
  if(key != 'C'){
    p0 = key;
    digitalWrite(A2, HIGH);
  }
  else{
    reprogram();
  }
  key = keypad.waitForKey();
  if(key != 'C'){
    p0 = key;
    digitalWrite(A1, HIGH);
  }
  else{
    reprogram();
  }
  key = keypad.waitForKey();
  if(key != 'C'){
    p0 = key;
    digitalWrite(A0, HIGH);
    solved = true;
  }
  else{
    reprogram();
  }
}

1 Ответ

1 голос
/ 01 ноября 2019

Скорее всего, вам не хватает памяти из-за ваших рекурсивных вызовов reprogram ().

Я даже не понимаю, зачем вам в первую очередь рекурсивные вызовы. Рекурсивные вызовы почти всегда являются плохой идеей для устройства с таким ограниченным объемом памяти.

Также см .:

https://arduino.stackexchange.com/questions/355/how-much-can-i-recurse-how-much-can-i-recurse-how-much-caqfsdrfw

...