I would just like to know if a Arduino Nano flash memory can be increased? If so, whats the process of doing this?
I'm currently using a ELEGOO Nano Board which came with the new bootloader.
Any ideas?
I would just like to know if a Arduino Nano flash memory can be increased? If so, whats the process of doing this?
I'm currently using a ELEGOO Nano Board which came with the new bootloader.
Any ideas?
You’ll need to use a different controller.
why you think you need more flash?
You can expand it as much as you like however you will not be able to execute any code from it. It will be good for storing data only. I do this a lot with FRAM memory, I get 32K by 8 for a few dollars. It can be gotten in either SPI or I2C for the Arduinos and Parallel for other computers that can support it. The code is the same as external EEPROM without the delays. It is non volatile so it remembers when the power fails. You can preload it with messages etc and that will not take any of your Arduino Flash.
ok, thanks
My sketch is quite large
Ok, thanks. I will look into this.
Can you post the memory usage stats from your sketch like
Sketch uses 3608 bytes (11%) of program storage space. Maximum is 32256 bytes.
Global variables use 280 bytes (13%) of dynamic memory, leaving 1768 bytes for local variables. Maximum is 2048 bytes.
show your sketch. we look if it able to be optimized.
Here is my sketch:-
#include <EEPROM.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#include <Fonts/nunitoTiny.h>
#include <Fonts/makoSmall.h>
#define OLED_CLK 2
#define OLED_MOSI 3
#define OLED_RESET 4
#define OLED_DC 5
#define OLED_CS 6
Adafruit_SH1106 tft(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
RF24 radio(7, 8);
const byte addr[6] = "00001";
int up, down, select;
int pressed = -1;
int app = 0;
int mode = 0;
int menu = 0;
int m1 = 0; int m2 = 0; int s1 = 0; int s2 = 0; int s = 0;
int mm1 = 0; int mm2 = 0; int ss1 = 0; int ss2 = 0; int ss = 0;
boolean tme = false;
boolean done = false;
int times = 0;
int amt = 0;
unsigned long curr;
unsigned long prev;
int interval = 92;
int last;
// ----- BITMAPS ----- //
const unsigned char sprint[] PROGMEM = {
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x7f, 0xfe,
0x00, 0x00,
0x01, 0x40,
0x02, 0xc0,
0x00, 0x00,
0x7f, 0xfe,
0x00, 0x00,
0x3c, 0x00,
0x20, 0x00,
0x00, 0x00,
0x7f, 0xfe,
0x00, 0x00,
0x00, 0x00
};
const unsigned char lap[] PROGMEM = {
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x0f, 0xf0,
0x3f, 0xfc,
0x38, 0x1c,
0x70, 0x0e,
0x60, 0x06,
0x60, 0x06,
0x70, 0x0e,
0x38, 0x1c,
0x3f, 0xfc,
0x0f, 0xf0,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00
};
const unsigned char count[] PROGMEM = {
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x7f, 0xfe,
0x6f, 0xb6,
0x55, 0x2a,
0x57, 0xba,
0x55, 0xb6,
0x6f, 0xa2,
0x7f, 0xfe,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00
};
static const unsigned char PROGMEM settings[] = {
0x00, 0x00,
0x01, 0x80,
0x01, 0x80,
0x19, 0x98,
0x1d, 0xb8,
0x0f, 0xf0,
0x07, 0xe0,
0x7e, 0x7e,
0x7e, 0x7e,
0x07, 0xe0,
0x0f, 0xf0,
0x1d, 0xb8,
0x19, 0x98,
0x01, 0x80,
0x01, 0x80,
0x00, 0x00
};
static const unsigned char PROGMEM autos[] = {
0x00, 0x00,
0x03, 0xc0,
0x01, 0x80,
0x03, 0xc0,
0x0d, 0x30,
0x10, 0x28,
0x10, 0x48,
0x20, 0x44,
0x21, 0x8c,
0x31, 0x84,
0x20, 0x04,
0x10, 0x08,
0x10, 0x08,
0x0c, 0xb0,
0x03, 0xc0,
0x00, 0x00
};
static const unsigned char PROGMEM manual[] = {
0x00, 0x00,
0x00, 0x00,
0x03, 0xc0,
0x0c, 0x30,
0x10, 0x08,
0x10, 0x08,
0x26, 0x64,
0x28, 0x94,
0x2a, 0x94,
0x26, 0x64,
0x10, 0x08,
0x10, 0x08,
0x0c, 0x30,
0x03, 0xc0,
0x00, 0x00,
0x00, 0x00
};
static const unsigned char PROGMEM back[] = {
0x00, 0x00,
0x00, 0x00,
0x08, 0x00,
0x18, 0x00,
0x3f, 0xe0,
0x3f, 0xf8,
0x18, 0x38,
0x08, 0x1c,
0x00, 0x1c,
0x00, 0x38,
0x0f, 0xf8,
0x0f, 0xe0,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00
};
static const unsigned char PROGMEM dist[] = {
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x7f, 0xfe,
0x7f, 0xfe,
0x6f, 0xbe,
0x6d, 0xb6,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00
};
static const unsigned char PROGMEM sound[] = {
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x20,
0x02, 0x10,
0x06, 0x88,
0x1e, 0x48,
0x1e, 0x48,
0x06, 0x88,
0x02, 0x10,
0x00, 0x20,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00
};
static const unsigned char PROGMEM nosound[] = {
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x80,
0x01, 0x80,
0x07, 0x80,
0x07, 0x80,
0x01, 0x80,
0x00, 0x80,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00
};
static const unsigned char PROGMEM racecal[] = {
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x7f, 0xfe,
0x00, 0x00,
0x51, 0xc0,
0x2a, 0x20,
0x50, 0x40,
0x28, 0x80,
0x50, 0x00,
0x28, 0x80,
0x00, 0x00,
0x7f, 0xfe,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00
};
void setup() {
Serial.begin(115200);
pinMode(14, INPUT);
pinMode(15, INPUT);
pinMode(16, INPUT);
pinMode(9, INPUT);
tft.begin(SH1106_SWITCHCAPVCC);
radio.begin();
radio.openReadingPipe(0, addr);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
radio.flush_rx();
tft.clearDisplay();
tft.setTextColor(WHITE);
int x, y;
int16_t x1, y1;
uint16_t w, h;
tft.setFont(&nunitoTiny);
tft.getTextBounds("Welcome", x, y, &x1, &y1, &w, &h);
tft.setCursor(63 - (w / 2), 37);
tft.print("Welcome");
tft.display();
int bar = 0;
while(bar < 128) {
tft.fillRect(0, 61, bar, 4, WHITE);
bar = bar + random(1, 6);
delay(random(4, 8));
tft.display();
}
tft.fillRect(0, 61, 128, 4, BLACK);
tft.display();
if(EEPROM.read(0) > 2) {
EEPROM.write(0, 0);
}
if(EEPROM.read(1) > 10) {
EEPROM.write(1, 5);
}
if(EEPROM.read(0) == 0) {
tone(9, 440, 100);
delay(100);
tone(9, 659, 100);
delay(100);
}
noTone(9);
delay(800);
app = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
void drawApp(int appl) {
tft.clearDisplay();
if(appl == 0) {
tme = false;
tft.setFont(&makoSmall);
tft.setCursor(46, 18);
tft.print("Sprint");
tft.setCursor(46, 29);
tft.print("Lap");
tft.setCursor(46, 40);
tft.print("Counter");
tft.setCursor(46, 51);
tft.print("Settings");
} else if(appl == 1) {
tft.setFont(&makoSmall);
tft.setCursor(46, 20);
tft.print("Automatic");
tft.setCursor(46, 36);
tft.print("Manual");
tft.setCursor(46, 52);
tft.print("Back");
} else if(appl == 2) {
tft.setFont(&makoSmall);
tft.setCursor(3, 8);
tft.print("Sprint");
tft.drawLine(3, 49, 123, 49, WHITE);
tft.drawLine(88, 54, 91, 57, WHITE);
tft.drawLine(91, 57, 88, 60, WHITE);
tft.setCursor(100, 60);
tft.print("Back");
tft.setFont(&nunitoTiny);
tft.setCursor(3, 28);
m1 = 0; m2 = 0; s1 = 0; s2 = 0; s = 0;
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
tft.display();
tme = true;
delay(100);
if(EEPROM.read(0) == 0) {
tone(9, 523, 150);
delay(random(1800, 3500));
tone(9, 523, 150);
delay(random(2300, 4100));
tone(9, 1047, 300);
}
} else if(appl == 3) {
tft.setFont(&makoSmall);
tft.setCursor(3, 8);
tft.print("Sprint");
tft.drawLine(3, 49, 123, 49, WHITE);
tft.setCursor(15, 60);
tft.print("Start");
tft.setCursor(100, 60);
tft.print("Back");
tft.setFont(&nunitoTiny);
tft.setCursor(3, 28);
m1 = 0; m2 = 0; s1 = 0; s2 = 0; s = 0;
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
} else if(appl == 4) {
tft.setFont(&makoSmall);
tft.setCursor(3, 8);
tft.print("Lap");
tft.drawLine(3, 49, 123, 49, WHITE);
tft.drawLine(74, 3, 74, 46, WHITE);
tft.drawLine(88, 54, 91, 57, WHITE);
tft.drawLine(91, 57, 88, 60, WHITE);
tft.setCursor(100, 60);
tft.print("Back");
tft.setFont(&nunitoTiny);
tft.setCursor(3, 28);
m1 = 0; m2 = 0; s1 = 0; s2 = 0; s = 0;
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
tft.display();
tme = true;
times = 0;
delay(100);
if(EEPROM.read(0) == 0) {
tone(9, 523, 150);
delay(random(1800, 3500));
tone(9, 523, 150);
delay(random(2300, 4100));
tone(9, 1047, 300);
}
} else if(appl == 5) {
tft.setFont(&makoSmall);
tft.setCursor(3, 8);
tft.print("Lap");
tft.drawLine(3, 49, 123, 49, WHITE);
tft.drawLine(74, 3, 74, 46, WHITE);
tft.drawLine(88, 54, 91, 57, WHITE);
tft.drawLine(91, 57, 88, 60, WHITE);
tft.setCursor(100, 60);
tft.print("Back");
tft.setCursor(3, 36);
tft.print("Sel to Start");
tft.setFont(&nunitoTiny);
tft.setCursor(3, 28);
m1 = 0; m2 = 0; s1 = 0; s2 = 0; s = 0;
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
tft.display();
tme = false;
done = false;
times = 0;
} else if(appl == 6) {
tft.setFont(&makoSmall);
tft.setCursor(3, 8);
tft.print("Current");
tft.setCursor(3, 40);
tft.print("Last");
int x, y;
int16_t x1, y1;
uint16_t w, h;
tft.getTextBounds("Lane", x, y, &x1, &y1, &w, &h);
tft.setCursor(124 - w, 8);
tft.print("Lane");
tft.getTextBounds("Num", x, y, &x1, &y1, &w, &h);
tft.setCursor(124 - w, 40);
tft.print("Num");
tft.setFont(&nunitoTiny);
tft.setCursor(3, 26);
m1 = 0; m2 = 0; s1 = 0; s2 = 0; s = 0;
tft.setCursor(3, 58);
tft.print("No Data");
tft.setCursor(116, 26);
tft.print(EEPROM.read(1));
tft.getTextBounds("0", x, y, &x1, &y1, &w, &h);
tft.setCursor(124 - w, 58);
tft.print("0");
tft.display();
tme = false;
done = false;
amt = 0;
} else if(appl == 8) {
tme = false;
tft.setFont(&makoSmall);
tft.setCursor(46, 18);
tft.print("Distance");
tft.setCursor(46, 29);
tft.print("Sound");
tft.setCursor(46, 40);
tft.print("Lane Calib");
tft.setCursor(46, 51);
tft.print("Back");
} else if(appl == 9) {
tme = false;
tft.setFont(&makoSmall);
tft.setCursor(7, 25);
tft.print("Select Lane");
tft.drawLine(88, 54, 91, 57, WHITE);
tft.drawLine(91, 57, 88, 60, WHITE);
tft.setCursor(100, 60);
tft.print("Back");
tft.setFont(&nunitoTiny);
tft.setCursor(7, 45);
tft.print(EEPROM.read(1));
}
tft.display();
}
void drawMenu(int app, int item) {
if(app == 0) {
tft.fillRect(0, 0, 43, 64, BLACK);
tft.drawLine(33, 0, 33, 63, WHITE);
if(item == 0) {
tft.drawLine(33, 12, 33, 18, BLACK);
tft.drawLine(33, 11, 37, 15, WHITE);
tft.drawLine(37, 15, 33, 19, WHITE);
tft.drawBitmap(8, 24, sprint, 16, 16, WHITE);
} else if(item == 1) {
tft.drawLine(33, 23, 33, 29, BLACK);
tft.drawLine(33, 22, 37, 26, WHITE);
tft.drawLine(37, 26, 33, 30, WHITE);
tft.drawBitmap(8, 24, lap, 16, 16, WHITE);
} else if(item == 2) {
tft.drawLine(33, 34, 33, 40, BLACK);
tft.drawLine(33, 33, 37, 37, WHITE);
tft.drawLine(37, 37, 33, 41, WHITE);
tft.drawBitmap(8, 24, count, 16, 16, WHITE);
} else if(item == 3) {
tft.drawLine(33, 45, 33, 51, BLACK);
tft.drawLine(33, 44, 37, 48, WHITE);
tft.drawLine(37, 48, 33, 52, WHITE);
tft.drawBitmap(8, 24, settings, 16, 16, WHITE);
}
} else if(app == 1) {
tft.fillRect(0, 0, 43, 64, BLACK);
tft.drawLine(33, 0, 33, 63, WHITE);
if(item == 0) {
tft.drawLine(33, 13, 33, 19, BLACK);
tft.drawLine(33, 12, 37, 16, WHITE);
tft.drawLine(37, 16, 33, 20, WHITE);
tft.drawBitmap(8, 24, autos, 16, 16, WHITE);
} else if(item == 1) {
tft.drawLine(33, 29, 33, 35, BLACK);
tft.drawLine(33, 28, 37, 32, WHITE);
tft.drawLine(37, 32, 33, 36, WHITE);
tft.drawBitmap(8, 24, manual, 16, 16, WHITE);
} else if(item == 2) {
tft.drawLine(33, 45, 33, 51, BLACK);
tft.drawLine(33, 44, 37, 48, WHITE);
tft.drawLine(37, 48, 33, 52, WHITE);
tft.drawBitmap(8, 24, back, 16, 16, WHITE);
}
} else if(app == 3) {
if(item == 0) {
tft.fillRect(87, 53, 7, 10, BLACK);
tft.drawLine(3, 54, 6, 57, WHITE);
tft.drawLine(6, 57, 3, 60, WHITE);
} else if(item == 1) {
tft.fillRect(0, 53, 7, 10, BLACK);
tft.drawLine(88, 54, 91, 57, WHITE);
tft.drawLine(91, 57, 88, 60, WHITE);
}
} else if(app == 5) {
if(item == 0) {
tft.fillRect(87, 53, 7, 10, BLACK);
tft.drawLine(3, 54, 6, 57, WHITE);
tft.drawLine(6, 57, 3, 60, WHITE);
} else if(item == 1) {
tft.fillRect(0, 53, 7, 10, BLACK);
tft.drawLine(88, 54, 91, 57, WHITE);
tft.drawLine(91, 57, 88, 60, WHITE);
}
} else if(app == 7) {
if(item == 0) {
tft.fillRect(87, 53, 7, 10, BLACK);
tft.drawLine(3, 54, 6, 57, WHITE);
tft.drawLine(6, 57, 3, 60, WHITE);
} else if(item == 1) {
tft.fillRect(0, 53, 7, 10, BLACK);
tft.drawLine(88, 54, 91, 57, WHITE);
tft.drawLine(91, 57, 88, 60, WHITE);
}
} else if(app == 8) {
tft.fillRect(0, 0, 43, 64, BLACK);
tft.drawLine(33, 0, 33, 63, WHITE);
if(item == 0) {
tft.drawLine(33, 12, 33, 18, BLACK);
tft.drawLine(33, 11, 37, 15, WHITE);
tft.drawLine(37, 15, 33, 19, WHITE);
tft.drawBitmap(8, 24, dist, 16, 16, WHITE);
} else if(item == 1) {
tft.drawLine(33, 23, 33, 29, BLACK);
tft.drawLine(33, 22, 37, 26, WHITE);
tft.drawLine(37, 26, 33, 30, WHITE);
if(EEPROM.read(0) == 0) {
tft.drawBitmap(8, 24, sound, 16, 16, WHITE);
} else {
tft.drawBitmap(8, 24, nosound, 16, 16, WHITE);
}
} else if(item == 2) {
tft.drawLine(33, 34, 33, 40, BLACK);
tft.drawLine(33, 33, 37, 37, WHITE);
tft.drawLine(37, 37, 33, 41, WHITE);
tft.drawBitmap(8, 24, racecal, 16, 16, WHITE);
} else if(item == 3) {
tft.drawLine(33, 45, 33, 51, BLACK);
tft.drawLine(33, 44, 37, 48, WHITE);
tft.drawLine(37, 48, 33, 52, WHITE);
tft.drawBitmap(8, 24, back, 16, 16, WHITE);
}
}
tft.display();
}
void events(int button) {
if(app == 0) {
if(button == 0) {
if(menu != 0) {
menu = menu - 1;
drawMenu(app, menu);
}
} else if(button == 1) {
if(menu != 3) {
menu++;
drawMenu(app, menu);
}
} else if(button == 2) {
if(menu == 0) {
app = 1;
mode = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
} else if(menu == 1) {
app = 1;
mode = 1;
menu = 0;
drawApp(app);
drawMenu(app, menu);
} else if(menu == 2) {
app = 6;
drawApp(app);
} else if(menu == 3) {
app = 8;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
}
} else if(app == 1) {
if(button == 0) {
if(menu != 0) {
menu = menu - 1;
drawMenu(app, menu);
}
} else if(button == 1) {
if(menu != 2) {
menu++;
drawMenu(app, menu);
}
} else if(button == 2) {
if(menu == 0) {
if(mode == 0) {
app = 2;
menu = 0;
radio.flush_rx();
drawApp(app);
drawMenu(app, menu);
} else if(mode == 1) {
app = 4;
menu = 0;
radio.flush_rx();
drawApp(app);
drawMenu(app, menu);
} else if(mode == 2) {
app = 6;
menu = 0;
radio.flush_rx();
drawApp(app);
drawMenu(app, menu);
}
} else if(menu == 1) {
if(mode == 0) {
app = 3;
menu = 0;
drawApp(app);
drawMenu(app, menu);
} else if(mode == 1) {
app = 5;
menu = 0;
drawApp(app);
drawMenu(app, menu);
} else if(mode == 2) {
app = 7;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
} else if(menu == 2) {
app = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
}
} else if(app == 2) {
if(button == 2) {
app = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
} else if(app == 3) {
if(button == 0) {
if(menu == 0)
menu = 1;
else
menu = 0;
drawMenu(app, menu);
} else if(button == 1) {
if(menu == 0)
menu = 1;
else
menu = 0;
drawMenu(app, menu);
} else if(button == 2) {
if(menu == 0) {
delay(100);
if(EEPROM.read(0) == 0) {
tone(9, 1047, 300);
}
tme = true;
} else if(menu == 1) {
app = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
}
} else if(app == 4) {
if(button == 2) {
app = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
} else if(app == 5) {
if(button == 0) {
} else if(button == 1) {
if(done == false) {
app = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
} else if(button == 2) {
if(done == false) {
delay(100);
if(EEPROM.read(0) == 0) {
tone(9, 523, 150);
delay(random(1800, 3500));
tone(9, 523, 150);
delay(random(2300, 4100));
tone(9, 1047, 300);
}
tme = true;
} else if(menu == 1) {
app = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
}
} else if(app == 6) {
if(button == 2) {
if(done == false) {
delay(100);
if(EEPROM.read(0) == 0) {
tone(9, 1047, 300);
}
tme = true;
done = true;
} else if(done == true) {
app = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
}
} else if(app == 7) {
if(button == 0) {
} else if(button == 1) {
if(done == false) {
app = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
} else if(button == 2) {
if(done == false) {
delay(100);
if(EEPROM.read(0) == 0) {
tone(9, 523, 150);
delay(random(1800, 3500));
tone(9, 523, 150);
delay(random(2300, 4100));
tone(9, 1047, 300);
}
tme = true;
} else if(menu == 1) {
app = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
}
} else if(app == 8) {
if(button == 0) {
if(menu != 0) {
menu = menu - 1;
drawMenu(app, menu);
}
} else if(button == 1) {
if(menu != 3) {
menu++;
drawMenu(app, menu);
}
} else if(button == 2) {
if(menu == 0) {
app = 9;
drawApp(9);
} else if(menu == 1) {
if(EEPROM.read(0) == 0) {
EEPROM.write(0, 1);
tft.fillRect(8, 24, 16, 16, BLACK);
tft.drawBitmap(8, 24, nosound, 16, 16, WHITE);
} else {
EEPROM.write(0, 0);
tft.fillRect(8, 24, 16, 16, BLACK);
tft.drawBitmap(8, 24, sound, 16, 16, WHITE);
}
tft.display();
} else if(menu == 2) {
} else if(menu == 3) {
app = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
}
} else if(app == 9) {
if(button == 0) {
if(EEPROM.read(1) != 8) {
EEPROM.write(1, EEPROM.read(1) + 1);
tft.fillRect(6, 32, 20, 20, BLACK);
tft.setFont(&nunitoTiny);
tft.setCursor(7, 45);
tft.print(EEPROM.read(1));
tft.display();
}
} else if(button == 1) {
if(EEPROM.read(1) != 1) {
EEPROM.write(1, EEPROM.read(1) - 1);
tft.fillRect(6, 32, 20, 20, BLACK);
tft.setFont(&nunitoTiny);
tft.setCursor(7, 45);
tft.print(EEPROM.read(1));
tft.display();
}
} else if(button == 2) {
app = 8;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
}
}
void getTime() {
if(s == 9) {
s = 0;
s2++;
if(s2 > 9) {
s2 = 0;
s1++;
if(s1 > 5) {
s1 = 0;
m2++;
if(m2 > 9) {
m2 = 0;
m1++;
if(m1 > 9) {
m1 = 0;
}
}
}
}
} else {
s++;
}
}
boolean hasData() {
if(radio.available()) {
int distance;
radio.read(&distance, sizeof(distance));
if(distance < (EEPROM.read(1) * 100)) {
return true;
}
}
return false;
}
void loop() {
up = digitalRead(16);
down = digitalRead(15);
select = digitalRead(14);
if(up == HIGH && pressed == -1) {
pressed = 0;
events(0);
} else if(down == HIGH && pressed == -1) {
pressed = 1;
events(1);
} else if(select == HIGH && pressed == -1) {
pressed = 2;
events(2);
}
if(up == LOW) {
if(pressed == 0)
pressed = -1;
}
if(down == LOW) {
if(pressed == 1)
pressed = -1;
}
if(select == LOW) {
if(pressed == 2)
pressed = -1;
}
if(app == 2) {
if(hasData()) {
int text;
radio.read(&text, sizeof(text));
tme = false;
} else {
curr = millis();
}
if(curr - prev >= interval && tme == true) {
prev = curr;
getTime();
delay(10);
}
tft.fillRect(0, 16, 72, 13, BLACK);
tft.setFont(&nunitoTiny);
tft.setCursor(3, 28);
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
tft.display();
} else if(app == 3) {
if(hasData()) {
int text;
radio.read(&text, sizeof(text));
tme = false;
} else {
if(tme == true)
curr = millis();
}
if(curr - prev >= interval && tme == true) {
prev = curr;
getTime();
delay(10);
}
tft.fillRect(0, 16, 72, 13, BLACK);
tft.setFont(&nunitoTiny);
tft.setCursor(3, 28);
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
tft.display();
} else if(app == 4) {
if(hasData() && last > 10) {
int text;
radio.read(&text, sizeof(text));
if(times < 4) {
tft.setFont(&makoSmall);
tft.setCursor(84, 12 + (times * 10));
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
mm1 = m1; mm2 = m2; ss1 = s1; ss2 = s2; ss = s;
times++;
last = 0;
curr = millis();
if(times == 4) {
tme = false;
}
}
} else if(hasData()) {
int text;
radio.read(&text, sizeof(text));
curr = millis();
} else {
curr = millis();
}
if(curr - prev >= interval && tme == true) {
prev = curr;
getTime();
last++;
}
tft.fillRect(0, 16, 72, 13, BLACK);
tft.setFont(&nunitoTiny);
tft.setCursor(3, 28);
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
tft.display();
} else if(app == 6) {
if(hasData() && last >= 5) {
int text;
radio.read(&text, sizeof(text));
tft.setFont(&nunitoTiny);
tft.fillRect(0, 46, 128, 13, BLACK);
tft.setCursor(3, 58);
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
mm1 = m1; mm2 = m2; ss1 = s1; ss2 = s2; ss = s;
last = 0;
curr = millis();
amt++;
int x, y;
int16_t x1, y1;
uint16_t w, h;
tft.getTextBounds(String(amt), x, y, &x1, &y1, &w, &h);
tft.setCursor(124 - w, 58);
tft.print(String(amt));
//Serial.println("Runner " + String(amt) + ": " + String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
} else if(hasData()) {
int text;
radio.read(&text, sizeof(text));
curr = millis();
} else {
curr = millis();
}
if(curr - prev >= interval && tme == true) {
prev = curr;
getTime();
last++;
delay(10);
}
tft.fillRect(0, 14, 72, 13, BLACK);
tft.setFont(&nunitoTiny);
tft.setCursor(3, 26);
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
tft.display();
}
}
This is what i'm getting when uploading the sketch.
Sketch uses 28530 bytes (92%) of program storage space. Maximum is 30720 bytes.
Global variables use 1784 bytes (87%) of dynamic memory, leaving 264 bytes for local variables. Maximum is 2048 bytes.
Low memory available, stability problems may occur.
yes, exactly what i thought
you used 16 bit variable to store 1 single bit.
near to every variable is int
type.
to store time it is unnecessary to split every number to single digit.
Thanks for spotting an issue with the code. May I ask, What should I amend this too? I'm not the original person who created this code. I've just replicated the project using the code the author provided. I have little experience in coding.
Replace "int" variables or constants with variables declared byte or int8_t, where possible.
Byte variables store values 0-255, int8_t from -128 to 127.
Unfortunately, especially in low memory situations, lines like this cause AVR-based Arduinos to crash:
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
Strings are never necessary, but getting rid of them will require you to learn some program skills. In this case, I believe that the above line can be replaced by
tft.print(m1);
tft.print(m2);
tft.write(':');
tft.print(s1);
tft.print(s2);
tft.write('.');
tft.print(s);
As others have said, take a close look at how you declare variables.
Your tone management could likely be simplified. Do you really need two tone signals. noTone() is not not required since the output times out.
if(EEPROM.read(0) == 0) {
tone(9, 440, 100);
delay(100);
tone(9, 659, 100);
delay(100);
}
noTone(9);
There must be a less memory intensive way than this to print "00:00.0"
tft.setFont(&nunitoTiny);
tft.setCursor(3, 28);
m1 = 0; m2 = 0; s1 = 0; s2 = 0; s = 0;
tft.print(String(m1) + String(m2) + ":" + String(s1) + String(s2) + "." + String(s));
What an incredible blunder by the author of this code! Or more likely, laziness.
tft.print("00:00.0")
should work.
Thanks, I will try and implement all the changes you mentioned.
I don't understand the code myself. However, the tones represent a 'Ready, Set, Go!!' (if this the right part of the code) as the complete code is for race timing system.
The Nano Every is a pin for pin upgrade to the Nano. They're cheap and have 48k of flash vs 32. Get the one with headers already soldered on if you get one.
void events(int button) {
if (app == 0) {
if (button == 0) {
if (menu != 0) {
menu = menu - 1;
drawMenu(app, menu);
}
} else if (button == 1) {
if (menu != 3) {
menu++;
drawMenu(app, menu);
}
} else if (button == 2) {
if (menu == 0) {
app = 1;
mode = 0;
menu = 0;
drawApp(app);
drawMenu(app, menu);
} else if (menu == 1) {
app = 1;
mode = 1;
menu = 0;
drawApp(app);
drawMenu(app, menu);
} else if (menu == 2) {
app = 6;
drawApp(app);
} else if (menu == 3) {
app = 8;
menu = 0;
drawApp(app);
drawMenu(app, menu);
}
}
}
....
better
void events(byte button) {
if (app == 0) {
if (button == 0 && menu != 0) menu--;
if (button == 1 && menu != 3) menu++;
if (button == 2) {
if (menu == 0) {
app = 1;
mode = 0;
}
if (menu == 1) {
app = 1;
mode = 1;
menu = 0;
}
if (menu == 2) app = 6;
if (menu == 3) {
app = 8;
menu = 0;
}
}
drawApp(app);
drawMenu(app, menu);
}
.....