Arduino Running out of memory after being on for so long


so i'm running arduino uno that's connected keypad controlling 8 magnetic locks. each lock responds different code.

after day or so, mag locks quit opening when correct sequence put keypad. resetting arduino doesn't fix problem. however, when arduino powered off longer duration (10 seconds or so), go working fine (for while).

using power of google, think figured out there may problem in code making arduino pile on memory , run out of room process new commands.

if case, there can change make run more efficiently? thought trying make reset stored data after every long, think that'd last resort if couldn't find way make code little cleaner.

thanks!

code: [select]
const byte relay1 = 4;
const byte relay2 = 5;
const byte relay3 = 6;
const byte relay4 = 7;
const byte relay5 = 8;
const byte relay6 = 9;
const byte relay7 = 10;
const byte relay8 = 11;

//#include <wiegand.h>//library not used
//wiegand wg;

// connect d0 pin 2 , d1 pin 3 on arduino uno
const byte pind0 = 2;
const byte pind1 = 3;

const byte intd0 = 0;
const byte intd1 = 1;

volatile unsigned bitcount;
volatile byte bits[26];
volatile unsigned long lastbittime;

const byte storedpattern[9][26] =
{
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,0,1,1},//1469
  {1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,1,0,1,1,0},//6219
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,0,0,0},//2020
  {1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,0},//5123
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,1,0,0,1,0},//0617
  {1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,1,1,1,0,0},//8670
  {0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,0,1,0},//3313
  {1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,0,0,1,1,0,1,1},//7117
  {1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,1},//9731
};

byte matchpattern = 99;

void setup() {
  serial.begin(9600);
  // wg.begin();
  pinmode(pind0, input_pullup);// set d0 pin input
  pinmode(pind1, input_pullup);// set d1 pin input
  attachinterrupt(intd0, readd0, falling); // hardware interrupt - high low pulse
  attachinterrupt(intd1, readd1, falling); // hardware interrupt - high low pulse
  //pinmode(2, input_pullup);//duplicate
  //pinmode(3, input_pullup);//duplicate
  pinmode(relay1, output);
  pinmode(relay2, output);
  pinmode(relay3, output);
  pinmode(relay4, output);
  pinmode(relay5, output);
  pinmode(relay6, output);
  pinmode(relay7, output);
  pinmode(relay8, output);

  digitalwrite(relay1, low);
  digitalwrite(relay2, low);
  digitalwrite(relay3, low);
  digitalwrite(relay4, low);
  digitalwrite(relay5, low);
  digitalwrite(relay6, low);
  digitalwrite(relay7, low);
  digitalwrite(relay8, low);
}

//interrupt service routines
void readd0() {
  if (bitcount < 100) {
    lastbittime = millis();
    bits[bitcount++] = 0;
  }
}

void readd1() {
  if (bitcount < 100) {
    lastbittime = millis();
    bits[bitcount++] = 1;
  }
}

void loop() {

  byte localbits[26];
  // grab volatile variables interrupts disabled
  nointerrupts();
  unsigned long interval = millis() - lastbittime;
  unsigned count = bitcount;
  interrupts();

  // process data when have new bits, not while.
  if (interval > 100 && count != 0)
  {
    nointerrupts();
    (unsigned = 0; < count; i++) {
      localbits[i] = bits[i];
    }
    bitcount = 0;
    interrupts();

    serial.print(count);
    serial.print(" bits: ");
    (unsigned = 0; < count; i++) {
      serial.print(localbits[i]);
      if (i % 8 == 7)
        serial.write(' ');
    }
    serial.println();

    //test match memcmp
    matchpattern = 99;//reset no match
    (byte = 0; <= 9; i++)
    {
      if ((memcmp(localbits, storedpattern[i], 26)) == 0)
      {
        matchpattern = i;
      }
    }

    serial.print("entered number matches ");
    switch (matchpattern)
    {
      case 0:
        serial.println("1469");
        digitalwrite(relay1, high);
        break;

      case 1:
        serial.println("6219");
        digitalwrite(relay2, high);
        break;

      case 2:
        serial.println("2020");
        digitalwrite(relay3, high);
        break;

      case 3:
        serial.println("5123");
        digitalwrite(relay4, high);
        break;

      case 4:
        serial.println("0617");
        digitalwrite(relay5, high);
        break;

      case 5:
        serial.println("8670");
        digitalwrite(relay6, high);
        break;

      case 6:
        serial.println("3313");
        digitalwrite(relay7, high);
        break;

      case 7:
        serial.println("7117");
        digitalwrite(relay8, high);
        break;

      case 8:
        serial.println("9731");
        digitalwrite(relay1, low);
        digitalwrite(relay2, low);
        digitalwrite(relay3, low);
        digitalwrite(relay4, low);
        digitalwrite(relay5, low);
        digitalwrite(relay6, low);
        digitalwrite(relay7, low);
        digitalwrite(relay8, low);
        break;

      default:
        serial.println("no code match");//case 99
        break;
    }
  }
}

 

maybe idea problem ?

volatile byte bits[26];
....
   if (bitcount < 100) {
      ...
     bits[bitcount++] = 0;


Arduino Forum > Using Arduino > Programming Questions > Arduino Running out of memory after being on for so long


arduino

Comments

Popular posts from this blog

Flip address is out of range arduino uno r3

Arduino Uno not uploading

Indesign and MathType fonts