Excessive dynamic memory useage

Hi,
Can someone tell me please why this simple sketch uses 75% of dynamic memory as global
variables? - and how I can reduce this?

#include <Arduino.h>
#include <U8g2lib.h>
float AverageA = 0;
float beep;
float Beep_period;

U8G2_ST7567_JLX12864_F_4W_SW_SPI u8g2(U8G2_R3, /* clock=/ 7, / data=/ 8, / cs=/ 11, / dc=/ 9, / reset=*/ 10);
int inputPin = A0;

void setup(void) {
u8g2.begin();
u8g2.setContrast(80);
}

void loop(void) {
u8g2.clearBuffer(); // clear the internal memory
AverageA = (analogRead(A0) / 45.0) - 10.0;
u8g2.setFont(u8g2_font_timB24_tn);
if ((AverageA) >= 0) {
u8g2.setCursor(23, 28);
}
else {
u8g2.setCursor(12, 28); //move average display over to accomodate - sign
}
u8g2.print(AverageA);
u8g2.drawBox(0, 62, 17, 5); //divide line
//up triangles ********************
if ((AverageA) > 0.25) {
u8g2.drawTriangle(9, 50, 0, 61, 17, 61);
}
if ((AverageA) > 0.85) {
u8g2.drawTriangle(9, 44, 0, 55, 17, 55);
}
if ((AverageA) > 1.45) {
u8g2.drawTriangle(9, 38, 0, 49, 17, 49);
}
if ((AverageA) > 2.05) {
u8g2.drawTriangle(9, 32, 0, 43, 17, 43);
}
if ((AverageA) > 2.65) {
u8g2.drawTriangle(9, 26, 0, 37, 17, 37);
}
if ((AverageA) > 3.25) {
u8g2.drawTriangle(9, 20, 0, 31, 17, 31);
}
if ((AverageA) > 3.85) {
u8g2.drawTriangle(9, 14, 0, 25, 17, 25);
}
if ((AverageA) > 4.45) {
u8g2.drawTriangle(9, 8, 0, 19, 17, 19);
}
if ((AverageA) > 5.05) {
u8g2.drawTriangle(9, 2, 0, 13, 17, 13);
}
//down triangles ****************
if ((AverageA) < -0.25)u8g2.drawTriangle(9, 79, 0, 68, 17, 68);
if ((AverageA) < -0.85)u8g2.drawTriangle(9, 85, 0, 74, 17, 74);
if ((AverageA) < -1.45)u8g2.drawTriangle(9, 91, 0, 80, 17, 80);
if ((AverageA) < -2.05)u8g2.drawTriangle(9, 97, 0, 86, 17, 86);
if ((AverageA) < -2.65)u8g2.drawTriangle(9, 103, 0, 92, 17, 92);
if ((AverageA) < -3.25)u8g2.drawTriangle(9, 109, 0, 98, 17, 98);
if ((AverageA) < -3.85)u8g2.drawTriangle(9, 115, 0, 104, 17, 104);
if ((AverageA) < -4.45)u8g2.drawTriangle(9, 121, 0, 110, 17, 110);
if ((AverageA) < -5.05)u8g2.drawTriangle(9, 127, 0, 117, 17, 117);
//Sounds *********************************************

if (((millis() - beep) > Beep_period) && (AverageA > 0.25))
{ // UP TONES
beep = millis();
tone(13, (400 + (125 * AverageA)), 125 - (6 * AverageA));
Beep_period = 1000 - (70 * AverageA);
}
else if (AverageA < -2.0)
{ // DOWN TONES
tone(13, (250 + (20 * AverageA)), 125);
}
u8g2.sendBuffer(); // transfer internal memory to the display

}

Because of that?

Please remember to use code tags when posting code

The display library needs a large buffer ?

Looks like a 128 x 64 display, that will use 1024 bytes of memory for the display buffer. Not sure what is using the remaining memory.

The program itself, discounting the display buffer, is using 25% of memory, seems reasonable ........

You can reduce the display buffer memory by using a page buffer instead of a full buffer. That does require a few changes to the code - see the examples for the U8g2 library.

75% memory usage is not a problem with the current code, may be a concern if you intend to add additional code.

Hi David, Thanks, I've tried the page buffer, it made very little difference, not sure how much to expect?
The 'sensor' part of the code, to be merged, uses 37 and 45% of memory - I think I've got a problem!

Not really, just use a more modern Arduino with more memory .......

Dohh!
I tried page buffer, the sketch worked with no reduction in memory useage - but I failed to changed the display constructor as required.
Now done and memory useage 43 and 31%.
Thanks for your reply.
Paul H

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.