Hello There,
I am currently working on a rather complex project involving a real-time-clock, a sd-card-module and a OLED display on my Arduino UNO.
I am more and more running into memory space problems due to complexity. When I add new functions at certain places the Arduino resets itself due to an overflow of the dynamic memory i guess.
Switching to a mega works but it kinda feels like the lazy solution and is not nice due to the larger board.
I'll copy all parts of the code below, which are related to the display module. Any ideas how to make it more "memory-efficient"?
I'm thankful for any advice.
Best regards!
#include "U8glib.h"
U8GLIB_SH1106_128X64 u8g(9, A3, A0, A1, A2); // SCL=A4, SDA=A3, CS=A0, DC=A1, Reset=A2
void setup () {
}
void loop() {
//
//Stuff happening which changes Display State
//
digitalWrite(A0,HIGH);
//delay(100);
u8g.firstPage();
do {
u8g.setFont(u8g_font_9x15B); //10 px heiht
u8g.drawStr(10, 10, "Smartpot 1.0");
u8g.setFont(u8g_font_8x13); //Optimales copyright Zeichen
u8g.setPrintPos(30, 24);
u8g.print(char(169));
u8g.setFont(u8g_font_5x8);
u8g.setPrintPos(40, 22);
u8g.print("MY Name");
u8g.setPrintPos(25, 30);
u8g.print("www.mydomain.tbd");
//Page 0
if(iDisplayState == 0){
u8g.setPrintPos(0, 40);
u8g.print("Pflanzen: ");
u8g.print(iPlantCount);
if(iSlaveDataIDs[0] != 0){
u8g.setPrintPos(0, 48);
u8g.print("ID 1: ");
u8g.print(iSlaveDataMoisture[0]);
}
if(iSlaveDataIDs[1] != 0){
u8g.setPrintPos(50, 48);
u8g.print("ID 2: ");
u8g.print(iSlaveDataMoisture[1]);
}
if(iSlaveDataIDs[2] != 0){
u8g.setPrintPos(0, 56);
u8g.print("ID 3: ");
u8g.print(iSlaveDataMoisture[2]);
}
if(iSlaveDataIDs[3] != 0){
u8g.setPrintPos(50, 56);
u8g.print("ID 4: ");
u8g.print(iSlaveDataMoisture[3]);
}
if(iSlaveDataIDs[4] != 0){
u8g.setPrintPos(0, 64);
u8g.print("ID 5: ");
u8g.print(iSlaveDataMoisture[4]);
}
if(iSlaveDataIDs[5] != 0){
u8g.setPrintPos(50, 64);
u8g.print("ID 6: ");
u8g.print(iSlaveDataMoisture[5]);
}
}
///////////////////////////////////
/////// Optionen Bewaesserung /////
///////////////////////////////////
u8g.setFont(u8g_font_5x8);
if(iDisplayState == 3){
u8g.setPrintPos(0, 48);
u8g.print("Bewaesserung");
u8g.setPrintPos(0, 56);
u8g.print("starten");
}
else if(iDisplayState == 4){
u8g.setPrintPos(0, 48);
u8g.print("Bewaesserung");
u8g.setPrintPos(0, 56);
u8g.print("wirklich");
u8g.setPrintPos(0, 64);
u8g.print("starten?");
}
else if(iDisplayState == 5){
u8g.setPrintPos(0, 48);
u8g.print("Bewaesserung");
u8g.setPrintPos(0, 56);
u8g.print("gestartet");
if(bFillingInProcess == false){
serial_value_command(0, iDataTypeState, iDataValueStateBeginFilling);
bFillingInProcess = true;
delay(500);
}
}
///////////////////////////////////
//////// Optionen Licht An ////////
///////////////////////////////////
if(iDisplayState == 6){
u8g.setPrintPos(0, 48);
u8g.print("Lichter");
u8g.setPrintPos(0, 56);
u8g.print("anschalten");
}
else if(iDisplayState == 7){
u8g.setPrintPos(0, 48);
u8g.print("Lichter");
u8g.setPrintPos(0, 56);
u8g.print("wirklich");
u8g.setPrintPos(0, 64);
u8g.print("anschalten?");
}
else if(iDisplayState == 8){
u8g.setPrintPos(0, 48);
u8g.print("Lichter");
u8g.setPrintPos(0, 56);
u8g.print("angeschaltet");
}
///////////////////////////////////
/////// Optionen Licht Aus ////////
///////////////////////////////////
if(iDisplayState == 9){
u8g.setPrintPos(0, 48);
u8g.print("Lichter");
u8g.setPrintPos(0, 56);
u8g.print("ausschalten");
}
else if(iDisplayState == 10){
u8g.setPrintPos(0, 48);
u8g.print("Lichter");
u8g.setPrintPos(0, 56);
u8g.print("wirklich");
u8g.setPrintPos(0, 64);
u8g.print("ausschalten?");
}
else if(iDisplayState == 11){
u8g.setPrintPos(0, 48);
u8g.print("Lichter");
u8g.setPrintPos(0, 56);
u8g.print("ausgeschaltet");
}
u8g.setFont(u8g_font_5x8);
u8g.setPrintPos(100, 56);
u8g.print(clock_get_month());
u8g.print("/");
u8g.print(clock_get_day());
u8g.setPrintPos(100, 64);
u8g.print(clock_get_hour());
u8g.print(":");
u8g.print(clock_get_minute());
//Print a single pixel if hold is true
if(bIsHold == true){
u8g.drawPixel(0, 0);
}
} while( u8g.nextPage() );
digitalWrite(A0,LOW);
}